From 3e970fc8368750d3b177fe69a43a97fd49b2c446 Mon Sep 17 00:00:00 2001 From: Karl Pauls Date: Fri, 13 Apr 2018 21:13:16 +0000 Subject: [PATCH] FELIX-5800: calculate system package exports at runtime on jpms, optionally with uses constraints, and cleanup the existing default definitions. git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1829104 13f79535-47bb-0310-9956-ffa450edef68 --- .../felix/framework/ExtensionManager.java | 545 ++-- .../org/apache/felix/framework/Felix.java | 48 +- .../framework/util/ClassFileVisitor.java | 85 + .../felix/framework/util/ClassParser.java | 2808 +++++++++++++++++ .../felix/framework/util/FelixConstants.java | 1 + .../org/apache/felix/framework/util/Util.java | 58 +- .../src/main/resources/default.properties | 1077 ++----- 7 files changed, 3542 insertions(+), 1080 deletions(-) create mode 100644 osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassFileVisitor.java create mode 100644 osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassParser.java diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java index 4f8a1649981..c4ba397f461 100644 --- a/osgi-r7/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java @@ -22,6 +22,7 @@ import org.apache.felix.framework.cache.DirectoryContent; import org.apache.felix.framework.cache.JarContent; import org.apache.felix.framework.ext.ClassPathExtenderFactory; +import org.apache.felix.framework.util.ClassParser; import org.apache.felix.framework.util.FelixConstants; import org.apache.felix.framework.util.ImmutableList; import org.apache.felix.framework.util.ImmutableMap; @@ -33,6 +34,7 @@ import org.apache.felix.framework.wiring.BundleCapabilityImpl; import org.apache.felix.framework.wiring.BundleRequirementImpl; import org.apache.felix.framework.wiring.BundleWireImpl; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; import org.osgi.framework.AdminPermission; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; @@ -50,13 +52,20 @@ import org.osgi.framework.wiring.BundleWiring; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.net.URI; import java.net.URL; import java.security.AccessController; import java.security.AllPermission; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -70,6 +79,10 @@ import java.util.Properties; import java.util.ServiceLoader; import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -146,12 +159,8 @@ class ExtensionManager implements Content } private final Logger m_logger; - private final Map m_configMap; - private final Map m_headerMap = new StringMap(); - private final Map m_originalHeaderMap = new StringMap(); - private final BundleRevisionImpl m_systemBundleRevision; - private volatile List m_capabilities = Collections.EMPTY_LIST; - private volatile Set m_exportNames = Collections.EMPTY_SET; + private volatile ExtensionManagerRevision m_systemBundleRevision; + private final List m_extensionTuples = Collections.synchronizedList(new ArrayList()); private final List m_resolvedExtensions = new CopyOnWriteArrayList(); @@ -180,96 +189,23 @@ public ExtensionTuple(BundleActivator activator, Bundle bundle) * instance. * * @param logger the logger to use. - * @param configMap the configuration to read properties from. - * @param felix the framework. */ ExtensionManager(Logger logger, Map configMap, Felix felix) { m_logger = logger; - m_configMap = configMap; - m_systemBundleRevision = new ExtensionManagerRevision(felix); - -// TODO: FRAMEWORK - Not all of this stuff really belongs here, probably only exports. - // Populate system bundle header map. - m_headerMap.put(FelixConstants.BUNDLE_VERSION, - m_configMap.get(FelixConstants.FELIX_VERSION_PROPERTY)); - m_headerMap.put(FelixConstants.BUNDLE_SYMBOLICNAME, - FelixConstants.SYSTEM_BUNDLE_SYMBOLICNAME); - m_headerMap.put(FelixConstants.BUNDLE_NAME, "System Bundle"); - m_headerMap.put(FelixConstants.BUNDLE_DESCRIPTION, - "This bundle is system specific; it implements various system services."); - m_headerMap.put(FelixConstants.EXPORT_SERVICE, - "org.osgi.service.packageadmin.PackageAdmin," + - "org.osgi.service.startlevel.StartLevel," + - "org.osgi.service.url.URLHandlers"); - - Properties configProps = Util.toProperties(m_configMap); - // The system bundle exports framework packages as well as - // arbitrary user-defined packages from the system class path. - // We must construct the system bundle's export metadata. - // Get configuration property that specifies which class path - // packages should be exported by the system bundle. - String syspkgs = - "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ? - Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES) : - configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES); - - syspkgs = (syspkgs == null) ? "" : syspkgs; - - // If any extra packages are specified, then append them. - String pkgextra = - "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ? - Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA) : - configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA); - - syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0)) - ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra : "," + pkgextra); - - m_headerMap.put(FelixConstants.BUNDLE_MANIFESTVERSION, "2"); - m_headerMap.put(FelixConstants.EXPORT_PACKAGE, syspkgs); - - // The system bundle alsp provides framework generic capabilities - // as well as arbitrary user-defined generic capabilities. We must - // construct the system bundle's capabilitie metadata. Get the - // configuration property that specifies which capabilities should - // be provided by the system bundle. - String syscaps = Util.getPropertyWithSubs(configProps, Constants.FRAMEWORK_SYSTEMCAPABILITIES); - - syscaps = (syscaps == null) ? "" : syscaps; - - // If any extra capabilities are specified, then append them. - String capextra = Util.getPropertyWithSubs(configProps, Constants.FRAMEWORK_SYSTEMCAPABILITIES_EXTRA); - syscaps = ((capextra == null) || (capextra.trim().length() == 0)) - ? syscaps : syscaps + (capextra.trim().startsWith(",") ? capextra : "," + capextra); - m_headerMap.put(FelixConstants.PROVIDE_CAPABILITY, syscaps); - m_originalHeaderMap.putAll(m_headerMap); - try - { - ManifestParser mp = new ManifestParser( - m_logger, m_configMap, m_systemBundleRevision, m_headerMap); - List caps = ManifestParser.aliasSymbolicName(mp.getCapabilities(), m_systemBundleRevision); - caps.add(buildNativeCapabilites()); - appendCapabilities(caps); - } - catch (Exception ex) - { - m_capabilities = Collections.EMPTY_LIST; - m_logger.log( - Logger.LOG_ERROR, - "Error parsing system bundle export statement: " - + syspkgs, ex); - } + + m_systemBundleRevision = new ExtensionManagerRevision(configMap, felix); } - protected BundleCapability buildNativeCapabilites() { - String osArchitecture = (String)m_configMap.get(FelixConstants.FRAMEWORK_PROCESSOR); - String osName = (String)m_configMap.get(FelixConstants.FRAMEWORK_OS_NAME); - String osVersion = (String)m_configMap.get(FelixConstants.FRAMEWORK_OS_VERSION); - String userLang = (String)m_configMap.get(FelixConstants.FRAMEWORK_LANGUAGE); + protected BundleCapability buildNativeCapabilites(BundleRevisionImpl revision, Map configMap) { + String osArchitecture = (String) configMap.get(FelixConstants.FRAMEWORK_PROCESSOR); + String osName = (String) configMap.get(FelixConstants.FRAMEWORK_OS_NAME); + String osVersion = (String) configMap.get(FelixConstants.FRAMEWORK_OS_VERSION); + String userLang = (String) configMap.get(FelixConstants.FRAMEWORK_LANGUAGE); Map attributes = new HashMap(); - + //Add all startup properties so we can match selection-filters - attributes.putAll(m_configMap); + attributes.putAll(configMap); if( osArchitecture != null ) { @@ -291,7 +227,134 @@ protected BundleCapability buildNativeCapabilites() { attributes.put(NativeNamespace.CAPABILITY_LANGUAGE_ATTRIBUTE, userLang); } - return new BundleCapabilityImpl(getRevision(), NativeNamespace.NATIVE_NAMESPACE, Collections. emptyMap(), attributes); + return new BundleCapabilityImpl(revision, NativeNamespace.NATIVE_NAMESPACE, Collections. emptyMap(), attributes); + } + + @IgnoreJRERequirement + void updateRevision(Felix felix, Map configMap) + { + Map config = new HashMap(configMap); + Properties defaultProperties = Util.loadDefaultProperties(m_logger); + + Util.initializeJPMSEE(felix._getProperty("java.specification.version"), defaultProperties, m_logger); + + String sysprops = felix._getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES); + + final Map> exports = Util.initializeJPMS(defaultProperties); + + if (exports != null && (sysprops == null || "true".equalsIgnoreCase(felix._getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)))) + { + java.nio.file.FileSystem fs = java.nio.file.FileSystems.getFileSystem(URI.create("jrt:/")); + final ClassParser classParser = new ClassParser(); + final Set imports = new HashSet(); + for (Set moduleImport : exports.values()) + { + for (String pkg : moduleImport) + { + if (!pkg.startsWith("java.")) + { + imports.add(pkg); + } + } + } + for (final String moduleKey : exports.keySet()) + { + int idx = moduleKey.indexOf("@"); + String module = idx == -1 ? moduleKey : moduleKey.substring(0, idx); + if (felix._getProperty(module) == null && !exports.get(moduleKey).isEmpty() && defaultProperties.getProperty(module) == null) + { + final SortedMap> referred = new TreeMap>(); + if ("true".equalsIgnoreCase(felix._getProperty(FelixConstants.CALCULATE_SYSTEMPACKAGES_USES))) + { + try + { + Properties cachedProps = new Properties(); + File modulesDir = felix.getDataFile(felix, "modules"); + modulesDir.mkdirs(); + File cached = new File(modulesDir, moduleKey + ".properties"); + if (cached.isFile()) + { + FileInputStream input = new FileInputStream(cached); + cachedProps.load(new InputStreamReader(input, "UTF-8")); + input.close(); + for (Enumeration keys = cachedProps.propertyNames(); keys.hasMoreElements();) + { + String pkg = (String) keys.nextElement(); + referred.put(pkg, new TreeSet(Arrays.asList(cachedProps.getProperty(pkg).split(",")))); + } + } + else + { + java.nio.file.Path path = fs.getPath("modules", module.substring("felix.jpms.".length())); + java.nio.file.Files.walkFileTree(path, (java.nio.file.FileVisitor) Felix.class.getClassLoader().loadClass("org.apache.felix.framework.util.ClassFileVisitor") + .getConstructor(Set.class, Set.class, ClassParser.class, SortedMap.class).newInstance(imports, exports.get(moduleKey), classParser, referred)); + for (String pkg : referred.keySet()) + { + SortedSet uses = referred.get(pkg); + if (uses != null && !uses.isEmpty()) + { + cachedProps.setProperty(pkg, String.join(",", uses)); + } + } + OutputStream output = new FileOutputStream(cached); + cachedProps.store(new OutputStreamWriter(output, "UTF-8"), null); + output.close(); + } + } + catch (Throwable e) + { + m_logger.log(Logger.LOG_WARNING, "Exception calculating JPMS module exports", e); + } + } + + String pkgs = ""; + + for (String pkg : exports.get(moduleKey)) + { + pkgs += "," + pkg; + SortedSet uses = referred.get(pkg); + if (uses != null && !uses.isEmpty()) + { + pkgs += ";uses:=\""; + String sep = ""; + for (String u : uses) + { + pkgs += sep + u; + sep = ","; + } + pkgs += "\""; + } + pkgs += ";version=\"" + defaultProperties.getProperty("felix.detect.java.version") + "\""; + } + defaultProperties.put(module, pkgs); + } + } + } + if(sysprops != null && "true".equalsIgnoreCase(felix._getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ) + { + defaultProperties.put(Constants.FRAMEWORK_SYSTEMPACKAGES, sysprops); + config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMPACKAGES)); + } + else if (sysprops == null) + { + config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMPACKAGES)); + } + + String syscaps = felix._getProperty(Constants.FRAMEWORK_SYSTEMCAPABILITIES); + if(syscaps == null) + { + config.put(Constants.FRAMEWORK_SYSTEMCAPABILITIES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMCAPABILITIES)); + } + + for (Map.Entry entry : defaultProperties.entrySet()) + { + if (!config.containsKey(entry.getKey())) + { + config.put(entry.getKey(), entry.getValue()); + } + } + + m_systemBundleRevision.update(config); } public BundleRevisionImpl getRevision() @@ -381,30 +444,6 @@ else if (content instanceof DirectoryContent) m_unresolvedExtensions.add(bri); } - public synchronized void removeExtensionBundles() - { - m_resolvedExtensions.clear(); - m_unresolvedExtensions.clear(); - m_failedExtensions.clear(); - m_headerMap.clear(); - m_headerMap.putAll(m_originalHeaderMap); - try - { - ManifestParser mp = new ManifestParser( - m_logger, m_configMap, m_systemBundleRevision, m_headerMap); - List caps = ManifestParser.aliasSymbolicName(mp.getCapabilities(), m_systemBundleRevision); - caps.add(buildNativeCapabilites()); - appendCapabilities(caps); - } - catch (Exception ex) - { - m_capabilities = Collections.EMPTY_LIST; - m_logger.log( - Logger.LOG_ERROR, - "Error parsing system bundle export statement", ex); - } - } - public synchronized List resolveExtensionBundles(Felix felix) { if (m_unresolvedExtensions.isEmpty()) @@ -459,11 +498,11 @@ public synchronized List resolveExtensionBundles(Felix felix) BundleWire wire = new BundleWireImpl(revision, revision.getDeclaredRequirements(BundleRevision.HOST_NAMESPACE).get(0), - m_systemBundleRevision, getCapabilities(BundleRevision.HOST_NAMESPACE).get(0)); + m_systemBundleRevision, m_systemBundleRevision.getWiring().getCapabilities(BundleRevision.HOST_NAMESPACE).get(0)); try { - revision.resolve(new BundleWiringImpl(m_logger, m_configMap, null, revision, null, + revision.resolve(new BundleWiringImpl(m_logger, m_systemBundleRevision.m_configMap, null, revision, null, Collections.singletonList(wire), Collections.EMPTY_MAP, Collections.EMPTY_MAP)); } catch (Exception ex) @@ -474,7 +513,7 @@ public synchronized List resolveExtensionBundles(Felix felix) felix.getDependencies().addDependent(wire); - appendCapabilities(entry.getKey().getDeclaredExtensionCapabilities(null)); + m_systemBundleRevision.appendCapabilities(entry.getKey().getDeclaredExtensionCapabilities(null)); for (BundleWire w : entry.getValue()) { if (!w.getRequirement().getNamespace().equals(BundleRevision.HOST_NAMESPACE) && @@ -642,6 +681,13 @@ void stopExtensionBundles(Felix felix) m_extensionTuples.clear(); } + public synchronized void removeExtensionBundles() + { + m_resolvedExtensions.clear(); + m_unresolvedExtensions.clear(); + m_failedExtensions.clear(); + } + private Map> findResolvableExtensions(List extensions, List alt) { // The idea is to loop through the extensions and try to resolve all unresolved extension. If we can't resolve @@ -659,7 +705,7 @@ private Map> findResolvableExtensions(List< outer: for (BundleRequirement req : bri.getDeclaredRequirements(null)) { // first see if we can resolve from the system bundle - for (BundleCapability cap : getCapabilities(req.getNamespace())) + for (BundleCapability cap : m_systemBundleRevision.getWiring().getCapabilities(req.getNamespace())) { if (req.matches(cap)) { @@ -756,83 +802,6 @@ private Map> findResolvableExtensions(List< return wires; } - private List getCapabilities(String namespace) - { - List caps = m_capabilities; - List result = caps; - if (namespace != null) - { - result = new ArrayList(); - for (BundleCapability cap : caps) - { - if (cap.getNamespace().equals(namespace)) - { - result.add(cap); - } - } - } - return result; - } - - private void appendCapabilities(List caps) - { - List newCaps = new ArrayList(m_capabilities.size() + caps.size()); - newCaps.addAll(m_capabilities); - newCaps.addAll(caps); - m_capabilities = ImmutableList.newInstance(newCaps); - m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(newCaps)); - } - - private String convertCapabilitiesToHeaders(List caps) - { - StringBuffer exportSB = new StringBuffer(""); - Set exportNames = new HashSet(); - - for (BundleCapability cap : caps) - { - if (cap.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE)) - { - // Add a comma separate if there is an existing package. - if (exportSB.length() > 0) - { - exportSB.append(", "); - } - - // Append exported package information. - exportSB.append(cap.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE)); - for (Entry entry : cap.getDirectives().entrySet()) - { - exportSB.append("; "); - exportSB.append(entry.getKey()); - exportSB.append(":=\""); - exportSB.append(entry.getValue()); - exportSB.append("\""); - } - for (Entry entry : cap.getAttributes().entrySet()) - { - if (!entry.getKey().equals(BundleRevision.PACKAGE_NAMESPACE) - && !entry.getKey().equals(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE) - && !entry.getKey().equals(Constants.BUNDLE_VERSION_ATTRIBUTE)) - { - exportSB.append("; "); - exportSB.append(entry.getKey()); - exportSB.append("=\""); - exportSB.append(entry.getValue()); - exportSB.append("\""); - } - } - - // Remember exported packages. - exportNames.add( - (String) cap.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE)); - } - } - - m_exportNames = exportNames; - - return exportSB.toString(); - } - public void close() { // Do nothing on close, since we have nothing open. @@ -889,14 +858,173 @@ public URL getEntryAsURL(String name) class ExtensionManagerRevision extends BundleRevisionImpl { - private final Version m_version; + private volatile Map m_configMap; + private final Map m_headerMap = new StringMap(); + private volatile List m_capabilities = Collections.EMPTY_LIST; + private volatile Set m_exportNames = Collections.EMPTY_SET; + private volatile Version m_version; private volatile BundleWiring m_wiring; - ExtensionManagerRevision(Felix felix) + ExtensionManagerRevision(Map configMap, Felix felix) { super(felix, "0"); - m_version = new Version((String) + + m_configMap = configMap; + +// TODO: FRAMEWORK - Not all of this stuff really belongs here + // Populate system bundle header map. + m_headerMap.put(FelixConstants.BUNDLE_VERSION, m_configMap.get(FelixConstants.FELIX_VERSION_PROPERTY)); + m_headerMap.put(FelixConstants.BUNDLE_SYMBOLICNAME, + FelixConstants.SYSTEM_BUNDLE_SYMBOLICNAME); + m_headerMap.put(FelixConstants.BUNDLE_NAME, "System Bundle"); + m_headerMap.put(FelixConstants.BUNDLE_DESCRIPTION, + "This bundle is system specific; it implements various system services."); + m_headerMap.put(FelixConstants.EXPORT_SERVICE, + "org.osgi.service.packageadmin.PackageAdmin," + + "org.osgi.service.startlevel.StartLevel," + + "org.osgi.service.url.URLHandlers"); + + + m_headerMap.put(FelixConstants.BUNDLE_MANIFESTVERSION, "2"); + + + m_version = new Version((String) m_configMap.get(FelixConstants.FELIX_VERSION_PROPERTY)); + + try + { + ManifestParser mp = new ManifestParser( + m_logger, m_configMap, this, m_headerMap); + List caps = ManifestParser.aliasSymbolicName(mp.getCapabilities(), this); + caps.add(buildNativeCapabilites(this, m_configMap)); + appendCapabilities(caps); + } + catch (Exception ex) + { + m_capabilities = Collections.EMPTY_LIST; + m_logger.log( + Logger.LOG_ERROR, + "Error parsing system bundle statement", ex); + } + } + + private void update(Map configMap) + { + Properties configProps = Util.toProperties(configMap); + // The system bundle exports framework packages as well as + // arbitrary user-defined packages from the system class path. + // We must construct the system bundle's export metadata. + // Get configuration property that specifies which class path + // packages should be exported by the system bundle. + String syspkgs = + "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ? + Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES) : + configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES); + + syspkgs = (syspkgs == null) ? "" : syspkgs; + + // If any extra packages are specified, then append them. + String pkgextra = + "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ? + Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA) : + configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA); + + syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0)) + ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra : "," + pkgextra); + + m_headerMap.put(FelixConstants.EXPORT_PACKAGE, syspkgs); + + // The system bundle alsp provides framework generic capabilities + // as well as arbitrary user-defined generic capabilities. We must + // construct the system bundle's capabilitie metadata. Get the + // configuration property that specifies which capabilities should + // be provided by the system bundle. + String syscaps = Util.getPropertyWithSubs(configProps, Constants.FRAMEWORK_SYSTEMCAPABILITIES); + + syscaps = (syscaps == null) ? "" : syscaps; + + // If any extra capabilities are specified, then append them. + String capextra = Util.getPropertyWithSubs(configProps, Constants.FRAMEWORK_SYSTEMCAPABILITIES_EXTRA); + syscaps = ((capextra == null) || (capextra.trim().length() == 0)) + ? syscaps : syscaps + (capextra.trim().startsWith(",") ? capextra : "," + capextra); + + m_headerMap.put(FelixConstants.PROVIDE_CAPABILITY, syscaps); + + try + { + ManifestParser mp = new ManifestParser( + m_logger, m_configMap, this, m_headerMap); + List caps = ManifestParser.aliasSymbolicName(mp.getCapabilities(), this); + caps.add(buildNativeCapabilites(this, m_configMap)); + m_capabilities = Collections.EMPTY_LIST; + appendCapabilities(caps); + } + catch (Exception ex) + { + m_capabilities = Collections.EMPTY_LIST; + m_logger.log( + Logger.LOG_ERROR, + "Error parsing system bundle statement.", ex); + } + } + + private void appendCapabilities(List caps) + { + List newCaps = new ArrayList(m_capabilities.size() + caps.size()); + newCaps.addAll(m_capabilities); + newCaps.addAll(caps); + m_capabilities = ImmutableList.newInstance(newCaps); + m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(newCaps)); + } + + private String convertCapabilitiesToHeaders(List caps) + { + StringBuffer exportSB = new StringBuffer(""); + Set exportNames = new HashSet(); + + for (BundleCapability cap : caps) + { + if (cap.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE)) + { + // Add a comma separate if there is an existing package. + if (exportSB.length() > 0) + { + exportSB.append(", "); + } + + // Append exported package information. + exportSB.append(cap.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE)); + for (Entry entry : cap.getDirectives().entrySet()) + { + exportSB.append("; "); + exportSB.append(entry.getKey()); + exportSB.append(":=\""); + exportSB.append(entry.getValue()); + exportSB.append("\""); + } + for (Entry entry : cap.getAttributes().entrySet()) + { + if (!entry.getKey().equals(BundleRevision.PACKAGE_NAMESPACE) + && !entry.getKey().equals(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE) + && !entry.getKey().equals(Constants.BUNDLE_VERSION_ATTRIBUTE)) + { + exportSB.append("; "); + exportSB.append(entry.getKey()); + exportSB.append("=\""); + exportSB.append(entry.getValue()); + exportSB.append("\""); + } + } + + // Remember exported packages. + exportNames.add( + (String) cap.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE)); + } + } + + m_exportNames = exportNames; + + return exportSB.toString(); } @Override @@ -908,7 +1036,24 @@ public Map getHeaders() @Override public List getDeclaredCapabilities(String namespace) { - return ExtensionManager.this.getCapabilities(namespace); + List caps = m_capabilities; + List result; + if (namespace != null) + { + result = new ArrayList(); + for (BundleCapability cap : caps) + { + if (cap.getNamespace().equals(namespace)) + { + result.add(cap); + } + } + } + else + { + result = new ArrayList(m_capabilities); + } + return result; } @Override @@ -1000,7 +1145,7 @@ public ClassLoader getClassLoader() @Override public List getCapabilities(String namespace) { - return ExtensionManager.this.getCapabilities(namespace); + return m_systemBundleRevision.getDeclaredCapabilities(namespace); } @Override @@ -1040,7 +1185,7 @@ public Class getClassByDelegation(String name) throws ClassNotFoundException } if (clazz == null) { - if (!m_exportNames.contains(Util.getClassPackage(name))) + if (!m_systemBundleRevision.m_exportNames.contains(Util.getClassPackage(name))) { throw new ClassNotFoundException(name); } diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/Felix.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/Felix.java index 49ffd0b6e0a..ba8cd1b8fd3 100644 --- a/osgi-r7/framework/src/main/java/org/apache/felix/framework/Felix.java +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/Felix.java @@ -437,6 +437,7 @@ public void serviceChanged(ServiceEvent event, Dictionary oldProps) // Create the extension manager, which we will use as the // revision for the system bundle. m_extensionManager = new ExtensionManager(m_logger, m_configMap, this); + try { addRevision(m_extensionManager.getRevision()); @@ -445,7 +446,7 @@ public void serviceChanged(ServiceEvent event, Dictionary oldProps) { // This should not throw an exception, but if so, lets convert it to // a runtime exception. - throw new RuntimeException(ex.getMessage()); + throw new RuntimeException("Exception creating system bundle revision", ex); } // Create event dispatcher. @@ -735,6 +736,25 @@ public void init(final FrameworkListener... listeners) throws BundleException maps[IDENTIFIER_MAP_IDX].put(new Long(0), this); m_installedBundles = maps; + + try + { + getResolver().removeRevision(m_extensionManager.getRevision()); + m_extensionManager.removeExtensionBundles(); + m_extensionManager.updateRevision(this, m_configMap); + if (!m_configMutableMap.containsKey(Constants.FRAMEWORK_SYSTEMPACKAGES)) + { + m_configMutableMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, m_extensionManager.getRevision().getHeaders().get(Constants.EXPORT_PACKAGE)); + } + getResolver().addRevision(m_extensionManager.getRevision()); + } + catch (Exception ex) + { + // This should not throw an exception, but if so, lets convert it to + // a runtime exception. + throw new BundleException("Exception creating system bundle revision", ex); + } + // Manually resolve the system bundle, which will cause its // state to be set to RESOLVED. try @@ -4848,41 +4868,16 @@ private void initializeFrameworkProperties() Properties defaultProperties = Util.loadDefaultProperties(m_logger); - Util.initializeJPMS(defaultProperties); - Util.initializeJPMSEE(_getProperty("java.specification.version"), defaultProperties, m_logger); // Set supported execution environments to default value, // if not explicitly configured. loadFromDefaultIfNotDefined(defaultProperties, Constants.FRAMEWORK_EXECUTIONENVIRONMENT); - String sysprops = _getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES); - if(sysprops != null && "true".equalsIgnoreCase(_getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ) - { - defaultProperties.put(Constants.FRAMEWORK_SYSTEMPACKAGES, sysprops); - m_configMutableMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMPACKAGES)); - } - else if (sysprops == null) - { - m_configMutableMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMPACKAGES)); - } - - String syscaps = _getProperty(Constants.FRAMEWORK_SYSTEMCAPABILITIES); - if(syscaps == null) - { - m_configMutableMap.put(Constants.FRAMEWORK_SYSTEMCAPABILITIES, Util.getPropertyWithSubs(defaultProperties, Constants.FRAMEWORK_SYSTEMCAPABILITIES)); - } - - loadFromDefaultIfNotDefined(defaultProperties, "ee-jpms"); - loadFromDefaultIfNotDefined(defaultProperties, "eecap-jpms"); - loadFromDefaultIfNotDefined(defaultProperties, "felix.detect.java.version"); - // Set supported native capabilities to default value, // if not explicitly configured. loadPrefixFromDefaultIfNotDefined(m_configMutableMap, defaultProperties, FelixConstants.NATIVE_OS_NAME_ALIAS_PREFIX); loadPrefixFromDefaultIfNotDefined(m_configMutableMap, defaultProperties, FelixConstants.NATIVE_PROC_NAME_ALIAS_PREFIX); - loadPrefixFromDefaultIfNotDefined(m_configMutableMap, defaultProperties, "felix.detect.jpms."); - loadPrefixFromDefaultIfNotDefined(m_configMutableMap, defaultProperties, "felix.jpms."); } private void loadFromDefaultIfNotDefined(Properties defaultProperties, String propertyName) @@ -5226,7 +5221,6 @@ public void stop(BundleContext context) m_securityManager = null; } - m_extensionManager.removeExtensionBundles(); m_dependencies.removeDependents(adapt(BundleRevision.class)); // Dispose of the bundle cache. diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassFileVisitor.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassFileVisitor.java new file mode 100644 index 00000000000..6722dac275d --- /dev/null +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassFileVisitor.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.felix.framework.util; + +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; + +import java.io.IOException; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeSet; + +@IgnoreJRERequirement +public class ClassFileVisitor extends java.nio.file.SimpleFileVisitor +{ + private final Set m_imports; + private final Set m_exports; + private final ClassParser m_classParser; + private final SortedMap> m_result; + + public ClassFileVisitor(Set imports, Set exports, ClassParser classParser, SortedMap> result) + { + m_imports = imports; + m_exports = exports; + m_classParser = classParser; + m_result = result; + } + + @Override + public java.nio.file.FileVisitResult visitFile(java.nio.file.Path file, java.nio.file.attribute.BasicFileAttributes attrs) throws IOException + { + if (file.getNameCount() > 3) + { + String name = file.subpath(2, file.getNameCount() - 1).toString().replace("/", "."); + if (m_exports.contains(name) && file.toString().endsWith(".class")) + { + SortedSet strings = m_result.get(name); + + if (!name.startsWith("java.")) + { + try + { + Set refs = m_classParser.parseClassFileUses(file.toString(), java.nio.file.Files.newInputStream(file)); + refs.retainAll(m_imports); + refs.remove(name); + if (strings == null) + { + strings = new TreeSet(refs); + m_result.put(name, strings); + } + else + { + strings.addAll(refs); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + else if (strings == null) + { + m_result.put(name, new TreeSet()); + } + } + } + return java.nio.file.FileVisitResult.CONTINUE; + } +} \ No newline at end of file diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassParser.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassParser.java new file mode 100644 index 00000000000..cb08530bca9 --- /dev/null +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/ClassParser.java @@ -0,0 +1,2808 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.felix.framework.util; + +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.ElementType; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * This class is based on code developed at https://github.com/bndtools/bnd + */ +public class ClassParser +{ + Map typeRefCache = new HashMap(); + Map descriptorCache = new HashMap(); + Map packageCache = new HashMap(); + + // MUST BE BEFORE PRIMITIVES, THEY USE THE DEFAULT PACKAGE!! + final static PackageRef DEFAULT_PACKAGE = new PackageRef(); + final static PackageRef PRIMITIVE_PACKAGE = new PackageRef(); + + final static TypeRef VOID = new ConcreteRef("V", "void", PRIMITIVE_PACKAGE); + final static TypeRef BOOLEAN = new ConcreteRef("Z", "boolean", PRIMITIVE_PACKAGE); + final static TypeRef BYTE = new ConcreteRef("B", "byte", PRIMITIVE_PACKAGE); + final static TypeRef CHAR = new ConcreteRef("C", "char", PRIMITIVE_PACKAGE); + final static TypeRef SHORT = new ConcreteRef("S", "short", PRIMITIVE_PACKAGE); + final static TypeRef INTEGER = new ConcreteRef("I", "int", PRIMITIVE_PACKAGE); + final static TypeRef LONG = new ConcreteRef("J", "long", PRIMITIVE_PACKAGE); + final static TypeRef DOUBLE = new ConcreteRef("D", "double", PRIMITIVE_PACKAGE); + final static TypeRef FLOAT = new ConcreteRef("F", "float", PRIMITIVE_PACKAGE); + + + { + packageCache.put("", DEFAULT_PACKAGE); + } + + private interface TypeRef extends Comparable + { + String getBinary(); + + String getFQN(); + + String getPath(); + + boolean isPrimitive(); + + TypeRef getClassRef(); + + PackageRef getPackageRef(); + + String getShortName(); + + String getSourcePath(); + + String getDottedOnly(); + + } + + private static class PackageRef implements Comparable + { + final String binaryName; + final String fqn; + + PackageRef(String binaryName) + { + this.binaryName = fqnToBinary(binaryName); + this.fqn = binaryToFQN(binaryName); + } + + PackageRef() + { + this.binaryName = ""; + this.fqn = "."; + } + + public String getFQN() + { + return fqn; + } + + @Override + public String toString() + { + return fqn; + } + + boolean isPrimitivePackage() + { + return this == PRIMITIVE_PACKAGE; + } + + @Override + public int compareTo(PackageRef other) + { + return fqn.compareTo(other.fqn); + } + + @Override + public boolean equals(Object o) + { + assert o instanceof PackageRef; + return o == this; + } + + @Override + public int hashCode() + { + return super.hashCode(); + } + + + } + + // We "intern" the + private static class ConcreteRef implements TypeRef + { + final String binaryName; + final String fqn; + final boolean primitive; + final PackageRef packageRef; + + ConcreteRef(PackageRef packageRef, String binaryName) + { + this.binaryName = binaryName; + this.fqn = binaryToFQN(binaryName); + this.primitive = false; + this.packageRef = packageRef; + } + + ConcreteRef(String binaryName, String fqn, PackageRef pref) + { + this.binaryName = binaryName; + this.fqn = fqn; + this.primitive = true; + this.packageRef = pref; + } + + @Override + public String getBinary() + { + return binaryName; + } + + @Override + public String getPath() + { + return binaryName + ".class"; + } + + @Override + public String getSourcePath() + { + return binaryName + ".java"; + } + + @Override + public String getFQN() + { + return fqn; + } + + @Override + public String getDottedOnly() + { + return fqn.replace('$', '.'); + } + + @Override + public boolean isPrimitive() + { + return primitive; + } + + @Override + public TypeRef getClassRef() + { + return this; + } + + @Override + public PackageRef getPackageRef() + { + return packageRef; + } + + @Override + public String getShortName() + { + int n = binaryName.lastIndexOf('/'); + return binaryName.substring(n + 1); + } + + @Override + public String toString() + { + return fqn; + } + + @Override + public boolean equals(Object other) + { + assert other instanceof TypeRef; + return this == other; + } + + @Override + public int compareTo(TypeRef other) + { + if (this == other) + { + return 0; + } + return fqn.compareTo(other.getFQN()); + } + + @Override + public int hashCode() + { + return super.hashCode(); + } + + } + + private static class ArrayRef implements TypeRef + { + final TypeRef component; + + ArrayRef(TypeRef component) + { + this.component = component; + } + + @Override + public String getBinary() + { + return "[" + component.getBinary(); + } + + @Override + public String getFQN() + { + return component.getFQN() + "[]"; + } + + @Override + public String getPath() + { + return component.getPath(); + } + + @Override + public String getSourcePath() + { + return component.getSourcePath(); + } + + @Override + public boolean isPrimitive() + { + return false; + } + + @Override + public TypeRef getClassRef() + { + return component.getClassRef(); + } + + @Override + public boolean equals(Object other) + { + if (other == null || other.getClass() != getClass()) + { + return false; + } + + return component.equals(((ArrayRef) other).component); + } + + @Override + public PackageRef getPackageRef() + { + return component.getPackageRef(); + } + + @Override + public String getShortName() + { + return component.getShortName() + "[]"; + } + + @Override + public String toString() + { + return component.toString() + "[]"; + } + + @Override + public String getDottedOnly() + { + return component.getDottedOnly(); + } + + @Override + public int compareTo(TypeRef other) + { + if (this == other) + { + return 0; + } + + return getFQN().compareTo(other.getFQN()); + } + + @Override + public int hashCode() + { + return super.hashCode(); + } + } + + private TypeRef getTypeRef(String binaryClassName) + { + TypeRef ref = typeRefCache.get(binaryClassName); + if (ref != null) + { + return ref; + } + + if (binaryClassName.startsWith("[")) + { + ref = getTypeRef(binaryClassName.substring(1)); + ref = new ArrayRef(ref); + } + else + { + if (binaryClassName.length() == 1) + { + switch (binaryClassName.charAt(0)) + { + case 'V': + return VOID; + case 'B': + return BYTE; + case 'C': + return CHAR; + case 'I': + return INTEGER; + case 'S': + return SHORT; + case 'D': + return DOUBLE; + case 'F': + return FLOAT; + case 'J': + return LONG; + case 'Z': + return BOOLEAN; + } + // falls trough for other 1 letter class names + } + if (binaryClassName.startsWith("L") && binaryClassName.endsWith(";")) + { + binaryClassName = binaryClassName.substring(1, binaryClassName.length() - 1); + } + ref = typeRefCache.get(binaryClassName); + if (ref != null) + { + return ref; + } + + PackageRef pref; + int n = binaryClassName.lastIndexOf('/'); + if (n < 0) + { + pref = DEFAULT_PACKAGE; + } + else + { + pref = getPackageRef(binaryClassName.substring(0, n)); + } + + ref = new ConcreteRef(pref, binaryClassName); + } + + typeRefCache.put(binaryClassName, ref); + return ref; + } + + private PackageRef getPackageRef(String binaryPackName) + { + if (binaryPackName.indexOf('.') >= 0) + { + binaryPackName = binaryPackName.replace('.', '/'); + } + PackageRef ref = packageCache.get(binaryPackName); + if (ref != null) + { + return ref; + } + + ref = new PackageRef(binaryPackName); + packageCache.put(binaryPackName, ref); + return ref; + } + + private Descriptor getDescriptor(String descriptor) + { + Descriptor d = descriptorCache.get(descriptor); + if (d != null) + { + return d; + } + d = new Descriptor(descriptor); + descriptorCache.put(descriptor, d); + return d; + } + + private class Descriptor + { + final TypeRef type; + final TypeRef[] prototype; + final String descriptor; + + Descriptor(String descriptor) + { + this.descriptor = descriptor; + int index = 0; + List types = new ArrayList(); + if (descriptor.charAt(index) == '(') + { + index++; + while (descriptor.charAt(index) != ')') + { + index = parse(types, descriptor, index); + } + index++; // skip ) + prototype = types.toArray(new TypeRef[0]); + types.clear(); + } + else + { + prototype = null; + } + + index = parse(types, descriptor, index); + type = types.get(0); + } + + int parse(List types, String descriptor, int index) + { + char c; + StringBuilder sb = new StringBuilder(); + while ((c = descriptor.charAt(index++)) == '[') + { + sb.append('['); + } + + switch (c) + { + case 'L': + while ((c = descriptor.charAt(index++)) != ';') + { + // TODO + sb.append(c); + } + break; + + case 'V': + case 'B': + case 'C': + case 'I': + case 'S': + case 'D': + case 'F': + case 'J': + case 'Z': + sb.append(c); + break; + + default: + throw new IllegalArgumentException( + "Invalid type in descriptor: " + c + " from " + descriptor + "[" + index + "]"); + } + types.add(getTypeRef(sb.toString())); + return index; + } + + @Override + public boolean equals(Object other) + { + if (other == null || other.getClass() != getClass()) + { + return false; + } + + return Arrays.equals(prototype, ((Descriptor) other).prototype) && type == ((Descriptor) other).type; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = prime + type.hashCode(); + result = prime * result + ((prototype == null) ? 0 : Arrays.hashCode(prototype)); + return result; + } + + @Override + public String toString() + { + return descriptor; + } + } + + private static String binaryToFQN(String binary) + { + StringBuilder sb = new StringBuilder(); + for (int i = 0, l = binary.length(); i < l; i++) + { + char c = binary.charAt(i); + + if (c == '/') + { + sb.append('.'); + } + else + { + sb.append(c); + } + } + String result = sb.toString(); + assert result.length() > 0; + return result; + } + + private static String fqnToBinary(String binary) + { + return binary.replace('.', '/'); + } + + + TypeRef getTypeRefFromFQN(String fqn) + { + if (fqn.equals("boolean")) + { + return BOOLEAN; + } + + if (fqn.equals("byte")) + { + return BOOLEAN; + } + + if (fqn.equals("char")) + { + return CHAR; + } + + if (fqn.equals("short")) + { + return SHORT; + } + + if (fqn.equals("int")) + { + return INTEGER; + } + + if (fqn.equals("long")) + { + return LONG; + } + + if (fqn.equals("float")) + { + return FLOAT; + } + + if (fqn.equals("double")) + { + return DOUBLE; + } + + return getTypeRef(fqnToBinary(fqn)); + } + + + public Set parseClassFileUses(String path, InputStream in) throws Exception + { + DataInputStream din = new DataInputStream(in); + try + { + return new Clazz(this, path).parseClassFileData(din); + } + finally + { + din.close(); + } + } + + private static class Clazz + { + + class ClassConstant + { + int cname; + boolean referred; + + ClassConstant(int class_index) + { + this.cname = class_index; + } + + public String getName() + { + return (String) pool[cname]; + } + + @Override + public String toString() + { + return "ClassConstant[" + getName() + "]"; + } + } + + + enum CONSTANT + { + Zero(0), + Utf8, + Two, + Integer(4), + Float(4), + Long(8), + Double(8), + Class(2), + String(2), + Fieldref(4), + Methodref(4), + InterfaceMethodref(4), + NameAndType(4), + Thirteen, + Fourteen, + MethodHandle(3), + MethodType(2), + Seventeen, + InvokeDynamic(4), + Module(2), + Package(2); + private final int skip; + + CONSTANT(int skip) + { + this.skip = skip; + } + + CONSTANT() + { + this.skip = -1; + } + + int skip() + { + return skip; + } + } + + final static int ACC_MODULE = 0x8000; + + static protected class Assoc + { + Assoc(CONSTANT tag, int a, int b) + { + this.tag = tag; + this.a = a; + this.b = b; + } + + CONSTANT tag; + int a; + int b; + + @Override + public String toString() + { + return "Assoc[" + tag + ", " + a + "," + b + "]"; + } + } + + public abstract class Def + { + + final int access; + + public Def(int access) + { + this.access = access; + } + + } + + public class FieldDef extends Def + { + final String name; + final Descriptor descriptor; + String signature; + Object constant; + + + public FieldDef(int access, String name, String descriptor) + { + super(access); + this.name = name; + this.descriptor = Clazz.this.classParser.getDescriptor(descriptor); + } + + + @Override + public String toString() + { + return name; + } + } + + public class MethodDef extends FieldDef + { + public MethodDef(int access, String method, String descriptor) + { + super(access, method, descriptor); + } + } + + boolean hasDefaultConstructor; + + int depth = 0; + + TypeRef className; + Object pool[]; + int intPool[]; + Set imports = new HashSet(); + String path; + int minor = 0; + int major = 0; + int accessx = 0; + int forName = 0; + int class$ = 0; + TypeRef[] interfaces; + TypeRef zuper; + FieldDef last = null; + final ClassParser classParser; + String classSignature; + + private boolean detectLdc; + + public Clazz(ClassParser classParser, String path) + { + this.path = path; + this.classParser = classParser; + } + + Set parseClassFileData(DataInput in) throws Exception + { + + ++depth; + + boolean crawl = false; // Crawl the byte code if we have a + // collector + int magic = in.readInt(); + if (magic != 0xCAFEBABE) + { + throw new IOException("Not a valid class file (no CAFEBABE header)"); + } + + minor = in.readUnsignedShort(); // minor version + major = in.readUnsignedShort(); // major version + int count = in.readUnsignedShort(); + pool = new Object[count]; + intPool = new int[count]; + + CONSTANT[] tags = CONSTANT.values(); + process: + for (int poolIndex = 1; poolIndex < count; poolIndex++) + { + int tagValue = in.readUnsignedByte(); + if (tagValue >= tags.length) + { + throw new IOException("Unrecognized constant pool tag value " + tagValue); + } + CONSTANT tag = tags[tagValue]; + switch (tag) + { + case Zero: + break process; + case Utf8: + constantUtf8(in, poolIndex); + break; + case Integer: + constantInteger(in, poolIndex); + break; + case Float: + constantFloat(in, poolIndex); + break; + // For some insane optimization reason, + // the long and double entries take two slots in the + // constant pool. See 4.4.5 + case Long: + constantLong(in, poolIndex); + poolIndex++; + break; + case Double: + constantDouble(in, poolIndex); + poolIndex++; + break; + case Class: + constantClass(in, poolIndex); + break; + case String: + constantString(in, poolIndex); + break; + case Fieldref: + case Methodref: + case InterfaceMethodref: + ref(in, poolIndex); + break; + case NameAndType: + nameAndType(in, poolIndex, tag); + break; + case MethodHandle: + methodHandle(in, poolIndex, tag); + break; + case MethodType: + methodType(in, poolIndex, tag); + break; + case InvokeDynamic: + invokeDynamic(in, poolIndex, tag); + break; + default: + int skip = tag.skip(); + if (skip == -1) + { + throw new IOException("Invalid tag " + tag); + } + in.skipBytes(skip); + break; + } + } + + pool(pool, intPool); + + // All name& type and class constant records contain classParser we must + // treat + // as references, though not API + for (Object o : pool) + { + if (o == null) + { + continue; + } + + if (o instanceof Assoc) + { + Assoc assoc = (Assoc) o; + switch (assoc.tag) + { + case Fieldref: + case Methodref: + case InterfaceMethodref: + classConstRef(assoc.a); + break; + + case NameAndType: + case MethodType: + referTo(assoc.b, 0); // Descriptor + break; + default: + break; + } + } + } + + // + // There is a bug in J8 compiler that leaves an + // orphan class constant. So when we have a CC that + // is not referenced by fieldrefs, method refs, or other + // refs then we need to crawl the byte code. + // + for (Object o : pool) + { + if (o instanceof ClassConstant) + { + ClassConstant cc = (ClassConstant) o; + if (cc.referred == false) + { + detectLdc = true; + } + } + } + + /* + * Parse after the constant pool, code thanks to Hans Christian + * Falkenberg + */ + + accessx = in.readUnsignedShort(); // access + + int this_class = in.readUnsignedShort(); + className = classParser.getTypeRef((String) pool[intPool[this_class]]); + if (!isModule()) + { + referTo(className, Modifier.PUBLIC); + } + + int super_class = in.readUnsignedShort(); + String superName = (String) pool[intPool[super_class]]; + if (superName != null) + { + zuper = classParser.getTypeRef(superName); + } + + if (zuper != null) + { + referTo(zuper, accessx); + } + + int interfacesCount = in.readUnsignedShort(); + if (interfacesCount > 0) + { + interfaces = new TypeRef[interfacesCount]; + for (int i = 0; i < interfacesCount; i++) + { + interfaces[i] = classParser.getTypeRef((String) pool[intPool[in.readUnsignedShort()]]); + referTo(interfaces[i], accessx); + } + } + + int fieldsCount = in.readUnsignedShort(); + for (int i = 0; i < fieldsCount; i++) + { + int access_flags = in.readUnsignedShort(); // skip access flags + int name_index = in.readUnsignedShort(); + int descriptor_index = in.readUnsignedShort(); + + // Java prior to 1.5 used a weird + // static variable to hold the com.X.class + // result construct. If it did not find it + // it would create a variable class$com$X + // that would be used to hold the class + // object gotten with Class.forName ... + // Stupidly, they did not actively use the + // class name for the field type, so bnd + // would not see a reference. We detect + // this case and add an artificial descriptor + String name = pool[name_index].toString(); // name_index + if (name.startsWith("class$") || name.startsWith("$class$")) + { + crawl = true; + } + + referTo(descriptor_index, access_flags); + doAttributes(in, ElementType.FIELD, false, access_flags); + } + + // + // Check if we have to crawl the code to find + // the ldc(_w) invokestatic Class.forName + // if so, calculate the method ref index so we + // can do this efficiently + // + if (crawl) + { + forName = findMethodReference("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); + class$ = findMethodReference(className.getBinary(), "class$", "(Ljava/lang/String;)Ljava/lang/Class;"); + } + else if (major == 48) + { + forName = findMethodReference("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); + if (forName > 0) + { + crawl = true; + class$ = findMethodReference(className.getBinary(), "class$", + "(Ljava/lang/String;)Ljava/lang/Class;"); + } + } + + // There are some serious changes in the + // class file format. So we do not do any crawling + // it has also become less important + // however, jDK8 has a bug that leaves an orphan ClassConstnat + // so if we have those, we need to also crawl the byte codes. + // if (major >= JAVA.OpenJDK7.major) + + crawl |= detectLdc; + + // + // Handle the methods + // + int methodCount = in.readUnsignedShort(); + for (int i = 0; i < methodCount; i++) + { + int access_flags = in.readUnsignedShort(); + int name_index = in.readUnsignedShort(); + int descriptor_index = in.readUnsignedShort(); + String name = pool[name_index].toString(); + String descriptor = pool[descriptor_index].toString(); + MethodDef mdef = null; + referTo(descriptor_index, access_flags); + + if ("".equals(name)) + { + if (Modifier.isPublic(access_flags) && "()V".equals(descriptor)) + { + hasDefaultConstructor = true; + } + doAttributes(in, ElementType.CONSTRUCTOR, crawl, access_flags); + } + else + { + doAttributes(in, ElementType.METHOD, crawl, access_flags); + } + } + last = null; + + doAttributes(in, ElementType.TYPE, false, accessx); + + // + // Parse all the classParser we found + // + reset(); + return imports; + } + + private void constantFloat(DataInput in, int poolIndex) throws IOException + { + in.skipBytes(4); + } + + private void constantInteger(DataInput in, int poolIndex) throws IOException + { + intPool[poolIndex] = in.readInt(); + pool[poolIndex] = intPool[poolIndex]; + } + + private void pool(@SuppressWarnings("unused") Object[] pool, @SuppressWarnings("unused") int[] intPool) + { + } + + private void nameAndType(DataInput in, int poolIndex, CONSTANT tag) throws IOException + { + int name_index = in.readUnsignedShort(); + int descriptor_index = in.readUnsignedShort(); + pool[poolIndex] = new Assoc(tag, name_index, descriptor_index); + } + + private void methodType(DataInput in, int poolIndex, CONSTANT tag) throws IOException + { + int descriptor_index = in.readUnsignedShort(); + pool[poolIndex] = new Assoc(tag, 0, descriptor_index); + } + + private void methodHandle(DataInput in, int poolIndex, CONSTANT tag) throws IOException + { + int reference_kind = in.readUnsignedByte(); + int reference_index = in.readUnsignedShort(); + pool[poolIndex] = new Assoc(tag, reference_kind, reference_index); + } + + private void invokeDynamic(DataInput in, int poolIndex, CONSTANT tag) throws IOException + { + int bootstrap_method_attr_index = in.readUnsignedShort(); + int name_and_type_index = in.readUnsignedShort(); + pool[poolIndex] = new Assoc(tag, bootstrap_method_attr_index, name_and_type_index); + } + + private void ref(DataInput in, int poolIndex) throws IOException + { + int class_index = in.readUnsignedShort(); + int name_and_type_index = in.readUnsignedShort(); + pool[poolIndex] = new Assoc(Clazz.CONSTANT.Methodref, class_index, name_and_type_index); + } + + private void constantString(DataInput in, int poolIndex) throws IOException + { + int string_index = in.readUnsignedShort(); + intPool[poolIndex] = string_index; + } + + private void constantClass(DataInput in, int poolIndex) throws IOException + { + int class_index = in.readUnsignedShort(); + intPool[poolIndex] = class_index; + ClassConstant c = new ClassConstant(class_index); + pool[poolIndex] = c; + } + + private void constantDouble(DataInput in, int poolIndex) throws IOException + { + in.skipBytes(8); + } + + private void constantLong(DataInput in, int poolIndex) throws IOException + { + in.skipBytes(8); + } + + private void constantUtf8(DataInput in, int poolIndex) throws IOException + { + // CONSTANT_Utf8 + + String name = in.readUTF(); + pool[poolIndex] = name; + } + + private int findMethodReference(String clazz, String methodname, String descriptor) + { + for (int i = 1; i < pool.length; i++) + { + if (pool[i] instanceof Assoc) + { + Assoc methodref = (Assoc) pool[i]; + if (methodref.tag == CONSTANT.Methodref) + { + // Method ref + int class_index = methodref.a; + int class_name_index = intPool[class_index]; + if (clazz.equals(pool[class_name_index])) + { + int name_and_type_index = methodref.b; + Assoc name_and_type = (Assoc) pool[name_and_type_index]; + if (name_and_type.tag == CONSTANT.NameAndType) + { + // Name and Type + int name_index = name_and_type.a; + int type_index = name_and_type.b; + if (methodname.equals(pool[name_index])) + { + if (descriptor.equals(pool[type_index])) + { + return i; + } + } + } + } + } + } + } + return -1; + } + + private void doAttributes(DataInput in, ElementType member, boolean crawl, int access_flags) throws Exception + { + int attributesCount = in.readUnsignedShort(); + for (int j = 0; j < attributesCount; j++) + { + // skip name CONSTANT_Utf8 pointer + doAttribute(in, member, crawl, access_flags); + } + } + + private static long getUnsignedInt(int x) + { + return x & 0x00000000ffffffffL; + } + + private static int getUnsingedByte(byte b) + { + return b & 0xFF; + } + + private static int getUnsingedShort(short s) + { + return s & 0xFFFF; + } + + private void doAttribute(DataInput in, ElementType member, boolean crawl, int access_flags) throws Exception + { + final int attribute_name_index = in.readUnsignedShort(); + final String attributeName = (String) pool[attribute_name_index]; + final long attribute_length = getUnsignedInt(in.readInt()); + if (attributeName.equals("Deprecated")) + { + } + else if (attributeName.equals("RuntimeVisibleAnnotations")) + { + doAnnotations(in, member, RetentionPolicy.RUNTIME, access_flags); + + } + else if (attributeName.equals("RuntimeInvisibleAnnotations")) + { + doAnnotations(in, member, RetentionPolicy.CLASS, access_flags); + + } + else if (attributeName.equals("RuntimeVisibleParameterAnnotations")) + { + doParameterAnnotations(in, member, RetentionPolicy.RUNTIME, access_flags); + + } + else if (attributeName.equals("RuntimeInvisibleParameterAnnotations")) + { + doParameterAnnotations(in, member, RetentionPolicy.CLASS, access_flags); + + } + else if (attributeName.equals("RuntimeVisibleTypeAnnotations")) + { + doTypeAnnotations(in, member, RetentionPolicy.RUNTIME, access_flags); + + } + else if (attributeName.equals("RuntimeInvisibleTypeAnnotations")) + { + doTypeAnnotations(in, member, RetentionPolicy.CLASS, access_flags); + + } + else if (attributeName.equals("InnerClasses")) + { + doInnerClasses(in); + + } + else if (attributeName.equals("EnclosingMethod")) + { + doEnclosingMethod(in); + + } + else if (attributeName.equals("SourceFile")) + { + doSourceFile(in); + + } + else if (attributeName.equals("Code")) + { + doCode(in, crawl); + + } + else if (attributeName.equals("Signature")) + { + doSignature(in, member, access_flags); + + } + else if (attributeName.equals("ConstantValue")) + { + doConstantValue(in); + + } + else if (attributeName.equals("AnnotationDefault")) + { + doElementValue(in, member, RetentionPolicy.RUNTIME, access_flags); + } + else if (attributeName.equals("Exceptions")) + { + doExceptions(in, access_flags); + + } + else if (attributeName.equals("BootstrapMethods")) + { + doBootstrapMethods(in); + + } + else if (attributeName.equals("StackMapTable")) + { + doStackMapTable(in); + + } + else + { + if (attribute_length > 0x7FFFFFFF) + { + throw new IllegalArgumentException("Attribute > 2Gb"); + } + in.skipBytes((int) attribute_length); + + } + } + + private void doEnclosingMethod(DataInput in) throws IOException + { + int cIndex = in.readUnsignedShort(); + int mIndex = in.readUnsignedShort(); + classConstRef(cIndex); + } + + private void doInnerClasses(DataInput in) throws Exception + { + int number_of_classes = in.readUnsignedShort(); + for (int i = 0; i < number_of_classes; i++) + { + int inner_class_info_index = in.readUnsignedShort(); + int outer_class_info_index = in.readUnsignedShort(); + int inner_name_index = in.readUnsignedShort(); + int inner_class_access_flags = in.readUnsignedShort(); + } + } + + void doSignature(DataInput in, ElementType member, int access_flags) throws IOException + { + int signature_index = in.readUnsignedShort(); + String signature = (String) pool[signature_index]; + try + { + + parseDescriptor(signature, access_flags); + if (last != null) + { + last.signature = signature; + } + + if (member == ElementType.TYPE) + { + classSignature = signature; + } + + } + catch (Exception e) + { + throw new RuntimeException("Signature failed for " + signature, e); + } + } + + void doConstantValue(DataInput in) throws IOException + { + int constantValue_index = in.readUnsignedShort(); + } + + void doExceptions(DataInput in, int access_flags) throws IOException + { + int exception_count = in.readUnsignedShort(); + for (int i = 0; i < exception_count; i++) + { + int index = in.readUnsignedShort(); + ClassConstant cc = (ClassConstant) pool[index]; + TypeRef clazz = classParser.getTypeRef(cc.getName()); + referTo(clazz, access_flags); + } + } + + private void doCode(DataInput in, boolean crawl) throws Exception + { + /* int max_stack = */ + in.readUnsignedShort(); + /* int max_locals = */ + in.readUnsignedShort(); + int code_length = in.readInt(); + byte code[] = new byte[code_length]; + in.readFully(code, 0, code_length); + if (crawl) + { + crawl(code); + } + int exception_table_length = in.readUnsignedShort(); + for (int i = 0; i < exception_table_length; i++) + { + int start_pc = in.readUnsignedShort(); + int end_pc = in.readUnsignedShort(); + int handler_pc = in.readUnsignedShort(); + int catch_type = in.readUnsignedShort(); + classConstRef(catch_type); + } + doAttributes(in, ElementType.METHOD, false, 0); + } + + private void crawl(byte[] code) + { + ByteBuffer bb = ByteBuffer.wrap(code); + int lastReference = -1; + + while (bb.remaining() > 0) + { + int instruction = getUnsingedByte(bb.get()); + switch (instruction) + { + case ldc: + lastReference = getUnsingedByte(bb.get()); + classConstRef(lastReference); + break; + + case ldc_w: + lastReference = getUnsingedShort(bb.getShort()); + classConstRef(lastReference); + break; + + case anewarray: + case checkcast: + case instanceof_: + case new_: + { + int cref = getUnsingedShort(bb.getShort()); + classConstRef(cref); + lastReference = -1; + break; + } + + case multianewarray: + { + int cref = getUnsingedShort(bb.getShort()); + classConstRef(cref); + bb.get(); + lastReference = -1; + break; + } + + case invokespecial: + { + int mref = getUnsingedShort(bb.getShort()); + break; + } + + case invokevirtual: + { + int mref = getUnsingedShort(bb.getShort()); + break; + } + + case invokeinterface: + { + int mref = getUnsingedShort(bb.getShort()); + bb.get(); // read past the 'count' operand + bb.get(); // read past the reserved space for future operand + break; + } + + case invokestatic: + { + int methodref = getUnsingedShort(bb.getShort()); + + if ((methodref == forName || methodref == class$) && lastReference != -1 + && pool[intPool[lastReference]] instanceof String) + { + String fqn = (String) pool[intPool[lastReference]]; + if (!fqn.equals("class") && fqn.indexOf('.') > 0) + { + TypeRef clazz = classParser.getTypeRefFromFQN(fqn); + referTo(clazz, 0); + } + lastReference = -1; + } + break; + } + + /* + * 3/5: opcode, indexbyte1, indexbyte2 or iinc, indexbyte1, + * indexbyte2, countbyte1, countbyte2 + */ + case wide: + int opcode = getUnsingedByte(bb.get()); + bb.getShort(); // at least 3 bytes + if (opcode == iinc) + { + bb.getShort(); + } + break; + + case tableswitch: + // Skip to place divisible by 4 + while ((bb.position() & 0x3) != 0) + { + bb.get(); + } + /* int deflt = */ + bb.getInt(); + int low = bb.getInt(); + int high = bb.getInt(); + bb.position(bb.position() + (high - low + 1) * 4); + lastReference = -1; + break; + + case lookupswitch: + // Skip to place divisible by 4 + while ((bb.position() & 0x3) != 0) + { + int n = bb.get(); + assert n == 0; // x + } + /* deflt = */ + int deflt = bb.getInt(); + int npairs = bb.getInt(); + bb.position(bb.position() + npairs * 8); + lastReference = -1; + break; + + default: + lastReference = -1; + bb.position(bb.position() + OFFSETS[instruction]); + } + } + } + + private void doSourceFile(DataInput in) throws IOException + { + int sourcefile_index = in.readUnsignedShort(); + } + + private void doParameterAnnotations(DataInput in, ElementType member, RetentionPolicy policy, int access_flags) + throws Exception + { + int num_parameters = in.readUnsignedByte(); + for (int p = 0; p < num_parameters; p++) + { + doAnnotations(in, member, policy, access_flags); + } + } + + private void doTypeAnnotations(DataInput in, ElementType member, RetentionPolicy policy, int access_flags) + throws Exception + { + int num_annotations = in.readUnsignedShort(); + for (int p = 0; p < num_annotations; p++) + { + + // type_annotation { + // u1 target_type; + // union { + // type_parameter_target; + // supertype_target; + // type_parameter_bound_target; + // empty_target; + // method_formal_parameter_target; + // throws_target; + // localvar_target; + // catch_target; + // offset_target; + // type_argument_target; + // } target_info; + // type_path target_path; + // u2 type_index; + // u2 num_element_value_pairs; + // { u2 element_name_index; + // element_value value; + // } element_value_pairs[num_element_value_pairs]; + // } + + // Table 4.7.20-A. Interpretation of target_type values (Part 1) + + int target_type = in.readUnsignedByte(); + switch (target_type) + { + case 0x00: // type parameter declaration of generic class or + // interface + case 0x01: // type parameter declaration of generic method or + // constructor + // + // type_parameter_target { + // u1 type_parameter_index; + // } + in.skipBytes(1); + break; + + case 0x10: // type in extends clause of class or interface + // declaration (including the direct superclass of + // an anonymous class declaration), or in implements + // clause of interface declaration + // supertype_target { + // u2 supertype_index; + // } + + in.skipBytes(2); + break; + + case 0x11: // type in bound of type parameter declaration of + // generic class or interface + case 0x12: // type in bound of type parameter declaration of + // generic method or constructor + // type_parameter_bound_target { + // u1 type_parameter_index; + // u1 bound_index; + // } + in.skipBytes(2); + break; + + case 0x13: // type in field declaration + case 0x14: // return type of method, or type of newly + // constructed object + case 0x15: // receiver type of method or constructor + break; + + case 0x16: // type in formal parameter declaration of method, + // constructor, or lambda expression + // formal_parameter_target { + // u1 formal_parameter_index; + // } + in.skipBytes(1); + break; + + case 0x17: // type in throws clause of method or constructor + // throws_target { + // u2 throws_type_index; + // } + in.skipBytes(2); + break; + + case 0x40: // type in local variable declaration + case 0x41: // type in resource variable declaration + // localvar_target { + // u2 table_length; + // { u2 start_pc; + // u2 length; + // u2 index; + // } table[table_length]; + // } + int table_length = in.readUnsignedShort(); + in.skipBytes(table_length * 6); + break; + + case 0x42: // type in exception parameter declaration + // catch_target { + // u2 exception_table_index; + // } + in.skipBytes(2); + break; + + case 0x43: // type in instanceof expression + case 0x44: // type in new expression + case 0x45: // type in method reference expression using ::new + case 0x46: // type in method reference expression using + // ::Identifier + // offset_target { + // u2 offset; + // } + in.skipBytes(2); + break; + + case 0x47: // type in cast expression + case 0x48: // type argument for generic constructor in new + // expression or explicit constructor invocation + // statement + + case 0x49: // type argument for generic method in method + // invocation expression + case 0x4A: // type argument for generic constructor in method + // reference expression using ::new + case 0x4B: // type argument for generic method in method + // reference expression using ::Identifier + // type_argument_target { + // u2 offset; + // u1 type_argument_index; + // } + in.skipBytes(3); + break; + + } + + // The value of the target_path item denotes precisely which part of + // the type indicated by target_info is annotated. The format of the + // type_path structure is specified in §4.7.20.2. + // + // type_path { + // u1 path_length; + // { u1 type_path_kind; + // u1 type_argument_index; + // } path[path_length]; + // } + + int path_length = in.readUnsignedByte(); + in.skipBytes(path_length * 2); + + // + // Rest is identical to the normal annotations + doAnnotation(in, member, policy, access_flags); + } + } + + private void doAnnotations(DataInput in, ElementType member, RetentionPolicy policy, int access_flags) + throws Exception + { + int num_annotations = in.readUnsignedShort(); // # of annotations + for (int a = 0; a < num_annotations; a++) + { + doAnnotation(in, member, policy, access_flags); + } + } + + // annotation { + // u2 type_index; + // u2 num_element_value_pairs; { + // u2 element_name_index; + // element_value value; + // } + // element_value_pairs[num_element_value_pairs]; + // } + + private void doAnnotation(DataInput in, ElementType member, RetentionPolicy policy, int access_flags) throws IOException + { + int type_index = in.readUnsignedShort(); + + String typeName = (String) pool[type_index]; + if (typeName != null) + { + if (policy == RetentionPolicy.RUNTIME) + { + referTo(type_index, 0); + } + } + int num_element_value_pairs = in.readUnsignedShort(); + + for (int v = 0; v < num_element_value_pairs; v++) + { + in.readUnsignedShort(); + doElementValue(in, member, policy, access_flags); + } + } + + private Object doElementValue(DataInput in, ElementType member, RetentionPolicy policy, int access_flags) throws IOException + { + char tag = (char) in.readUnsignedByte(); + switch (tag) + { + case 'B': // Byte + case 'C': // Character + case 'I': // Integer + case 'S': // Short + int const_value_index = in.readUnsignedShort(); + return intPool[const_value_index]; + + case 'D': // Double + case 'F': // Float + case 's': // String + case 'J': // Long + const_value_index = in.readUnsignedShort(); + return pool[const_value_index]; + + case 'Z': // Boolean + const_value_index = in.readUnsignedShort(); + return pool[const_value_index] == null || pool[const_value_index].equals(0) ? false : true; + + case 'e': // enum constant + int type_name_index = in.readUnsignedShort(); + if (policy == RetentionPolicy.RUNTIME) + { + referTo(type_name_index, 0); + } + int const_name_index = in.readUnsignedShort(); + return pool[const_name_index]; + + case 'c': // Class + int class_info_index = in.readUnsignedShort(); + TypeRef name = classParser.getTypeRef((String) pool[class_info_index]); + if (policy == RetentionPolicy.RUNTIME) + { + referTo(class_info_index, 0); + } + return name; + + case '@': // Annotation type + doAnnotation(in, member, policy, access_flags); + + case '[': // Array + int num_values = in.readUnsignedShort(); + Object[] result = new Object[num_values]; + for (int i = 0; i < num_values; i++) + { + result[i] = doElementValue(in, member, policy, access_flags); + } + return result; + + default: + throw new IllegalArgumentException("Invalid value for Annotation ElementValue tag " + tag); + } + } + + /* + * We don't currently process BootstrapMethods. We walk the data structure + * to consume the attribute. + */ + private void doBootstrapMethods(DataInput in) throws IOException + { + final int num_bootstrap_methods = in.readUnsignedShort(); + for (int v = 0; v < num_bootstrap_methods; v++) + { + final int bootstrap_method_ref = in.readUnsignedShort(); + final int num_bootstrap_arguments = in.readUnsignedShort(); + for (int a = 0; a < num_bootstrap_arguments; a++) + { + final int bootstrap_argument = in.readUnsignedShort(); + } + } + } + + /* + * The verifier can require access to types only referenced in StackMapTable + * attributes. + */ + private void doStackMapTable(DataInput in) throws IOException + { + final int number_of_entries = in.readUnsignedShort(); + for (int v = 0; v < number_of_entries; v++) + { + final int frame_type = in.readUnsignedByte(); + if (frame_type <= 63) + { // same_frame + // nothing else to do + } + else if (frame_type <= 127) + { // same_locals_1_stack_item_frame + verification_type_info(in); + } + else if (frame_type <= 246) + { // RESERVED + // nothing else to do + } + else if (frame_type <= 247) + { // same_locals_1_stack_item_frame_extended + final int offset_delta = in.readUnsignedShort(); + verification_type_info(in); + } + else if (frame_type <= 250) + { // chop_frame + final int offset_delta = in.readUnsignedShort(); + } + else if (frame_type <= 251) + { // same_frame_extended + final int offset_delta = in.readUnsignedShort(); + } + else if (frame_type <= 254) + { // append_frame + final int offset_delta = in.readUnsignedShort(); + final int number_of_locals = frame_type - 251; + for (int n = 0; n < number_of_locals; n++) + { + verification_type_info(in); + } + } + else if (frame_type <= 255) + { // full_frame + final int offset_delta = in.readUnsignedShort(); + final int number_of_locals = in.readUnsignedShort(); + for (int n = 0; n < number_of_locals; n++) + { + verification_type_info(in); + } + final int number_of_stack_items = in.readUnsignedShort(); + for (int n = 0; n < number_of_stack_items; n++) + { + verification_type_info(in); + } + } + } + } + + private void verification_type_info(DataInput in) throws IOException + { + final int tag = in.readUnsignedByte(); + switch (tag) + { + case 7:// Object_variable_info + final int cpool_index = in.readUnsignedShort(); + classConstRef(cpool_index); + break; + case 8:// ITEM_Uninitialized + final int offset = in.readUnsignedShort(); + break; + } + } + + void referTo(TypeRef typeRef, int modifiers) + { + if (typeRef.isPrimitive()) + { + return; + } + + PackageRef packageRef = typeRef.getPackageRef(); + if (packageRef.isPrimitivePackage()) + { + return; + } + + imports.add(packageRef.getFQN()); + } + + void referTo(int index, int modifiers) + { + String descriptor = (String) pool[index]; + parseDescriptor(descriptor, modifiers); + } + + /* + * This method parses a descriptor and adds the package of the descriptor to + * the referenced packages. The syntax of the descriptor is: + * + *
+         * descriptor ::= ( '(' reference * ')' )? reference reference ::= 'L'
+         * classname ( '<' references '>' )? ';' | 'B' | 'Z' | ... | '+' | '-'
+         * | '['
+         * 
+ * + * This methods uses heavy recursion to parse the descriptor and a roving + * pointer to limit the creation of string objects. + * + * @param descriptor The to be parsed descriptor + * @param modifiers + */ + + public void parseDescriptor(String descriptor, int modifiers) + { + // Some classParser are weird, they start with a generic + // declaration that contains ':', not sure what they mean ... + int rover = 0; + if (descriptor.charAt(0) == '<') + { + rover = parseFormalTypeParameters(descriptor, rover, modifiers); + } + + if (descriptor.charAt(rover) == '(') + { + rover = parseReferences(descriptor, rover + 1, ')', modifiers); + rover++; + } + parseReferences(descriptor, rover, (char) 0, modifiers); + } + + /* + * Parse a sequence of references. A sequence ends with a given character or + * when the string ends. + * + * @param descriptor The whole descriptor. + * @param rover The index in the descriptor + * @param delimiter The end character or 0 + * @return the last index processed, one character after the delimeter + */ + int parseReferences(String descriptor, int rover, char delimiter, int modifiers) + { + int r = rover; + while (r < descriptor.length() && descriptor.charAt(r) != delimiter) + { + r = parseReference(descriptor, r, modifiers); + } + return r; + } + + /* + * Parse a single reference. This can be a single character or an object + * reference when it starts with 'L'. + * + * @param descriptor The descriptor + * @param rover The place to start + * @return The return index after the reference + */ + int parseReference(String descriptor, int rover, int modifiers) + { + int r = rover; + char c = descriptor.charAt(r); + while (c == '[') + { + c = descriptor.charAt(++r); + } + + if (c == '<') + { + r = parseReferences(descriptor, r + 1, '>', modifiers); + } + else if (c == 'T') + { + // Type variable name + r++; + while (descriptor.charAt(r) != ';') + { + r++; + } + } + else if (c == 'L') + { + StringBuilder sb = new StringBuilder(); + r++; + while ((c = descriptor.charAt(r)) != ';') + { + if (c == '<') + { + r = parseReferences(descriptor, r + 1, '>', modifiers); + } + else + { + sb.append(c); + } + r++; + } + TypeRef ref = classParser.getTypeRef(sb.toString()); + + referTo(ref, modifiers); + } + else + { + if ("+-*BCDFIJSZV".indexOf(c) < 0) + { + ;// System.err.println("Should not skip: " + c); + } + } + + // this skips a lot of characters + // [, *, +, -, B, etc. + + return r + 1; + } + + /* + * FormalTypeParameters + * + * @param descriptor + * @param index + */ + private int parseFormalTypeParameters(String descriptor, int index, int modifiers) + { + index++; + while (descriptor.charAt(index) != '>') + { + // Skip IDENTIFIER + index = descriptor.indexOf(':', index) + 1; + if (index == 0) + { + throw new IllegalArgumentException("Expected ClassBound or InterfaceBounds: " + descriptor); + } + + // ClassBound? InterfaceBounds + char c = descriptor.charAt(index); + + if (c != ':') + { + // ClassBound? + index = parseReference(descriptor, index, modifiers); + c = descriptor.charAt(index); + } + + // InterfaceBounds* + while (c == ':') + { + index++; + index = parseReference(descriptor, index, modifiers); + c = descriptor.charAt(index); + } // for each interface + + } // for each formal parameter + return index + 1; // skip > + } + + public Set getReferred() + { + return imports; + } + + /* + * .class construct for different compilers sun 1.1 Detect static variable + * class$com$acme$MyClass 1.2 " 1.3 " 1.4 " 1.5 ldc_w (class) 1.6 " eclipse + * 1.1 class$0, ldc (string), invokestatic Class.forName 1.2 " 1.3 " 1.5 ldc + * (class) 1.6 " 1.5 and later is not an issue, sun pre 1.5 is easy to + * detect the static variable that decodes the class name. For eclipse, the + * class$0 gives away we have a reference encoded in a string. + * compilerversions/compilerversions.jar contains test versions of all + * versions/compilers. + */ + + public void reset() + { + if (--depth == 0) + { + pool = null; + intPool = null; + } + } + + @Override + public String toString() + { + if (className != null) + { + return className.getFQN(); + } + return super.toString(); + } + + + public boolean isModule() + { + return (ACC_MODULE & accessx) != 0; + } + + private void classConstRef(int lastReference) + { + Object o = pool[lastReference]; + if (o == null) + { + return; + } + + if (o instanceof ClassConstant) + { + ClassConstant cc = (ClassConstant) o; + if (cc.referred) + { + return; + } + cc.referred = true; + String name = cc.getName(); + if (name != null) + { + TypeRef tr = classParser.getTypeRef(name); + referTo(tr, 0); + } + } + + } + + + // the stack + final static short bipush = 0x10; // byte ? value + // pushes a + // byte + // onto the stack as an integer + // value + final static short sipush = 0x11; // byte1, byte2 ? + // value + // pushes a + // signed integer (byte1 << 8 + + // byte2) onto the stack + final static short ldc = 0x12; // index ? value + // pushes + // a + // constant #index from a + // constant pool (String, int, + // float or class type) onto the + // stack + final static short ldc_w = 0x13; // indexbyte1, + // indexbyte2 ? + // value pushes a constant + // #index from a constant pool + // (String, int, float or class + // type) onto the stack (wide + // index is constructed as + // indexbyte1 << 8 + indexbyte2) + final static short ldc2_w = 0x14; // indexbyte1, + // indexbyte2 ? + // value pushes a constant + // #index from a constant pool + // (double or long) onto the + // stack (wide index is + // constructed as indexbyte1 << + // 8 + indexbyte2) + final static short iload = 0x15; // index ? value + // loads + // an int + // value from a variable #index + final static short lload = 0x16; // index ? value + // load a + // long + // value from a local variable + // #index + final static short fload = 0x17; // index ? value + // loads a + // float + // value from a local variable + // #index + final static short dload = 0x18; // index ? value + // loads a + // double + // value from a local variable + // #index + final static short aload = 0x19; // index ? objectref + // loads a + // reference onto the stack from + // short from array + final static short istore = 0x36; // index value ? + // store + // int value + // into variable #index + final static short lstore = 0x37; // index value ? + // store a + // long + // value in a local variable + // #index + final static short fstore = 0x38; // index value ? + // stores + // a float + // value into a local variable + // #index + final static short dstore = 0x39; // index value ? + // stores + // a double + // longs + final static short iinc = 0x84; // index, const [No + // change] + // increment local variable + // compares two doubles + final static short ifeq = 0x99; // branchbyte1, + // branchbyte2 + // a long from an array + final static short astore = 0x3a; // index objectref ? + // stores a + // reference into a local + // double to a long + final static short ifne = 0x9a; // branchbyte1, + // branchbyte2 + // value ? if value is not 0, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short iflt = 0x9b; // branchbyte1, + // branchbyte2 + // value ? if value is less than + // 0, branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short ifge = 0x9c; // branchbyte1, + // branchbyte2 + // value ? if value is greater + // than or equal to 0, branch to + // instruction at branchoffset + // (signed short constructed + // from unsigned bytes + // branchbyte1 << 8 + + // branchbyte2) + final static short ifgt = 0x9d; // branchbyte1, + // branchbyte2 + // value ? if value is greater + // than 0, branch to instruction + // at branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short ifle = 0x9e; // branchbyte1, + // branchbyte2 + // value ? if value is less than + // or equal to 0, branch to + // instruction at branchoffset + // (signed short constructed + // from unsigned bytes + // branchbyte1 << 8 + + // branchbyte2) + final static short if_icmpeq = 0x9f; // branchbyte1, + // branchbyte2 + // value1, value2 ? if ints are + // equal, branch to instruction + // at branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short if_icmpne = 0xa0; // branchbyte1, + // branchbyte2 + // value1, value2 ? if ints are + // not equal, branch to + // instruction at branchoffset + // (signed short constructed + // from unsigned bytes + // branchbyte1 << 8 + + // branchbyte2) + final static short if_icmplt = 0xa1; // branchbyte1, + // branchbyte2 + // value1, value2 ? if value1 is + // less than value2, branch to + // instruction at branchoffset + // (signed short constructed + // from unsigned bytes + // branchbyte1 << 8 + + // branchbyte2) + final static short if_icmpge = 0xa2; // branchbyte1, + // branchbyte2 + // value1, value2 ? if value1 is + // greater than or equal to + // value2, branch to instruction + // at branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short if_icmpgt = 0xa3; // branchbyte1, + // branchbyte2 + // value1, value2 ? if value1 is + // greater than value2, branch + // to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short if_icmple = 0xa4; // branchbyte1, + // branchbyte2 + // value1, value2 ? if value1 is + // less than or equal to value2, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short if_acmpeq = 0xa5; // branchbyte1, + // branchbyte2 + // value1, value2 ? if + // references are equal, branch + // to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short if_acmpne = 0xa6; // branchbyte1, + // branchbyte2 + // value1, value2 ? if + // references are not equal, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short goto_ = 0xa7; // branchbyte1, + // branchbyte2 [no + // change] goes to another + // instruction at branchoffset + // (signed short constructed + // from unsigned bytes + // branchbyte1 << 8 + + // branchbyte2) + final static short jsr = 0xa8; // branchbyte1, + // branchbyte2 ? + // address jump to subroutine at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) and place the + // return address on the stack + final static short ret = 0xa9; // index [No change] + // continue + // execution from address taken + // from a local variable #index + // (the asymmetry with jsr is + // intentional) + final static short tableswitch = 0xaa; // [0-3 bytes + // padding], + // defaultbyte1, defaultbyte2, + // defaultbyte3, defaultbyte4, + // lowbyte1, lowbyte2, lowbyte3, + // lowbyte4, highbyte1, + // highbyte2, highbyte3, + // highbyte4, jump offsets... + // index ? continue execution + // from an address in the table + // at offset index + final static short lookupswitch = 0xab; // <0-3 bytes + // padding>, + // defaultbyte1, defaultbyte2, + // from + // method + final static short getstatic = 0xb2; // index1, index2 ? + // value gets a + // static field value of a + // class, where the field is + // identified by field reference + // in the constant pool index + // (index1 << 8 + index2) + final static short putstatic = 0xb3; // indexbyte1, + // indexbyte2 value + // ? set static field to value + // in a class, where the field + // is identified by a field + // reference index in constant + // pool (indexbyte1 << 8 + + // indexbyte2) + final static short getfield = 0xb4; // index1, index2 + // objectref ? + // value gets a field value of + // an object objectref, where + // the field is identified by + // field reference in the + // constant pool index (index1 + // << 8 + index2) + final static short putfield = 0xb5; // indexbyte1, + // indexbyte2 + // objectref, value ? set field + // to value in an object + // objectref, where the field is + // identified by a field + // reference index in constant + // pool (indexbyte1 << 8 + + // indexbyte2) + final static short invokevirtual = 0xb6; // indexbyte1, + // indexbyte2 + // objectref, [arg1, arg2, ...] + // ? invoke virtual method on + // object objectref, where the + // method is identified by + // method reference index in + // constant pool (indexbyte1 << + // 8 + indexbyte2) + final static short invokespecial = 0xb7; // indexbyte1, + // indexbyte2 + // objectref, [arg1, arg2, ...] + // ? invoke instance method on + // object objectref, where the + // method is identified by + // method reference index in + // constant pool (indexbyte1 << + // 8 + indexbyte2) + final static short invokestatic = 0xb8; // indexbyte1, + // indexbyte2 [arg1, + // arg2, ...] ? invoke a static + // method, where the method is + // identified by method + // reference index in constant + // pool (indexbyte1 << 8 + + // indexbyte2) + final static short invokeinterface = 0xb9; // indexbyte1, + // indexbyte2, + // count, 0 objectref, [arg1, + // arg2, ...] ? invokes an + // interface method on object + // objectref, where the + // interface method is + // identified by method + // reference index in constant + // pool (indexbyte1 << 8 + + // indexbyte2) + final static short invokedynamic = 0xba; // introduced in J7 + + final static short new_ = 0xbb; // indexbyte1, + // indexbyte2 ? + // objectref creates new object + // of type identified by class + // reference in constant pool + // index (indexbyte1 << 8 + + // indexbyte2) + final static short newarray = 0xbc; // atype count ? + // arrayref + // creates new array with count + // elements of primitive type + // identified by atype + final static short anewarray = 0xbd; // indexbyte1, + // indexbyte2 count + // objectref throws an error or + // exception (notice that the + // rest of the stack is cleared, + // leaving only a reference to + // the Throwable) + final static short checkcast = 0xc0; // indexbyte1, + // indexbyte2 + // objectref ? objectref checks + // whether an objectref is of a + // certain type, the class + // reference of which is in the + // constant pool at index + // (indexbyte1 << 8 + + // indexbyte2) + final static short instanceof_ = 0xc1; // indexbyte1, + // indexbyte2 + // object ("release the lock" - + // end of synchronized() + // section) + final static short wide = 0xc4; // opcode, + // indexbyte1, + // indexbyte2 + final static short multianewarray = 0xc5; // indexbyte1, + // indexbyte2, + // dimensions count1, + // [count2,...] ? arrayref + // create a new array of + // dimensions dimensions with + // elements of type identified + // by class reference in + // constant pool index + // (indexbyte1 << 8 + + // indexbyte2); the sizes of + // each dimension is identified + // by count1, [count2, etc] + final static short ifnull = 0xc6; // branchbyte1, + // branchbyte2 + // value ? if value is null, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short ifnonnull = 0xc7; // branchbyte1, + // branchbyte2 + // value ? if value is not null, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned + // bytes branchbyte1 << 8 + + // branchbyte2) + final static short goto_w = 0xc8; // branchbyte1, + // branchbyte2, + // branchbyte3, branchbyte4 [no + // change] goes to another + // instruction at branchoffset + // (signed int constructed from + // unsigned bytes branchbyte1 << + // 24 + branchbyte2 << 16 + + // branchbyte3 << 8 + + // branchbyte4) + final static short jsr_w = 0xc9; // branchbyte1, + // branchbyte2, + + + final static byte OFFSETS[] = new byte[256]; + + static + { + OFFSETS[bipush] = 1; // byte ? value pushes a byte onto the + // stack as an integer value + OFFSETS[sipush] = 2; // byte1, byte2 ? value pushes a signed + // integer (byte1 << 8 + byte2) onto the + // stack + OFFSETS[ldc] = 1; // index ? value pushes a constant + // #index from a constant pool (String, + // int, float or class type) onto the + // stack + OFFSETS[ldc_w] = 2; // indexbyte1, indexbyte2 ? value pushes + // a constant #index from a constant + // pool (String, int, float or class + // type) onto the stack (wide index is + // constructed as indexbyte1 << 8 + + // indexbyte2) + OFFSETS[ldc2_w] = 2; // indexbyte1, indexbyte2 ? value pushes + // a constant #index from a constant + // pool (double or long) onto the stack + // (wide index is constructed as + // indexbyte1 << 8 + indexbyte2) + OFFSETS[iload] = 1; // index ? value loads an int value from + // a variable #index + OFFSETS[lload] = 1; // index ? value load a long value from + // a local variable #index + OFFSETS[fload] = 1; // index ? value loads a float value + // from a local variable #index + OFFSETS[dload] = 1; // index ? value loads a double value + // from a local variable #index + OFFSETS[aload] = 1; // index ? objectref loads a reference + // onto the stack from a local variable + // #index + OFFSETS[istore] = 1; // index value ? store int value into + // variable #index + OFFSETS[lstore] = 1; // index value ? store a long value in a + // local variable #index + OFFSETS[fstore] = 1; // index value ? stores a float value + // into a local variable #index + OFFSETS[dstore] = 1; // index value ? stores a double value + // into a local variable #index + OFFSETS[iinc] = 2; // index, const [No change] increment + // local variable #index by signed byte + // const + OFFSETS[ifeq] = 2; // branchbyte1, branchbyte2 value ? if + // value is 0, branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[astore] = 1; // index objectref ? stores a reference + // into a local variable #index + OFFSETS[ifne] = 2; // branchbyte1, branchbyte2 value ? if + // value is not 0, branch to instruction + // at branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[iflt] = 2; // branchbyte1, branchbyte2 value ? if + // value is less than 0, branch to + // instruction at branchoffset (signed + // short constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[ifge] = 2; // branchbyte1, branchbyte2 value ? if + // value is greater than or equal to 0, + // branch to instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[ifgt] = 2; // branchbyte1, branchbyte2 value ? if + // value is greater than 0, branch to + // instruction at branchoffset (signed + // short constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[ifle] = 2; // branchbyte1, branchbyte2 value ? if + // value is less than or equal to 0, + // branch to instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[if_icmpeq] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if ints are equal, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[if_icmpne] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if ints are not equal, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[if_icmplt] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if value1 is less than + // value2, branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[if_icmpge] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if value1 is greater + // than or equal to value2, branch + // to instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[if_icmpgt] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if value1 is greater + // than value2, branch to + // instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[if_icmple] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if value1 is less than + // or equal to value2, branch to + // instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[if_acmpeq] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if references are equal, + // branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[if_acmpne] = 2; // branchbyte1, branchbyte2 value1, + // value2 ? if references are not + // equal, branch to instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[goto_] = 2; // branchbyte1, branchbyte2 [no change] + // goes to another instruction at + // branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[jsr] = 2; // branchbyte1, branchbyte2 ? address + // jump to subroutine at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) and place the return + // address on the stack + OFFSETS[ret] = 1; // index [No change] continue execution + // from address taken from a local + // variable #index (the asymmetry with + // jsr is intentional) + OFFSETS[tableswitch] = -1; // [0-3 bytes padding], + // defaultbyte1, defaultbyte2, + // defaultbyte3, defaultbyte4, + // lowbyte1, lowbyte2, lowbyte3, + // lowbyte4, highbyte1, + // highbyte2, highbyte3, + // highbyte4, jump offsets... + // index ? continue execution + // from an address in the table + // at offset index + OFFSETS[lookupswitch] = -1; // <0-3 bytes padding>, + // defaultbyte1, defaultbyte2, + // defaultbyte3, defaultbyte4, + // npairs1, npairs2, npairs3, + // npairs4, match-offset + // pairs... key ? a target + // address is looked up from a + // table using a key and + // execution continues from the + // instruction at that address + OFFSETS[getstatic] = 2; // index1, index2 ? value gets a + // static field value of a class, + // where the field is identified by + // field reference in the constant + // pool index (index1 << 8 + index2) + OFFSETS[putstatic] = 2; // indexbyte1, indexbyte2 value ? + // set static field to value in a + // class, where the field is + // identified by a field reference + // index in constant pool + // (indexbyte1 << 8 + indexbyte2) + OFFSETS[getfield] = 2; // index1, index2 objectref ? value + // gets a field value of an object + // objectref, where the field is + // identified by field reference in + // the constant pool index (index1 + // << 8 + index2) + OFFSETS[putfield] = 2; // indexbyte1, indexbyte2 objectref, + // value ? set field to value in an + // object objectref, where the field + // is identified by a field + // reference index in constant pool + // (indexbyte1 << 8 + indexbyte2) + OFFSETS[invokevirtual] = 2; // indexbyte1, indexbyte2 + // objectref, [arg1, arg2, ...] + // ? invoke virtual method on + // object objectref, where the + // method is identified by + // method reference index in + // constant pool (indexbyte1 << + // 8 + indexbyte2) + OFFSETS[invokespecial] = 2; // indexbyte1, indexbyte2 + // objectref, [arg1, arg2, ...] + // ? invoke instance method on + // object objectref, where the + // method is identified by + // method reference index in + // constant pool (indexbyte1 << + // 8 + indexbyte2) + OFFSETS[invokestatic] = 2; // indexbyte1, indexbyte2 [arg1, + // arg2, ...] ? invoke a static + // method, where the method is + // identified by method + // reference index in constant + // pool (indexbyte1 << 8 + + // indexbyte2) + OFFSETS[invokeinterface] = 2; // indexbyte1, indexbyte2, + // count, 0 objectref, + // [arg1, arg2, ...] ? + // invokes an interface + // method on object + // objectref, where the + // interface method is + // identified by method + // reference index in + // constant pool (indexbyte1 + // << 8 + indexbyte2) + + OFFSETS[invokedynamic] = 4; // 4: indexbyte1, indexbyte2, 0, 0 + + OFFSETS[new_] = 2; // indexbyte1, indexbyte2 ? objectref + // creates new object of type identified + // by class reference in constant pool + // index (indexbyte1 << 8 + indexbyte2) + OFFSETS[newarray] = 1; // atype count ? arrayref creates + // new array with count elements of + // primitive type identified by + // atype + OFFSETS[anewarray] = 2; // indexbyte1, indexbyte2 count ? + // arrayref creates a new array of + // references of length count and + // component type identified by the + // class reference index (indexbyte1 + // << 8 + indexbyte2) in the + // constant pool + OFFSETS[checkcast] = 2; // indexbyte1, indexbyte2 objectref + // ? objectref checks whether an + // objectref is of a certain type, + // the class reference of which is + // in the constant pool at index + // (indexbyte1 << 8 + indexbyte2) + OFFSETS[instanceof_] = 2; // indexbyte1, indexbyte2 objectref + // ? result determines if an object + // objectref is of a given type, + // identified by class reference + // index in constant pool + // (indexbyte1 << 8 + indexbyte2) + OFFSETS[wide] = 3; // opcode, indexbyte1, indexbyte2 + OFFSETS[multianewarray] = 3; // indexbyte1, indexbyte2, + // dimensions count1, + // [count2,...] ? arrayref + // create a new array of + // dimensions dimensions with + // elements of type identified + // by class reference in + // constant pool index + // (indexbyte1 << 8 + + // indexbyte2); the sizes of + // each dimension is identified + // by count1, [count2, etc] + OFFSETS[ifnull] = 2; // branchbyte1, branchbyte2 value ? if + // value is null, branch to instruction + // at branchoffset (signed short + // constructed from unsigned bytes + // branchbyte1 << 8 + branchbyte2) + OFFSETS[ifnonnull] = 2; // branchbyte1, branchbyte2 value ? + // if value is not null, branch to + // instruction at branchoffset + // (signed short constructed from + // unsigned bytes branchbyte1 << 8 + + // branchbyte2) + OFFSETS[goto_w] = 4; // branchbyte1, branchbyte2, + // branchbyte3, branchbyte4 [no change] + // goes to another instruction at + // branchoffset (signed int constructed + // from unsigned bytes branchbyte1 << 24 + // + branchbyte2 << 16 + branchbyte3 << + // 8 + branchbyte4) + OFFSETS[jsr_w] = 4; // branchbyte1, branchbyte2, + // branchbyte3, branchbyte4 ? address + // jump to subroutine at branchoffset + // (signed int constructed from unsigned + // bytes branchbyte1 << 24 + branchbyte2 + // << 16 + branchbyte3 << 8 + + // branchbyte4) and place the return + // address on the stack + } + } +} diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/FelixConstants.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/FelixConstants.java index c314e06806b..87626fc0366 100644 --- a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/FelixConstants.java +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/FelixConstants.java @@ -72,4 +72,5 @@ public interface FelixConstants extends org.osgi.framework.Constants String SECURITY_DEFAULT_POLICY = "felix.security.defaultpolicy"; String FELIX_EXTENSIONS_DISABLE = "felix.extensions.disable"; String FRAMEWORK_UUID_SECURE = "felix.uuid.secure"; + String CALCULATE_SYSTEMPACKAGES_USES = "felix.systempackages.calculate.uses"; } diff --git a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/Util.java b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/Util.java index e211675eb19..db644584aef 100644 --- a/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/Util.java +++ b/osgi-r7/framework/src/main/java/org/apache/felix/framework/util/Util.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -52,6 +53,8 @@ import java.util.Properties; import java.util.Random; import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; @@ -139,7 +142,16 @@ public static void initializeJPMSEE(String javaVersion, Properties properties, L properties.put("eecap-jpms", eecap.toString()); } - properties.put("felix.detect.java.version", String.format("0.0.0.JavaSE_%03d_%03d", version.getMajor(), version.getMinor())); + properties.put("felix.detect.java.specification.version", version.getMajor() < 9 ? ("1." + (version.getMinor() > 6 ? version.getMinor() : 6)) : Integer.toString(version.getMajor())); + + if (version.getMajor() < 9) + { + properties.put("felix.detect.java.version", String.format("0.0.0.JavaSE_001_%03d", version.getMinor() > 6 ? version.getMinor() : 6)); + } + else + { + properties.put("felix.detect.java.version", String.format("0.0.0.JavaSE_%03d", version.getMajor())); + } } catch (Exception ex) { @@ -147,12 +159,15 @@ public static void initializeJPMSEE(String javaVersion, Properties properties, L } } - public static void initializeJPMS(Properties properties) + public static Map> initializeJPMS(Properties properties) { + Map> exports = null; try { Class c_ModuleLayer = Felix.class.getClassLoader().loadClass("java.lang.ModuleLayer"); Class c_Module = Felix.class.getClassLoader().loadClass("java.lang.Module"); + Class c_Descriptor = Felix.class.getClassLoader().loadClass("java.lang.module.ModuleDescriptor"); + Class c_Exports = Felix.class.getClassLoader().loadClass("java.lang.module.ModuleDescriptor$Exports"); Method m_getLayer = c_Module.getMethod("getLayer"); Method m_getModule = Class.class.getMethod("getModule"); Method m_canRead = c_Module.getMethod("canRead", c_Module); @@ -166,38 +181,45 @@ public static void initializeJPMS(Properties properties) moduleLayer = c_ModuleLayer.getMethod("boot").invoke(null); } - Set javaExports = new TreeSet(); + Set modules = new TreeSet(); + exports = new HashMap>(); for (Object module : ((Iterable) c_ModuleLayer.getMethod("modules").invoke(moduleLayer))) { if ((Boolean) m_canRead.invoke(self, module)) { Object name = m_getName.invoke(module); properties.put("felix.detect.jpms." + name, name); - for (String export : (Iterable) c_Module.getMethod("getPackages").invoke(module)) + modules.add("felix.jpms." + name); + Set pkgs = new HashSet(); + + Object descriptor = c_Module.getMethod("getDescriptor").invoke(module); + + for (Object export :((Set) c_Descriptor.getMethod("exports").invoke(descriptor))) { - if (export.startsWith("java.") && (Boolean) c_Module.getMethod("isExported", String.class, c_Module).invoke(module, export, self)) + if (((Set) c_Exports.getMethod("targets").invoke(export)).isEmpty()) { - javaExports.add(export); + pkgs.add((String) c_Exports.getMethod("source").invoke(export)); } } + if (!pkgs.isEmpty()) + { + exports.put("felix.jpms." + c_Descriptor.getMethod("toNameAndVersion").invoke(descriptor), pkgs); + } } } - if (!javaExports.isEmpty()) - { - StringBuilder builder = new StringBuilder(); - for (String export : javaExports) { - builder.append(',').append(export).append(";version=\"${felix.detect.java.version}\""); - } - properties.put("felix.detect.jpms.java", builder.toString()); - } - properties.put("felix.detect.jpms", "jpms"); + String modulesString = ""; + for (String module : modules) { + modulesString += "${" + module + "}"; + } + properties.put("jre-jpms", modulesString); } catch (Exception ex) { // Not much we can do - probably not on java9 } + return exports; } public static String getPropertyWithSubs(Properties props, String name) @@ -468,7 +490,7 @@ public static List getCapabilityByNamespace( public static List getDynamicRequirements( List reqs) { - List result = new ArrayList(); + List result = null; if (reqs != null) { for (BundleRequirement req : reqs) @@ -476,6 +498,10 @@ public static List getDynamicRequirements( String resolution = req.getDirectives().get(Constants.RESOLUTION_DIRECTIVE); if ((resolution != null) && resolution.equals("dynamic")) { + if (result == null) + { + result = new ArrayList(); + } result.add(req); } } diff --git a/osgi-r7/framework/src/main/resources/default.properties b/osgi-r7/framework/src/main/resources/default.properties index 6bc63ab7dc2..fe752c0f527 100644 --- a/osgi-r7/framework/src/main/resources/default.properties +++ b/osgi-r7/framework/src/main/resources/default.properties @@ -120,850 +120,253 @@ org.osgi.framework.system.packages=\ org.osgi.service.resolver;version="1.1";uses:="org.osgi.resource", \ org.osgi.util.tracker;version="1.5.2";uses:="org.osgi.framework", \ org.osgi.dto;version="1.1" \ - ${dollar}{jre-${dollar}{java.specification.version}} \ + ${dollar}{jre-${dollar}{felix.detect.java.specification.version}} \ ${dollar}{jre-${dollar}{felix.detect.jpms}} # # Java platform package export properties. # -jre-1.6-java-base=, \ - 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.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.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.util, \ - java.util.concurrent, \ - java.util.concurrent.atomic, \ - java.util.concurrent.locks, \ - java.util.jar, \ - java.util.logging, \ - java.util.prefs, \ - java.util.regex, \ - java.util.spi, \ - java.util.zip - -jre-1.7-java-base= \ - ${dollar}{jre-1.6-java-base}, \ - java.lang.invoke, \ - java.nio.file, \ - java.nio.file.attribute, \ - java.nio.file.spi - -jre-1.8-java-base= \ - ${dollar}{jre-1.7-java-base}, \ - java.time, \ - java.time.chrono, \ - java.time.format, \ - java.time.temporal, \ - java.time.zone, \ - java.util.function, \ - java.util.stream +jre-base=, \ + java.applet;version="${dollar}{felix.detect.java.version}", \ + java.awt;version="${dollar}{felix.detect.java.version}", \ + java.awt.color;version="${dollar}{felix.detect.java.version}", \ + java.awt.datatransfer;version="${dollar}{felix.detect.java.version}", \ + java.awt.dnd;version="${dollar}{felix.detect.java.version}", \ + java.awt.event;version="${dollar}{felix.detect.java.version}", \ + java.awt.font;version="${dollar}{felix.detect.java.version}", \ + java.awt.geom;version="${dollar}{felix.detect.java.version}", \ + java.awt.im;version="${dollar}{felix.detect.java.version}", \ + java.awt.im.spi;version="${dollar}{felix.detect.java.version}", \ + java.awt.image;version="${dollar}{felix.detect.java.version}", \ + java.awt.image.renderable;version="${dollar}{felix.detect.java.version}", \ + java.awt.print;version="${dollar}{felix.detect.java.version}", \ + java.beans;version="${dollar}{felix.detect.java.version}", \ + java.beans.beancontext;version="${dollar}{felix.detect.java.version}", \ + java.io;version="${dollar}{felix.detect.java.version}", \ + java.lang;version="${dollar}{felix.detect.java.version}", \ + java.lang.annotation;version="${dollar}{felix.detect.java.version}", \ + java.lang.instrument;version="${dollar}{felix.detect.java.version}", \ + java.lang.management;version="${dollar}{felix.detect.java.version}", \ + java.lang.ref;version="${dollar}{felix.detect.java.version}", \ + java.lang.reflect;version="${dollar}{felix.detect.java.version}", \ + java.math;version="${dollar}{felix.detect.java.version}", \ + java.net;version="${dollar}{felix.detect.java.version}", \ + java.nio;version="${dollar}{felix.detect.java.version}", \ + java.nio.channels;version="${dollar}{felix.detect.java.version}", \ + java.nio.channels.spi;version="${dollar}{felix.detect.java.version}", \ + java.nio.charset;version="${dollar}{felix.detect.java.version}", \ + java.nio.charset.spi;version="${dollar}{felix.detect.java.version}", \ + java.rmi;version="${dollar}{felix.detect.java.version}", \ + java.rmi.activation;version="${dollar}{felix.detect.java.version}", \ + java.rmi.dgc;version="${dollar}{felix.detect.java.version}", \ + java.rmi.registry;version="${dollar}{felix.detect.java.version}", \ + java.rmi.server;version="${dollar}{felix.detect.java.version}", \ + java.security;version="${dollar}{felix.detect.java.version}", \ + java.security.acl;version="${dollar}{felix.detect.java.version}", \ + java.security.cert;version="${dollar}{felix.detect.java.version}", \ + java.security.interfaces;version="${dollar}{felix.detect.java.version}", \ + java.security.spec;version="${dollar}{felix.detect.java.version}", \ + java.sql;version="${dollar}{felix.detect.java.version}", \ + java.text;version="${dollar}{felix.detect.java.version}", \ + java.text.spi;version="${dollar}{felix.detect.java.version}", \ + java.util;version="${dollar}{felix.detect.java.version}", \ + java.util.concurrent;version="${dollar}{felix.detect.java.version}", \ + java.util.concurrent.atomic;version="${dollar}{felix.detect.java.version}", \ + java.util.concurrent.locks;version="${dollar}{felix.detect.java.version}", \ + java.util.jar;version="${dollar}{felix.detect.java.version}", \ + java.util.logging;version="${dollar}{felix.detect.java.version}", \ + java.util.prefs;version="${dollar}{felix.detect.java.version}", \ + java.util.regex;version="${dollar}{felix.detect.java.version}", \ + java.util.spi;version="${dollar}{felix.detect.java.version}", \ + java.util.zip;version="${dollar}{felix.detect.java.version}", \ + javax.accessibility;uses:="javax.swing.text";version="${dollar}{felix.detect.java.version}", \ + javax.activation;version="${dollar}{felix.detect.java.version}", \ + javax.activity;version="${dollar}{felix.detect.java.version}", \ + javax.annotation;version="${dollar}{felix.detect.java.version}", \ + javax.annotation.processing;uses:="javax.lang.model,javax.lang.model.element,javax.lang.model.util,javax.tools";version="${dollar}{felix.detect.java.version}", \ + javax.crypto.interfaces;uses:="javax.crypto,javax.crypto.spec";version="${dollar}{felix.detect.java.version}", \ + javax.crypto.spec;uses:="javax.crypto";version="${dollar}{felix.detect.java.version}", \ + javax.imageio;uses:="javax.imageio.event,javax.imageio.metadata,javax.imageio.spi,javax.imageio.stream";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.event;uses:="javax.imageio";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.metadata;uses:="javax.imageio,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.plugins.bmp;uses:="javax.imageio";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.plugins.jpeg;uses:="javax.imageio";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.spi;uses:="javax.imageio,javax.imageio.metadata,javax.imageio.stream";version="${dollar}{felix.detect.java.version}", \ + javax.imageio.stream;uses:="javax.imageio";version="${dollar}{felix.detect.java.version}", \ + javax.jws;version="${dollar}{felix.detect.java.version}", \ + javax.jws.soap;version="${dollar}{felix.detect.java.version}", \ + javax.lang.model.util;uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element,javax.lang.model.type";version="${dollar}{felix.detect.java.version}", \ + javax.management;uses:="javax.management.loading,javax.management.openmbean";version="${dollar}{felix.detect.java.version}", \ + javax.management.loading;uses:="javax.management";version="${dollar}{felix.detect.java.version}", \ + javax.management.modelmbean;uses:="javax.management,javax.management.loading";version="${dollar}{felix.detect.java.version}", \ + javax.management.openmbean;uses:="javax.management";version="${dollar}{felix.detect.java.version}", \ + javax.management.relation;uses:="javax.management";version="${dollar}{felix.detect.java.version}", \ + javax.management.remote;uses:="javax.management,javax.security.auth";version="${dollar}{felix.detect.java.version}", \ + javax.management.remote.rmi;uses:="javax.management,javax.management.loading,javax.management.remote,javax.naming,javax.rmi,javax.rmi.CORBA,javax.rmi.ssl,javax.security.auth,org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable";version="${dollar}{felix.detect.java.version}", \ + javax.management.timer;uses:="javax.management";version="${dollar}{felix.detect.java.version}", \ + javax.naming;uses:="javax.naming.spi";version="${dollar}{felix.detect.java.version}", \ + javax.naming.directory;uses:="javax.naming";version="${dollar}{felix.detect.java.version}", \ + javax.naming.event;uses:="javax.naming,javax.naming.directory";version="${dollar}{felix.detect.java.version}", \ + javax.naming.ldap;uses:="javax.naming,javax.naming.directory,javax.naming.event,javax.net.ssl";version="${dollar}{felix.detect.java.version}", \ + javax.naming.spi;uses:="javax.naming,javax.naming.directory";version="${dollar}{felix.detect.java.version}", \ + javax.net;version="${dollar}{felix.detect.java.version}", \ + javax.net.ssl;uses:="javax.net,javax.security.auth.x500,javax.security.cert";version="${dollar}{felix.detect.java.version}", \ + javax.print;uses:="javax.print.attribute,javax.print.attribute.standard,javax.print.event";version="${dollar}{felix.detect.java.version}", \ + javax.print.attribute;version="${dollar}{felix.detect.java.version}", \ + javax.print.attribute.standard;uses:="javax.print.attribute";version="${dollar}{felix.detect.java.version}", \ + javax.print.event;uses:="javax.print,javax.print.attribute";version="${dollar}{felix.detect.java.version}", \ + javax.rmi;uses:="javax.rmi.CORBA,org.omg.CORBA";version="${dollar}{felix.detect.java.version}", \ + javax.rmi.CORBA;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable,org.omg.SendingContext";version="${dollar}{felix.detect.java.version}", \ + javax.rmi.ssl;uses:="javax.net,javax.net.ssl";version="${dollar}{felix.detect.java.version}", \ + javax.script;version="${dollar}{felix.detect.java.version}", \ + javax.security.auth;version="${dollar}{felix.detect.java.version}", \ + javax.security.auth.callback;version="${dollar}{felix.detect.java.version}", \ + javax.security.auth.kerberos;uses:="javax.crypto,javax.security.auth";version="${dollar}{felix.detect.java.version}", \ + javax.security.auth.login;uses:="javax.security.auth,javax.security.auth.callback";version="${dollar}{felix.detect.java.version}", \ + javax.security.auth.spi;uses:="javax.security.auth,javax.security.auth.callback,javax.security.auth.login";version="${dollar}{felix.detect.java.version}", \ + javax.security.auth.x500;uses:="javax.security.auth";version="${dollar}{felix.detect.java.version}", \ + javax.security.cert;version="${dollar}{felix.detect.java.version}", \ + javax.security.sasl;uses:="javax.security.auth.callback";version="${dollar}{felix.detect.java.version}", \ + javax.sound.midi;uses:="javax.sound.midi.spi";version="${dollar}{felix.detect.java.version}", \ + javax.sound.midi.spi;uses:="javax.sound.midi";version="${dollar}{felix.detect.java.version}", \ + javax.sound.sampled;uses:="javax.sound.sampled.spi";version="${dollar}{felix.detect.java.version}", \ + javax.sound.sampled.spi;uses:="javax.sound.sampled";version="${dollar}{felix.detect.java.version}", \ + javax.sql;uses:="javax.transaction.xa";version="${dollar}{felix.detect.java.version}", \ + javax.sql.rowset;uses:="javax.sql,javax.sql.rowset.serial,javax.sql.rowset.spi";version="${dollar}{felix.detect.java.version}", \ + javax.sql.rowset.serial;uses:="javax.sql.rowset";version="${dollar}{felix.detect.java.version}", \ + javax.sql.rowset.spi;uses:="javax.naming,javax.sql,javax.sql.rowset";version="${dollar}{felix.detect.java.version}", \ + javax.swing;uses:="javax.accessibility,javax.print,javax.print.attribute,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.table,javax.swing.text,javax.swing.text.html,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.border;uses:="javax.swing";version="${dollar}{felix.detect.java.version}", \ + javax.swing.event;uses:="javax.swing,javax.swing.table,javax.swing.text,javax.swing.tree,javax.swing.undo";version="${dollar}{felix.detect.java.version}", \ + javax.swing.filechooser;uses:="javax.swing";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf;uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.metal;uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.text,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.multi;uses:="javax.accessibility,javax.swing,javax.swing.filechooser,javax.swing.plaf,javax.swing.text,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.table;uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf";version="${dollar}{felix.detect.java.version}", \ + javax.swing.text;uses:="javax.accessibility,javax.print,javax.print.attribute,javax.swing,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.tree,javax.swing.undo";version="${dollar}{felix.detect.java.version}", \ + javax.swing.text.html;uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf,javax.swing.text,javax.swing.undo";version="${dollar}{felix.detect.java.version}", \ + javax.swing.text.html.parser;uses:="javax.swing.text,javax.swing.text.html";version="${dollar}{felix.detect.java.version}", \ + javax.swing.text.rtf;uses:="javax.swing.text";version="${dollar}{felix.detect.java.version}", \ + javax.swing.tree;uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic";version="${dollar}{felix.detect.java.version}", \ + javax.swing.undo;uses:="javax.swing,javax.swing.event";version="${dollar}{felix.detect.java.version}", \ + javax.tools;uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element";version="${dollar}{felix.detect.java.version}", \ + javax.transaction;version="${dollar}{felix.detect.java.version}", \ + javax.transaction.xa;version="${dollar}{felix.detect.java.version}", \ + javax.xml;version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind;uses:="javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.datatype,javax.xml.namespace,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,org.w3c.dom,org.xml.sax";version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind.annotation;uses:="javax.xml.bind,javax.xml.parsers,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind.annotation.adapters;uses:="javax.xml.bind";version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind.attachment;uses:="javax.activation";version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind.helpers;uses:="javax.xml.bind,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transform.stream,javax.xml.validation,org.w3c.dom,org.xml.sax";version="${dollar}{felix.detect.java.version}", \ + javax.xml.bind.util;uses:="javax.xml.bind,javax.xml.transform.sax,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto;uses:="javax.xml.crypto.dsig.keyinfo";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto.dom;uses:="javax.xml.crypto,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto.dsig;uses:="javax.xml.crypto,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto.dsig.dom;uses:="javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto.dsig.keyinfo;uses:="javax.xml.crypto";version="${dollar}{felix.detect.java.version}", \ + javax.xml.crypto.dsig.spec;uses:="javax.xml.crypto";version="${dollar}{felix.detect.java.version}", \ + javax.xml.datatype;uses:="javax.xml.namespace";version="${dollar}{felix.detect.java.version}", \ + javax.xml.namespace;version="${dollar}{felix.detect.java.version}", \ + javax.xml.parsers;uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers";version="${dollar}{felix.detect.java.version}", \ + javax.xml.soap;uses:="javax.activation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.stream;uses:="javax.xml.namespace,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform";version="${dollar}{felix.detect.java.version}", \ + javax.xml.stream.events;uses:="javax.xml.namespace,javax.xml.stream";version="${dollar}{felix.detect.java.version}", \ + javax.xml.stream.util;uses:="javax.xml.namespace,javax.xml.stream,javax.xml.stream.events";version="${dollar}{felix.detect.java.version}", \ + javax.xml.transform;version="${dollar}{felix.detect.java.version}", \ + javax.xml.transform.dom;uses:="javax.xml.transform,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.transform.sax;uses:="javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.xml.sax.ext";version="${dollar}{felix.detect.java.version}", \ + javax.xml.transform.stax;uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.transform";version="${dollar}{felix.detect.java.version}", \ + javax.xml.transform.stream;uses:="javax.xml.transform";version="${dollar}{felix.detect.java.version}", \ + javax.xml.validation;uses:="javax.xml.transform,javax.xml.transform.stream,org.w3c.dom,org.w3c.dom.ls,org.xml.sax";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.handler;uses:="javax.xml.namespace,javax.xml.ws";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.handler.soap;uses:="javax.xml.bind,javax.xml.namespace,javax.xml.soap,javax.xml.ws.handler";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.http;uses:="javax.xml.ws";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.soap;uses:="javax.xml.soap,javax.xml.ws,javax.xml.ws.spi";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.spi;uses:="javax.xml.bind,javax.xml.namespace,javax.xml.transform,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.wsaddressing,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.wsaddressing;uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.ws,javax.xml.ws.spi,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.xpath;uses:="javax.xml.namespace,org.xml.sax";version="${dollar}{felix.detect.java.version}", \ + org.ietf.jgss;version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA;uses:="org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA.DynAnyPackage;uses:="org.omg.CORBA";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA.ORBPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA.TypeCodePackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA.portable;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA_2_3;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CORBA_2_3.portable;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CosNaming;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.PortableServer";version="${dollar}{felix.detect.java.version}", \ + org.omg.CosNaming.NamingContextExtPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.CosNaming.NamingContextPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming";version="${dollar}{felix.detect.java.version}", \ + org.omg.Dynamic;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.DynamicAny;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage";version="${dollar}{felix.detect.java.version}", \ + org.omg.DynamicAny.DynAnyFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.DynamicAny.DynAnyPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.IOP;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage";version="${dollar}{felix.detect.java.version}", \ + org.omg.IOP.CodecFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.IOP.CodecPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.Messaging;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableInterceptor;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable,org.omg.Dynamic,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableInterceptor.ORBInitInfoPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.ServantLocatorPackage,org.omg.PortableServer.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer.CurrentPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer.POAManagerPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer.POAPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer.ServantLocatorPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.PortableServer.portable;uses:="org.omg.CORBA,org.omg.PortableServer";version="${dollar}{felix.detect.java.version}", \ + org.omg.SendingContext;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="${dollar}{felix.detect.java.version}", \ + org.omg.stub.java.rmi;uses:="javax.rmi.CORBA";version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom;version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom.bootstrap;uses:="org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom.ls;uses:="org.w3c.dom,org.w3c.dom.events";version="${dollar}{felix.detect.java.version}", \ + org.xml.sax;version="${dollar}{felix.detect.java.version}", \ + org.xml.sax.ext;uses:="org.xml.sax,org.xml.sax.helpers";version="${dollar}{felix.detect.java.version}", \ + org.xml.sax.helpers;uses:="org.xml.sax";version="${dollar}{felix.detect.java.version}" + +jre-base-1.6= \ + ${jre-base}, \ + javax.crypto;uses:="javax.crypto.spec";version="${dollar}{felix.detect.java.version}", \ + javax.lang.model;version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom.events;uses:="org.w3c.dom";version="${dollar}{felix.detect.java.version}" jre-1.6= \ - ${dollar}{jre-1.6-java-base}, \ - javax.accessibility;uses:="javax.swing.text";version="0.0.0.1_006_JavaSE", \ - javax.activation;version="0.0.0.1_006_JavaSE", \ - javax.activity;version="0.0.0.1_006_JavaSE", \ - javax.annotation.processing;uses:="javax.tools,javax.lang.model,javax.lang.model.element,javax.lang.model.util";version="0.0.0.1_006_JavaSE", \ - javax.annotation;version="0.0.0.1_006_JavaSE", \ - javax.crypto.interfaces;uses:="javax.crypto.spec,javax.crypto";version="0.0.0.1_006_JavaSE", \ - javax.crypto.spec;uses:="javax.crypto";version="0.0.0.1_006_JavaSE", \ - javax.crypto;uses:="javax.crypto.spec";version="0.0.0.1_006_JavaSE", \ - javax.imageio.event;uses:="javax.imageio";version="0.0.0.1_006_JavaSE", \ - javax.imageio.metadata;uses:="org.w3c.dom,javax.imageio";version="0.0.0.1_006_JavaSE", \ - javax.imageio.plugins.bmp;uses:="javax.imageio";version="0.0.0.1_006_JavaSE", \ - javax.imageio.plugins.jpeg;uses:="javax.imageio";version="0.0.0.1_006_JavaSE", \ - javax.imageio.spi;uses:="javax.imageio.stream,javax.imageio,javax.imageio.metadata";version="0.0.0.1_006_JavaSE", \ - javax.imageio.stream;uses:="javax.imageio";version="0.0.0.1_006_JavaSE", \ - javax.imageio;uses:="javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,javax.imageio.event";version="0.0.0.1_006_JavaSE", \ - javax.jws.soap;version="0.0.0.1_006_JavaSE", \ - javax.jws;version="0.0.0.1_006_JavaSE", \ - javax.lang.model.element;uses:="javax.lang.model.type";version="0.0.0.1_006_JavaSE", \ - javax.lang.model.type;uses:="javax.lang.model.element";version="0.0.0.1_006_JavaSE", \ - javax.lang.model.util;uses:="javax.lang.model,javax.lang.model.element,javax.annotation.processing,javax.lang.model.type";version="0.0.0.1_006_JavaSE", \ - javax.lang.model;version="0.0.0.1_006_JavaSE", \ - javax.management.loading;uses:="javax.management";version="0.0.0.1_006_JavaSE", \ - javax.management.modelmbean;uses:="javax.management,javax.management.loading";version="0.0.0.1_006_JavaSE", \ - javax.management.monitor;uses:="javax.management,javax.management.openmbean";version="0.0.0.1_006_JavaSE", \ - javax.management.openmbean;uses:="javax.management";version="0.0.0.1_006_JavaSE", \ - javax.management.relation;uses:="javax.management";version="0.0.0.1_006_JavaSE", \ - javax.management.remote.rmi;uses:="javax.management.remote,javax.security.auth,javax.management,javax.management.loading,javax.naming,org.omg.CORBA,javax.rmi.ssl,org.omg.CORBA.portable,javax.rmi,javax.rmi.CORBA,org.omg.CORBA_2_3.portable";version="0.0.0.1_006_JavaSE", \ - javax.management.remote;uses:="javax.security.auth,javax.management";version="0.0.0.1_006_JavaSE", \ - javax.management.timer;uses:="javax.management";version="0.0.0.1_006_JavaSE", \ - javax.management;uses:="javax.management.loading,javax.management.openmbean";version="0.0.0.1_006_JavaSE", \ - javax.naming.directory;uses:="javax.naming";version="0.0.0.1_006_JavaSE", \ - javax.naming.event;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_006_JavaSE", \ - javax.naming.ldap;uses:="javax.naming,javax.naming.directory,javax.net.ssl,javax.naming.event";version="0.0.0.1_006_JavaSE", \ - javax.naming.spi;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_006_JavaSE", \ - javax.naming;uses:="javax.naming.spi";version="0.0.0.1_006_JavaSE", \ - javax.net.ssl;uses:="javax.security.cert,javax.security.auth.x500,javax.net";version="0.0.0.1_006_JavaSE", \ - javax.net;version="0.0.0.1_006_JavaSE", \ - javax.print.attribute.standard;uses:="javax.print.attribute";version="0.0.0.1_006_JavaSE", \ - javax.print.attribute;version="0.0.0.1_006_JavaSE", \ - javax.print.event;uses:="javax.print,javax.print.attribute";version="0.0.0.1_006_JavaSE", \ - javax.print;uses:="javax.print.attribute,javax.print.event,javax.print.attribute.standard";version="0.0.0.1_006_JavaSE", \ - javax.rmi.CORBA;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,org.omg.SendingContext";version="0.0.0.1_006_JavaSE", \ - javax.rmi.ssl;uses:="javax.net,javax.net.ssl";version="0.0.0.1_006_JavaSE", \ - javax.rmi;uses:="org.omg.CORBA,javax.rmi.CORBA";version="0.0.0.1_006_JavaSE", \ - javax.script;version="0.0.0.1_006_JavaSE", \ - javax.security.auth.callback;version="0.0.0.1_006_JavaSE", \ - javax.security.auth.kerberos;uses:="javax.security.auth,javax.crypto";version="0.0.0.1_006_JavaSE", \ - javax.security.auth.login;uses:="javax.security.auth,javax.security.auth.callback";version="0.0.0.1_006_JavaSE", \ - javax.security.auth.spi;uses:="javax.security.auth.callback,javax.security.auth.login,javax.security.auth";version="0.0.0.1_006_JavaSE", \ - javax.security.auth.x500;uses:="javax.security.auth";version="0.0.0.1_006_JavaSE", \ - javax.security.auth;version="0.0.0.1_006_JavaSE", \ - javax.security.cert;version="0.0.0.1_006_JavaSE", \ - javax.security.sasl;uses:="javax.security.auth.callback";version="0.0.0.1_006_JavaSE", \ - javax.sound.midi.spi;uses:="javax.sound.midi";version="0.0.0.1_006_JavaSE", \ - javax.sound.midi;uses:="javax.sound.midi.spi";version="0.0.0.1_006_JavaSE", \ - javax.sound.sampled.spi;uses:="javax.sound.sampled";version="0.0.0.1_006_JavaSE", \ - javax.sound.sampled;uses:="javax.sound.sampled.spi";version="0.0.0.1_006_JavaSE", \ - javax.sql.rowset.serial;uses:="javax.sql.rowset";version="0.0.0.1_006_JavaSE", \ - javax.sql.rowset.spi;uses:="javax.sql,javax.naming,javax.sql.rowset";version="0.0.0.1_006_JavaSE", \ - javax.sql.rowset;uses:="javax.sql,javax.sql.rowset.serial,javax.sql.rowset.spi";version="0.0.0.1_006_JavaSE", \ - javax.sql;uses:="javax.transaction.xa";version="0.0.0.1_006_JavaSE", \ - javax.swing.border;uses:="javax.swing";version="0.0.0.1_006_JavaSE", \ - javax.swing.colorchooser;uses:="javax.swing.event,javax.swing,javax.swing.border";version="0.0.0.1_006_JavaSE", \ - javax.swing.event;uses:="javax.swing,javax.swing.text,javax.swing.table,javax.swing.tree,javax.swing.undo";version="0.0.0.1_006_JavaSE", \ - javax.swing.filechooser;uses:="javax.swing";version="0.0.0.1_006_JavaSE", \ - javax.swing.plaf.basic;uses:="javax.swing.border,javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.event,javax.swing.colorchooser,javax.accessibility,javax.swing.filechooser,javax.swing.text.html,javax.sound.sampled,javax.swing.table,javax.swing.tree";version="0.0.0.1_006_JavaSE", \ - javax.swing.plaf.metal;uses:="javax.swing.plaf,javax.swing,javax.swing.border,javax.swing.text,javax.swing.plaf.basic,javax.swing.filechooser,javax.swing.event,javax.swing.tree";version="0.0.0.1_006_JavaSE", \ - javax.swing.plaf.multi;uses:="javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_006_JavaSE", \ - javax.swing.plaf.synth;uses:="javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.border,javax.swing.plaf.basic,javax.swing.colorchooser,javax.swing.event,javax.xml.parsers,org.xml.sax,javax.swing.table,javax.swing.tree";version="0.0.0.1_006_JavaSE", \ - javax.swing.plaf;uses:="javax.swing,javax.swing.border,javax.accessibility,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_006_JavaSE", \ - javax.swing.table;uses:="javax.swing.event,javax.swing.plaf,javax.swing.border,javax.swing,javax.accessibility";version="0.0.0.1_006_JavaSE", \ - javax.swing.text.html.parser;uses:="javax.swing.text.html,javax.swing.text";version="0.0.0.1_006_JavaSE", \ - javax.swing.text.html;uses:="javax.swing.event,javax.swing.text,javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.undo";version="0.0.0.1_006_JavaSE", \ - javax.swing.text.rtf;uses:="javax.swing.text";version="0.0.0.1_006_JavaSE", \ - javax.swing.text;uses:="javax.swing.event,javax.swing.tree,javax.swing.undo,javax.swing,javax.swing.plaf,javax.swing.plaf.basic,javax.print,javax.print.attribute,javax.accessibility,javax.swing.text.html";version="0.0.0.1_006_JavaSE", \ - javax.swing.tree;uses:="javax.swing.event,javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.basic";version="0.0.0.1_006_JavaSE", \ - javax.swing.undo;uses:="javax.swing,javax.swing.event";version="0.0.0.1_006_JavaSE", \ - javax.swing;uses:="javax.swing.event,javax.accessibility,javax.swing.text,javax.swing.plaf,javax.swing.border,javax.swing.tree,javax.swing.table,javax.swing.colorchooser,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.filechooser,javax.print,javax.print.attribute,javax.swing.plaf.metal";version="0.0.0.1_006_JavaSE", \ - javax.tools;uses:="javax.lang.model.element,javax.annotation.processing,javax.lang.model";version="0.0.0.1_006_JavaSE", \ - javax.transaction.xa;version="0.0.0.1_006_JavaSE", \ - javax.transaction;version="0.0.0.1_006_JavaSE", \ - javax.xml.bind.annotation.adapters;uses:="javax.xml.bind";version="0.0.0.1_006_JavaSE", \ - javax.xml.bind.annotation;uses:="javax.xml.transform,javax.xml.bind,javax.xml.parsers,javax.xml.transform.dom,org.w3c.dom";version="0.0.0.1_006_JavaSE", \ - javax.xml.bind.attachment;uses:="javax.activation";version="0.0.0.1_006_JavaSE", \ - javax.xml.bind.helpers;uses:="javax.xml.bind.annotation.adapters,javax.xml.transform.dom,org.w3c.dom,org.xml.sax,javax.xml.bind.attachment,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,javax.xml.transform.sax,javax.xml.bind,javax.xml.parsers";version="0.0.0.1_006_JavaSE", \ - javax.xml.bind.util;uses:="javax.xml.transform.sax,javax.xml.bind,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers";version="0.0.0.1_006_JavaSE", \ - javax.xml.bind;uses:="javax.xml.validation,javax.xml.namespace,javax.xml.datatype,javax.xml.transform,javax.xml.bind.annotation,javax.xml.transform.stream,org.w3c.dom,javax.xml.bind.attachment,javax.xml.stream,javax.xml.bind.annotation.adapters,org.xml.sax";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto.dom;uses:="javax.xml.crypto,org.w3c.dom";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto.dsig.dom;uses:="javax.xml.crypto.dsig,javax.xml.crypto,org.w3c.dom,javax.xml.crypto.dom";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto.dsig.keyinfo;uses:="javax.xml.crypto";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto.dsig.spec;uses:="javax.xml.crypto";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto.dsig;uses:="javax.xml.crypto,javax.xml.crypto.dsig.spec,javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_006_JavaSE", \ - javax.xml.crypto;uses:="javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_006_JavaSE", \ - javax.xml.datatype;uses:="javax.xml.namespace";version="0.0.0.1_006_JavaSE", \ - javax.xml.namespace;version="0.0.0.1_006_JavaSE", \ - javax.xml.parsers;uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_006_JavaSE", \ - javax.xml.soap;uses:="javax.activation,javax.xml.namespace,org.w3c.dom,javax.xml.transform.dom,javax.xml.transform";version="0.0.0.1_006_JavaSE", \ - javax.xml.stream.events;uses:="javax.xml.namespace,javax.xml.stream";version="0.0.0.1_006_JavaSE", \ - javax.xml.stream.util;uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.namespace";version="0.0.0.1_006_JavaSE", \ - javax.xml.stream;uses:="javax.xml.stream.events,javax.xml.namespace,javax.xml.stream.util,javax.xml.transform";version="0.0.0.1_006_JavaSE", \ - javax.xml.transform.dom;uses:="javax.xml.transform,org.w3c.dom";version="0.0.0.1_006_JavaSE", \ - javax.xml.transform.sax;uses:="org.xml.sax.ext,javax.xml.transform,org.xml.sax,javax.xml.transform.stream";version="0.0.0.1_006_JavaSE", \ - javax.xml.transform.stax;uses:="javax.xml.stream,javax.xml.transform,javax.xml.stream.events";version="0.0.0.1_006_JavaSE", \ - javax.xml.transform.stream;uses:="javax.xml.transform";version="0.0.0.1_006_JavaSE", \ - javax.xml.transform;version="0.0.0.1_006_JavaSE", \ - javax.xml.validation;uses:="org.w3c.dom.ls,javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.w3c.dom";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.handler.soap;uses:="javax.xml.ws.handler,javax.xml.namespace,javax.xml.soap,javax.xml.bind";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.handler;uses:="javax.xml.ws,javax.xml.namespace";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.http;uses:="javax.xml.ws";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.soap;uses:="javax.xml.ws.spi,javax.xml.ws,javax.xml.soap";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.spi;uses:="javax.xml.ws,javax.xml.ws.wsaddressing,javax.xml.transform,org.w3c.dom,javax.xml.namespace,javax.xml.ws.handler,javax.xml.bind";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws.wsaddressing;uses:="javax.xml.bind.annotation,javax.xml.namespace,org.w3c.dom,javax.xml.transform,javax.xml.bind,javax.xml.ws,javax.xml.ws.spi";version="0.0.0.1_006_JavaSE", \ - javax.xml.ws;uses:="javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.transform,org.w3c.dom,javax.xml.bind.annotation,javax.xml.transform.stream,javax.xml.bind,javax.xml.namespace";version="0.0.0.1_006_JavaSE", \ - javax.xml.xpath;uses:="org.xml.sax,javax.xml.namespace";version="0.0.0.1_006_JavaSE", \ - javax.xml;version="0.0.0.1_006_JavaSE", \ - org.ietf.jgss;version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA.DynAnyPackage;uses:="org.omg.CORBA";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA.ORBPackage;uses:="org.omg.CORBA";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA.TypeCodePackage;uses:="org.omg.CORBA";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA.portable;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA;uses:="org.omg.CORBA.portable,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA_2_3.portable,org.omg.CORBA.TypeCodePackage";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA_2_3.portable;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.CORBA_2_3;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.CosNaming.NamingContextExtPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.CosNaming.NamingContextPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming";version="0.0.0.1_006_JavaSE", \ - org.omg.CosNaming;uses:="org.omg.CORBA.portable,org.omg.CORBA,org.omg.PortableServer,org.omg.CosNaming.NamingContextPackage,org.omg.CosNaming.NamingContextExtPackage";version="0.0.0.1_006_JavaSE", \ - org.omg.Dynamic;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.DynamicAny.DynAnyFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.DynamicAny.DynAnyPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.DynamicAny;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage";version="0.0.0.1_006_JavaSE", \ - org.omg.IOP.CodecFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.IOP.CodecPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.IOP;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage";version="0.0.0.1_006_JavaSE", \ - org.omg.Messaging;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableInterceptor.ORBInitInfoPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableInterceptor;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.CORBA_2_3.portable,org.omg.Dynamic";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer.CurrentPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer.POAManagerPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer.POAPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer.ServantLocatorPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer.portable;uses:="org.omg.CORBA,org.omg.PortableServer";version="0.0.0.1_006_JavaSE", \ - org.omg.PortableServer;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.portable,org.omg.CORBA_2_3,org.omg.PortableServer.ServantLocatorPackage";version="0.0.0.1_006_JavaSE", \ - org.omg.SendingContext;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_006_JavaSE", \ - org.omg.stub.java.rmi;uses:="javax.rmi.CORBA";version="0.0.0.1_006_JavaSE", \ - org.w3c.dom.bootstrap;uses:="org.w3c.dom";version="0.0.0.1_006_JavaSE", \ - org.w3c.dom.events;uses:="org.w3c.dom,org.w3c.dom.views";version="0.0.0.1_006_JavaSE", \ - org.w3c.dom.ls;uses:="org.w3c.dom,org.w3c.dom.events,org.w3c.dom.traversal";version="0.0.0.1_006_JavaSE", \ - org.w3c.dom;version="0.0.0.1_006_JavaSE", \ - org.xml.sax.ext;uses:="org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_006_JavaSE", \ - org.xml.sax.helpers;uses:="org.xml.sax";version="0.0.0.1_006_JavaSE", \ - org.xml.sax;version="0.0.0.1_006_JavaSE" + ${jre-base-1.6}, \ + javax.lang.model.element;uses:="javax.lang.model.type";version="${dollar}{felix.detect.java.version}", \ + javax.lang.model.type;uses:="javax.lang.model.element";version="${dollar}{felix.detect.java.version}", \ + javax.management.monitor;uses:="javax.management,javax.management.openmbean";version="${dollar}{felix.detect.java.version}", \ + javax.swing.colorchooser;uses:="javax.swing,javax.swing.border,javax.swing.event";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.basic;uses:="javax.accessibility,javax.sound.sampled,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.synth;uses:="javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.table,javax.swing.text,javax.swing.tree,javax.xml.parsers,org.xml.sax";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws;uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.stream,javax.xml.ws.handler,javax.xml.ws.spi,org.w3c.dom";version="${dollar}{felix.detect.java.version}" + +jre-base-1.7=, \ + java.lang.invoke;version="${dollar}{felix.detect.java.version}", \ + java.nio.file;version="${dollar}{felix.detect.java.version}", \ + java.nio.file.attribute;version="${dollar}{felix.detect.java.version}", \ + java.nio.file.spi;version="${dollar}{felix.detect.java.version}", \ + javax.lang.model.element;uses:="javax.lang.model,javax.lang.model.type";version="${dollar}{felix.detect.java.version}", \ + javax.lang.model.type;uses:="javax.lang.model,javax.lang.model.element";version="${dollar}{felix.detect.java.version}", \ + javax.management.monitor;uses:="javax.management";version="${dollar}{felix.detect.java.version}", \ + javax.swing.colorchooser;uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.text";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.basic;uses:="javax.accessibility,javax.sound.sampled,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.synth,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.tree";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.nimbus;uses:="javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.synth";version="${dollar}{felix.detect.java.version}", \ + javax.swing.plaf.synth;uses:="javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.table,javax.swing.text,javax.swing.tree,javax.xml.parsers,org.xml.sax,org.xml.sax.helpers";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws;uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.stream,javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,org.w3c.dom";version="${dollar}{felix.detect.java.version}", \ + javax.xml.ws.spi.http;version="${dollar}{felix.detect.java.version}" jre-1.7= \ - ${dollar}{jre-1.7-java-base}, \ - javax.accessibility;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", \ - javax.activation;version="0.0.0.1_007_JavaSE", \ - javax.activity;version="0.0.0.1_007_JavaSE", \ - javax.annotation.processing;uses:="javax.tools,javax.lang.model,javax.lang.model.element,javax.lang.model.util";version="0.0.0.1_007_JavaSE", \ - javax.annotation;version="0.0.0.1_007_JavaSE", \ - javax.crypto.interfaces;uses:="javax.crypto.spec,javax.crypto";version="0.0.0.1_007_JavaSE", \ - javax.crypto.spec;uses:="javax.crypto";version="0.0.0.1_007_JavaSE", \ - javax.crypto;uses:="javax.crypto.spec";version="0.0.0.1_007_JavaSE", \ - javax.imageio.event;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ - javax.imageio.metadata;uses:="org.w3c.dom,javax.imageio";version="0.0.0.1_007_JavaSE", \ - javax.imageio.plugins.bmp;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ - javax.imageio.plugins.jpeg;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ - javax.imageio.spi;uses:="javax.imageio.stream,javax.imageio,javax.imageio.metadata";version="0.0.0.1_007_JavaSE", \ - javax.imageio.stream;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ - javax.imageio;uses:="javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,javax.imageio.event";version="0.0.0.1_007_JavaSE", \ - javax.jws.soap;version="0.0.0.1_007_JavaSE", \ - javax.jws;version="0.0.0.1_007_JavaSE", \ - javax.lang.model.element;uses:="javax.lang.model.type,javax.lang.model";version="0.0.0.1_007_JavaSE", \ - javax.lang.model.type;uses:="javax.lang.model.element,javax.lang.model";version="0.0.0.1_007_JavaSE", \ - javax.lang.model.util;uses:="javax.lang.model,javax.lang.model.element,javax.annotation.processing,javax.lang.model.type";version="0.0.0.1_007_JavaSE", \ - javax.lang.model;version="0.0.0.1_007_JavaSE", \ - javax.management.loading;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management.modelmbean;uses:="javax.management,javax.management.loading";version="0.0.0.1_007_JavaSE", \ - javax.management.monitor;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management.openmbean;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management.relation;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management.remote.rmi;uses:="javax.management.remote,javax.security.auth,javax.management,javax.management.loading,javax.naming,javax.rmi.ssl,org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,javax.rmi.CORBA,javax.rmi";version="0.0.0.1_007_JavaSE", \ - javax.management.remote;uses:="javax.security.auth,javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management.timer;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ - javax.management;uses:="javax.management.loading,javax.management.openmbean";version="0.0.0.1_007_JavaSE", \ - javax.naming.directory;uses:="javax.naming";version="0.0.0.1_007_JavaSE", \ - javax.naming.event;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", \ - javax.naming.ldap;uses:="javax.naming,javax.naming.directory,javax.net.ssl,javax.naming.event";version="0.0.0.1_007_JavaSE", \ - javax.naming.spi;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", \ - javax.naming;uses:="javax.naming.spi";version="0.0.0.1_007_JavaSE", \ - javax.net.ssl;uses:="javax.security.cert,javax.security.auth.x500,javax.net";version="0.0.0.1_007_JavaSE", \ - javax.net;version="0.0.0.1_007_JavaSE", \ - javax.print.attribute.standard;uses:="javax.print.attribute";version="0.0.0.1_007_JavaSE", \ - javax.print.attribute;version="0.0.0.1_007_JavaSE", \ - javax.print.event;uses:="javax.print,javax.print.attribute";version="0.0.0.1_007_JavaSE", \ - javax.print;uses:="javax.print.attribute,javax.print.event,javax.print.attribute.standard";version="0.0.0.1_007_JavaSE", \ - javax.rmi.CORBA;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,org.omg.SendingContext";version="0.0.0.1_007_JavaSE", \ - javax.rmi.ssl;uses:="javax.net,javax.net.ssl";version="0.0.0.1_007_JavaSE", \ - javax.rmi;uses:="org.omg.CORBA,javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", \ - javax.script;version="0.0.0.1_007_JavaSE", \ - javax.security.auth.callback;version="0.0.0.1_007_JavaSE", \ - javax.security.auth.kerberos;uses:="javax.security.auth,javax.crypto";version="0.0.0.1_007_JavaSE", \ - javax.security.auth.login;uses:="javax.security.auth,javax.security.auth.callback";version="0.0.0.1_007_JavaSE", \ - javax.security.auth.spi;uses:="javax.security.auth.callback,javax.security.auth.login,javax.security.auth";version="0.0.0.1_007_JavaSE", \ - javax.security.auth.x500;uses:="javax.security.auth";version="0.0.0.1_007_JavaSE", \ - javax.security.auth;version="0.0.0.1_007_JavaSE", \ - javax.security.cert;version="0.0.0.1_007_JavaSE", \ - javax.security.sasl;uses:="javax.security.auth.callback";version="0.0.0.1_007_JavaSE", \ - javax.sound.midi.spi;uses:="javax.sound.midi";version="0.0.0.1_007_JavaSE", \ - javax.sound.midi;uses:="javax.sound.midi.spi";version="0.0.0.1_007_JavaSE", \ - javax.sound.sampled.spi;uses:="javax.sound.sampled";version="0.0.0.1_007_JavaSE", \ - javax.sound.sampled;uses:="javax.sound.sampled.spi";version="0.0.0.1_007_JavaSE", \ - javax.sql.rowset.serial;uses:="javax.sql.rowset";version="0.0.0.1_007_JavaSE", \ - javax.sql.rowset.spi;uses:="javax.sql,javax.naming,javax.sql.rowset";version="0.0.0.1_007_JavaSE", \ - javax.sql.rowset;uses:="javax.sql,javax.sql.rowset.serial,javax.sql.rowset.spi";version="0.0.0.1_007_JavaSE", \ - javax.sql;uses:="javax.transaction.xa";version="0.0.0.1_007_JavaSE", \ - javax.swing.border;uses:="javax.swing";version="0.0.0.1_007_JavaSE", \ - javax.swing.colorchooser;uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.text";version="0.0.0.1_007_JavaSE", \ - javax.swing.event;uses:="javax.swing,javax.swing.text,javax.swing.table,javax.swing.tree,javax.swing.undo";version="0.0.0.1_007_JavaSE", \ - javax.swing.filechooser;uses:="javax.swing";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf.basic;uses:="javax.swing.border,javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.event,javax.swing.colorchooser,javax.accessibility,javax.swing.filechooser,javax.swing.text.html,javax.sound.sampled,javax.swing.table,javax.swing.plaf.synth,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf.metal;uses:="javax.swing.plaf,javax.swing,javax.swing.border,javax.swing.text,javax.swing.plaf.basic,javax.swing.filechooser,javax.swing.event,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf.multi;uses:="javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf.nimbus;uses:="javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.plaf.synth";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf.synth;uses:="javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.border,javax.swing.plaf.basic,javax.swing.colorchooser,javax.swing.event,javax.xml.parsers,org.xml.sax,org.xml.sax.helpers,javax.swing.table,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ - javax.swing.plaf;uses:="javax.swing,javax.swing.border,javax.accessibility,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ - javax.swing.table;uses:="javax.swing.event,javax.swing.plaf,javax.swing.border,javax.swing,javax.accessibility";version="0.0.0.1_007_JavaSE", \ - javax.swing.text.html.parser;uses:="javax.swing.text,javax.swing.text.html";version="0.0.0.1_007_JavaSE", \ - javax.swing.text.html;uses:="javax.swing.event,javax.swing.text,javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.undo";version="0.0.0.1_007_JavaSE", \ - javax.swing.text.rtf;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", \ - javax.swing.text;uses:="javax.swing.event,javax.swing.tree,javax.swing.undo,javax.swing,javax.swing.plaf,javax.swing.plaf.basic,javax.print,javax.print.attribute,javax.accessibility,javax.swing.text.html";version="0.0.0.1_007_JavaSE", \ - javax.swing.tree;uses:="javax.swing.event,javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.basic";version="0.0.0.1_007_JavaSE", \ - javax.swing.undo;uses:="javax.swing,javax.swing.event";version="0.0.0.1_007_JavaSE", \ - javax.swing;uses:="javax.swing.event,javax.accessibility,javax.swing.text,javax.swing.plaf,javax.swing.border,javax.swing.tree,javax.swing.table,javax.swing.colorchooser,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.filechooser,javax.print,javax.print.attribute,javax.swing.plaf.metal";version="0.0.0.1_007_JavaSE", \ - javax.tools;uses:="javax.lang.model.element,javax.annotation.processing,javax.lang.model";version="0.0.0.1_007_JavaSE", \ - javax.transaction.xa;version="0.0.0.1_007_JavaSE", \ - javax.transaction;version="0.0.0.1_007_JavaSE", \ - javax.xml.bind.annotation.adapters;uses:="javax.xml.bind";version="0.0.0.1_007_JavaSE", \ - javax.xml.bind.annotation;uses:="javax.xml.transform,javax.xml.bind,javax.xml.parsers,javax.xml.transform.dom,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ - javax.xml.bind.attachment;uses:="javax.activation";version="0.0.0.1_007_JavaSE", \ - javax.xml.bind.helpers;uses:="javax.xml.bind.annotation.adapters,javax.xml.transform.dom,org.w3c.dom,org.xml.sax,javax.xml.bind.attachment,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,javax.xml.transform.sax,javax.xml.bind,javax.xml.parsers";version="0.0.0.1_007_JavaSE", \ - javax.xml.bind.util;uses:="javax.xml.transform.sax,javax.xml.bind,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ - javax.xml.bind;uses:="javax.xml.validation,javax.xml.namespace,javax.xml.datatype,javax.xml.transform,javax.xml.bind.annotation,javax.xml.transform.stream,org.w3c.dom,javax.xml.bind.attachment,javax.xml.stream,javax.xml.bind.annotation.adapters,org.xml.sax";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto.dom;uses:="javax.xml.crypto,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto.dsig.dom;uses:="javax.xml.crypto.dsig,javax.xml.crypto,org.w3c.dom,javax.xml.crypto.dom";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto.dsig.keyinfo;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto.dsig.spec;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto.dsig;uses:="javax.xml.crypto,javax.xml.crypto.dsig.spec,javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", \ - javax.xml.crypto;uses:="javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", \ - javax.xml.datatype;uses:="javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ - javax.xml.namespace;version="0.0.0.1_007_JavaSE", \ - javax.xml.parsers;uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ - javax.xml.soap;uses:="javax.activation,javax.xml.namespace,org.w3c.dom,javax.xml.transform.dom,javax.xml.transform";version="0.0.0.1_007_JavaSE", \ - javax.xml.stream.events;uses:="javax.xml.namespace,javax.xml.stream";version="0.0.0.1_007_JavaSE", \ - javax.xml.stream.util;uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ - javax.xml.stream;uses:="javax.xml.stream.events,javax.xml.namespace,javax.xml.stream.util,javax.xml.transform";version="0.0.0.1_007_JavaSE", \ - javax.xml.transform.dom;uses:="javax.xml.transform,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ - javax.xml.transform.sax;uses:="org.xml.sax.ext,javax.xml.transform,org.xml.sax,javax.xml.transform.stream";version="0.0.0.1_007_JavaSE", \ - javax.xml.transform.stax;uses:="javax.xml.stream,javax.xml.transform,javax.xml.stream.events";version="0.0.0.1_007_JavaSE", \ - javax.xml.transform.stream;uses:="javax.xml.transform";version="0.0.0.1_007_JavaSE", \ - javax.xml.transform;version="0.0.0.1_007_JavaSE", \ - javax.xml.validation;uses:="org.w3c.dom.ls,javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.handler.soap;uses:="javax.xml.ws.handler,javax.xml.namespace,javax.xml.soap,javax.xml.bind";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.handler;uses:="javax.xml.ws,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.http;uses:="javax.xml.ws";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.soap;uses:="javax.xml.ws.spi,javax.xml.ws,javax.xml.soap";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.spi.http;version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.spi;uses:="javax.xml.ws,javax.xml.ws.wsaddressing,javax.xml.transform,org.w3c.dom,javax.xml.namespace,javax.xml.ws.handler,javax.xml.bind";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws.wsaddressing;uses:="javax.xml.bind.annotation,javax.xml.namespace,org.w3c.dom,javax.xml.transform,javax.xml.bind,javax.xml.ws,javax.xml.ws.spi";version="0.0.0.1_007_JavaSE", \ - javax.xml.ws;uses:="javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,javax.xml.transform,org.w3c.dom,javax.xml.bind.annotation,javax.xml.transform.stream,javax.xml.bind,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ - javax.xml.xpath;uses:="org.xml.sax,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ - javax.xml;version="0.0.0.1_007_JavaSE", \ - org.ietf.jgss;version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA.DynAnyPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA.ORBPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA.TypeCodePackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA.portable;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA;uses:="org.omg.CORBA.portable,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA_2_3.portable,org.omg.CORBA.TypeCodePackage";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA_2_3.portable;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.CORBA_2_3;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.CosNaming.NamingContextExtPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.CosNaming.NamingContextPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming";version="0.0.0.1_007_JavaSE", \ - org.omg.CosNaming;uses:="org.omg.CORBA.portable,org.omg.CORBA,org.omg.PortableServer,org.omg.CosNaming.NamingContextPackage,org.omg.CosNaming.NamingContextExtPackage";version="0.0.0.1_007_JavaSE", \ - org.omg.Dynamic;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.DynamicAny.DynAnyFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.DynamicAny.DynAnyPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.DynamicAny;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage";version="0.0.0.1_007_JavaSE", \ - org.omg.IOP.CodecFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.IOP.CodecPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.IOP;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage";version="0.0.0.1_007_JavaSE", \ - org.omg.Messaging;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableInterceptor.ORBInitInfoPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableInterceptor;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.CORBA_2_3.portable,org.omg.Dynamic";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer.CurrentPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer.POAManagerPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer.POAPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer.ServantLocatorPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer.portable;uses:="org.omg.CORBA,org.omg.PortableServer";version="0.0.0.1_007_JavaSE", \ - org.omg.PortableServer;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.portable,org.omg.CORBA_2_3,org.omg.PortableServer.ServantLocatorPackage";version="0.0.0.1_007_JavaSE", \ - org.omg.SendingContext;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ - org.omg.stub.java.rmi;uses:="javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", \ - org.w3c.dom.bootstrap;uses:="org.w3c.dom";version="0.0.0.1_007_JavaSE", \ - org.w3c.dom.events;uses:="org.w3c.dom,org.w3c.dom.views";version="0.0.0.1_007_JavaSE", \ - org.w3c.dom.ls;uses:="org.w3c.dom,org.w3c.dom.events,org.w3c.dom.traversal";version="0.0.0.1_007_JavaSE", \ - org.w3c.dom;version="0.0.0.1_007_JavaSE", \ - org.xml.sax.ext;uses:="org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ - org.xml.sax.helpers;uses:="org.xml.sax";version="0.0.0.1_007_JavaSE", \ - org.xml.sax;version="0.0.0.1_007_JavaSE" - -jre-1.8= \ - ${dollar}{jre-1.8-java-base}, \ - javax.accessibility;version="0.0.0.1_008_JavaSE";uses:="javax.swing.text", \ - javax.activation;version="0.0.0.1_008_JavaSE", \ - javax.activity;version="0.0.0.1_008_JavaSE", \ - javax.annotation;version="0.0.0.1_008_JavaSE", \ - javax.annotation.processing;version="0.0.0.1_008_JavaSE";uses:="javax.lang.model,javax.lang.model.element,javax.lang.model.util,javax.tools", \ - javax.crypto;version="0.0.0.1_008_JavaSE", \ - javax.crypto.interfaces;version="0.0.0.1_008_JavaSE", \ - javax.crypto.spec;version="0.0.0.1_008_JavaSE", \ - javax.imageio;version="0.0.0.1_008_JavaSE";uses:="javax.imageio.event,javax.imageio.metadata,javax.imageio.spi,javax.imageio.stream", \ - javax.imageio.event;version="0.0.0.1_008_JavaSE";uses:="javax.imageio", \ - javax.imageio.metadata;version="0.0.0.1_008_JavaSE";uses:="javax.imageio,org.w3c.dom", \ - javax.imageio.plugins.bmp;version="0.0.0.1_008_JavaSE";uses:="javax.imageio", \ - javax.imageio.plugins.jpeg;version="0.0.0.1_008_JavaSE";uses:="javax.imageio", \ - javax.imageio.spi;version="0.0.0.1_008_JavaSE";uses:="javax.imageio,javax.imageio.metadata,javax.imageio.stream", \ - javax.imageio.stream;version="0.0.0.1_008_JavaSE", \ - javax.jws;version="0.0.0.1_008_JavaSE", \ - javax.jws.soap;version="0.0.0.1_008_JavaSE", \ - javax.lang.model;version="0.0.0.1_008_JavaSE";uses:="javax.lang.model.element", \ - javax.lang.model.element;version="0.0.0.1_008_JavaSE";uses:="javax.lang.model,javax.lang.model.type", \ - javax.lang.model.type;version="0.0.0.1_008_JavaSE";uses:="javax.lang.model,javax.lang.model.element", \ - javax.lang.model.util;version="0.0.0.1_008_JavaSE";uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element,javax.lang.model.type", \ - javax.management;version="0.0.0.1_008_JavaSE";uses:="javax.management.loading", \ - javax.management.loading;version="0.0.0.1_008_JavaSE";uses:="javax.management", \ - javax.management.modelmbean;version="0.0.0.1_008_JavaSE";uses:="javax.management,javax.management.loading", \ - javax.management.monitor;version="0.0.0.1_008_JavaSE";uses:="javax.management", \ - javax.management.openmbean;version="0.0.0.1_008_JavaSE";uses:="javax.management", \ - javax.management.relation;version="0.0.0.1_008_JavaSE";uses:="javax.management", \ - javax.management.remote;version="0.0.0.1_008_JavaSE";uses:="javax.management,javax.security.auth", \ - javax.management.remote.rmi;version="0.0.0.1_008_JavaSE";uses:="javax.management,javax.management.remote,javax.rmi.CORBA,javax.security.auth,org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable", \ - javax.management.timer;version="0.0.0.1_008_JavaSE";uses:="javax.management", \ - javax.naming;version="0.0.0.1_008_JavaSE", \ - javax.naming.directory;version="0.0.0.1_008_JavaSE";uses:="javax.naming", \ - javax.naming.event;version="0.0.0.1_008_JavaSE";uses:="javax.naming,javax.naming.directory", \ - javax.naming.ldap;version="0.0.0.1_008_JavaSE";uses:="javax.naming,javax.naming.directory,javax.naming.event,javax.net.ssl", \ - javax.naming.spi;version="0.0.0.1_008_JavaSE";uses:="javax.naming,javax.naming.directory", \ - javax.net;version="0.0.0.1_008_JavaSE", \ - javax.net.ssl;version="0.0.0.1_008_JavaSE";uses:="javax.net,javax.security.cert", \ - javax.print;version="0.0.0.1_008_JavaSE";uses:="javax.print.attribute,javax.print.event", \ - javax.print.attribute;version="0.0.0.1_008_JavaSE", \ - javax.print.attribute.standard;version="0.0.0.1_008_JavaSE";uses:="javax.print.attribute", \ - javax.print.event;version="0.0.0.1_008_JavaSE";uses:="javax.print,javax.print.attribute", \ - javax.rmi;version="0.0.0.1_008_JavaSE", \ - javax.rmi.CORBA;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable,org.omg.SendingContext", \ - javax.rmi.ssl;version="0.0.0.1_008_JavaSE";uses:="javax.net.ssl", \ - javax.script;version="0.0.0.1_008_JavaSE", \ - javax.security.auth;version="0.0.0.1_008_JavaSE", \ - javax.security.auth.callback;version="0.0.0.1_008_JavaSE", \ - javax.security.auth.kerberos;version="0.0.0.1_008_JavaSE";uses:="javax.crypto,javax.security.auth", \ - javax.security.auth.login;version="0.0.0.1_008_JavaSE";uses:="javax.security.auth,javax.security.auth.callback", \ - javax.security.auth.spi;version="0.0.0.1_008_JavaSE";uses:="javax.security.auth,javax.security.auth.callback,javax.security.auth.login", \ - javax.security.auth.x500;version="0.0.0.1_008_JavaSE";uses:="javax.security.auth", \ - javax.security.cert;version="0.0.0.1_008_JavaSE", \ - javax.security.sasl;version="0.0.0.1_008_JavaSE";uses:="javax.security.auth.callback", \ - javax.sound.midi;version="0.0.0.1_008_JavaSE", \ - javax.sound.midi.spi;version="0.0.0.1_008_JavaSE";uses:="javax.sound.midi", \ - javax.sound.sampled;version="0.0.0.1_008_JavaSE", \ - javax.sound.sampled.spi;version="0.0.0.1_008_JavaSE";uses:="javax.sound.sampled", \ - javax.sql;version="0.0.0.1_008_JavaSE";uses:="javax.transaction.xa", \ - javax.sql.rowset;version="0.0.0.1_008_JavaSE";uses:="javax.sql,javax.sql.rowset.spi", \ - javax.sql.rowset.serial;version="0.0.0.1_008_JavaSE", \ - javax.sql.rowset.spi;version="0.0.0.1_008_JavaSE";uses:="javax.naming,javax.sql,javax.sql.rowset", \ - javax.swing;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.print,javax.print.attribute,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.table,javax.swing.text,javax.swing.tree", \ - javax.swing.border;version="0.0.0.1_008_JavaSE";uses:="javax.swing", \ - javax.swing.colorchooser;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.event", \ - javax.swing.event;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.table,javax.swing.text,javax.swing.tree,javax.swing.undo", \ - javax.swing.filechooser;version="0.0.0.1_008_JavaSE";uses:="javax.swing", \ - javax.swing.plaf;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.filechooser,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.basic;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.table,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.metal;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.tree", \ - javax.swing.plaf.multi;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.filechooser,javax.swing.plaf,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.nimbus;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.plaf.synth", \ - javax.swing.plaf.synth;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.colorchooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.text,javax.swing.tree", \ - javax.swing.table;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf", \ - javax.swing.text;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.print,javax.print.attribute,javax.swing,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.tree,javax.swing.undo", \ - javax.swing.text.html;version="0.0.0.1_008_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.event,javax.swing.text", \ - javax.swing.text.html.parser;version="0.0.0.1_008_JavaSE";uses:="javax.swing.text,javax.swing.text.html", \ - javax.swing.text.rtf;version="0.0.0.1_008_JavaSE";uses:="javax.swing.text", \ - javax.swing.tree;version="0.0.0.1_008_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.event", \ - javax.swing.undo;version="0.0.0.1_008_JavaSE";uses:="javax.swing.event", \ - javax.tools;version="0.0.0.1_008_JavaSE";uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element", \ - javax.transaction;version="0.0.0.1_008_JavaSE", \ - javax.transaction.xa;version="0.0.0.1_008_JavaSE", \ - javax.xml;version="0.0.0.1_008_JavaSE", \ - javax.xml.bind;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.namespace,javax.xml.stream,javax.xml.transform,javax.xml.validation,org.w3c.dom,org.xml.sax", \ - javax.xml.bind.annotation;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.parsers,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom", \ - javax.xml.bind.annotation.adapters;version="0.0.0.1_008_JavaSE", \ - javax.xml.bind.attachment;version="0.0.0.1_008_JavaSE";uses:="javax.activation", \ - javax.xml.bind.helpers;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.stream,javax.xml.transform,javax.xml.validation,org.w3c.dom,org.xml.sax", \ - javax.xml.bind.util;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.transform.sax", \ - javax.xml.crypto;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto.dsig.keyinfo", \ - javax.xml.crypto.dom;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto,org.w3c.dom", \ - javax.xml.crypto.dsig;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec", \ - javax.xml.crypto.dsig.dom;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,org.w3c.dom", \ - javax.xml.crypto.dsig.keyinfo;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto", \ - javax.xml.crypto.dsig.spec;version="0.0.0.1_008_JavaSE";uses:="javax.xml.crypto", \ - javax.xml.datatype;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace", \ - javax.xml.namespace;version="0.0.0.1_008_JavaSE", \ - javax.xml.parsers;version="0.0.0.1_008_JavaSE";uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers", \ - javax.xml.soap;version="0.0.0.1_008_JavaSE";uses:="javax.activation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom", \ - javax.xml.stream;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform", \ - javax.xml.stream.events;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace,javax.xml.stream", \ - javax.xml.stream.util;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace,javax.xml.stream,javax.xml.stream.events", \ - javax.xml.transform;version="0.0.0.1_008_JavaSE", \ - javax.xml.transform.dom;version="0.0.0.1_008_JavaSE";uses:="javax.xml.transform,org.w3c.dom", \ - javax.xml.transform.sax;version="0.0.0.1_008_JavaSE";uses:="javax.xml.transform,org.xml.sax,org.xml.sax.ext", \ - javax.xml.transform.stax;version="0.0.0.1_008_JavaSE";uses:="javax.xml.stream,javax.xml.transform", \ - javax.xml.transform.stream;version="0.0.0.1_008_JavaSE";uses:="javax.xml.transform", \ - javax.xml.validation;version="0.0.0.1_008_JavaSE";uses:="javax.xml.transform,org.w3c.dom,org.w3c.dom.ls,org.xml.sax", \ - javax.xml.ws;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,org.w3c.dom", \ - javax.xml.ws.handler;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace,javax.xml.ws", \ - javax.xml.ws.handler.soap;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.namespace,javax.xml.soap,javax.xml.ws.handler", \ - javax.xml.ws.http;version="0.0.0.1_008_JavaSE";uses:="javax.xml.ws", \ - javax.xml.ws.soap;version="0.0.0.1_008_JavaSE";uses:="javax.xml.soap,javax.xml.ws,javax.xml.ws.spi", \ - javax.xml.ws.spi;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind,javax.xml.namespace,javax.xml.transform,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.wsaddressing,org.w3c.dom", \ - javax.xml.ws.spi.http;version="0.0.0.1_008_JavaSE", \ - javax.xml.ws.wsaddressing;version="0.0.0.1_008_JavaSE";uses:="javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.ws,org.w3c.dom", \ - javax.xml.xpath;version="0.0.0.1_008_JavaSE";uses:="javax.xml.namespace,org.xml.sax", \ - org.ietf.jgss;version="0.0.0.1_008_JavaSE", \ - org.omg.CORBA;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable", \ - org.omg.CORBA_2_3;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CORBA_2_3.portable;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CORBA.DynAnyPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA", \ - org.omg.CORBA.ORBPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA", \ - org.omg.CORBA.portable;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable", \ - org.omg.CORBA.TypeCodePackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA", \ - org.omg.CosNaming;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.PortableServer", \ - org.omg.CosNaming.NamingContextExtPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CosNaming.NamingContextPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming", \ - org.omg.Dynamic;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.DynamicAny;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage", \ - org.omg.DynamicAny.DynAnyFactoryPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.DynamicAny.DynAnyPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.IOP;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage", \ - org.omg.IOP.CodecFactoryPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.IOP.CodecPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.Messaging;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableInterceptor;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.Dynamic,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage", \ - org.omg.PortableInterceptor.ORBInitInfoPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.ServantLocatorPackage,org.omg.PortableServer.portable", \ - org.omg.PortableServer.CurrentPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.POAManagerPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.POAPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.portable;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.PortableServer", \ - org.omg.PortableServer.ServantLocatorPackage;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.SendingContext;version="0.0.0.1_008_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.stub.java.rmi;version="0.0.0.1_008_JavaSE";uses:="javax.rmi.CORBA", \ - org.w3c.dom;version="0.0.0.1_008_JavaSE", \ - org.w3c.dom.bootstrap;version="0.0.0.1_008_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.events;version="0.0.0.1_008_JavaSE";uses:="org.w3c.dom,org.w3c.dom.views", \ - org.w3c.dom.ls;version="0.0.0.1_008_JavaSE";uses:="org.w3c.dom,org.w3c.dom.events", \ - org.w3c.dom.views;version="0.0.0.1_008_JavaSE", \ - org.xml.sax;version="0.0.0.1_008_JavaSE", \ - org.xml.sax.ext;version="0.0.0.1_008_JavaSE";uses:="org.xml.sax,org.xml.sax.helpers", \ - org.xml.sax.helpers;version="0.0.0.1_008_JavaSE";uses:="org.xml.sax" - -jre-jpms= \ - ${dollar}{felix.detect.jpms.java} \ - ${dollar}{felix.jpms.felix.default} - -felix.jpms.java.se= \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.base}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.compiler}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.desktop}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.management}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.management.rmi}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.naming}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.rmi}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.scripting}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.security.jgss}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.security.sasl}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.smartcardio}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.sql}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.sql.rowset}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.xml}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.xml.crypto}} - -felix.jpms.java.se.ee= \ - ${dollar}{felix.jpms.java.se} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.activation}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.corba}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.transaction}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.xml.bind}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.xml.ws}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.xml.ws.annotation}} - -felix.jpms.felix.default= \ - ${dollar}{felix.jpms.java.se.ee} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.java.jnlp}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.base}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.controls}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.fxml}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.graphics}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.media}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.swing}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.javafx.web}} \ - ${dollar}{felix.jpms.${dollar}{felix.detect.jpms.jdk.xml.dom}} - -felix.jpms.java.activation=, \ - javax.activation;version="0.0.0.9_JavaSE" - -felix.jpms.java.base=, \ - javax.crypto;version="0.0.0.9_JavaSE";uses:="javax.crypto.spec,javax.security.auth", \ - javax.crypto.interfaces;version="0.0.0.9_JavaSE";uses:="javax.crypto,javax.crypto.spec", \ - javax.crypto.spec;version="0.0.0.9_JavaSE";uses:="javax.crypto", \ - javax.net;version="0.0.0.9_JavaSE", \ - javax.net.ssl;version="0.0.0.9_JavaSE";uses:="javax.net,javax.security.auth.x500,javax.security.cert", \ - javax.security.auth;version="0.0.0.9_JavaSE", \ - javax.security.auth.callback;version="0.0.0.9_JavaSE", \ - javax.security.auth.login;version="0.0.0.9_JavaSE";uses:="javax.security.auth,javax.security.auth.callback,javax.security.auth.spi", \ - javax.security.auth.spi;version="0.0.0.9_JavaSE";uses:="javax.security.auth,javax.security.auth.callback,javax.security.auth.login", \ - javax.security.auth.x500;version="0.0.0.9_JavaSE";uses:="javax.security.auth", \ - javax.security.cert;version="0.0.0.9_JavaSE" - -felix.jpms.java.compiler=, \ - javax.annotation.processing;version="0.0.0.9_JavaSE";uses:="javax.lang.model,javax.lang.model.element,javax.lang.model.util,javax.tools", \ - javax.lang.model;version="0.0.0.9_JavaSE";uses:="javax.lang.model.element", \ - javax.lang.model.element;version="0.0.0.9_JavaSE";uses:="javax.lang.model,javax.lang.model.type", \ - javax.lang.model.type;version="0.0.0.9_JavaSE";uses:="javax.lang.model,javax.lang.model.element", \ - javax.lang.model.util;version="0.0.0.9_JavaSE";uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element,javax.lang.model.type", \ - javax.tools;version="0.0.0.9_JavaSE";uses:="javax.annotation.processing,javax.lang.model,javax.lang.model.element" - -felix.jpms.java.corba=, \ - javax.activity;version="0.0.0.9_JavaSE", \ - javax.rmi;version="0.0.0.9_JavaSE";uses:="javax.rmi.CORBA,org.omg.CORBA", \ - javax.rmi.CORBA;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable,org.omg.SendingContext", \ - org.omg.CORBA;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable", \ - org.omg.CORBA.DynAnyPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA", \ - org.omg.CORBA.ORBPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CORBA.TypeCodePackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CORBA.portable;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable", \ - org.omg.CORBA_2_3;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CORBA_2_3.portable;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CosNaming;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.PortableServer", \ - org.omg.CosNaming.NamingContextExtPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.CosNaming.NamingContextPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming", \ - org.omg.Dynamic;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.DynamicAny;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage", \ - org.omg.DynamicAny.DynAnyFactoryPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.DynamicAny.DynAnyPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.IOP;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage", \ - org.omg.IOP.CodecFactoryPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.IOP.CodecPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.Messaging;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableInterceptor;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3.portable,org.omg.Dynamic,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage", \ - org.omg.PortableInterceptor.ORBInitInfoPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CORBA_2_3,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.ServantLocatorPackage,org.omg.PortableServer.portable", \ - org.omg.PortableServer.CurrentPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.POAManagerPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.POAPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.ServantLocatorPackage;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.PortableServer.portable;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.PortableServer", \ - org.omg.SendingContext;version="0.0.0.9_JavaSE";uses:="org.omg.CORBA,org.omg.CORBA.portable", \ - org.omg.stub.java.rmi;version="0.0.0.9_JavaSE";uses:="javax.rmi.CORBA" - -felix.jpms.java.desktop=, \ - javax.accessibility;version="0.0.0.9_JavaSE";uses:="javax.swing.text", \ - javax.imageio;version="0.0.0.9_JavaSE";uses:="javax.imageio.event,javax.imageio.metadata,javax.imageio.spi,javax.imageio.stream", \ - javax.imageio.event;version="0.0.0.9_JavaSE";uses:="javax.imageio", \ - javax.imageio.metadata;version="0.0.0.9_JavaSE";uses:="javax.imageio,org.w3c.dom", \ - javax.imageio.plugins.bmp;version="0.0.0.9_JavaSE";uses:="javax.imageio", \ - javax.imageio.plugins.jpeg;version="0.0.0.9_JavaSE";uses:="javax.imageio", \ - javax.imageio.plugins.tiff;version="0.0.0.9_JavaSE";uses:="javax.imageio,javax.imageio.metadata,org.w3c.dom", \ - javax.imageio.spi;version="0.0.0.9_JavaSE";uses:="javax.imageio,javax.imageio.metadata,javax.imageio.stream", \ - javax.imageio.stream;version="0.0.0.9_JavaSE";uses:="javax.imageio", \ - javax.print;version="0.0.0.9_JavaSE";uses:="javax.print.attribute,javax.print.attribute.standard,javax.print.event", \ - javax.print.attribute;version="0.0.0.9_JavaSE", \ - javax.print.attribute.standard;version="0.0.0.9_JavaSE";uses:="javax.print.attribute", \ - javax.print.event;version="0.0.0.9_JavaSE";uses:="javax.print,javax.print.attribute", \ - javax.sound.midi;version="0.0.0.9_JavaSE";uses:="javax.sound.midi.spi", \ - javax.sound.midi.spi;version="0.0.0.9_JavaSE";uses:="javax.sound.midi", \ - javax.sound.sampled;version="0.0.0.9_JavaSE";uses:="javax.sound.sampled.spi", \ - javax.sound.sampled.spi;version="0.0.0.9_JavaSE";uses:="javax.sound.sampled", \ - javax.swing;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.print,javax.print.attribute,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.table,javax.swing.text,javax.swing.text.html,javax.swing.tree", \ - javax.swing.border;version="0.0.0.9_JavaSE";uses:="javax.swing", \ - javax.swing.colorchooser;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.text", \ - javax.swing.event;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.table,javax.swing.text,javax.swing.tree,javax.swing.undo", \ - javax.swing.filechooser;version="0.0.0.9_JavaSE";uses:="javax.swing", \ - javax.swing.plaf;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.filechooser,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.basic;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.sound.sampled,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.synth,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.tree", \ - javax.swing.plaf.metal;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.multi;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.filechooser,javax.swing.plaf,javax.swing.text,javax.swing.tree", \ - javax.swing.plaf.nimbus;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.synth", \ - javax.swing.plaf.synth;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.table,javax.swing.text,javax.swing.tree,javax.xml.parsers,org.xml.sax,org.xml.sax.helpers", \ - javax.swing.table;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf", \ - javax.swing.text;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.print,javax.print.attribute,javax.swing,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.tree,javax.swing.undo", \ - javax.swing.text.html;version="0.0.0.9_JavaSE";uses:="javax.accessibility,javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf,javax.swing.text,javax.swing.text.html.parser,javax.swing.undo", \ - javax.swing.text.html.parser;version="0.0.0.9_JavaSE";uses:="javax.swing.text,javax.swing.text.html", \ - javax.swing.text.rtf;version="0.0.0.9_JavaSE";uses:="javax.swing.text", \ - javax.swing.tree;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.plaf,javax.swing.plaf.basic", \ - javax.swing.undo;version="0.0.0.9_JavaSE";uses:="javax.swing,javax.swing.event" - -felix.jpms.java.jnlp=, \ - javax.jnlp;version="0.0.0.9_JavaSE" - -felix.jpms.java.management=, \ - javax.management;version="0.0.0.9_JavaSE";uses:="javax.management.loading,javax.management.openmbean", \ - javax.management.loading;version="0.0.0.9_JavaSE";uses:="javax.management", \ - javax.management.modelmbean;version="0.0.0.9_JavaSE";uses:="javax.management,javax.management.loading", \ - javax.management.monitor;version="0.0.0.9_JavaSE";uses:="javax.management", \ - javax.management.openmbean;version="0.0.0.9_JavaSE";uses:="javax.management", \ - javax.management.relation;version="0.0.0.9_JavaSE";uses:="javax.management", \ - javax.management.remote;version="0.0.0.9_JavaSE";uses:="javax.management,javax.security.auth", \ - javax.management.timer;version="0.0.0.9_JavaSE";uses:="javax.management" - -felix.jpms.java.management.rmi=, \ - javax.management.remote.rmi;version="0.0.0.9_JavaSE";uses:="javax.management,javax.management.loading,javax.management.remote,javax.naming,javax.rmi.ssl,javax.security.auth" - -felix.jpms.java.naming=, \ - javax.naming;version="0.0.0.9_JavaSE";uses:="javax.naming.spi", \ - javax.naming.directory;version="0.0.0.9_JavaSE";uses:="javax.naming", \ - javax.naming.event;version="0.0.0.9_JavaSE";uses:="javax.naming,javax.naming.directory", \ - javax.naming.ldap;version="0.0.0.9_JavaSE";uses:="javax.naming,javax.naming.directory,javax.naming.event,javax.net.ssl", \ - javax.naming.spi;version="0.0.0.9_JavaSE";uses:="javax.naming,javax.naming.directory" - -felix.jpms.java.rmi=, \ - javax.rmi.ssl;version="0.0.0.9_JavaSE";uses:="javax.net,javax.net.ssl" - -felix.jpms.java.scripting=, \ - javax.script;version="0.0.0.9_JavaSE" + ${jre-base-1.6} \ + ${jre-base-1.7} -felix.jpms.java.security.jgss=, \ - javax.security.auth.kerberos;version="0.0.0.9_JavaSE";uses:="javax.crypto,javax.security.auth", \ - org.ietf.jgss;version="0.0.0.9_JavaSE" - -felix.jpms.java.security.sasl=, \ - javax.security.sasl;version="0.0.0.9_JavaSE";uses:="javax.security.auth.callback" - -felix.jpms.java.smartcardio=, \ - javax.smartcardio;version="0.0.0.9_JavaSE" - -felix.jpms.java.sql=, \ - javax.sql;version="0.0.0.9_JavaSE";uses:="javax.transaction.xa", \ - javax.transaction.xa;version="0.0.0.9_JavaSE" - -felix.jpms.java.sql.rowset=, \ - javax.sql.rowset;version="0.0.0.9_JavaSE";uses:="javax.sql,javax.sql.rowset.serial,javax.sql.rowset.spi", \ - javax.sql.rowset.serial;version="0.0.0.9_JavaSE";uses:="javax.sql.rowset", \ - javax.sql.rowset.spi;version="0.0.0.9_JavaSE";uses:="javax.naming,javax.sql,javax.sql.rowset" - -felix.jpms.java.transaction=, \ - javax.transaction;version="0.0.0.9_JavaSE" - -felix.jpms.java.xml=, \ - javax.xml;version="0.0.0.9_JavaSE", \ - javax.xml.catalog;version="0.0.0.9_JavaSE";uses:="javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.sax,org.w3c.dom.ls,org.xml.sax,org.xml.sax.helpers", \ - javax.xml.datatype;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace", \ - javax.xml.namespace;version="0.0.0.9_JavaSE", \ - javax.xml.parsers;version="0.0.0.9_JavaSE";uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers", \ - javax.xml.stream;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform", \ - javax.xml.stream.events;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace,javax.xml.stream", \ - javax.xml.stream.util;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace,javax.xml.stream,javax.xml.stream.events", \ - javax.xml.transform;version="0.0.0.9_JavaSE", \ - javax.xml.transform.dom;version="0.0.0.9_JavaSE";uses:="javax.xml.transform,org.w3c.dom", \ - javax.xml.transform.sax;version="0.0.0.9_JavaSE";uses:="javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.xml.sax.ext", \ - javax.xml.transform.stax;version="0.0.0.9_JavaSE";uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.transform", \ - javax.xml.transform.stream;version="0.0.0.9_JavaSE";uses:="javax.xml.transform", \ - javax.xml.validation;version="0.0.0.9_JavaSE";uses:="javax.xml.transform,javax.xml.transform.stream,org.w3c.dom,org.w3c.dom.ls,org.xml.sax", \ - javax.xml.xpath;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace,org.w3c.dom,org.xml.sax", \ - org.w3c.dom;version="0.0.0.9_JavaSE", \ - org.w3c.dom.bootstrap;version="0.0.0.9_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.events;version="0.0.0.9_JavaSE";uses:="org.w3c.dom,org.w3c.dom.views", \ - org.w3c.dom.ls;version="0.0.0.9_JavaSE";uses:="org.w3c.dom,org.w3c.dom.events,org.w3c.dom.traversal", \ - org.w3c.dom.ranges;version="0.0.0.9_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.traversal;version="0.0.0.9_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.views;version="0.0.0.9_JavaSE", \ - org.xml.sax;version="0.0.0.9_JavaSE", \ - org.xml.sax.ext;version="0.0.0.9_JavaSE";uses:="org.xml.sax,org.xml.sax.helpers", \ - org.xml.sax.helpers;version="0.0.0.9_JavaSE";uses:="org.xml.sax" - -felix.jpms.java.xml.bind=, \ - javax.xml.bind;version="0.0.0.9_JavaSE";uses:="javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.datatype,javax.xml.namespace,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,org.w3c.dom,org.xml.sax", \ - javax.xml.bind.annotation;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.parsers,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom", \ - javax.xml.bind.annotation.adapters;version="0.0.0.9_JavaSE";uses:="javax.xml.bind", \ - javax.xml.bind.attachment;version="0.0.0.9_JavaSE";uses:="javax.activation", \ - javax.xml.bind.helpers;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transform.stream,javax.xml.validation,org.w3c.dom,org.xml.sax", \ - javax.xml.bind.util;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.transform.sax,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers" - -felix.jpms.java.xml.crypto=, \ - javax.xml.crypto;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto.dsig.keyinfo", \ - javax.xml.crypto.dom;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto,org.w3c.dom", \ - javax.xml.crypto.dsig;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec", \ - javax.xml.crypto.dsig.dom;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,org.w3c.dom", \ - javax.xml.crypto.dsig.keyinfo;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto,javax.xml.crypto.dsig", \ - javax.xml.crypto.dsig.spec;version="0.0.0.9_JavaSE";uses:="javax.xml.crypto", \ - org.jcp.xml.dsig.internal;version="0.0.0.9_JavaSE";uses:="javax.crypto", \ - org.jcp.xml.dsig.internal.dom;version="0.0.0.9_JavaSE";uses:="javax.crypto,javax.security.auth.x500,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.parsers,org.jcp.xml.dsig.internal,org.w3c.dom" - -felix.jpms.java.xml.ws=, \ - javax.jws;version="0.0.0.9_JavaSE", \ - javax.jws.soap;version="0.0.0.9_JavaSE", \ - javax.xml.soap;version="0.0.0.9_JavaSE";uses:="javax.activation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.dom,org.w3c.dom", \ - javax.xml.ws;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.transform.stream,javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,org.w3c.dom", \ - javax.xml.ws.handler;version="0.0.0.9_JavaSE";uses:="javax.xml.namespace,javax.xml.ws", \ - javax.xml.ws.handler.soap;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.namespace,javax.xml.soap,javax.xml.ws.handler", \ - javax.xml.ws.http;version="0.0.0.9_JavaSE";uses:="javax.xml.ws", \ - javax.xml.ws.soap;version="0.0.0.9_JavaSE";uses:="javax.xml.soap,javax.xml.ws,javax.xml.ws.spi", \ - javax.xml.ws.spi;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.namespace,javax.xml.transform,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.wsaddressing,org.w3c.dom", \ - javax.xml.ws.spi.http;version="0.0.0.9_JavaSE", \ - javax.xml.ws.wsaddressing;version="0.0.0.9_JavaSE";uses:="javax.xml.bind,javax.xml.bind.annotation,javax.xml.namespace,javax.xml.transform,javax.xml.ws,javax.xml.ws.spi,org.w3c.dom" - -felix.jpms.java.xml.ws.annotation=, \ - javax.annotation;version="0.0.0.9_JavaSE" - -felix.jpms.javafx.base=, \ - javafx.beans;version="0.0.0.9_JavaSE", \ - javafx.beans.binding;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.util", \ - javafx.beans.property;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.binding,javafx.beans.value,javafx.collections,javafx.util", \ - javafx.beans.property.adapter;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value", \ - javafx.beans.value;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.collections", \ - javafx.collections;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.collections.transformation,javafx.util", \ - javafx.collections.transformation;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.collections", \ - javafx.event;version="0.0.0.9_JavaSE";uses:="javafx.beans", \ - javafx.util;version="0.0.0.9_JavaSE";uses:="javafx.beans", \ - javafx.util.converter;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.util" - -felix.jpms.javafx.controls=, \ - javafx.scene.chart;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.event,javafx.geometry,javafx.scene,javafx.scene.control,javafx.scene.layout,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.scene.transform,javafx.util", \ - javafx.scene.control;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.collections.transformation,javafx.css,javafx.css.converter,javafx.event,javafx.geometry,javafx.scene,javafx.scene.control.skin,javafx.scene.image,javafx.scene.input,javafx.scene.layout,javafx.scene.paint,javafx.scene.text,javafx.stage,javafx.util,javafx.util.converter", \ - javafx.scene.control.cell;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.control,javafx.scene.control.skin,javafx.scene.input,javafx.scene.layout,javafx.util,javafx.util.converter", \ - javafx.scene.control.skin;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.collections.transformation,javafx.css,javafx.css.converter,javafx.event,javafx.geometry,javafx.scene,javafx.scene.chart,javafx.scene.control,javafx.scene.effect,javafx.scene.image,javafx.scene.input,javafx.scene.layout,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.scene.transform,javafx.stage,javafx.util" - -felix.jpms.javafx.fxml=, \ - javafx.fxml;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.scene,javafx.scene.image,javafx.scene.shape,javafx.scene.text,javafx.util,javax.script,javax.xml.namespace,javax.xml.stream,javax.xml.stream.util" - -felix.jpms.javafx.graphics=, \ - javafx.animation;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.paint,javafx.scene.shape,javafx.util", \ - javafx.application;version="0.0.0.9_JavaSE";uses:="javafx.beans.property,javafx.beans.value,javafx.stage", \ - javafx.concurrent;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.beans,javafx.beans.property,javafx.beans.value,javafx.event,javafx.util", \ - javafx.css;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css.converter,javafx.geometry,javafx.scene,javafx.scene.effect,javafx.scene.layout,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.util", \ - javafx.css.converter;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.css,javafx.geometry,javafx.scene,javafx.scene.effect,javafx.scene.image,javafx.scene.layout,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.util", \ - javafx.geometry;version="0.0.0.9_JavaSE";uses:="javafx.beans", \ - javafx.print;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.geometry,javafx.scene,javafx.stage", \ - javafx.scene;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.event,javafx.geometry,javafx.scene.effect,javafx.scene.image,javafx.scene.input,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.scene.transform,javafx.stage,javafx.util", \ - javafx.scene.canvas;version="0.0.0.9_JavaSE";uses:="javafx.beans.property,javafx.geometry,javafx.scene,javafx.scene.effect,javafx.scene.image,javafx.scene.paint,javafx.scene.shape,javafx.scene.text,javafx.scene.transform", \ - javafx.scene.effect;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.scene,javafx.scene.image,javafx.scene.paint", \ - javafx.scene.image;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.geometry,javafx.scene,javafx.scene.paint,javafx.util", \ - javafx.scene.input;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.image,javafx.util", \ - javafx.scene.layout;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.geometry,javafx.scene,javafx.scene.image,javafx.scene.paint,javafx.scene.shape,javafx.stage,javafx.util", \ - javafx.scene.paint;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.property,javafx.scene.image", \ - javafx.scene.shape;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.geometry,javafx.scene,javafx.scene.paint,javafx.scene.transform", \ - javafx.scene.text;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.css,javafx.css.converter,javafx.geometry,javafx.scene,javafx.scene.layout,javafx.scene.paint,javafx.scene.shape", \ - javafx.scene.transform;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.property,javafx.beans.value,javafx.event,javafx.geometry,javafx.scene", \ - javafx.stage;version="0.0.0.9_JavaSE";uses:="javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.image,javafx.scene.input,javafx.scene.layout,javafx.scene.paint,javafx.util" - -felix.jpms.javafx.media=, \ - javafx.scene.media;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.image,javafx.util" - -felix.jpms.javafx.swing=, \ - javafx.embed.swing;version="0.0.0.9_JavaSE";uses:="javafx.application,javafx.beans,javafx.beans.binding,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.event,javafx.geometry,javafx.scene,javafx.scene.image,javafx.scene.input,javafx.scene.text,javafx.stage,javax.swing,javax.swing.border" - -felix.jpms.javafx.web=, \ - javafx.scene.web;version="0.0.0.9_JavaSE";uses:="javafx.animation,javafx.application,javafx.beans,javafx.beans.property,javafx.beans.value,javafx.collections,javafx.concurrent,javafx.css,javafx.css.converter,javafx.event,javafx.geometry,javafx.print,javafx.scene,javafx.scene.control,javafx.scene.image,javafx.scene.input,javafx.scene.layout,javafx.scene.paint,javafx.scene.text,javafx.stage,javafx.util,org.w3c.dom,org.w3c.dom.html" - -felix.jpms.jdk.xml.dom=, \ - org.w3c.dom.css;version="0.0.0.9_JavaSE";uses:="org.w3c.dom,org.w3c.dom.stylesheets,org.w3c.dom.views", \ - org.w3c.dom.html;version="0.0.0.9_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.stylesheets;version="0.0.0.9_JavaSE";uses:="org.w3c.dom", \ - org.w3c.dom.xpath;version="0.0.0.9_JavaSE";uses:="org.w3c.dom" \ No newline at end of file +jre-1.8= \ + ${jre-base} \ + ${jre-base-1.7}, \ + java.time;version="${dollar}{felix.detect.java.version}", \ + java.time.chrono;version="${dollar}{felix.detect.java.version}", \ + java.time.format;version="${dollar}{felix.detect.java.version}", \ + java.time.temporal;version="${dollar}{felix.detect.java.version}", \ + java.time.zone;version="${dollar}{felix.detect.java.version}", \ + java.util.function;version="${dollar}{felix.detect.java.version}", \ + java.util.stream;version="${dollar}{felix.detect.java.version}", \ + javax.crypto;uses:="javax.crypto.spec,javax.security.auth";version="${dollar}{felix.detect.java.version}", \ + javax.lang.model;uses:="javax.lang.model.element";version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom.events;uses:="org.w3c.dom,org.w3c.dom.views";version="${dollar}{felix.detect.java.version}", \ + org.w3c.dom.views;version="${dollar}{felix.detect.java.version}" \ No newline at end of file