JdkPackages.java

/*
 * Copyright (C) 2017 Red Hat, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.atlasmap.java.core;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JdkPackages {

    private static final List<String> JDK_PACKAGES = Arrays.asList("java.applet", "java.awt", "java.awt.color",
            "java.awt.datatransfer", "java.awt.dnd", "java.awt.event", "java.awt.font", "java.awt.geom", "java.awt.im",
            "java.awt.im.spi", "java.awt.image", "java.awt.image.renderable", "java.awt.print", "java.beans",
            "java.beans.beancontext", "java.io", "java.lang", "java.lang.annotation", "java.lang.instrument",
            "java.lang.invoke", "java.lang.management", "java.lang.ref", "java.lang.reflect", "java.math", "java.net",
            "java.nio", "java.nio.channels", "java.nio.channels.spi", "java.nio.charset", "java.nio.charset.spi",
            "java.nio.file", "java.nio.file.attribute", "java.nio.file.spi", "java.rmi", "java.rmi.activation",
            "java.rmi.dgc", "java.rmi.registry", "java.rmi.server", "java.security", "java.security.acl",
            "java.security.cert", "java.security.interfaces", "java.security.spec", "java.sql", "java.text",
            "java.text.spi", "java.time", "java.time.chrono", "java.time.format", "java.time.temporal",
            "java.time.zone", "java.util", "java.util.concurrent", "java.util.concurrent.atomic",
            "java.util.concurrent.locks", "java.util.function", "java.util.jar", "java.util.logging", "java.util.prefs",
            "java.util.regex", "java.util.spi", "java.util.stream", "java.util.zip", "javax.accessibility",
            "javax.activation", "javax.activity", "javax.annotation", "javax.annotation.processing", "javax.crypto",
            "javax.crypto.interfaces", "javax.crypto.spec", "javax.imageio", "javax.imageio.event",
            "javax.imageio.metadata", "javax.imageio.plugins.bmp", "javax.imageio.plugins.jpeg", "javax.imageio.spi",
            "javax.imageio.stream", "javax.jws", "javax.jws.soap", "javax.lang.model", "javax.lang.model.element",
            "javax.lang.model.type", "javax.lang.model.util", "javax.management", "javax.management.loading",
            "javax.management.modelmbean", "javax.management.monitor", "javax.management.openmbean",
            "javax.management.relation", "javax.management.remote", "javax.management.remote.rmi",
            "javax.management.timer", "javax.naming", "javax.naming.directory", "javax.naming.event",
            "javax.naming.ldap", "javax.naming.spi", "javax.net", "javax.net.ssl", "javax.print",
            "javax.print.attribute", "javax.print.attribute.standard", "javax.print.event", "javax.rmi",
            "javax.rmi.CORBA", "javax.rmi.ssl", "javax.script", "javax.security.auth", "javax.security.auth.callback",
            "javax.security.auth.kerberos", "javax.security.auth.login", "javax.security.auth.spi",
            "javax.security.auth.x500", "javax.security.cert", "javax.security.sasl", "javax.sound.midi",
            "javax.sound.midi.spi", "javax.sound.sampled", "javax.sound.sampled.spi", "javax.sql", "javax.sql.rowset",
            "javax.sql.rowset.serial", "javax.sql.rowset.spi", "javax.swing", "javax.swing.border",
            "javax.swing.colorchooser", "javax.swing.event", "javax.swing.filechooser", "javax.swing.plaf",
            "javax.swing.plaf.basic", "javax.swing.plaf.metal", "javax.swing.plaf.multi", "javax.swing.plaf.nimbus",
            "javax.swing.plaf.synth", "javax.swing.table", "javax.swing.text", "javax.swing.text.html",
            "javax.swing.text.html.parser", "javax.swing.text.rtf", "javax.swing.tree", "javax.swing.undo",
            "javax.tools", "javax.transaction", "javax.transaction.xa", "javax.xml", "javax.xml.bind",
            "javax.xml.bind.annotation", "javax.xml.bind.annotation.adapters", "javax.xml.bind.attachment",
            "javax.xml.bind.helpers", "javax.xml.bind.util", "javax.xml.crypto", "javax.xml.crypto.dom",
            "javax.xml.crypto.dsig", "javax.xml.crypto.dsig.dom", "javax.xml.crypto.dsig.keyinfo",
            "javax.xml.crypto.dsig.spec", "javax.xml.datatype", "javax.xml.namespace", "javax.xml.parsers",
            "javax.xml.soap", "javax.xml.stream", "javax.xml.stream.events", "javax.xml.stream.util",
            "javax.xml.transform", "javax.xml.transform.dom", "javax.xml.transform.sax", "javax.xml.transform.stax",
            "javax.xml.transform.stream", "javax.xml.validation", "javax.xml.ws", "javax.xml.ws.handler",
            "javax.xml.ws.handler.soap", "javax.xml.ws.http", "javax.xml.ws.soap", "javax.xml.ws.spi",
            "javax.xml.ws.spi.http", "javax.xml.ws.wsaddressing", "javax.xml.xpath", "org.ietf.jgss", "org.omg.CORBA",
            "org.omg.CORBA.DynAnyPackage", "org.omg.CORBA.ORBPackage", "org.omg.CORBA.TypeCodePackage",
            "org.omg.CORBA.portable", "org.omg.CORBA_2_3", "org.omg.CORBA_2_3.portable", "org.omg.CosNaming",
            "org.omg.CosNaming.NamingContextExtPackage", "org.omg.CosNaming.NamingContextPackage", "org.omg.Dynamic",
            "org.omg.DynamicAny", "org.omg.DynamicAny.DynAnyFactoryPackage", "org.omg.DynamicAny.DynAnyPackage",
            "org.omg.IOP", "org.omg.IOP.CodecFactoryPackage", "org.omg.IOP.CodecPackage", "org.omg.Messaging",
            "org.omg.PortableInterceptor", "org.omg.PortableInterceptor.ORBInitInfoPackage", "org.omg.PortableServer",
            "org.omg.PortableServer.CurrentPackage", "org.omg.PortableServer.POAManagerPackage",
            "org.omg.PortableServer.POAPackage", "org.omg.PortableServer.ServantLocatorPackage",
            "org.omg.PortableServer.portable", "org.omg.SendingContext", "org.omg.stub.java.rmi", "org.w3c.dom",
            "org.w3c.dom.bootstrap", "org.w3c.dom.events", "org.w3c.dom.ls", "org.w3c.dom.views", "org.xml.sax",
            "org.xml.sax.ext", "org.xml.sax.helpers");

    private static final List<String> VENDOR_PACKAGES = Arrays.asList("sun");

    public static Boolean contains(String packageName) {
        if (packageName == null || packageName.length() < 1) {
            return false;
        }

        if (getJdkPackageList().contains(packageName)) {
            return true;
        }

        for (String vpkg : VENDOR_PACKAGES) {
            if (packageName.startsWith(vpkg)) {
                return true;
            }
        }
        return false;
    }

    public static List<String> getJdkPackageList() {
        return getJdkPackageList(getRuntimeVersion());
    }

    public static List<String> getJdkPackageList(String version) {
        if (version == null) {
            return new ArrayList<String>();
        }

        // Do we have any usecase to distinguish them?
        switch (version) {
        default:
            return JDK_PACKAGES;
        }
    }

    private static String getRuntimeVersion() {
        return System.getProperty("java.specification.version");
    }

}