Index: src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP <+>/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage org.apache.ivy.osgi.p2;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.text.ParseException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.xml.parsers.ParserConfigurationException;\n\nimport org.apache.ivy.osgi.core.BundleCapability;\nimport org.apache.ivy.osgi.core.BundleInfo;\nimport org.apache.ivy.osgi.core.BundleRequirement;\nimport org.apache.ivy.osgi.core.ExportPackage;\nimport org.apache.ivy.osgi.core.ManifestParser;\nimport org.apache.ivy.osgi.p2.PropertiesParser.PropertiesHandler;\nimport org.apache.ivy.osgi.util.DelegatingHandler;\nimport org.apache.ivy.osgi.util.Version;\nimport org.apache.ivy.osgi.util.VersionRange;\nimport org.apache.ivy.util.Message;\nimport org.apache.ivy.util.XMLHelper;\nimport org.xml.sax.Attributes;\nimport org.xml.sax.SAXException;\nimport org.xml.sax.SAXParseException;\n\npublic class P2MetadataParser implements XMLInputParser {\n\n private final P2Descriptor p2Descriptor;\n\n private int logLevel = Message.MSG_INFO;\n\n public P2MetadataParser(P2Descriptor p2Descriptor) {\n this.p2Descriptor = p2Descriptor;\n }\n\n public void setLogLevel(int logLevel) {\n this.logLevel = logLevel;\n }\n\n public void parse(InputStream in) throws ParseException, IOException, SAXException {\n RepositoryHandler handler = new RepositoryHandler(p2Descriptor);\n try {\n XMLHelper.parse(in, null, handler, null);\n } catch (ParserConfigurationException e) {\n throw new SAXException(e);\n }\n }\n\n private class RepositoryHandler extends DelegatingHandler {\n\n // private static final String P2_TIMESTAMP = \"p2.timestamp\";\n\n private static final String REPOSITORY = \"repository\";\n\n // private static final String NAME = \"name\";\n //\n // private static final String TYPE = \"type\";\n //\n // private static final String VERSION = \"version\";\n //\n // private static final String DESCRIPTION = \"description\";\n //\n // private static final String PROVIDER = \"provider\";\n\n public RepositoryHandler(final P2Descriptor p2Descriptor) {\n super(REPOSITORY);\n // addChild(new PropertiesHandler(P2_TIMESTAMP),\n // new ChildElementHandler() {\n // public void childHanlded(PropertiesHandler child) {\n // String timestamp = child.properties.get(P2_TIMESTAMP);\n // if (timestamp != null) {\n // p2Descriptor.setTimestamp(Long.parseLong(timestamp));\n // }\n // }\n // });\n addChild(new UnitsHandler(), new ChildElementHandler() {\n public void childHanlded(UnitsHandler child) {\n for (BundleInfo bundle : child.bundles) {\n p2Descriptor.addBundle(bundle);\n }\n }\n });\n addChild(new ReferencesHandler(), new ChildElementHandler() {\n public void childHanlded(ReferencesHandler child) {\n }\n });\n }\n\n // protected void handleAttributes(Attributes atts) {\n // String name = atts.getValue(NAME);\n // String type = atts.getValue(TYPE);\n // String version = atts.getValue(VERSION);\n // String description = atts.getValue(DESCRIPTION);\n // String provider = atts.getValue(PROVIDER);\n // }\n }\n\n private class ReferencesHandler extends DelegatingHandler {\n\n private static final String REFERENCES = \"references\";\n\n private static final String SIZE = \"size\";\n\n List repositoryUris;\n\n public ReferencesHandler() {\n super(REFERENCES);\n addChild(new RepositoryReferenceHandler(),\n new ChildElementHandler() {\n public void childHanlded(RepositoryReferenceHandler child) {\n repositoryUris.add(child.uri);\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) throws SAXException {\n int size = Integer.parseInt(atts.getValue(SIZE));\n repositoryUris = new ArrayList(size);\n }\n }\n\n private class RepositoryReferenceHandler extends DelegatingHandler {\n\n private static final String REPOSITORY = \"repository\";\n\n // private static final String TYPE = \"type\";\n //\n // private static final String OPTIONS = \"options\";\n //\n // private static final String NAME = \"name\";\n\n private static final String URI = \"uri\";\n\n private static final String URL = \"url\";\n\n public RepositoryReferenceHandler() {\n super(REPOSITORY);\n }\n\n // int type;\n //\n // int options;\n //\n // String name;\n\n URI uri;\n\n protected void handleAttributes(Attributes atts) throws SAXException {\n // type = Integer.parseInt(atts.getValue(TYPE));\n // options = Integer.parseInt(atts.getValue(OPTIONS));\n // name = atts.getValue(NAME);\n\n String uriAtt = atts.getValue(URI);\n String urlAtt = atts.getValue(URL);\n\n if (uriAtt != null) {\n try {\n uri = new URI(uriAtt);\n } catch (URISyntaxException e) {\n throw new SAXParseException(\"Invalid uri attribute \" + uriAtt + \"(\"\n + e.getMessage() + \")\", getLocator());\n }\n }\n if (uri != null && urlAtt != null) {\n try {\n uri = new URI(urlAtt);\n } catch (URISyntaxException e) {\n throw new SAXParseException(\"Invalid url attribute \" + urlAtt + \"(\"\n + e.getMessage() + \")\", getLocator());\n }\n }\n }\n }\n\n private class UnitsHandler extends DelegatingHandler {\n\n private static final String UNITS = \"units\";\n\n private static final String SIZE = \"size\";\n\n List bundles;\n\n public UnitsHandler() {\n super(UNITS);\n addChild(new UnitHandler(), new ChildElementHandler() {\n public void childHanlded(UnitHandler child) {\n if (child.bundleInfo != null && !child.bundleInfo.getCapabilities().isEmpty()) {\n bundles.add(child.bundleInfo);\n }\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n int size = Integer.parseInt(atts.getValue(SIZE));\n bundles = new ArrayList(size);\n }\n\n }\n\n class UnitHandler extends DelegatingHandler {\n\n private static final String CATEGORY_PROPERTY = \"org.eclipse.equinox.p2.type.category\";\n\n private static final String UNIT = \"unit\";\n\n private static final String ID = \"id\";\n\n private static final String VERSION = \"version\";\n\n // private static final String SINGLETON = \"singleton\";\n\n BundleInfo bundleInfo;\n\n public UnitHandler() {\n super(UNIT);\n // addChild(new UpdateHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n addChild(new PropertiesHandler(CATEGORY_PROPERTY),\n new ChildElementHandler() {\n public void childHanlded(PropertiesHandler child) {\n String category = child.properties.get(CATEGORY_PROPERTY);\n if (category != null && Boolean.valueOf(category).booleanValue()) {\n // this is a category definition, this is useless, skip this unit\n child.getParent().skip();\n bundleInfo = null;\n }\n }\n });\n addChild(new ProvidesHandler(), new ChildElementHandler() {\n public void childHanlded(ProvidesHandler child) {\n if (\"source\".equals(child.eclipseType)) {\n // this is some source of some bundle\n bundleInfo.setSource(true);\n // we need to parse the manifest in the toupointData to figure out the\n // targeted bundle\n // in case we won't have the proper data in the manifest, prepare the source\n // data from the convention\n String symbolicName = bundleInfo.getSymbolicName();\n if (symbolicName.endsWith(\".source\")) {\n bundleInfo.setSymbolicNameTarget(symbolicName.substring(0,\n symbolicName.length() - 7));\n bundleInfo.setVersionTarget(bundleInfo.getVersion());\n }\n }\n for (BundleCapability capability : child.capabilities) {\n bundleInfo.addCapability(capability);\n }\n }\n });\n addChild(new FilterHandler(), new ChildElementHandler() {\n public void childHanlded(FilterHandler child) {\n }\n });\n addChild(new RequiresHandler(), new ChildElementHandler() {\n public void childHanlded(RequiresHandler child) {\n for (BundleRequirement requirement : child.requirements) {\n bundleInfo.addRequirement(requirement);\n }\n }\n });\n addChild(new HostRequirementsHandler(),\n new ChildElementHandler() {\n public void childHanlded(HostRequirementsHandler child) {\n }\n });\n addChild(new MetaRequirementsHandler(),\n new ChildElementHandler() {\n public void childHanlded(MetaRequirementsHandler child) {\n }\n });\n addChild(new ArtifactsHandler(), new ChildElementHandler() {\n public void childHanlded(ArtifactsHandler child) {\n }\n });\n // addChild(new TouchpointHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n addChild(new TouchpointDataHandler(), new ChildElementHandler() {\n public void childHanlded(TouchpointDataHandler child) throws SAXParseException {\n if (child.zipped != null) {\n bundleInfo.setHasInnerClasspath(child.zipped.booleanValue());\n }\n if (!bundleInfo.isSource()) {\n // we only care about parsing the manifest if it is a source\n return;\n }\n if (child.manifest != null) {\n // Eclipse may have serialized a little bit weirdly\n String manifest = ManifestParser.formatLines(child.manifest.trim());\n BundleInfo embeddedInfo;\n try {\n embeddedInfo = ManifestParser.parseManifest(manifest);\n } catch (IOException e) {\n if (logLevel >= Message.MSG_VERBOSE) {\n Message.verbose(\n \"The Manifest of the source bundle \"\n + bundleInfo.getSymbolicName() + \" could not be parsed\",\n e);\n }\n return;\n } catch (ParseException e) {\n if (logLevel >= Message.MSG_VERBOSE) {\n Message.verbose(\n \"The Manifest of the source bundle \"\n + bundleInfo.getSymbolicName() + \" is ill formed\", e);\n }\n return;\n }\n if (!embeddedInfo.isSource()) {\n if (logLevel >= Message.MSG_VERBOSE) {\n Message.verbose(\"The Manifest of the source bundle \"\n + bundleInfo.getSymbolicName()\n + \" is not declaring being a source.\");\n }\n return;\n }\n String symbolicNameTarget = embeddedInfo.getSymbolicNameTarget();\n if (symbolicNameTarget == null) {\n if (logLevel >= Message.MSG_VERBOSE) {\n Message.verbose(\"The Manifest of the source bundle \"\n + bundleInfo.getSymbolicName()\n + \" is not declaring a target symbolic name.\");\n }\n return;\n }\n Version versionTarget = embeddedInfo.getVersionTarget();\n if (versionTarget == null) {\n if (logLevel >= Message.MSG_VERBOSE) {\n Message.verbose(\"The Manifest of the source bundle \"\n + bundleInfo.getSymbolicName()\n + \" is not declaring a target version.\");\n }\n return;\n }\n bundleInfo.setSymbolicNameTarget(symbolicNameTarget);\n bundleInfo.setVersionTarget(versionTarget);\n }\n }\n });\n // addChild(new LicensesHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n // addChild(new CopyrightHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n // addChild(new ChangesHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n\n }\n\n protected void handleAttributes(Attributes atts) throws SAXException {\n String id = atts.getValue(ID);\n String version = atts.getValue(VERSION);\n // Boolean singleton = Boolean.valueOf(atts.getValue(SINGLETON));\n try {\n bundleInfo = new BundleInfo(id, new Version(version));\n } catch (ParseException e) {\n throw new SAXException(\"Incorrect version on bundle '\" + id + \"': \" + version\n + \" (\" + e.getMessage() + \")\");\n }\n }\n\n }\n\n // static class UpdateHandler extends DelegetingHandler {\n //\n // private static final String UPDATE = \"update\";\n //\n // private static final String ID = \"id\";\n //\n // private static final String RANGE = \"range\";\n //\n // private static final String SEVERITY = \"severity\";\n //\n // public UpdateHandler() {\n // super(UPDATE);\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // String id = atts.getValue(ID);\n // String range = atts.getValue(RANGE);\n // String severity = atts.getValue(SEVERITY);\n // }\n //\n // }\n\n private static class FilterHandler extends DelegatingHandler {\n\n private static final String FILTER = \"filter\";\n\n public FilterHandler() {\n super(FILTER);\n setBufferingChar(true);\n }\n\n }\n\n private static String namespace2Type(String namespace) {\n if (namespace.equals(\"java.package\")) {\n return BundleInfo.PACKAGE_TYPE;\n }\n if (namespace.equals(\"osgi.bundle\")) {\n return BundleInfo.BUNDLE_TYPE;\n }\n return null;\n }\n\n private class ProvidesHandler extends DelegatingHandler {\n\n private static final String PROVIDES = \"provides\";\n\n private static final String SIZE = \"size\";\n\n List capabilities;\n\n String eclipseType;\n\n public ProvidesHandler() {\n super(PROVIDES);\n addChild(new ProvidedHandler(), new ChildElementHandler() {\n public void childHanlded(ProvidedHandler child) {\n if (child.namespace.equals(\"org.eclipse.equinox.p2.eclipse.type\")) {\n eclipseType = child.name;\n } else {\n String type = namespace2Type(child.namespace);\n if (type == null) {\n if (logLevel >= Message.MSG_DEBUG) {\n Message.debug(\"Unsupported provided capability \" + child.namespace\n + \" \" + child.name + \" \" + child.version);\n }\n return;\n }\n BundleCapability capability;\n if (type == BundleInfo.PACKAGE_TYPE) {\n capability = new ExportPackage(child.name, child.version);\n } else {\n capability = new BundleCapability(type, child.name, child.version);\n }\n capabilities.add(capability);\n }\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n int size = Integer.parseInt(atts.getValue(SIZE));\n capabilities = new ArrayList(size);\n }\n\n }\n\n private static class ProvidedHandler extends DelegatingHandler {\n\n private static final String PROVIDED = \"provided\";\n\n private static final String NAMESPACE = \"namespace\";\n\n private static final String NAME = \"name\";\n\n private static final String VERSION = \"version\";\n\n String namespace;\n\n String name;\n\n Version version;\n\n public ProvidedHandler() {\n super(PROVIDED);\n }\n\n protected void handleAttributes(Attributes atts) throws SAXException {\n namespace = atts.getValue(NAMESPACE);\n name = atts.getValue(NAME);\n try {\n version = new Version(atts.getValue(VERSION));\n } catch (ParseException e) {\n throw new SAXException(\"Incorrect version on provided capability: \" + version\n + \" (\" + e.getMessage() + \")\");\n }\n }\n\n }\n\n abstract class AbstractRequirementHandler extends DelegatingHandler {\n\n private static final String SIZE = \"size\";\n\n List requirements;\n\n public AbstractRequirementHandler(String name) {\n super(name);\n addChild(new RequiredHandler(), new ChildElementHandler() {\n public void childHanlded(RequiredHandler child) {\n String name = child.name;\n VersionRange range = child.range;\n String type = namespace2Type(child.namespace);\n if (type == null) {\n if (logLevel >= Message.MSG_DEBUG) {\n Message.debug(\"Unsupported required capability \" + child.namespace\n + \" \" + name + \" \" + range);\n }\n } else {\n String resolution = child.optional ? \"optional\" : null;\n requirements.add(new BundleRequirement(type, name, range, resolution));\n }\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n int size = Integer.parseInt(atts.getValue(SIZE));\n requirements = new ArrayList(size);\n }\n\n }\n\n private class RequiresHandler extends AbstractRequirementHandler {\n\n private static final String REQUIRES = \"requires\";\n\n public RequiresHandler() {\n super(REQUIRES);\n }\n\n }\n\n private class RequiredHandler extends DelegatingHandler {\n\n private static final String REQUIRED = \"required\";\n\n private static final String NAMESPACE = \"namespace\";\n\n private static final String NAME = \"name\";\n\n private static final String RANGE = \"range\";\n\n private static final String OPTIONAL = \"optional\";\n\n // private static final String GREEDY = \"greedy\";\n\n String namespace;\n\n String name;\n\n VersionRange range;\n\n // String filter;\n //\n // boolean greedy;\n\n boolean optional;\n\n public RequiredHandler() {\n super(REQUIRED);\n // addChild(new FilterHandler(), new ChildElementHandler() {\n // public void childHanlded(FilterHandler child) {\n // filter = child.getBufferedChars().trim();\n // }\n // });\n }\n\n protected void handleAttributes(Attributes atts) throws SAXParseException {\n namespace = atts.getValue(NAMESPACE);\n name = atts.getValue(NAME);\n try {\n range = new VersionRange(atts.getValue(RANGE));\n } catch (ParseException e) {\n throw new RuntimeException(e);\n }\n // greedy = getOptionalBooleanAttribute(atts, GREEDY, Boolean.TRUE).booleanValue();\n optional = getOptionalBooleanAttribute(atts, OPTIONAL, Boolean.FALSE).booleanValue();\n }\n\n }\n\n private class HostRequirementsHandler extends AbstractRequirementHandler {\n\n private static final String HOST_REQUIREMENTS = \"hostRequirements\";\n\n public HostRequirementsHandler() {\n super(HOST_REQUIREMENTS);\n }\n\n }\n\n private class MetaRequirementsHandler extends AbstractRequirementHandler {\n\n private static final String META_REQUIREMENTS = \"metaRequirements\";\n\n public MetaRequirementsHandler() {\n super(META_REQUIREMENTS);\n }\n\n }\n\n private class ArtifactsHandler extends DelegatingHandler {\n\n private static final String ARTIFACTS = \"artifacts\";\n\n private static final String SIZE = \"size\";\n\n List artifacts;\n\n public ArtifactsHandler() {\n super(ARTIFACTS);\n addChild(new ArtifactHandler(), new ChildElementHandler() {\n public void childHanlded(ArtifactHandler child) {\n artifacts.add(child.artifact);\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n int size = Integer.parseInt(atts.getValue(SIZE));\n artifacts = new ArrayList(size);\n }\n\n }\n\n private class ArtifactHandler extends DelegatingHandler {\n\n private static final String ARTIFACT = \"artifact\";\n\n private static final String ID = \"id\";\n\n private static final String VERSION = \"version\";\n\n private static final String CLASSIFIER = \"classifier\";\n\n P2Artifact artifact;\n\n public ArtifactHandler() {\n super(ARTIFACT);\n }\n\n protected void handleAttributes(Attributes atts) throws SAXException {\n String id = atts.getValue(ID);\n String version = atts.getValue(VERSION);\n String classifier = atts.getValue(CLASSIFIER);\n try {\n artifact = new P2Artifact(id, new Version(version), classifier);\n } catch (ParseException e) {\n throw new SAXException(\"Incorrect version on artifact '\" + id + \"': \" + version\n + \" (\" + e.getMessage() + \")\");\n }\n }\n\n }\n\n // private static class TouchpointHandler extends DelegetingHandler {\n //\n // private static final String TOUCHPOINT = \"touchpoint\";\n //\n // private static final String ID = \"id\";\n //\n // private static final String VERSION = \"version\";\n //\n // public TouchpointHandler() {\n // super(TOUCHPOINT);\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // String id = atts.getValue(ID);\n // String version = atts.getValue(VERSION);\n // }\n //\n // }\n\n private class TouchpointDataHandler extends DelegatingHandler {\n\n private static final String TOUCHPOINTDATA = \"touchpointData\";\n\n // private static final String SIZE = \"size\";\n\n String manifest;\n\n Boolean zipped;\n\n public TouchpointDataHandler() {\n super(TOUCHPOINTDATA);\n addChild(new InstructionsHandler(), new ChildElementHandler() {\n public void childHanlded(InstructionsHandler child) {\n manifest = child.manifest;\n zipped = child.zipped;\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n // String size = atts.getValue(SIZE);\n }\n\n }\n\n private class InstructionsHandler extends DelegatingHandler {\n\n private static final String INSTRUCTIONS = \"instructions\";\n\n // private static final String SIZE = \"size\";\n\n String manifest;\n\n Boolean zipped;\n\n public InstructionsHandler() {\n super(INSTRUCTIONS);\n addChild(new InstructionHandler(), new ChildElementHandler() {\n public void childHanlded(InstructionHandler child) {\n manifest = null;\n zipped = null;\n String buffer = child.getBufferedChars().trim();\n if (\"manifest\".equals(child.key)) {\n manifest = buffer;\n } else if (\"zipped\".equals(child.key) && buffer.length() != 0) {\n zipped = Boolean.valueOf(buffer);\n }\n }\n });\n }\n\n protected void handleAttributes(Attributes atts) {\n // String size = atts.getValue(SIZE);\n }\n\n }\n\n private class InstructionHandler extends DelegatingHandler {\n\n private static final String INSTRUCTION = \"instruction\";\n\n private static final String KEY = \"key\";\n\n String key;\n\n public InstructionHandler() {\n super(INSTRUCTION);\n setBufferingChar(true);\n }\n\n protected void handleAttributes(Attributes atts) {\n key = atts.getValue(KEY);\n }\n\n }\n\n // private static class LicensesHandler extends DelegetingHandler {\n //\n // private static final String LICENSES = \"licenses\";\n //\n // private static final String SIZE = \"size\";\n //\n // public LicensesHandler() {\n // super(LICENSES);\n // addChild(new LicenseHandler(), new ChildElementHandler() {\n // public void childHanlded(DelegetingHandler child) {\n // }\n // });\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // String size = atts.getValue(SIZE);\n // }\n //\n // }\n\n // private static class LicenseHandler extends DelegetingHandler {\n //\n // private static final String LICENSE = \"license\";\n //\n // private static final String URI = \"uri\";\n //\n // private static final String URL = \"url\";\n //\n // public LicenseHandler() {\n // super(LICENSE);\n // setBufferingChar(true);\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // String uri = atts.getValue(URI);\n // String url = atts.getValue(URL);\n // }\n //\n // }\n\n // private static class CopyrightHandler extends DelegetingHandler {\n //\n // private static final String COPYRIGHT = \"copyright\";\n //\n // private static final String URI = \"uri\";\n //\n // private static final String URL = \"url\";\n //\n // public CopyrightHandler() {\n // super(COPYRIGHT);\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // String uri = atts.getValue(URI);\n // String url = atts.getValue(URL);\n // }\n //\n // }\n\n // private class ChangesHandler extends DelegetingHandler {\n //\n // private static final String CHANGES = \"changes\";\n //\n // private static final String SIZE = \"size\";\n //\n // public ChangesHandler() {\n // super(CHANGES);\n // addChild(new ChangeHandler(), new ChildElementHandler() {\n // public void childHanlded(ChangeHandler child) {\n // }\n // });\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // int size = Integer.parseInt(atts.getValue(SIZE));\n // }\n // }\n\n // private class ChangeHandler extends DelegetingHandler {\n //\n // private static final String CHANGE = \"change\";\n //\n // public ChangeHandler() {\n // super(CHANGE);\n // }\n // }\n\n // private class FromHandler extends AbstractRequirementHandler {\n //\n // private static final String FROM = \"from\";\n //\n // public FromHandler() {\n // super(FROM);\n // }\n //\n // }\n\n // private class ToHandler extends AbstractRequirementHandler {\n //\n // private static final String TO = \"to\";\n //\n // public ToHandler() {\n // super(TO);\n // }\n //\n // }\n\n // private class PatchScopeHandler extends DelegetingHandler {\n //\n // private static final String PATCH_SCOPE = \"patchScope\";\n //\n // private static final String SIZE = \"size\";\n //\n // public PatchScopeHandler() {\n // super(PATCH_SCOPE);\n // addChild(new PatchScopeHandler(), new ChildElementHandler() {\n // public void childHanlded(PatchScopeHandler child) {\n // }\n // });\n // }\n //\n // protected void handleAttributes(Attributes atts) {\n // int size = Integer.parseInt(atts.getValue(SIZE));\n // }\n // }\n\n // private class ScopeHandler extends DelegetingHandler {\n //\n // private static final String SCOPE = \"scope\";\n //\n // public ScopeHandler() {\n // super(SCOPE);\n // addChild(new RequiresHandler(), new ChildElementHandler() {\n // public void childHanlded(RequiresHandler child) {\n // }\n // });\n // }\n // }\n\n // private class LifeCycleHandler extends AbstractRequirementHandler {\n //\n // private static final String LIFE_CYCLE = \"lifeCycle\";\n //\n // public LifeCycleHandler() {\n // super(LIFE_CYCLE);\n // }\n // }\n\n}\n =================================================================== --- src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java (revision 5063d256221e7fe8a8c433401bea988d7ccb0a35) +++ src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java (revision ) @@ -17,21 +17,7 @@ */ package org.apache.ivy.osgi.p2; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.ivy.osgi.core.BundleCapability; -import org.apache.ivy.osgi.core.BundleInfo; -import org.apache.ivy.osgi.core.BundleRequirement; -import org.apache.ivy.osgi.core.ExportPackage; -import org.apache.ivy.osgi.core.ManifestParser; +import org.apache.ivy.osgi.core.*; import org.apache.ivy.osgi.p2.PropertiesParser.PropertiesHandler; import org.apache.ivy.osgi.util.DelegatingHandler; import org.apache.ivy.osgi.util.Version; @@ -42,6 +28,15 @@ import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; + public class P2MetadataParser implements XMLInputParser { private final P2Descriptor p2Descriptor; @@ -519,19 +514,21 @@ super(name); addChild(new RequiredHandler(), new ChildElementHandler() { public void childHanlded(RequiredHandler child) { + if(!child.isMatch) { - String name = child.name; - VersionRange range = child.range; - String type = namespace2Type(child.namespace); - if (type == null) { - if (logLevel >= Message.MSG_DEBUG) { - Message.debug("Unsupported required capability " + child.namespace - + " " + name + " " + range); - } - } else { - String resolution = child.optional ? "optional" : null; - requirements.add(new BundleRequirement(type, name, range, resolution)); - } - } + String name = child.name; + VersionRange range = child.range; + String type = namespace2Type(child.namespace); + if (type == null) { + if (logLevel >= Message.MSG_DEBUG) { + Message.debug("Unsupported required capability " + child.namespace + + " " + name + " " + range); + } + } else { + String resolution = child.optional ? "optional" : null; + requirements.add(new BundleRequirement(type, name, range, resolution)); + } + } + } }); } @@ -564,6 +561,8 @@ private static final String OPTIONAL = "optional"; + private static final String MATCH = "match"; + // private static final String GREEDY = "greedy"; String namespace; @@ -578,6 +577,8 @@ boolean optional; + boolean isMatch; + public RequiredHandler() { super(REQUIRED); // addChild(new FilterHandler(), new ChildElementHandler() { @@ -589,6 +590,12 @@ protected void handleAttributes(Attributes atts) throws SAXParseException { namespace = atts.getValue(NAMESPACE); + if(namespace==null){ + if(atts.getValue(MATCH)!=null){ + isMatch=true; + return; + }; + } name = atts.getValue(NAME); try { range = new VersionRange(atts.getValue(RANGE)); Index: test/java/org/apache/ivy/osgi/p2/P2DescriptorTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP <+>/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage org.apache.ivy.osgi.p2;\n\nimport java.io.File;\n\nimport junit.framework.TestCase;\n\nimport org.apache.ivy.Ivy;\nimport org.apache.ivy.core.cache.RepositoryCacheManager;\nimport org.apache.ivy.core.module.descriptor.Artifact;\nimport org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;\nimport org.apache.ivy.core.module.id.ModuleRevisionId;\nimport org.apache.ivy.core.report.ArtifactDownloadReport;\nimport org.apache.ivy.core.report.DownloadReport;\nimport org.apache.ivy.core.report.DownloadStatus;\nimport org.apache.ivy.core.resolve.DownloadOptions;\nimport org.apache.ivy.core.resolve.ResolveData;\nimport org.apache.ivy.core.resolve.ResolveOptions;\nimport org.apache.ivy.core.resolve.ResolvedModuleRevision;\nimport org.apache.ivy.core.settings.IvySettings;\nimport org.apache.ivy.osgi.core.BundleInfo;\nimport org.apache.ivy.osgi.updatesite.UpdateSiteResolver;\n\npublic class P2DescriptorTest extends TestCase {\n\n private File cache;\n\n private IvySettings settings;\n\n private UpdateSiteResolver p2SourceResolver;\n\n private UpdateSiteResolver p2ZippedResolver;\n\n private UpdateSiteResolver p2WithPackedResolver;\n\n private Ivy ivy;\n\n private ResolveData data;\n\n protected void setUp() throws Exception {\n settings = new IvySettings();\n\n p2SourceResolver = new UpdateSiteResolver();\n p2SourceResolver.setName(\"p2-sources\");\n p2SourceResolver.setUrl(new File(\"test/test-p2/sources\").toURI().toURL().toExternalForm());\n p2SourceResolver.setSettings(settings);\n settings.addResolver(p2SourceResolver);\n\n p2ZippedResolver = new UpdateSiteResolver();\n p2ZippedResolver.setName(\"p2-zipped\");\n p2ZippedResolver.setUrl(new File(\"test/test-p2/zipped\").toURI().toURL().toExternalForm());\n p2ZippedResolver.setSettings(settings);\n settings.addResolver(p2ZippedResolver);\n\n p2WithPackedResolver = new UpdateSiteResolver();\n p2WithPackedResolver.setName(\"p2-with-packed\");\n p2WithPackedResolver.setUrl(new File(\"test/test-p2/packed\").toURI().toURL()\n .toExternalForm());\n p2WithPackedResolver.setSettings(settings);\n settings.addResolver(p2WithPackedResolver);\n\n cache = new File(\"build/cache\");\n cache.mkdirs();\n settings.setDefaultCache(cache);\n\n ivy = new Ivy();\n ivy.setSettings(settings);\n ivy.bind();\n\n ivy.getResolutionCacheManager().clean();\n RepositoryCacheManager[] caches = settings.getRepositoryCacheManagers();\n for (int i = 0; i < caches.length; i++) {\n caches[i].clean();\n }\n\n data = new ResolveData(ivy.getResolveEngine(), new ResolveOptions());\n }\n\n @Override\n protected void tearDown() throws Exception {\n ivy.getLoggerEngine().sumupProblems();\n }\n\n public void testResolveSource() throws Exception {\n settings.setDefaultResolver(\"p2-sources\");\n\n ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,\n \"org.apache.ivy\", \"2.2.0.final_20100923230623\");\n\n ResolvedModuleRevision rmr = p2SourceResolver.getDependency(\n new DefaultDependencyDescriptor(mrid, false), data);\n assertNotNull(rmr);\n assertEquals(mrid, rmr.getId());\n\n assertEquals(2, rmr.getDescriptor().getAllArtifacts().length);\n\n DownloadReport report = p2SourceResolver.download(rmr.getDescriptor().getAllArtifacts(),\n new DownloadOptions());\n assertNotNull(report);\n\n assertEquals(2, report.getArtifactsReports().length);\n\n for (int i = 0; i < 2; i++) {\n Artifact artifact = rmr.getDescriptor().getAllArtifacts()[i];\n ArtifactDownloadReport ar = report.getArtifactReport(artifact);\n assertNotNull(ar);\n\n assertEquals(artifact, ar.getArtifact());\n assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus());\n\n // test to ask to download again, should use cache\n DownloadReport report2 = p2SourceResolver.download(new Artifact[] {artifact},\n new DownloadOptions());\n assertNotNull(report2);\n\n assertEquals(1, report2.getArtifactsReports().length);\n\n ar = report2.getArtifactReport(artifact);\n assertNotNull(ar);\n\n assertEquals(artifact, ar.getArtifact());\n assertEquals(DownloadStatus.NO, ar.getDownloadStatus());\n }\n }\n\n public void testResolveNotZipped() throws Exception {\n settings.setDefaultResolver(\"p2-zipped\");\n\n ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,\n \"org.eclipse.e4.core.services\", \"1.0.0.v20120521-2346\");\n\n ResolvedModuleRevision rmr = p2ZippedResolver.getDependency(\n new DefaultDependencyDescriptor(mrid, false), data);\n assertNotNull(rmr);\n assertEquals(mrid, rmr.getId());\n\n assertEquals(1, rmr.getDescriptor().getAllArtifacts().length);\n\n DownloadOptions options = new DownloadOptions();\n DownloadReport report = p2ZippedResolver.download(rmr.getDescriptor().getAllArtifacts(),\n options);\n assertNotNull(report);\n\n assertEquals(1, report.getArtifactsReports().length);\n\n Artifact artifact = rmr.getDescriptor().getAllArtifacts()[0];\n ArtifactDownloadReport ar = report.getArtifactReport(artifact);\n assertNotNull(ar);\n\n assertEquals(artifact, ar.getArtifact());\n assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus());\n assertNull(ar.getUnpackedLocalFile());\n }\n\n public void testResolveZipped() throws Exception {\n settings.setDefaultResolver(\"p2-zipped\");\n\n ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,\n \"org.apache.ant\", \"1.8.3.v20120321-1730\");\n\n ResolvedModuleRevision rmr = p2ZippedResolver.getDependency(\n new DefaultDependencyDescriptor(mrid, false), data);\n assertNotNull(rmr);\n assertEquals(mrid, rmr.getId());\n\n assertEquals(2, rmr.getDescriptor().getAllArtifacts().length);\n\n DownloadOptions options = new DownloadOptions();\n DownloadReport report = p2ZippedResolver.download(rmr.getDescriptor().getAllArtifacts(),\n options);\n assertNotNull(report);\n\n assertEquals(2, report.getArtifactsReports().length);\n\n for (int i = 0; i < 2; i++) {\n Artifact artifact = rmr.getDescriptor().getAllArtifacts()[i];\n ArtifactDownloadReport ar = report.getArtifactReport(artifact);\n assertNotNull(ar);\n\n assertEquals(artifact, ar.getArtifact());\n assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus());\n // only the binary get unpacked\n if (ar.getArtifact().getType().equals(\"source\")) {\n assertNull(ar.getUnpackedLocalFile());\n } else {\n assertNotNull(ar.getUnpackedLocalFile());\n }\n }\n }\n\n public void testResolvePacked() throws Exception {\n settings.setDefaultResolver(\"p2-with-packed\");\n\n ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, \"org.junit\",\n \"4.10.0.v4_10_0_v20120426-0900\");\n\n ResolvedModuleRevision rmr = p2WithPackedResolver.getDependency(\n new DefaultDependencyDescriptor(mrid, false), data);\n assertNotNull(rmr);\n assertEquals(mrid, rmr.getId());\n\n assertEquals(1, rmr.getDescriptor().getAllArtifacts().length);\n\n DownloadOptions options = new DownloadOptions();\n DownloadReport report = p2WithPackedResolver.download(\n rmr.getDescriptor().getAllArtifacts(), options);\n assertNotNull(report);\n\n assertEquals(1, report.getArtifactsReports().length);\n\n Artifact artifact = rmr.getDescriptor().getAllArtifacts()[0];\n ArtifactDownloadReport ar = report.getArtifactReport(artifact);\n assertNotNull(ar);\n\n assertEquals(artifact, ar.getArtifact());\n assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus());\n assertNotNull(ar.getUnpackedLocalFile());\n }\n}\n =================================================================== --- test/java/org/apache/ivy/osgi/p2/P2DescriptorTest.java (revision 5063d256221e7fe8a8c433401bea988d7ccb0a35) +++ test/java/org/apache/ivy/osgi/p2/P2DescriptorTest.java (revision ) @@ -17,10 +17,7 @@ */ package org.apache.ivy.osgi.p2; -import java.io.File; - import junit.framework.TestCase; - import org.apache.ivy.Ivy; import org.apache.ivy.core.cache.RepositoryCacheManager; import org.apache.ivy.core.module.descriptor.Artifact; @@ -37,6 +34,8 @@ import org.apache.ivy.osgi.core.BundleInfo; import org.apache.ivy.osgi.updatesite.UpdateSiteResolver; +import java.io.File; + public class P2DescriptorTest extends TestCase { private File cache; @@ -49,6 +48,8 @@ private UpdateSiteResolver p2WithPackedResolver; + private UpdateSiteResolver p2RapResolver; + private Ivy ivy; private ResolveData data; @@ -75,6 +76,13 @@ p2WithPackedResolver.setSettings(settings); settings.addResolver(p2WithPackedResolver); + + p2RapResolver = new UpdateSiteResolver(); + p2RapResolver.setName("p2-rap"); + p2RapResolver.setUrl(new File("test/test-p2/rap").toURI().toURL().toExternalForm()); + p2RapResolver.setSettings(settings); + settings.addResolver(p2RapResolver); + cache = new File("build/cache"); cache.mkdirs(); settings.setDefaultCache(cache); @@ -101,17 +109,17 @@ settings.setDefaultResolver("p2-sources"); ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, - "org.apache.ivy", "2.2.0.final_20100923230623"); + "org.apache.ivy", "2.2.0.final_20100923230623"); ResolvedModuleRevision rmr = p2SourceResolver.getDependency( - new DefaultDependencyDescriptor(mrid, false), data); + new DefaultDependencyDescriptor(mrid, false), data); assertNotNull(rmr); assertEquals(mrid, rmr.getId()); assertEquals(2, rmr.getDescriptor().getAllArtifacts().length); DownloadReport report = p2SourceResolver.download(rmr.getDescriptor().getAllArtifacts(), - new DownloadOptions()); + new DownloadOptions()); assertNotNull(report); assertEquals(2, report.getArtifactsReports().length); @@ -125,8 +133,8 @@ assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); // test to ask to download again, should use cache - DownloadReport report2 = p2SourceResolver.download(new Artifact[] {artifact}, + DownloadReport report2 = p2SourceResolver.download(new Artifact[]{artifact}, - new DownloadOptions()); + new DownloadOptions()); assertNotNull(report2); assertEquals(1, report2.getArtifactsReports().length); @@ -143,10 +151,10 @@ settings.setDefaultResolver("p2-zipped"); ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, - "org.eclipse.e4.core.services", "1.0.0.v20120521-2346"); + "org.eclipse.e4.core.services", "1.0.0.v20120521-2346"); ResolvedModuleRevision rmr = p2ZippedResolver.getDependency( - new DefaultDependencyDescriptor(mrid, false), data); + new DefaultDependencyDescriptor(mrid, false), data); assertNotNull(rmr); assertEquals(mrid, rmr.getId()); @@ -154,7 +162,7 @@ DownloadOptions options = new DownloadOptions(); DownloadReport report = p2ZippedResolver.download(rmr.getDescriptor().getAllArtifacts(), - options); + options); assertNotNull(report); assertEquals(1, report.getArtifactsReports().length); @@ -172,10 +180,10 @@ settings.setDefaultResolver("p2-zipped"); ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, - "org.apache.ant", "1.8.3.v20120321-1730"); + "org.apache.ant", "1.8.3.v20120321-1730"); ResolvedModuleRevision rmr = p2ZippedResolver.getDependency( - new DefaultDependencyDescriptor(mrid, false), data); + new DefaultDependencyDescriptor(mrid, false), data); assertNotNull(rmr); assertEquals(mrid, rmr.getId()); @@ -183,7 +191,7 @@ DownloadOptions options = new DownloadOptions(); DownloadReport report = p2ZippedResolver.download(rmr.getDescriptor().getAllArtifacts(), - options); + options); assertNotNull(report); assertEquals(2, report.getArtifactsReports().length); @@ -208,10 +216,10 @@ settings.setDefaultResolver("p2-with-packed"); ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, "org.junit", - "4.10.0.v4_10_0_v20120426-0900"); + "4.10.0.v4_10_0_v20120426-0900"); ResolvedModuleRevision rmr = p2WithPackedResolver.getDependency( - new DefaultDependencyDescriptor(mrid, false), data); + new DefaultDependencyDescriptor(mrid, false), data); assertNotNull(rmr); assertEquals(mrid, rmr.getId()); @@ -219,7 +227,7 @@ DownloadOptions options = new DownloadOptions(); DownloadReport report = p2WithPackedResolver.download( - rmr.getDescriptor().getAllArtifacts(), options); + rmr.getDescriptor().getAllArtifacts(), options); assertNotNull(report); assertEquals(1, report.getArtifactsReports().length); @@ -232,4 +240,34 @@ assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); assertNotNull(ar.getUnpackedLocalFile()); } + + public void testRap() throws Exception { + settings.setDefaultResolver("p2-rap"); + + ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE, "org.eclipse.osgi", + "3.10+"); + + ResolvedModuleRevision rmr = p2RapResolver.getDependency( + new DefaultDependencyDescriptor(mrid, false), data); + assertNotNull(rmr); + //assertEquals(mrid, rmr.getId()); + + assertEquals(2, rmr.getDescriptor().getAllArtifacts().length); + + DownloadOptions options = new DownloadOptions(); + DownloadReport report = p2RapResolver.download( + rmr.getDescriptor().getAllArtifacts(), options); + assertNotNull(report); + + assertEquals(2, report.getArtifactsReports().length); + + Artifact artifact = rmr.getDescriptor().getAllArtifacts()[0]; + ArtifactDownloadReport ar = report.getArtifactReport(artifact); + assertNotNull(ar); + + assertEquals(artifact, ar.getArtifact()); + assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); + assertNotNull(ar.getUnpackedLocalFile()); -} + } +} +