You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2011/01/07 13:41:05 UTC

svn commit: r1056291 - in /ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2: ./ P2Artifact.java P2ArtifactParser.java P2Descriptor.java P2MetadataParser.java PropertiesParser.java XMLInputParser.java

Author: hibou
Date: Fri Jan  7 12:41:04 2011
New Revision: 1056291

URL: http://svn.apache.org/viewvc?rev=1056291&view=rev
Log:
Add a first implementaition of a parser of an Eclipse P2 repository

Added:
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java   (with props)
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java   (with props)
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java   (with props)
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java   (with props)
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java   (with props)
    ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java   (with props)

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,47 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import org.apache.ivy.osgi.util.Version;
+
+public class P2Artifact {
+
+    private String id;
+
+    private Version version;
+
+    private String classifier;
+
+    public P2Artifact(String id, Version version, String classifier) {
+        this.id = id;
+        this.version = version;
+        this.classifier = classifier;
+    }
+
+    public String getClassifier() {
+        return classifier;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Artifact.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,201 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.ivy.osgi.p2.PropertiesParser.PropertiesHandler;
+import org.apache.ivy.osgi.util.DelegetingHandler;
+import org.apache.ivy.osgi.util.Version;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class P2ArtifactParser implements XMLInputParser {
+
+    private final P2Descriptor p2Descriptor;
+
+    public P2ArtifactParser(P2Descriptor p2Descriptor) {
+        this.p2Descriptor = p2Descriptor;
+    }
+
+    public void parse(InputStream in) throws ParseException, IOException, SAXException {
+        XMLReader reader = XMLReaderFactory.createXMLReader();
+        RepositoryHandler handler = new RepositoryHandler(p2Descriptor);
+        reader.setContentHandler(handler);
+        reader.parse(new InputSource(in));
+    }
+
+    static class RepositoryHandler extends DelegetingHandler {
+
+        private static final String REPOSITORY = "repository";
+
+        // private static final String NAME = "name";
+        //
+        // private static final String TYPE = "type";
+        //
+        // private static final String VERSION = "version";
+
+        private Map/* <String, String> */patternsByClassifier = new HashMap();
+
+        public RepositoryHandler(final P2Descriptor p2Descriptor) {
+            super(REPOSITORY);
+            // addChild(new PropertiesHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            addChild(new MappingsHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Iterator it = ((MappingsHandler) child).outputByFilter.entrySet().iterator();
+                    while (it.hasNext()) {
+                        Entry entry = (Entry) it.next();
+                        String filter = (String) entry.getKey();
+                        if (filter.startsWith("(& (classifier=") && filter.endsWith("")) {
+                            String classifier = filter.substring(15, filter.length() - 2);
+                            patternsByClassifier.put(classifier, entry.getValue());
+                        } else {
+                            throw new IllegalStateException();
+                        }
+
+                    }
+                }
+            });
+            addChild(new ArtifactsHandler(p2Descriptor, patternsByClassifier),
+                new ChildElementHandler() {
+                    public void childHanlded(DelegetingHandler child) {
+                        // nothing to do
+                    }
+                });
+        }
+        // protected void handleAttributes(Attributes atts) {
+        // String name = atts.getValue(NAME);
+        // String type = atts.getValue(TYPE);
+        // String version = atts.getValue(VERSION);
+        // }
+    }
+
+    static class MappingsHandler extends DelegetingHandler {
+
+        private static final String MAPPINGS = "mappings";
+
+        private static final String SIZE = "size";
+
+        Map/* <String, String> */outputByFilter;
+
+        public MappingsHandler() {
+            super(MAPPINGS);
+            addChild(new RuleHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    outputByFilter.put(((RuleHandler) child).filter, ((RuleHandler) child).output);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            outputByFilter = new HashMap(size);
+        }
+
+    }
+
+    static class RuleHandler extends DelegetingHandler {
+
+        private static final String RULE = "rule";
+
+        private static final String FILTER = "filter";
+
+        private static final String OUTPUT = "output";
+
+        private String filter;
+
+        private String output;
+
+        public RuleHandler() {
+            super(RULE);
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            filter = atts.getValue(FILTER);
+            output = atts.getValue(OUTPUT);
+        }
+
+    }
+
+    static class ArtifactsHandler extends DelegetingHandler {
+
+        private static final String ARTIFACTS = "artifacts";
+
+        // private static final String SIZE = "size";
+
+        public ArtifactsHandler(final P2Descriptor p2Descriptor,
+                final Map/* <String, String> */patternsByClassifier) {
+            super(ARTIFACTS);
+            addChild(new ArtifactHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    P2Artifact a = ((ArtifactHandler) child).p2Artifact;
+                    String url = (String) patternsByClassifier.get(a.getClassifier());
+                    p2Descriptor.addArtifactUrl(a.getId(), a.getVersion(), url);
+                }
+            });
+        }
+
+        // protected void handleAttributes(Attributes atts) {
+        // int size = Integer.parseInt(atts.getValue(SIZE));
+        // artifacts = new ArrayList(size);
+        // }
+
+    }
+
+    static class ArtifactHandler extends DelegetingHandler {
+
+        private static final String ARTIFACT = "artifact";
+
+        private static final String CLASSIFIER = "classifier";
+
+        private static final String ID = "id";
+
+        private static final String VERSION = "version";
+
+        P2Artifact p2Artifact;
+
+        public ArtifactHandler() {
+            super(ARTIFACT);
+            addChild(new PropertiesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            String id = atts.getValue(ID);
+            Version version = new Version(atts.getValue(VERSION));
+            String classifier = atts.getValue(CLASSIFIER);
+
+            p2Artifact = new P2Artifact(id, version, classifier);
+        }
+    }
+
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2ArtifactParser.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,65 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ivy.osgi.core.BundleInfo;
+import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider;
+import org.apache.ivy.osgi.repo.RepoDescriptor;
+import org.apache.ivy.osgi.util.Version;
+
+public class P2Descriptor extends RepoDescriptor {
+
+    private long timestamp;
+
+    private Map/* <String, Map<Version, String>> */artifactUrls = new HashMap();
+
+    public P2Descriptor(ExecutionEnvironmentProfileProvider profileProvider) {
+        super(profileProvider);
+    }
+
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public void addBundle(BundleInfo bundleInfo) {
+        // before transforming it and adding it into the repo, let's add the artifacts
+
+        Map/* <Version, String> */urlsByVersion = (Map) artifactUrls.get(bundleInfo
+                .getSymbolicName());
+        if (urlsByVersion != null) {
+            String url = (String) urlsByVersion.get(bundleInfo.getVersion());
+            if (url != null) {
+                bundleInfo.setUri(url);
+            }
+        }
+
+        super.addBundle(bundleInfo);
+    }
+
+    public void addArtifactUrl(String id, Version version, String url) {
+        Map/* <Version, String> */byVersion = (Map) artifactUrls.get(id);
+        if (byVersion == null) {
+            byVersion = new HashMap();
+            artifactUrls.put(id, byVersion);
+        }
+        byVersion.put(version, url);
+    }
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2Descriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,766 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+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.p2.PropertiesParser.PropertiesHandler;
+import org.apache.ivy.osgi.util.DelegetingHandler;
+import org.apache.ivy.osgi.util.Version;
+import org.apache.ivy.osgi.util.VersionRange;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class P2MetadataParser implements XMLInputParser {
+
+    private final P2Descriptor p2Descriptor;
+
+    public P2MetadataParser(P2Descriptor p2Descriptor) {
+        this.p2Descriptor = p2Descriptor;
+    }
+
+    public void parse(InputStream in) throws ParseException, IOException, SAXException {
+        XMLReader reader = XMLReaderFactory.createXMLReader();
+        RepositoryHandler handler = new RepositoryHandler(p2Descriptor);
+        reader.setContentHandler(handler);
+        reader.parse(new InputSource(in));
+    }
+
+    static class RepositoryHandler extends DelegetingHandler {
+
+        private static final String REPOSITORY = "repository";
+
+        // private static final String NAME = "name";
+        //
+        // private static final String TYPE = "type";
+        //
+        // private static final String VERSION = "version";
+        //
+        // private static final String DESCRIPTION = "description";
+        //
+        // private static final String PROVIDER = "provider";
+
+        public RepositoryHandler(final P2Descriptor p2Descriptor) {
+            super(REPOSITORY);
+            addChild(new PropertiesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Map properties = ((PropertiesHandler) child).properties;
+                    String timestamp = (String) properties.get("p2.timestamp");
+                    if (timestamp != null) {
+                        p2Descriptor.setTimestamp(Long.parseLong(timestamp));
+                    }
+                }
+            });
+            addChild(new UnitsHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Iterator it = ((UnitsHandler) child).bundles.iterator();
+                    while (it.hasNext()) {
+                        p2Descriptor.addBundle((BundleInfo) it.next());
+                    }
+                }
+            });
+            addChild(new ReferencesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+        }
+
+        // protected void handleAttributes(Attributes atts) {
+        // String name = atts.getValue(NAME);
+        // String type = atts.getValue(TYPE);
+        // String version = atts.getValue(VERSION);
+        // String description = atts.getValue(DESCRIPTION);
+        // String provider = atts.getValue(PROVIDER);
+        // }
+    }
+
+    static class ReferencesHandler extends DelegetingHandler {
+
+        private static final String REFERENCES = "references";
+
+        private static final String SIZE = "size";
+
+        List/* <URI> */repositoryUris;
+
+        public ReferencesHandler() {
+            super(REFERENCES);
+            addChild(new RepositoryReferenceHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    repositoryUris.add(((RepositoryReferenceHandler) child).uri);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) throws SAXException {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            repositoryUris = new ArrayList(size);
+        }
+    }
+
+    static class RepositoryReferenceHandler extends DelegetingHandler {
+
+        private static final String REPOSITORY = "repository";
+
+        private static final String TYPE = "type";
+
+        private static final String OPTIONS = "options";
+
+        private static final String NAME = "name";
+
+        private static final String URI = "uri";
+
+        private static final String URL = "url";
+
+        public RepositoryReferenceHandler() {
+            super(REPOSITORY);
+        }
+
+        int type;
+
+        int options;
+
+        String name;
+
+        URI uri;
+
+        protected void handleAttributes(Attributes atts) throws SAXException {
+            type = Integer.parseInt(atts.getValue(TYPE));
+            options = Integer.parseInt(atts.getValue(OPTIONS));
+            name = atts.getValue(NAME);
+
+            try {
+                String uriAtt = atts.getValue(URI);
+                String url = atts.getValue(URL);
+                if (uri != null) {
+                    uri = new URI(uriAtt);
+                } else if (url != null) {
+                    uri = new URI(url);
+                }
+            } catch (URISyntaxException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+
+    static class UnitsHandler extends DelegetingHandler {
+
+        private static final String UNITS = "units";
+
+        private static final String SIZE = "size";
+
+        List bundles;
+
+        public UnitsHandler() {
+            super(UNITS);
+            addChild(new UnitHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    bundles.add(((UnitHandler) child).bundleInfo);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            bundles = new ArrayList(size);
+        }
+
+    }
+
+    static class UnitHandler extends DelegetingHandler {
+
+        private static final String UNIT = "unit";
+
+        private static final String ID = "id";
+
+        private static final String VERSION = "version";
+
+        private static final String SINGLETON = "singleton";
+
+        BundleInfo bundleInfo;
+
+        public UnitHandler() {
+            super(UNIT);
+            // addChild(new UpdateHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            addChild(new PropertiesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Map properties = ((PropertiesHandler) child).properties;
+                    String category = (String) properties
+                            .get("org.eclipse.equinox.p2.type.category");
+                    if (category != null && Boolean.valueOf(category).booleanValue()) {
+                        // this is a category definition, this is useless, skip this unit
+                        child.getParent().skip();
+                    }
+                }
+            });
+            addChild(new ProvidesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Iterator it = ((ProvidesHandler) child).capabilities.iterator();
+                    while (it.hasNext()) {
+                        bundleInfo.addCapability((BundleCapability) it.next());
+                    }
+                }
+            });
+            addChild(new FilterHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+            addChild(new RequiresHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    Iterator it = ((RequiresHandler) child).requirements.iterator();
+                    while (it.hasNext()) {
+                        bundleInfo.addRequirement((BundleRequirement) it.next());
+                    }
+                }
+            });
+            addChild(new HostRequirementsHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+            addChild(new MetaRequirementsHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+            addChild(new ArtifactsHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+            // addChild(new TouchpointHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            // addChild(new TouchpointDataHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            // addChild(new LicensesHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            // addChild(new CopyrightHandler(), new ChildElementHandler() {
+            // public void childHanlded(DelegetingHandler child) {
+            // }
+            // });
+            addChild(new ChangesHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            String id = atts.getValue(ID);
+            Version version = new Version(atts.getValue(VERSION));
+            boolean singleton = Boolean.getBoolean(atts.getValue(SINGLETON));
+            bundleInfo = new BundleInfo(id, version);
+        }
+
+    }
+
+    // static class UpdateHandler extends DelegetingHandler {
+    //
+    // private static final String UPDATE = "update";
+    //
+    // private static final String ID = "id";
+    //
+    // private static final String RANGE = "range";
+    //
+    // private static final String SEVERITY = "severity";
+    //
+    // public UpdateHandler() {
+    // super(UPDATE);
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String id = atts.getValue(ID);
+    // String range = atts.getValue(RANGE);
+    // String severity = atts.getValue(SEVERITY);
+    // }
+    //
+    // }
+
+    static class FilterHandler extends DelegetingHandler {
+
+        private static final String FILTER = "filter";
+
+        public FilterHandler() {
+            super(FILTER);
+            setBufferingChar(true);
+        }
+
+    }
+
+    private static String namespace2Type(String namespace) {
+        if (namespace.equals("java.package")) {
+            return BundleInfo.PACKAGE_TYPE;
+        }
+        if (namespace.equals("osgi.bundle")) {
+            return BundleInfo.BUNDLE_TYPE;
+        }
+        return null;
+    }
+
+    static class ProvidesHandler extends DelegetingHandler {
+
+        private static final String PROVIDES = "provides";
+
+        private static final String SIZE = "size";
+
+        List capabilities;
+
+        public ProvidesHandler() {
+            super(PROVIDES);
+            addChild(new ProvidedHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    String name = ((ProvidedHandler) child).name;
+                    Version version = ((ProvidedHandler) child).version;
+                    String type = namespace2Type(((ProvidedHandler) child).namespace);
+                    BundleCapability capability;
+                    if (type == BundleInfo.PACKAGE_TYPE) {
+                        capability = new ExportPackage(name, version);
+                    } else {
+                        capability = new BundleCapability(type, name, version);
+                    }
+                    capabilities.add(capability);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            capabilities = new ArrayList(size);
+        }
+
+    }
+
+    static class ProvidedHandler extends DelegetingHandler {
+
+        private static final String PROVIDED = "provided";
+
+        private static final String NAMESPACE = "namespace";
+
+        private static final String NAME = "name";
+
+        private static final String VERSION = "version";
+
+        String namespace;
+
+        String name;
+
+        Version version;
+
+        public ProvidedHandler() {
+            super(PROVIDED);
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            namespace = atts.getValue(NAMESPACE);
+            name = atts.getValue(NAME);
+            version = new Version(atts.getValue(VERSION));
+        }
+
+    }
+
+    static abstract class AbstractRequirementHandler extends DelegetingHandler {
+
+        private static final String SIZE = "size";
+
+        List requirements;
+
+        public AbstractRequirementHandler(String name) {
+            super(name);
+            addChild(new RequiredHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    String name = ((RequiredHandler) child).name;
+                    VersionRange range = ((RequiredHandler) child).range;
+                    String type = namespace2Type(((RequiredHandler) child).namespace);
+                    requirements.add(new BundleRequirement(type, name, range, null));
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            requirements = new ArrayList(size);
+        }
+
+    }
+
+    static class RequiresHandler extends AbstractRequirementHandler {
+
+        private static final String REQUIRES = "provides";
+
+        public RequiresHandler() {
+            super(REQUIRES);
+        }
+
+    }
+
+    static class RequiredHandler extends DelegetingHandler {
+
+        private static final String REQUIRED = "required";
+
+        private static final String NAMESPACE = "namespace";
+
+        private static final String NAME = "name";
+
+        private static final String RANGE = "range";
+
+        String namespace;
+
+        String name;
+
+        VersionRange range;
+
+        String filter;
+
+        public RequiredHandler() {
+            super(REQUIRED);
+            addChild(new FilterHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    filter = child.getBufferedChars().trim();
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            namespace = atts.getValue(NAMESPACE);
+            name = atts.getValue(NAME);
+            try {
+                range = new VersionRange(atts.getValue(RANGE));
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+    }
+
+    static class HostRequirementsHandler extends AbstractRequirementHandler {
+
+        private static final String HOST_REQUIREMENTS = "hostRequirements";
+
+        public HostRequirementsHandler() {
+            super(HOST_REQUIREMENTS);
+        }
+
+    }
+
+    static class MetaRequirementsHandler extends AbstractRequirementHandler {
+
+        private static final String META_REQUIREMENTS = "metaRequirements";
+
+        public MetaRequirementsHandler() {
+            super(META_REQUIREMENTS);
+        }
+
+    }
+
+    static class ArtifactsHandler extends DelegetingHandler {
+
+        private static final String ARTIFACTS = "artifacts";
+
+        private static final String SIZE = "size";
+
+        List artifacts;
+
+        public ArtifactsHandler() {
+            super(ARTIFACTS);
+            addChild(new ArtifactHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    artifacts.add(((ArtifactHandler) child).artifact);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            artifacts = new ArrayList(size);
+        }
+
+    }
+
+    static class ArtifactHandler extends DelegetingHandler/* <ArtifactsHandler> */{
+
+        private static final String ARTIFACT = "artifact";
+
+        private static final String ID = "id";
+
+        private static final String VERSION = "version";
+
+        private static final String CLASSIFIER = "classifier";
+
+        P2Artifact artifact;
+
+        public ArtifactHandler() {
+            super(ARTIFACT);
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            String id = atts.getValue(ID);
+            Version version = new Version(atts.getValue(VERSION));
+            String classifier = atts.getValue(CLASSIFIER);
+            artifact = new P2Artifact(id, version, classifier);
+        }
+
+    }
+
+    //
+    // static class TouchpointHandler extends DelegetingHandler {
+    //
+    // private static final String TOUCHPOINT = "touchpoint";
+    //
+    // private static final String ID = "id";
+    //
+    // private static final String VERSION = "version";
+    //
+    // public TouchpointHandler() {
+    // super(TOUCHPOINT);
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String id = atts.getValue(ID);
+    // String version = atts.getValue(VERSION);
+    // }
+    //
+    // }
+    //
+    // static class TouchpointDataHandler extends DelegetingHandler {
+    //
+    // private static final String TOUCHPOINTDATA = "touchpointData";
+    //
+    // private static final String SIZE = "size";
+    //
+    // public TouchpointDataHandler() {
+    // super(TOUCHPOINTDATA);
+    // addChild(new InstructionsHandler(), new ChildElementHandler() {
+    // public void childHanlded(DelegetingHandler child) {
+    // }
+    // });
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String size = atts.getValue(SIZE);
+    // }
+    //
+    // }
+    //
+    // static class InstructionsHandler extends DelegetingHandler {
+    //
+    // private static final String INSTRUCTIONS = "instructions";
+    //
+    // private static final String SIZE = "size";
+    //
+    // public InstructionsHandler() {
+    // super(INSTRUCTIONS);
+    // addChild(new InstructionHandler(), new ChildElementHandler() {
+    // public void childHanlded(DelegetingHandler child) {
+    // }
+    // });
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String size = atts.getValue(SIZE);
+    // }
+    //
+    // }
+    //
+    // static class InstructionHandler extends DelegetingHandler {
+    //
+    // private static final String INSTRUCTION = "instruction";
+    //
+    // private static final String KEY = "key";
+    //
+    // public InstructionHandler() {
+    // super(INSTRUCTION);
+    // setBufferingChar(true);
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String size = atts.getValue(KEY);
+    // }
+    //
+    // }
+    //
+    // static class LicensesHandler extends DelegetingHandler {
+    //
+    // private static final String LICENSES = "licenses";
+    //
+    // private static final String SIZE = "size";
+    //
+    // public LicensesHandler() {
+    // super(LICENSES);
+    // addChild(new LicenseHandler(), new ChildElementHandler() {
+    // public void childHanlded(DelegetingHandler child) {
+    // }
+    // });
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String size = atts.getValue(SIZE);
+    // }
+    //
+    // }
+    //
+    // static class LicenseHandler extends DelegetingHandler {
+    //
+    // private static final String LICENSE = "license";
+    //
+    // private static final String URI = "uri";
+    //
+    // private static final String URL = "url";
+    //
+    // public LicenseHandler() {
+    // super(LICENSE);
+    // setBufferingChar(true);
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String uri = atts.getValue(URI);
+    // String url = atts.getValue(URL);
+    // }
+    //
+    // }
+    //
+    // static class CopyrightHandler extends DelegetingHandler {
+    //
+    // private static final String COPYRIGHT = "copyright";
+    //
+    // private static final String URI = "uri";
+    //
+    // private static final String URL = "url";
+    //
+    // public CopyrightHandler() {
+    // super(COPYRIGHT);
+    // }
+    //
+    // protected void handleAttributes(Attributes atts) {
+    // String uri = atts.getValue(URI);
+    // String url = atts.getValue(URL);
+    // }
+    //
+    // }
+
+    static class ChangesHandler extends DelegetingHandler {
+
+        private static final String CHANGES = "changes";
+
+        private static final String SIZE = "size";
+
+        public ChangesHandler() {
+            super(CHANGES);
+            addChild(new ChangeHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+        }
+    }
+
+    static class ChangeHandler extends DelegetingHandler {
+
+        private static final String CHANGE = "change";
+
+        public ChangeHandler() {
+            super(CHANGE);
+        }
+    }
+
+    static class FromHandler extends AbstractRequirementHandler {
+
+        private static final String FROM = "from";
+
+        public FromHandler() {
+            super(FROM);
+        }
+
+    }
+
+    static class ToHandler extends AbstractRequirementHandler {
+
+        private static final String TO = "to";
+
+        public ToHandler() {
+            super(TO);
+        }
+
+    }
+
+    static class PatchScopeHandler extends DelegetingHandler {
+
+        private static final String PATCH_SCOPE = "patchScope";
+
+        private static final String SIZE = "size";
+
+        public PatchScopeHandler() {
+            super(PATCH_SCOPE);
+            addChild(new PatchScopeHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+        }
+    }
+
+    static class ScopeHandler extends DelegetingHandler {
+
+        private static final String SCOPE = "scope";
+
+        public ScopeHandler() {
+            super(SCOPE);
+            addChild(new RequiresHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                }
+            });
+        }
+    }
+
+    static class LifeCycleHandler extends AbstractRequirementHandler {
+
+        private static final String LIFE_CYCLE = "lifeCycle";
+
+        public LifeCycleHandler() {
+            super(LIFE_CYCLE);
+        }
+    }
+
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/P2MetadataParser.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,75 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ivy.osgi.util.DelegetingHandler;
+import org.xml.sax.Attributes;
+
+public class PropertiesParser {
+
+    static class PropertiesHandler extends DelegetingHandler {
+
+        private static final String PROPERTIES = "properties";
+
+        private static final String SIZE = "size";
+
+        Map properties;
+
+        public PropertiesHandler() {
+            super(PROPERTIES);
+            addChild(new PropertyHandler(), new ChildElementHandler() {
+                public void childHanlded(DelegetingHandler child) {
+                    properties.put(((PropertyHandler) child).name, ((PropertyHandler) child).value);
+                }
+            });
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            int size = Integer.parseInt(atts.getValue(SIZE));
+            properties = new HashMap(size);
+        }
+
+    }
+
+    static class PropertyHandler extends DelegetingHandler {
+
+        private static final String PROPERTY = "property";
+
+        private static final String NAME = "name";
+
+        private static final String VALUE = "value";
+
+        String name;
+
+        String value;
+
+        public PropertyHandler() {
+            super(PROPERTY);
+        }
+
+        protected void handleAttributes(Attributes atts) {
+            name = atts.getValue(NAME);
+            value = atts.getValue(VALUE);
+        }
+
+    }
+
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/PropertiesParser.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java?rev=1056291&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java Fri Jan  7 12:41:04 2011
@@ -0,0 +1,30 @@
+/*
+ *  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.ivy.osgi.p2;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+
+import org.xml.sax.SAXException;
+
+public interface XMLInputParser {
+
+    public void parse(InputStream in) throws ParseException, IOException, SAXException;
+
+}

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/osgi/p2/XMLInputParser.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain