#
# Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#
# This file contains the package names of all the "non-core"
# API published in the Java 2 SDK documentation. "Non-core" means
# it includes all published API outside of the JDK API specification.
#
# These environment variables are used by javadoc in
# make/docs/Makefile and are referenced by the localization
# team when determining which APIs to extract javadoc
# comments from.

DOMAPI_PKGS = com.sun.java.browser.dom \
    org.w3c.dom \
    org.w3c.dom.bootstrap \
    org.w3c.dom.ls \
    org.w3c.dom.ranges \
    org.w3c.dom.traversal \
    org.w3c.dom.html \
    org.w3c.dom.stylesheets \
    org.w3c.dom.css \
    org.w3c.dom.events \
    org.w3c.dom.views

JDI_PKGS = com.sun.jdi \
    com.sun.jdi.event \
    com.sun.jdi.request \
    com.sun.jdi.connect \
    com.sun.jdi.connect.spi

MGMT_PKGS = com.sun.management

JAAS_PKGS = com.sun.security.auth \
    com.sun.security.auth.callback \
    com.sun.security.auth.login \
    com.sun.security.auth.module

JGSS_PKGS = com.sun.security.jgss

OLD_JSSE_PKGS = com.sun.net.ssl

HTTPSERVER_PKGS = com.sun.net.httpserver \
    com.sun.net.httpserver.spi

NIO_PKGS = com.sun.nio.file

DOCLETAPI_PKGS = com.sun.javadoc

TAGLETAPI_FILE = com/sun/tools/doclets/Taglet.java

TAGLETAPI_PKGS = com.sun.tools.doclets

ATTACH_PKGS = com.sun.tools.attach \
    com.sun.tools.attach.spi

JCONSOLE_PKGS = com.sun.tools.jconsole

TREEAPI_PKGS = com.sun.source.doctree \
    com.sun.source.tree \
    com.sun.source.util \
    jdk

NASHORNAPI_PKGS = jdk.nashorn.api.scripting

SMARTCARDIO_PKGS = javax.smartcardio

SCTPAPI_PKGS = com.sun.nio.sctp

ifeq ($(PLATFORM), macosx)
  APPLE_EXT_PKGS = com.apple.concurrent \
      com.apple.eawt \
      com.apple.eawt.event \
      com.apple.eio
endif

JDK_PKGS = jdk \
     jdk.net \
     jdk.management.cmm

JACCESSAPI_PKGS = com.sun.java.accessibility.util

# non-core packages in rt.jar
NON_CORE_PKGS = $(DOMAPI_PKGS) \
    $(MGMT_PKGS) \
    $(JAAS_PKGS) \
    $(JGSS_PKGS) \
    $(NIO_PKGS) \
    $(OLD_JSSE_PKGS) \
    $(HTTPSERVER_PKGS) \
    $(SMARTCARDIO_PKGS) \
    $(SCTPAPI_PKGS) \
    $(APPLE_EXT_PKGS) \
    $(JDK_PKGS) \
    $(JACCESSAPI_PKGS)
