/*
 * Copyright (c) 2009, 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.
 *
 * 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.
 */

// These classes are not referenced in the JDK but we can't
// remove them for compatibility reason.  Define this module
// first so that other modules don't need to exclude these clases
module private-legacy {
    include sun.misc.Cache*,
            sun.misc.ClassLoaderUtil,
            sun.misc.Compare,
            sun.misc.ConditionLock,
            sun.misc.CRC16,
            sun.misc.Lock,
            sun.misc.Regexp,
            sun.misc.RequestProcessor,
            sun.misc.Sort,
            sun.misc.Request,
            sun.misc.Timeable,
            sun.misc.Timer,
            sun.misc.TimerThread,
            sun.misc.TimerTickThread,
            sun.misc.UCDecoder,
            sun.misc.UCEncoder,
            sun.misc.UUDecoder,
            sun.misc.UUEncoder,
            com.sun.net.ssl.SSLContext,
            sun.net.NetworkServer,
            sun.net.URLCanonicalizer,
            sun.reflect.misc.ConstructorUtil,
            sun.reflect.FieldInfo,
            sun.reflect.SignatureIterator,
            sun.reflect.generics.reflectiveObjects.NotImplementedException,
            sunw.io.Serializable,
            sunw.util.EventListener,
            sunw.util.EventObject;
}

// Deprecated classes that aren't referenced/used go here.
module deprecated {
    // add deprecated security classes once b78 is promoted
}

/**************************************************************************/

module base {
    // core classes
    include java.lang.*,
            java.lang.annotation.*,
            java.lang.ref.*,
            java.lang.reflect.*,
            java.math.*,
            java.net.*,
            java.util.*,
            java.util.concurrent.**,
            java.util.jar.*,
            java.util.regex.*,
            java.util.spi.*,
            java.util.zip.*,
            java.text.**;

    exclude java.util.jar.Pack200*,
            java.util.XMLUtils,
            java.text.Bidi;

    include java.io.*, java.nio.*, java.nio.charset.**;
    exclude java.io.TempFileHelper, java.nio.BufferPoolMXBean;

    // security APIs
    // javax.crypto and javax.security.auth are included to avoid inconsistent
    // spliting of JCA and JAAS. This adds about 85k. Also note that some deprecated
    // classes must be included for now (see 6876158, 6876170)
    include java.security.*,
            java.security.cert.*,
            java.security.interfaces.*,
            java.security.spec.*,
            javax.security.auth.**,
            javax.crypto.**;

    // Sun and RSA security providers (except LDAP CertStore)
    // roots sun.security.provider.* sun.security.provider.certpath.* sun.security.rsa.*
    include com.sun.security.auth.PrincipalComparator,
            com.sun.security.auth.SubjectCodeSource,
            com.sun.security.auth.login.**,
            com.sun.security.auth.Policy*,
            sun.security.action.*,
            sun.security.ec.*,
            sun.security.jca.*,
            sun.security.pkcs.*,
            sun.security.provider.*,
            sun.security.provider.certpath.*,
            sun.security.rsa.*,
            sun.security.util.*,
            sun.security.validator.*,
            sun.security.x509.*,
            sun.security.timestamp.*;

    // this list is based on the classlist generated from the rootset
    // need investigation
    exclude sun.security.ec.ECD*,
            sun.security.ec.ECKeyPairGenerator,
            sun.security.ec.SunEC*,
            sun.security.pkcs.PKCS10*,
            sun.security.pkcs.EncodingException,
            sun.security.util.AuthResources_*,
            sun.security.util.Resources_*,
            sun.security.util.BigInt,
            sun.security.util.HostnameChecker,
            sun.security.x509.CertAndKeyGen,
            sun.security.util.PathList;

    // Kerberos not needed
    exclude javax.security.auth.kerberos.**,
            sun.security.jgss.**,
            sun.security.krb5.**,
            sun.security.ssl.Kerberos*,
            org.ietf.jgss.**;

   // property events and annotations
   include java.beans.ChangeListenerMap,
           java.beans.IndexedPropertyChangeEvent,
           java.beans.PropertyChange*,
           java.beans.PropertyVetoException,
           java.beans.VetoableChange*,
           java.beans.ConstructorProperties;

    // mandatory charsets
    include sun.nio.cs.*;

    exclude sun.nio.cs.AbstractCharsetProvider,
            sun.nio.cs.CharsetMapping,
            sun.nio.cs.IBM*,
            sun.nio.cs.ISO*,
            sun.nio.cs.KOI8_*,
            sun.nio.cs.MS125*,
            sun.nio.cs.UTF_32*,
            sun.nio.cs.SingleByteDecoder,
            sun.nio.cs.SingleByteEncoder;

    allow   sun.nio.cs.ISO_8859_1,
            sun.nio.cs.ISO_8859_15,
            sun.nio.cs.MS1252;

    include sun.text.*,
            sun.text.normalizer.*;

    // resource files
    include sun/text/resources/*.icu;

    exclude sun.text.bidi.*,
            sun.text.CharArrayCodePointIterator,
            sun.text.CharSequenceCodePointIterator,
            sun.text.CharacterIteratorCodePointIterator,
            sun.text.CodePointIterator;

    include sun.util.*,
            sun.util.calendar.*,
            sun.util.logging.*,
            sun.util.resources.LocaleData,
            sun.util.resources.LocaleNamesBundle,
            sun.util.resources.OpenListResourceBundle;

    // US_en locale
    include sun.text.resources.BreakIteratorInfo,
            sun.text.resources.FormatData,
            sun.text.resources.FormatData_en_US,
            sun.util.resources.CalendarData,
            sun.util.resources.CalendarData_en,
            sun.util.resources.TimeZoneNames,
            sun.util.resources.TimeZoneNames_en,
            sun.util.resources.TimeZoneNamesBundle,
            sun.util.resources.LocaleNames,
            sun.util.resources.LocaleNames_en,
            sun.util.resources.LocalenamesBundles,
            sun.util.resources.CurrencyNames,
            sun.util.resources.CurrencyNames_en_US,
            sun.util.EmptyListResourceBundle;

    // resources file needed by
    // - sun.misc.ExtensionInfo
    // - sun.security.provider.PolicyFile
    // - com.sun.security.auth.PolicyFile
    include sun.misc.resources.Messages,
            sun.security.util.Resources,
            sun.security.util.AuthResources;

    // java.nio.channels and java.nio.file not in base
    include sun.nio.ch.Interruptible,
            sun.nio.ch.DirectBuffer,
            sun.nio.ByteBuffered;

    include sun.reflect.**;

    // protocol handlers
    include sun.net.www.protocol.file.*,
            sun.net.www.protocol.jar.*,
            sun.net.www.protocol.http.*;

    include sun.net.*,
            sun.net.spi.*,
            sun.net.idn.*,
            sun.net.util.*,
            sun.net.www.*,
            sun.net.www.http.*,
            sun.net.spi.nameservice.*;

    // resource file for sun.net.idn
    include sun/net/idn/*;

    // classes in net-compat
    exclude sun.net.Telnet*, sun.net.TransferProtocolClient;

    // classes in deploy
    exclude sun.net.www.protocol.http.AuthCacheBridge;

    // classes in security-jsse
    exclude java.net.SecureCacheResponse;

    // launcher
    include sun.launcher.LauncherHelper, sun.launcher.resources.launcher;

    include sun.misc.*;
    exclude sun.misc.FIFOQueueEnumerator,
            sun.misc.LIFOQueueEnumerator,
            sun.misc.GC,
            sun.misc.PerformanceLogger,
            sun.misc.Queue,
            sun.misc.QueueElement,
            sun.misc.Ref,
            sun.misc.VMSupport;

    // On Windows, OSEnvironment dependency
    include sun.io.Win32ErrorMode;
}

/**************************************************************************/

module charsets {
    include sun.nio.cs.ext.**;

    include sun.nio.cs.AbstractCharsetProvider,
            sun.nio.cs.CharsetMapping,
            sun.nio.cs.IBM*,
            sun.nio.cs.ISO*,
            sun.nio.cs.KOI8_*,
            sun.nio.cs.MS125*,
            sun.nio.cs.SingleByte*,
            sun.nio.cs.UTF_32*;

    exclude sun.nio.cs.ISO_8859_1,
            sun.nio.cs.MS1252;

    // legacy sun.io converters
    include sun.io.*;
}

/**************************************************************************/

// For now, retains the current JRE extensions where localedata.jar in jre/lib/ext 
module localedata {
    include sun.util.resources.*_ar,
            sun.util.resources.*_ar_*,
            sun.util.resources.*_hi,
            sun.util.resources.*_hi_*,
            sun.util.resources.*_iw,
            sun.util.resources.*_iw_*,
            sun.util.resources.*_ja,
            sun.util.resources.*_ja_*,
            sun.util.resources.*_ko,
            sun.util.resources.*_ko_*,
            sun.util.resources.*_th,
            sun.util.resources.*_th_*,
            sun.util.resources.*_vi,
            sun.util.resources.*_vi_*,
            sun.util.resources.*_zh,
            sun.util.resources.*_zh_*;
    include sun.text.resources.*_ar,
            sun.text.resources.*_ar_*,
            sun.text.resources.*_hi,
            sun.text.resources.*_hi_*,
            sun.text.resources.*_iw,
            sun.text.resources.*_iw_*,
            sun.text.resources.*_ja,
            sun.text.resources.*_ja_*,
            sun.text.resources.*_ko,
            sun.text.resources.*_ko_*,
            sun.text.resources.*_th,
            sun.text.resources.*_th_*,
            sun.text.resources.*_vi,
            sun.text.resources.*_vi_*,
            sun.text.resources.*_zh,
            sun.text.resources.*_zh_*;
}

module resources {
    include sun.text.resources.*, sun.util.resources.*, sun.misc.resources.*;
}

/**************************************************************************/

module nio {
    include java.nio.channels.**, java.nio.file.**, com.sun.nio.file.**;

    // this is excluded from base
    include java.io.TempFileHelper;

    // provider implementations and their dependencies
    include sun.nio.ch.*, sun.nio.fs.**;
    exclude sun.nio.ch.Sctp*;
}

/**************************************************************************/

module pack200 {
    include java.util.jar.Pack200*, com.sun.java.util.jar.pack.**;
}

/**************************************************************************/

module logging {
    include java.util.logging.*, sun.util.logging.**;
    exclude java.util.logging.PlatformLoggingMXBean;

    // Formatter for HTTP messages
    include sun.net.www.protocol.http.logging.*;
}

/**************************************************************************/

module management-snmp {
    include com.sun.jmx.snmp.**, sun.management.snmp.**;
}

module management-iiop {
    include com.sun.jmx.remote.protocol.iiop.*;

    // stubs and ties
    include javax.management.remote.rmi._*,
            org.omg.stub.javax.management.remote.rmi.**;
}

module management {
    include java.lang.management.*, com.sun.management.**, sun.management.**;
    include javax.management.**, com.sun.jmx.**;

    // other management interfaces
    include java.nio.BufferPoolMXBean;
    include java.util.logging.PlatformLoggingMXBean;

    // supporting classes in sun.misc
    include sun.misc.VMSupport;
}

/**************************************************************************/

module tracing {
    // tracing
    include com.sun.tracing.**, sun.tracing.**;
}

module instrument {
    // java.lang.instrument
    include java.lang.instrument.*, sun.instrument.*;

    // HPROF support
    include com.sun.demo.jvmti.hprof.*;

    include tracing;
}

/**************************************************************************/

module rmi-activation {
    include java.rmi.activation.**,
            sun.rmi.server.Act*,
            sun.rmi.server.InactiveGroupException;
}

module rmic {
    // rmic is included in tools
    include sun.rmi.rmic.**;
}

module rmi {
    include java.rmi.**, sun.rmi.**, com.sun.rmi.**;

    // SSL factories are in rmi
    include javax.rmi.ssl.**;

    // supporting classes in sun.misc and dependencies
    include sun.misc.GC;
}

/**************************************************************************/

module prefs {
    include java.util.prefs.*;
}

/**************************************************************************/

module security-jsse {
    include javax.net.**,
            javax.security.cert.*,
            java.net.SecureCacheResponse,
            com.sun.net.ssl.**,
            com.sun.security.cert.internal.x509.*,
            sun.security.ssl.*,
            sun.net.www.protocol.https.**,
            sun.security.internal.interfaces.Tls*,
            sun.security.internal.spec.Tls*,
            sun.security.util.HostnameChecker;
}

module security-sunpkcs11 {
    include sun.security.pkcs11.**;
}

module security-sunjce {
    include com.sun.crypto.provider.*;
}

module security-sunec {
    include sun.security.ec.*;
}

module security-sunmscapi {
    include sun.security.mscapi.*;
}

module security-kerberos {
    include javax.security.auth.kerberos.*,
            com.sun.security.jgss.**,
            com.sun.security.auth.module.Krb5LoginModule,
            com.sun.security.sasl.gsskerb.**,             // GSSAPI SASL mechanism
            sun.security.jgss.**,
            sun.security.ssl.krb5.**,
            sun.security.krb5.**,
            org.ietf.jgss.**,
            sun.net.www.protocol.http.spnego.*;
}

module security-sasl {
    include javax.security.sasl.**,
            com.sun.security.sasl.**;
}

module security-xmldsig {
    include javax.xml.crypto.**,
            org.jcp.xml.dsig.**,
            com.sun.org.apache.xml.internal.security.**;
}

module security-smartcardio {
    include javax.smartcardio.**, sun.security.smartcardio.**;
}

module security-auth {
    include com.sun.security.auth.**, sun.security.util.AuthResources_*;
}

module security-misc {
    include security-auth;

    include sun.security.pkcs.*,
            sun.security.pkcs12.*;

    // this class is a candidate to be removed.
    include sun.security.util.BigInt;
}

module security-resources {
    include sun.security.util.Resources_*;
}

module security-compat {
    include java.security.acl.*, sun.security.acl.*;
}

/**************************************************************************/

module jndi-ldap {
    include javax.naming.ldap.**,
            com.sun.jndi.ldap.**,
            com.sun.jndi.url.ldap.*,
            com.sun.jndi.url.ldaps.*,
            sun.security.provider.certpath.ldap.**;
}

module jndi-rmiregistry {
    include com.sun.jndi.rmi.**, com.sun.jndi.url.rmi.**;
}

module jndi-dns {
    include net-dns;
    include com.sun.jndi.dns.**, com.sun.jndi.url.dns.**;
}

module jndi-cosnaming {
    include com.sun.jndi.cosnaming.**,
            com.sun.jndi.toolkit.corba.**,
            com.sun.jndi.url.corbaname.**,
            com.sun.jndi.url.iiop.**,
            com.sun.jndi.url.iiopname.**;
}

// framework/API and classes used by providers
module jndi {
    include javax.naming.**,
            com.sun.naming.**,
            com.sun.jndi.toolkit.ctx.**,
            com.sun.jndi.toolkit.dir.**,
            com.sun.jndi.toolkit.url.**;
}

/**************************************************************************/

module jdbc-base {
    include java.sql.**, javax.sql.*;
    exclude javax.sql.XA*;
}

module jdbc-enterprise {
    include javax.sql.**, com.sun.rowset.**;
}

module jdbc-odbc {
    include sun.jdbc.odbc.**;
}

/**************************************************************************/

module scripting {
    include javax.script.**;

    // supporting classes for scripting engines
    include com.sun.script.util.**;
}

module scripting-rhino {
    include com.sun.script.javascript.**, sun.org.mozilla.javascript.**;
}

/**************************************************************************/

module httpserver {
    include com.sun.net.httpserver.**, sun.net.httpserver.**;
}

/**************************************************************************/

module sctp {
    // API and dependencies
    include com.sun.nio.sctp.**, sun.nio.ch.Sctp*;
}

/**************************************************************************/

module langtools {
    include javax.tools.**, javax.lang.model.**, javax.annotation.processing.**;

    // include mirror API for now
    include com.sun.mirror.**;

    // include the JSR292 APIs for now
    include java.dyn.**, sun.dyn.**;
}

/**************************************************************************/

module beans {
    include java.beans.**, com.sun.beans.**, sun.beans.**;
}

/**************************************************************************/

module jaxp-parsers-api {
    include javax.xml.*, javax.xml.parsers.**,
            org.w3c.dom.**, org.w3c.sax.**, org.xml.sax.**;
}

module jaxp-api {
    include javax.xml.**;
    exclude javax.xml.crypto.**,   // XML-DSIG
            javax.xml.bind.**,     // JAX-WS
            javax.xml.soap.**,
            javax.xml.ws.**;
}

module jaxp-xerces-impl {
    include com.sun.org.apache.xerces.internal.**;

    // include in xerces-impl due to circular dependencies
    include com.sun.org.apache.xml.internal.serialize.**,
            com.sun.xml.internal.stream.**;
    exclude com.sun.xml.internal.stream.buffer.**;  // JAX-WS
}

// required by Xerces and JAX-WS
module jaxp-xerces-resolver {
    include com.sun.org.apache.xml.internal.resolver.**;
}

module jaxp-xalan {
    include com.sun.org.apache.xalan.internal.**,
            com.sun.org.apache.xpath.internal.**,
            com.sun.org.apache.xml.internal.dtm.**,
            com.sun.org.apache.xml.internal.res.**,
            com.sun.org.apache.xml.internal.serializer.**,
            com.sun.org.apache.xml.internal.utils.**,
            com.sun.org.apache.bcel.internal.**,
            com.sun.org.apache.regexp.internal.**,
            com.sun.java_cup.internal.**;
}

/**************************************************************************/

module jaxws-tools {
    include com.sun.codemodel.**,
            com.sun.xml.internal.dtdparser.**,
            com.sun.xml.internal.rngom.**,
            com.sun.xml.internal.xsom.**,
            com.sun.istack.internal.tools.**,
            com.sun.istack.internal.ws.**,
            com.sun.tools.internal.xjc.**,
            com.sun.tools.internal.ws.**,
            com.sun.tools.internal.jxc.**,
            org.relaxng.datatype.**;
}

module jaxws {
    include javax.jws.**,
            javax.xml.bind.**,
            javax.xml.soap.**,
            javax.xml.ws.**,
            org.relaxng.**,
            com.sun.istack.internal.*,
            com.sun.istack.internal.localization.*,
            com.sun.xml.internal.**;

    // include JAF in this module
    include javax.activation.**, com.sun.activation.**;

    include META-INF/mailcap.default,
            META-INF/mimetypes.default;
}

/**************************************************************************/
module enterprise-base {
    include javax.transaction.**,  // JTA
            javax.annotation.*;    // Common annotations (JSR-250)
}

/**************************************************************************/
module corba {
    include javax.activity.**,
            javax.rmi.*,
            javax.rmi.CORBA.*,
            javax.transaction.**,
            com.sun.corba.**,
            com.sun.org.omg.**,
            org.omg.**,
            sun.corba.**;

    // JMX remote API
    exclude org.omg.stub.javax.management.**;
}

/**************************************************************************/

module applet {
    include java.applet.**,
            sun.applet.**;
}

module awt {
    include java.awt.**,
            sun.awt.**,
            com.sun.awt.**;
}

module font {
    include sun.font.**;
}

module imageio {
    include javax.imageio.**,
            com.sun.imageio.**;
}

module java2d {
    include sun.dc.**,
            sun.java2d.**,
            com.sun.image.**;
}

module media {
    include com.sun.media.**;
}

module print {
    include javax.print.**,
            sun.print.**;
}

module sound {
    include javax.sound.**;
}

module swing {
    include javax.swing.**,
            sun.swing.**,
            // sajdi also contains classes in subpackages of com.sun.java.swing;
            // so use '*' instead of '**' 
            com.sun.java.swing.*,
            com.sun.java.swing.plaf.**,
            com.sun.swing.**;
}

module client {
    include applet,
            awt,
            font,
            imageio,
            java2d,
            media,
            print,
            sound,
            swing;

    include javax.accessibility.*,
            sun.audio.**,
            com.sun.accessibility.**;

    // Bidi class in client module for now
    include java.text.Bidi, sun.text.bidi.*;

    // PerformanceLogger and dependencies
    include sun.misc.Ref, sun.misc.PerformanceLogger;

    // misc. dependencies that we need to examine
    include sun.text.CodePointIterator,
            sun.text.Char*,
            sun.misc.Queue*,
            sun.misc.FIFOQueueEnumerator,
            sun.misc.LIFOQueueEnumerator;

    // content handlers
    include sun.net.www.content.audio.**,
            sun.net.www.content.image.**;
}

/**************************************************************************/

module jkernel {
    include sun.jkernel.*;
}

module deploy {
    include jkernel;

    // For now, all plugin and JNLP
    include com.sun.java.browser.**,
            netscape.**,
            sun.plugin.**,
            sun.plugin2.**,,
            com.sun.deploy.**,
            com.sun.javaws.**,
            javax.jnlp.*,
            com.sun.jnlp.*;

    // Hook for http authentication
    include sun.net.www.protocol.http.AuthCacheBridge;
}

/**************************************************************************/

module net-dns {
    include sun.net.dns.**;                 // to access DNS config.
    include sun.net.spi.nameservice.dns.**; // for DNS-only name service.
}

module net-compat {
    // NTLM authentication support
    include sun.net.www.protocol.http.ntlm.*;

    // ftp and mail clients
    include sun.net.ftp.**, sun.net.smtp.**;

    // Legacy protocol handlers
    include sun.net.www.protocol.**;

    // Legacy content handlers
    include sun.net.www.content.**;

    include sun.net.Telnet*,
            sun.net.TransferProtocolClient;
}

/**************************************************************************/

// jar-tool and security-tools are JRE tools
module jar-tool {
    include sun.tools.jar.**;
}

module security-tools {
    include sun.security.tools.**;

    // Used by security tools
    include sun.security.util.PathList, sun.security.x509.CertAndKeyGen;

    exclude sun.security.tools.JarBASE64Encoder,
            sun.security.tools.JarSigner,
            sun.security.tools.JarSignerParameters,
            sun.security.tools.JarSignerResources*,
            sun.security.tools.SignatureFile,
            sun.security.tools.TimestampedSigner;
}

module jconsole {
    include sun.tools.jconsole.**,
            com.sun.tools.jconsole.*;
}

module serialver {
    include sun.tools.serialver.**;
}

module gui-tools {
    include jconsole,
            serialver;

    include com.sun.tools.example.debug.bdi.**,
            com.sun.tools.example.debug.gui.**,
            com.sun.tools.internal.xjc.**;
}

module attach {
    include com.sun.tools.attach.**,
            sun.tools.attach.**;
}

module debugging {
    include com.sun.jdi.**, com.sun.tools.jdi.**;
}

module jdb {
    include com.sun.tools.example.debug.**;
}

module sajdi {
    include sun.jvm.hotspot.**,
            com.sun.java.swing.ui.**,
            com.sun.java.swing.action.**;

    include toolbarButtonGraphics/**;
    include sa.properties;
}

module tools {
    include attach,
            debugging,
            jaxws-tools,
            jdb,
            rmic,
            sajdi;

    // include gui-tools in tools module unless the tool binaries
    // are modified to load the new gui-tools.jar
    include gui-tools;

    include com.sun.tools.**, sun.tools.**, sun.security.tools.**,
            com.sun.jarsigner.**,
            com.sun.javac.**,
            com.sun.javadoc.**, com.sun.source.**,
            sun.jvmstat.**;
}

/**************************************************************************/

module servicetag {
    include com.sun.servicetag.**;
}

/**************************************************************************/

// these classes will be removed from JRE - see 6909002
module inputmethods-ext {
    include com.sun.inputmethods.internal.**;
}

/**************************************************************************/

// Workaround for US export and local policy files 
// They are currently in signed jars under the jre/lib/security directory
module US_export_policy {
    include default_US_export.policy;
}

module local_policy {
    include default_local.policy,
            exempt_local.policy;
}

/**************************************************************************/

module other {
    include **;
}
