You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2015/04/30 10:02:13 UTC
[2/4] karaf git commit: [KARAF-3712] Small improvements to the xml
repositories, add a method to serialise repositories as xml
[KARAF-3712] Small improvements to the xml repositories, add a method to serialise repositories as xml
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/9b65560a
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/9b65560a
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/9b65560a
Branch: refs/heads/master
Commit: 9b65560a9b4832bff2a09b3a932e6321488c95c8
Parents: 4cd9307
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Thu Apr 30 09:49:03 2015 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Thu Apr 30 09:50:17 2015 +0200
----------------------------------------------------------------------
.../internal/repository/StaxParser.java | 131 +++++++++++++++++--
.../features/internal/repository/UrlLoader.java | 2 +-
.../internal/repository/XmlRepository.java | 25 +++-
3 files changed, 139 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/9b65560a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
index fccdb58..a7e8622 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
@@ -17,6 +17,7 @@
package org.apache.karaf.features.internal.repository;
import java.io.InputStream;
+import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -24,14 +25,18 @@ import java.util.Map;
import javax.xml.stream.Location;
import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
import org.apache.felix.utils.version.VersionTable;
import org.apache.karaf.features.internal.resolver.CapabilityImpl;
import org.apache.karaf.features.internal.resolver.RequirementImpl;
import org.apache.karaf.features.internal.resolver.ResourceImpl;
import org.osgi.framework.Version;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import static javax.xml.stream.XMLStreamConstants.CHARACTERS;
@@ -59,21 +64,116 @@ public final class StaxParser {
public static final String VALUE = "value";
public static final String TYPE = "type";
- static XMLInputFactory factory;
+ public static final String REPOSITORY_NAMESPACE = "http://www.osgi.org/xmlns/repository/v1.0.0";
+
+ static XMLInputFactory inputFactory;
+ static XMLOutputFactory outputFactory;
private StaxParser() {
}
public static class Referral {
- String url;
- int depth = Integer.MAX_VALUE;
+ public String url;
+ public int depth = Integer.MAX_VALUE;
}
public static class XmlRepository {
- String name;
- long increment;
- List<Referral> referrals = new ArrayList<>();
- List<Resource> resources = new ArrayList<>();
+ public String name;
+ public long increment;
+ public List<Referral> referrals = new ArrayList<>();
+ public List<Resource> resources = new ArrayList<>();
+ }
+
+ public static void write(XmlRepository repository, OutputStreamWriter os) throws XMLStreamException {
+ XMLStreamWriter writer = getOutputFactory().createXMLStreamWriter(os);
+ writer.writeStartDocument();
+ writer.setDefaultNamespace(REPOSITORY_NAMESPACE);
+ // repository element
+ writer.writeStartElement(REPOSITORY_NAMESPACE, REPOSITORY);
+ writer.writeAttribute("xmlns", REPOSITORY_NAMESPACE);
+ writer.writeAttribute(REPO_NAME, repository.name);
+ writer.writeAttribute(INCREMENT, Long.toString(repository.increment));
+ // referrals
+ for (Referral referral : repository.referrals) {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, REFERRAL);
+ writer.writeAttribute(DEPTH, Integer.toString(referral.depth));
+ writer.writeAttribute(URL, referral.url);
+ writer.writeEndElement();
+ }
+ // resources
+ for (Resource resource : repository.resources) {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, RESOURCE);
+ for (Capability cap : resource.getCapabilities(null)) {
+ writeClause(writer, CAPABILITY, cap.getNamespace(), cap.getDirectives(), cap.getAttributes());
+ }
+ for (Requirement req : resource.getRequirements(null)) {
+ writeClause(writer, REQUIREMENT, req.getNamespace(), req.getDirectives(), req.getAttributes());
+ }
+ writer.writeEndElement();
+ }
+ writer.writeEndDocument();
+ writer.flush();
+ }
+
+ private static void writeClause(XMLStreamWriter writer, String element, String namespace, Map<String, String> directives, Map<String, Object> attributes) throws XMLStreamException {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, element);
+ writer.writeAttribute(NAMESPACE, namespace);
+ for (Map.Entry<String, String> dir : directives.entrySet()) {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, DIRECTIVE);
+ writer.writeAttribute(NAME, dir.getKey());
+ writer.writeAttribute(VALUE, dir.getValue());
+ writer.writeEndElement();
+ }
+ for (Map.Entry<String, Object> att : attributes.entrySet()) {
+ String key = att.getKey();
+ Object val = att.getValue();
+ writer.writeStartElement(REPOSITORY_NAMESPACE, DIRECTIVE);
+ writer.writeAttribute(NAME, key);
+ if (val instanceof Version) {
+ writer.writeAttribute(TYPE, "Version");
+ } else if (val instanceof Long) {
+ writer.writeAttribute(TYPE, "Long");
+ } else if (val instanceof Double) {
+ writer.writeAttribute(TYPE, "Double");
+ } else if (val instanceof Iterable) {
+ Iterable it = (Iterable) att.getValue();
+ String scalar = null;
+ for (Object o : it) {
+ String ts;
+ if (o instanceof String) {
+ ts = "String";
+ } else if (o instanceof Long) {
+ ts = "Long";
+ } else if (o instanceof Double) {
+ ts = "Double";
+ } else if (o instanceof Version) {
+ ts = "Version";
+ } else {
+ throw new IllegalArgumentException("Unsupported scalar type: " + o);
+ }
+ if (scalar == null) {
+ scalar = ts;
+ } else if (!scalar.equals(ts)) {
+ throw new IllegalArgumentException("Unconsistent list type for attribute " + key);
+ }
+ }
+ writer.writeAttribute(TYPE, "List<" + scalar + ">");
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (Object o : it) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(",");
+ }
+ sb.append(o.toString().replace(",", "\\,"));
+ }
+ val = sb.toString();
+ }
+ writer.writeAttribute(VALUE, val.toString());
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
}
public static XmlRepository parse(InputStream is) throws XMLStreamException {
@@ -81,7 +181,7 @@ public final class StaxParser {
}
public static XmlRepository parse(InputStream is, XmlRepository previous) throws XMLStreamException {
- XMLStreamReader reader = getFactory().createXMLStreamReader(is);
+ XMLStreamReader reader = getInputFactory().createXMLStreamReader(is);
int event = reader.nextTag();
if (event != START_ELEMENT || !REPOSITORY.equals(reader.getLocalName())) {
throw new IllegalStateException("Expected element 'repository' at the root of the document");
@@ -304,13 +404,20 @@ public final class StaxParser {
}
}
- private static synchronized XMLInputFactory getFactory() {
- if (StaxParser.factory == null) {
+ private static synchronized XMLInputFactory getInputFactory() {
+ if (StaxParser.inputFactory == null) {
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
- StaxParser.factory = factory;
+ StaxParser.inputFactory = factory;
+ }
+ return StaxParser.inputFactory;
+ }
+
+ private static synchronized XMLOutputFactory getOutputFactory() {
+ if (StaxParser.outputFactory == null) {
+ StaxParser.outputFactory = XMLOutputFactory.newInstance();
}
- return StaxParser.factory;
+ return StaxParser.outputFactory;
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/karaf/blob/9b65560a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
index 640837a..123451c 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
@@ -58,7 +58,7 @@ public abstract class UrlLoader {
}
}
long lm = connection.getLastModified();
- if (lm <= lastModified) {
+ if (lm > 0 && lm <= lastModified) {
return false;
}
try (
http://git-wip-us.apache.org/repos/asf/karaf/blob/9b65560a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
index 6661fb1..0cd3f9d 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
@@ -44,9 +44,9 @@ import static org.osgi.framework.namespace.IdentityNamespace.IDENTITY_NAMESPACE;
*/
public class XmlRepository extends BaseRepository {
- private final String url;
- private final Map<String, XmlLoader> loaders = new HashMap<String, XmlLoader>();
- private final ReadWriteLock lock = new ReentrantReadWriteLock();
+ final String url;
+ final Map<String, XmlLoader> loaders = new HashMap<String, XmlLoader>();
+ final ReadWriteLock lock = new ReentrantReadWriteLock();
public XmlRepository(String url) {
this.url = url;
@@ -64,6 +64,14 @@ public class XmlRepository extends BaseRepository {
return super.findProviders(requirements);
}
+ public String getUrl() {
+ return url;
+ }
+
+ protected Map<String, XmlLoader> getLoaders() {
+ return loaders;
+ }
+
@Override
protected void addResource(Resource resource) {
List<Capability> identities = resource.getCapabilities(IDENTITY_NAMESPACE);
@@ -140,12 +148,17 @@ public class XmlRepository extends BaseRepository {
return modified;
}
- static class XmlLoader extends UrlLoader {
+ protected static class XmlLoader extends UrlLoader {
- StaxParser.XmlRepository xml;
+ protected StaxParser.XmlRepository xml;
+
+ public XmlLoader(String url) {
+ super(url);
+ }
- XmlLoader(String url) {
+ public XmlLoader(String url, StaxParser.XmlRepository xml) {
super(url);
+ this.xml = xml;
}
@Override