You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2010/03/19 16:32:19 UTC

svn commit: r925279 [3/3] - in /felix/trunk: bundleplugin/ bundleplugin/src/main/java/org/apache/felix/bundleplugin/ bundleplugin/src/main/java/org/apache/felix/obrplugin/ bundleplugin/src/main/java/org/osgi/impl/bundle/obr/resource/ bundleplugin/src/t...

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java Fri Mar 19 15:32:17 2010
@@ -20,6 +20,7 @@ package org.apache.felix.bundlerepositor
 
 import org.apache.felix.bundlerepository.Capability;
 import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.utils.filter.FilterImpl;
 import org.osgi.framework.InvalidSyntaxException;
 
 public class RequirementImpl implements Requirement
@@ -35,75 +36,89 @@ public class RequirementImpl implements 
     {
     }
 
-    public synchronized String getName()
+    public RequirementImpl(String name) 
+    {
+        setName(name);
+    }
+
+    public String getName()
     {
         return m_name;
     }
 
-    public synchronized void setName(String name)
+    public void setName(String name)
     {
         // Name of capabilities and requirements are interned for performances
-        // (with a very slow inter consumption as there are only a handful of values)
+        // (with a very low memory consumption as there are only a handful of values)
         m_name = name.intern();
     }
 
-    public synchronized String getFilter()
+    public String getFilter()
     {
         return m_filter.toString();
     }
 
-    public synchronized void setFilter(String filter) throws InvalidSyntaxException
+    public void setFilter(String filter)
     {
-        m_filter = FilterImpl.newInstance(filter, true);
+        try
+        {
+            m_filter = FilterImpl.newInstance(filter, true);
+        }
+        catch (InvalidSyntaxException e)
+        {
+            IllegalArgumentException ex = new IllegalArgumentException();
+            ex.initCause(e);
+            throw ex;
+        }
     }
 
-    public synchronized boolean isSatisfied(Capability capability)
+    public boolean isSatisfied(Capability capability)
     {
-        return m_name.equals(capability.getName()) && m_filter.matchCase(capability.getProperties())
-                && (m_filter.toString().indexOf("(mandatory:<*") >= 0 || capability.getProperties().get("mandatory:") == null);
+        return m_name.equals(capability.getName()) && m_filter.matchCase(capability.getPropertiesAsMap())
+                && (m_filter.toString().indexOf("(mandatory:<*") >= 0 || capability.getPropertiesAsMap().get("mandatory:") == null);
     }
 
-    public synchronized boolean isExtend()
+    public boolean isExtend()
     {
         return m_extend;
     }
 
-    public synchronized void setExtend(String s)
+    public void setExtend(boolean extend)
     {
-        m_extend = Boolean.valueOf(s).booleanValue();
+        m_extend = extend;
     }
 
-    public synchronized boolean isMultiple()
+    public boolean isMultiple()
     {
         return m_multiple;
     }
 
-    public synchronized void setMultiple(String s)
+    public void setMultiple(boolean multiple)
     {
-        m_multiple = Boolean.valueOf(s).booleanValue();
+        m_multiple = multiple;
     }
 
-    public synchronized boolean isOptional()
+    public boolean isOptional()
     {
         return m_optional;
     }
 
-    public synchronized void setOptional(String s)
+    public void setOptional(boolean optional)
     {
-        m_optional = Boolean.valueOf(s).booleanValue();
+        m_optional = optional;
     }
 
-    public synchronized String getComment()
+    public String getComment()
     {
         return m_comment;
     }
 
-    public synchronized void addText(String s)
+    public void addText(String s)
     {
         m_comment = s;
     }
 
-    public synchronized boolean equals(Object o)
+    public boolean equals(Object o)
     {
         if (this == o)
         {
@@ -122,12 +137,12 @@ public class RequirementImpl implements 
         return false;
     }
 
-    public synchronized int hashCode()
+    public int hashCode()
     {
         return m_filter.toString().hashCode();
     }
 
-    public synchronized String toString()
+    public String toString()
     {
         return m_name + ":" + getFilter();
     }

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResolverImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResolverImpl.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResolverImpl.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResolverImpl.java Fri Mar 19 15:32:17 2010
@@ -23,6 +23,8 @@ import java.util.*;
 
 import org.apache.felix.bundlerepository.*;
 import org.apache.felix.bundlerepository.Resolver;
+import org.apache.felix.bundlerepository.impl.ResourceImpl;
+import org.apache.felix.utils.log.Logger;
 import org.osgi.framework.*;
 
 public class ResolverImpl implements Resolver
@@ -420,7 +422,7 @@ public class ResolverImpl implements Res
             {
                 best = current;
                 bestLocal = isCurrentLocal;
-                Object v = current.getCapability().getProperties().get(Resource.VERSION);
+                Object v = current.getCapability().getPropertiesAsMap().get(Resource.VERSION);
                 if ((v != null) && (v instanceof Version))
                 {
                     bestVersion = (Version) v;
@@ -428,7 +430,7 @@ public class ResolverImpl implements Res
             }
             else if ((m_resolutionFlags & DO_NOT_PREFER_LOCAL) != 0 || !bestLocal || isCurrentLocal)
             {
-                Object v = current.getCapability().getProperties().get(Resource.VERSION);
+                Object v = current.getCapability().getPropertiesAsMap().get(Resource.VERSION);
 
                 // If there is no version, then select the resource
                 // with the greatest number of capabilities.
@@ -575,7 +577,7 @@ public class ResolverImpl implements Res
                     {
                         m_logger.log(
                             Logger.LOG_ERROR,
-                            "Resolver: Update error - " + Util.getBundleName(localResource.getBundle()),
+                            "Resolver: Update error - " + getBundleName(localResource.getBundle()),
                             ex);
                         return;
                     }
@@ -767,4 +769,13 @@ public class ResolverImpl implements Res
         }
         return null;
     }
+
+    public static String getBundleName(Bundle bundle)
+    {
+        String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+        return (name == null)
+            ? "Bundle " + Long.toString(bundle.getBundleId())
+            : name;
+    }
+
 }
\ No newline at end of file

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java Fri Mar 19 15:32:17 2010
@@ -19,40 +19,28 @@
 package org.apache.felix.bundlerepository.impl;
 
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.*;
 
 import org.apache.felix.bundlerepository.Capability;
+import org.apache.felix.bundlerepository.Property;
 import org.apache.felix.bundlerepository.Repository;
 import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.version.VersionTable;
 import org.osgi.framework.Version;
 
 public class ResourceImpl implements Resource
 {
 
     private final Map m_map = new HashMap();
+    private final List m_capList = new ArrayList();
+    private final List m_reqList = new ArrayList();
     private Repository m_repo;
-    private List m_capList = new ArrayList();
-    private List m_reqList = new ArrayList();
-
     private Map m_uris;
-
-    private int m_hash;
+    private transient int m_hash;
 
     public ResourceImpl()
     {
-        this(null);
-    }
-
-    public ResourceImpl(ResourceImpl resource)
-    {
-        if (resource != null)
-        {
-            m_map.putAll(resource.getProperties());
-            m_capList.addAll(resource.m_capList);
-            m_reqList.addAll(resource.m_reqList);
-        }
     }
 
     public boolean equals(Object o)
@@ -85,11 +73,13 @@ public class ResourceImpl implements Res
         return m_hash;
     }
 
-    public Repository getRepository() {
+    public Repository getRepository()
+    {
         return m_repo;
     }
 
-    public void setRepository(Repository repository) {
+    public void setRepository(Repository repository)
+    {
         this.m_repo = repository;
     }
 
@@ -127,12 +117,17 @@ public class ResourceImpl implements Res
         return (String) m_map.get(Resource.URI);
     }
 
+    public Long getSize()
+    {
+        return ((Long) m_map.get(Resource.SIZE));
+    }
+
     public Requirement[] getRequirements()
     {
         return (Requirement[]) m_reqList.toArray(new Requirement[m_reqList.size()]);
     }
 
-    protected void addRequire(Requirement req)
+    public void addRequire(Requirement req)
     {
         m_reqList.add(req);
     }
@@ -142,7 +137,7 @@ public class ResourceImpl implements Res
         return (Capability[]) m_capList.toArray(new Capability[m_capList.size()]);
     }
 
-    protected void addCapability(Capability cap)
+    public void addCapability(Capability cap)
     {
         m_capList.add(cap);
     }
@@ -157,7 +152,7 @@ public class ResourceImpl implements Res
         return (String[]) catList.toArray(new String[catList.size()]);
     }
 
-    protected void addCategory(CategoryImpl cat)
+    public void addCategory(String category)
     {
         List catList = (List) m_map.get(CATEGORY);
         if (catList == null)
@@ -165,7 +160,7 @@ public class ResourceImpl implements Res
             catList = new ArrayList();
             m_map.put(CATEGORY, catList);
         }
-        catList.add(cat.getId());
+        catList.add(category);
     }
 
     public boolean isLocal()
@@ -175,18 +170,18 @@ public class ResourceImpl implements Res
 
     /**
      * Default setter method when setting parsed data from the XML file. 
-    **/
-    protected Object put(Object key, Object value)
+     **/
+    public Object put(Object key, Object value)
     {
         put(key.toString(), value.toString(), null);
         return null;
     }
 
-    protected void put(String key, String value, String type)
+    public void put(String key, String value, String type)
     {
         key = key.toLowerCase();
         m_hash = 0;
-        if ("uri".equals(type) || URI.equals(key))
+        if (Property.URI.equals(type) || URI.equals(key))
         {
             if (m_uris == null)
             {
@@ -194,17 +189,23 @@ public class ResourceImpl implements Res
             }
             m_uris.put(key, value);
         }
-        else if ("version".equals(type) || VERSION.equals(key))
+        else if (Property.VERSION.equals(type) || VERSION.equals(key))
         {
-            m_map.put(key, Version.parseVersion(value));
+            m_map.put(key, VersionTable.getVersion(value));
         }
-        else if ("long".equals(type) || SIZE.equals(key))
+        else if (Property.LONG.equals(type) || SIZE.equals(key))
         {
-            m_map.put(key, Long.valueOf(value.toString()));
+            m_map.put(key, Long.valueOf(value));
         }
-        else if (CATEGORY.equals(key))
+        else if (Property.SET.equals(type) || CATEGORY.equals(key))
         {
-            m_map.put(key, Arrays.asList(value.toString().split(",")));
+            StringTokenizer st = new StringTokenizer(value, ",");
+            Set s = new HashSet();
+            while (st.hasMoreTokens())
+            {
+                s.add(st.nextToken().trim());
+            }
+            m_map.put(key, s);
         }
         else
         {

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java Fri Mar 19 15:32:17 2010
@@ -19,6 +19,7 @@
 package org.apache.felix.bundlerepository.impl;
 
 import java.io.InputStream;
+import java.io.Reader;
 import javax.xml.stream.Location;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
@@ -26,25 +27,33 @@ import javax.xml.stream.XMLStreamExcepti
 import javax.xml.stream.XMLStreamReader;
 
 /**
- * Repository XML parser based on StaX 
+ * Repository XML xml based on StaX
  */
-public class StaxParser implements RepositoryImpl.RepositoryParser
+public class StaxParser extends RepositoryParser
 {
 
     static XMLInputFactory factory;
 
-    public StaxParser()
+    public static synchronized void setFactory(XMLInputFactory factory)
     {
-        synchronized (StaxParser.class)
+        StaxParser.factory = factory;
+    }
+
+    public static synchronized XMLInputFactory getFactory()
+    {
+        if (factory == null)
         {
-            if (factory == null)
-            {
-                factory = XMLInputFactory.newInstance();
-                setProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, false);
-                setProperty(factory, XMLInputFactory.IS_VALIDATING, false);
-                setProperty(factory, XMLInputFactory.IS_COALESCING, false);
-            }
+            XMLInputFactory factory = XMLInputFactory.newInstance();
+            setProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, false);
+            setProperty(factory, XMLInputFactory.IS_VALIDATING, false);
+            setProperty(factory, XMLInputFactory.IS_COALESCING, false);
+            StaxParser.factory = factory;
         }
+        return factory;
+    }
+
+    public StaxParser()
+    {
     }
 
     protected static boolean setProperty(XMLInputFactory factory, String name, boolean value)
@@ -60,54 +69,110 @@ public class StaxParser implements Repos
         return false;
     }
 
-    public void parse(RepositoryImpl repository, InputStream is) throws Exception
+    public RepositoryImpl parseRepository(InputStream is) throws Exception
     {
-        XMLStreamReader reader = factory.createXMLStreamReader(is);
-        try
+        XMLStreamReader reader = getFactory().createXMLStreamReader(is);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !REPOSITORY.equals(reader.getLocalName()))
         {
-            int event = reader.nextTag();
-            if (event != XMLStreamConstants.START_ELEMENT || !REPOSITORY.equals(reader.getLocalName()))
-            {
-                throw new Exception("Expected element 'repository' at the root of the document");
-            }
-            for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++)
+            throw new Exception("Expected element 'repository' at the root of the document");
+        }
+        return parseRepository(reader);
+    }
+
+    public RepositoryImpl parseRepository(Reader r) throws Exception
+    {
+        XMLStreamReader reader = getFactory().createXMLStreamReader(r);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !REPOSITORY.equals(reader.getLocalName()))
+        {
+            throw new Exception("Expected element 'repository' at the root of the document");
+        }
+        return parseRepository(reader);
+    }
+
+    public ResourceImpl parseResource(Reader r) throws Exception
+    {
+        XMLStreamReader reader = getFactory().createXMLStreamReader(r);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !RESOURCE.equals(reader.getLocalName()))
+        {
+            throw new Exception("Expected element 'resource'");
+        }
+        return parseResource(reader);
+    }
+
+    public CapabilityImpl parseCapability(Reader r) throws Exception
+    {
+        XMLStreamReader reader = getFactory().createXMLStreamReader(r);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !CAPABILITY.equals(reader.getLocalName()))
+        {
+            throw new Exception("Expected element 'capability'");
+        }
+        return parseCapability(reader);
+    }
+
+    public PropertyImpl parseProperty(Reader r) throws Exception
+    {
+        XMLStreamReader reader = getFactory().createXMLStreamReader(r);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !P.equals(reader.getLocalName()))
+        {
+            throw new Exception("Expected element 'p'");
+        }
+        return parseProperty(reader);
+    }
+
+    public RequirementImpl parseRequirement(Reader r) throws Exception 
+    {
+        XMLStreamReader reader = getFactory().createXMLStreamReader(r);
+        int event = reader.nextTag();
+        if (event != XMLStreamConstants.START_ELEMENT || !REQUIRE.equals(reader.getLocalName()))
+        {
+            throw new Exception("Expected element 'require'");
+        }
+        return parseRequire(reader);
+    }
+
+    public RepositoryImpl parseRepository(XMLStreamReader reader) throws Exception
+    {
+        RepositoryImpl repository = new RepositoryImpl();
+        for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++)
+        {
+            String name = reader.getAttributeLocalName(i);
+            String value = reader.getAttributeValue(i);
+            if (NAME.equals(name))
             {
-                String name = reader.getAttributeLocalName(i);
-                String value = reader.getAttributeValue(i);
-                if (NAME.equals(name))
-                {
-                    repository.setName(value);
-                }
-                else if (LASTMODIFIED.equals(name))
-                {
-                    repository.setLastmodified(value);
-                }
+                repository.setName(value);
             }
-            while ((event = reader.nextTag()) == XMLStreamConstants.START_ELEMENT)
+            else if (LASTMODIFIED.equals(name))
             {
-                String element = reader.getLocalName();
-                if (REFERRAL.equals(element))
-                {
-                    Referral referral = parseReferral(reader);
-                    repository.addReferral(referral);
-                }
-                else if (RESOURCE.equals(element))
-                {
-                    ResourceImpl resource = parseResource(reader);
-                    repository.addResource(resource);
-                }
-                else
-                {
-                    ignoreTag(reader);
-                }
+                repository.setLastModified(value);
             }
-            // Sanity check
-            sanityCheckEndElement(reader, event, REPOSITORY);
         }
-        finally
+        int event;
+        while ((event = reader.nextTag()) == XMLStreamConstants.START_ELEMENT)
         {
-            reader.close();
+            String element = reader.getLocalName();
+            if (REFERRAL.equals(element))
+            {
+                Referral referral = parseReferral(reader);
+                repository.addReferral(referral);
+            }
+            else if (RESOURCE.equals(element))
+            {
+                ResourceImpl resource = parseResource(reader);
+                repository.addResource(resource);
+            }
+            else
+            {
+                ignoreTag(reader);
+            }
         }
+        // Sanity check
+        sanityCheckEndElement(reader, event, REPOSITORY);
+        return repository;
     }
 
     private void sanityCheckEndElement(XMLStreamReader reader, int event, String element)
@@ -153,7 +218,7 @@ public class StaxParser implements Repos
                 String element = reader.getLocalName();
                 if (CATEGORY.equals(element))
                 {
-                    CategoryImpl category = parseCategory(reader);
+                    String category = parseCategory(reader);
                     resource.addCategory(category);
                 }
                 else if (CAPABILITY.equals(element))
@@ -211,18 +276,18 @@ public class StaxParser implements Repos
         }
     }
 
-    private CategoryImpl parseCategory(XMLStreamReader reader) throws XMLStreamException
+    private String parseCategory(XMLStreamReader reader) throws XMLStreamException
     {
-        CategoryImpl category = new CategoryImpl();
+        String id = null;
         for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++)
         {
             if (ID.equals(reader.getAttributeLocalName(i)))
             {
-                category.setId(reader.getAttributeValue(i));
+                id = reader.getAttributeValue(i);
             }
         }
         sanityCheckEndElement(reader, reader.nextTag(), CATEGORY);
-        return category;
+        return id;
     }
 
     private CapabilityImpl parseCapability(XMLStreamReader reader) throws Exception
@@ -244,7 +309,7 @@ public class StaxParser implements Repos
             if (P.equals(element))
             {
                 PropertyImpl prop = parseProperty(reader);
-                capability.addP(prop);
+                capability.addProperty(prop);
             }
             else
             {
@@ -299,15 +364,15 @@ public class StaxParser implements Repos
             }
             else if (EXTEND.equals(name))
             {
-                requirement.setExtend(value);
+                requirement.setExtend(Boolean.parseBoolean(value));
             }
             else if (MULTIPLE.equals(name))
             {
-                requirement.setMultiple(value);
+                requirement.setMultiple(Boolean.parseBoolean(value));
             }
             else if (OPTIONAL.equals(name))
             {
-                requirement.setOptional(value);
+                requirement.setOptional(Boolean.parseBoolean(value));
             }
         }
         int event;

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SystemRepositoryImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SystemRepositoryImpl.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SystemRepositoryImpl.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SystemRepositoryImpl.java Fri Mar 19 15:32:17 2010
@@ -19,6 +19,7 @@
 package org.apache.felix.bundlerepository.impl;
 
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.log.Logger;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.apache.felix.bundlerepository.Repository;

Added: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/XmlWriter.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/XmlWriter.java?rev=925279&view=auto
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/XmlWriter.java (added)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/XmlWriter.java Fri Mar 19 15:32:17 2010
@@ -0,0 +1,145 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class XmlWriter
+{
+    private final Writer w;
+    private final List elements = new ArrayList();
+    private boolean empty;
+    private boolean endAttr = true;
+    private boolean indent;
+
+    public XmlWriter(Writer w)
+    {
+        this(w, true);
+    }
+
+    public XmlWriter(Writer w, boolean indent)
+    {
+        this.w = w;
+        this.indent = indent;
+    }
+
+    public XmlWriter indent(int nb) throws IOException
+    {
+        if (indent)
+        {
+            while (nb-- > 0)
+            {
+                w.append("  ");
+            }
+        }
+        return this;
+    }
+
+    public XmlWriter newLine() throws IOException
+    {
+        if (indent)
+        {
+            w.append("\n");
+        }
+        return this;
+    }
+
+    public XmlWriter element(String name) throws IOException
+    {
+        if (!endAttr)
+        {
+            endAttr = true;
+            w.append(">");
+        }
+        if (!elements.isEmpty())
+        {
+            newLine();
+            indent(elements.size());
+        }
+        w.append("<").append(name);
+        elements.add(name);
+        empty = true;
+        endAttr = false;
+        return this;
+    }
+
+    public XmlWriter attribute(String name, Object value) throws IOException
+    {
+        if (value != null)
+        {
+            w.append(" ").append(name).append("='").append(encode(value.toString())).append("'");
+        }
+        return this;
+    }
+
+    public XmlWriter end() throws IOException
+    {
+        return end(true);
+    }
+
+    public XmlWriter end(boolean indent) throws IOException
+    {
+        String name = (String) elements.remove(elements.size() - 1);
+        if (!endAttr)
+        {
+            endAttr = true;
+            w.append("/>");
+        }
+        else
+        {
+            if (indent && !empty)
+            {
+                newLine();
+                indent(elements.size());
+            }
+            w.append("</").append(name).append(">");
+        }
+        empty = false;
+        return this;
+    }
+
+    public XmlWriter text(Object value) throws IOException
+    {
+        if (!endAttr)
+        {
+            endAttr = true;
+            w.append(">");
+        }
+        w.append(encode(value.toString()));
+        return this;
+    }
+
+    public XmlWriter textElement(String name, Object value) throws IOException
+    {
+        if (value != null)
+        {
+            element(name).text(value).end(false);
+        }
+        return this;
+    }
+
+    private static String encode(Object o) {
+        String s = o != null ? o.toString() : "";
+        return s.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
+    }
+
+}

Modified: felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/wrapper/CapabilityWrapper.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/wrapper/CapabilityWrapper.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/wrapper/CapabilityWrapper.java (original)
+++ felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/wrapper/CapabilityWrapper.java Fri Mar 19 15:32:17 2010
@@ -36,6 +36,6 @@ public class CapabilityWrapper implement
     }
 
     public Map getProperties() {
-        return capability.getProperties();
+        return capability.getPropertiesAsMap();
     }
 }

Added: felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java?rev=925279&view=auto
==============================================================================
--- felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java (added)
+++ felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java Fri Mar 19 15:32:17 2010
@@ -0,0 +1,55 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.util.jar.Attributes;
+
+import junit.framework.TestCase;
+import org.apache.felix.bundlerepository.DataModelHelper;
+import org.apache.felix.bundlerepository.Resource;
+
+public class DataModelHelperTest extends TestCase
+{
+
+    private DataModelHelper dmh = new DataModelHelperImpl();
+
+    public void testResource() throws Exception
+    {
+        Attributes attr = new Attributes();
+        attr.putValue("Manifest-Version", "1.0");
+        attr.putValue("Bundle-Name", "Apache Felix Utils");
+        attr.putValue("Bundle-Version", "0.1.0.SNAPSHOT");
+        attr.putValue("Bundle-ManifestVersion", "2");
+        attr.putValue("Bundle-License", "http://www.apache.org/licenses/LICENSE-2.0.txt");
+        attr.putValue("Bundle-Description", "Utility classes for OSGi.");
+        attr.putValue("Import-Package", "org.osgi.framework;version=\"[1.4,2)\"");
+        attr.putValue("Bundle-SymbolicName", "org.apache.felix.utils");
+
+        Resource resource = dmh.createResource(attr);
+
+        String xml = dmh.writeResource(resource);
+        System.out.println(xml);
+
+        Resource resource2 = dmh.readResource(xml);
+        String xml2 = dmh.writeResource(resource2);
+        System.out.println(xml2);
+
+        assertEquals(xml, xml2);
+    }
+}

Modified: felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryAdminTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryAdminTest.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryAdminTest.java (original)
+++ felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryAdminTest.java Fri Mar 19 15:32:17 2010
@@ -23,6 +23,8 @@ import java.util.Hashtable;
 
 import junit.framework.TestCase;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.filter.FilterImpl;
+import org.apache.felix.utils.log.Logger;
 import org.easymock.Capture;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
@@ -55,6 +57,7 @@ public class RepositoryAdminTest extends
         BundleContext bundleContext = (BundleContext) EasyMock.createMock(BundleContext.class);
         Bundle systemBundle = (Bundle) EasyMock.createMock(Bundle.class);
 
+        Activator.setContext(bundleContext);
         EasyMock.expect(bundleContext.getProperty((String) EasyMock.anyObject())).andReturn(null).anyTimes();
         EasyMock.expect(bundleContext.getBundle(0)).andReturn(systemBundle);
         EasyMock.expect(systemBundle.getHeaders()).andReturn(new Hashtable());

Modified: felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryImplTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryImplTest.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryImplTest.java (original)
+++ felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/RepositoryImplTest.java Fri Mar 19 15:32:17 2010
@@ -25,6 +25,7 @@ import java.util.Hashtable;
 import junit.framework.TestCase;
 import org.apache.felix.bundlerepository.Repository;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.log.Logger;
 import org.easymock.EasyMock;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -94,6 +95,7 @@ public class RepositoryImplTest extends 
         BundleContext bundleContext = (BundleContext) EasyMock.createMock(BundleContext.class);
         Bundle systemBundle = (Bundle) EasyMock.createMock(Bundle.class);
 
+        Activator.setContext(bundleContext);
         EasyMock.expect(bundleContext.getProperty((String) EasyMock.anyObject())).andReturn(null).anyTimes();
         EasyMock.expect(bundleContext.getBundle(0)).andReturn(systemBundle);
         EasyMock.expect(systemBundle.getHeaders()).andReturn(new Hashtable());

Modified: felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java (original)
+++ felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java Fri Mar 19 15:32:17 2010
@@ -25,6 +25,8 @@ import junit.framework.TestCase;
 
 import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.filter.FilterImpl;
+import org.apache.felix.utils.log.Logger;
 import org.easymock.Capture;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
@@ -61,7 +63,7 @@ public class ResolverImplTest extends Te
         repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml"));
 
         Resource[] res = repoAdmin.discoverResources(
-            new Requirement[] { repoAdmin.requirement(
+            new Requirement[] { repoAdmin.getHelper().requirement(
                 "package", "(package=org.apache.felix.test.osgi)") });
         assertNotNull(res);
         assertEquals(1, res.length);
@@ -73,7 +75,7 @@ public class ResolverImplTest extends Te
         repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml"));
 
         Resolver resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("package", "(package=org.apache.felix.test.osgi)"));
+        resolver.add(repoAdmin.getHelper().requirement("package", "(package=org.apache.felix.test.osgi)"));
         assertTrue(resolver.resolve());
     }
 
@@ -83,7 +85,7 @@ public class ResolverImplTest extends Te
         repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml"));
 
         Resolver resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("package", "(package=org.apache.felix.test.osgi)"));
+        resolver.add(repoAdmin.getHelper().requirement("package", "(package=org.apache.felix.test.osgi)"));
 
         Thread.currentThread().interrupt();
         try
@@ -103,7 +105,7 @@ public class ResolverImplTest extends Te
         repoAdmin.addRepository(getClass().getResource("/repo_for_optional_resources.xml"));
 
         Resolver resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("bundle", "(symbolicname=res1)"));
+        resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res1)"));
 
         assertTrue(resolver.resolve());
         assertEquals(1, resolver.getRequiredResources().length);
@@ -116,15 +118,15 @@ public class ResolverImplTest extends Te
         repoAdmin.addRepository(getClass().getResource("/repo_for_mandatory.xml"));
 
         Resolver resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("bundle", "(symbolicname=res2)"));
+        resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res2)"));
         assertFalse(resolver.resolve());
 
         resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("bundle", "(symbolicname=res3)"));
+        resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res3)"));
         assertTrue(resolver.resolve());
 
         resolver = repoAdmin.resolver();
-        resolver.add(repoAdmin.requirement("bundle", "(symbolicname=res4)"));
+        resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res4)"));
         assertFalse(resolver.resolve());
 
     }
@@ -139,6 +141,7 @@ public class ResolverImplTest extends Te
         BundleContext bundleContext = (BundleContext) EasyMock.createMock(BundleContext.class);
         Bundle systemBundle = (Bundle) EasyMock.createMock(Bundle.class);
 
+        Activator.setContext(bundleContext);
         EasyMock.expect(bundleContext.getProperty(RepositoryAdminImpl.REPOSITORY_URL_PROP))
                     .andReturn(getClass().getResource("/referred.xml").toExternalForm());
         EasyMock.expect(bundleContext.getProperty((String) EasyMock.anyObject())).andReturn(null).anyTimes();

Modified: felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/StaxParserTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/StaxParserTest.java?rev=925279&r1=925278&r2=925279&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/StaxParserTest.java (original)
+++ felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/StaxParserTest.java Fri Mar 19 15:32:17 2010
@@ -18,13 +18,16 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
-import java.io.File;
 import java.net.URL;
 import java.util.Hashtable;
 
 import junit.framework.TestCase;
+import org.apache.felix.bundlerepository.impl.PullParser;
 import org.apache.felix.bundlerepository.Resolver;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.bundlerepository.impl.StaxParser;
+import org.apache.felix.utils.filter.FilterImpl;
+import org.apache.felix.utils.log.Logger;
 import org.easymock.Capture;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
@@ -80,7 +83,7 @@ public class StaxParserTest extends Test
     {
         long t0, t1;
 
-        StaxParser.factory = null;
+        StaxParser.setFactory(null);
         System.setProperty("javax.xml.stream.XMLInputFactory", "com.ctc.wstx.stax.WstxInputFactory");
         for (int i = 0; i < nbWarm; i++)
         {
@@ -97,7 +100,7 @@ public class StaxParserTest extends Test
         System.err.println("Woodstox: " + (t1 - t0) + " ms");
 
 
-        StaxParser.factory = null;
+        StaxParser.setFactory(null);
         System.setProperty("javax.xml.stream.XMLInputFactory", "com.sun.xml.internal.stream.XMLInputFactoryImpl");
         for (int i = 0; i < nbWarm; i++)
         {
@@ -138,9 +141,10 @@ public class StaxParserTest extends Test
         BundleContext bundleContext = (BundleContext) EasyMock.createMock(BundleContext.class);
         Bundle systemBundle = (Bundle) EasyMock.createMock(Bundle.class);
 
+        Activator.setContext(bundleContext);
         EasyMock.expect(bundleContext.getProperty(RepositoryAdminImpl.REPOSITORY_URL_PROP))
                     .andReturn(getClass().getResource("/referral1_repository.xml").toExternalForm());
-        EasyMock.expect(bundleContext.getProperty(RepositoryImpl.OBR_PARSER_CLASS))
+        EasyMock.expect(bundleContext.getProperty(RepositoryParser.OBR_PARSER_CLASS))
                     .andReturn(repositoryParser.getName());
         EasyMock.expect(bundleContext.getProperty((String) EasyMock.anyObject())).andReturn(null).anyTimes();
         EasyMock.expect(bundleContext.getBundle(0)).andReturn(systemBundle);