]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.repo/src/org/argeo/slc/repo/osgi/UriWrapper.java
Merge remote-tracking branch 'origin/master' into testing
[gpl/argeo-slc.git] / org.argeo.slc.repo / src / org / argeo / slc / repo / osgi / UriWrapper.java
1 package org.argeo.slc.repo.osgi;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.InputStream;
6 import java.util.List;
7 import java.util.zip.ZipOutputStream;
8
9 import javax.jcr.Node;
10 import javax.jcr.Property;
11 import javax.jcr.Session;
12
13 import org.apache.commons.io.IOUtils;
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.jcr.JcrUtils;
17 import org.argeo.slc.DefaultNameVersion;
18 import org.argeo.slc.SlcException;
19 import org.argeo.slc.repo.OsgiFactory;
20 import org.argeo.slc.repo.RepoUtils;
21 import org.eclipse.aether.artifact.Artifact;
22 import org.eclipse.aether.artifact.DefaultArtifact;
23
24 import aQute.bnd.osgi.Jar;
25
26 public class UriWrapper extends BndWrapper implements Runnable {
27 private final static Log log = LogFactory.getLog(UriWrapper.class);
28
29 private String uri;
30 private String baseUri;
31 private String versionSeparator = "-";
32 private String extension = "jar";
33
34 private OsgiFactory osgiFactory;
35
36 private SourcesProvider sourcesProvider;
37
38 public UriWrapper() {
39 setFactory(this);
40 }
41
42 public void run() {
43 Session distSession = null;
44 Session javaSession = null;
45 InputStream in = null;
46 ByteArrayOutputStream out = null;
47 Jar jar = null;
48 try {
49 distSession = osgiFactory.openDistSession();
50 javaSession = osgiFactory.openJavaSession();
51 String uri = getEffectiveUri();
52 // if (uri == null) {
53 // uri = baseUri + '/' + getName() + versionSeparator + getVersion() + "." + extension;
54 // }
55 Node sourceArtifact = osgiFactory.getDist(distSession, uri);
56
57 // TODO factorize with Maven
58 in = sourceArtifact.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary().getStream();
59 out = new ByteArrayOutputStream();
60 wrapJar(in, out);
61 Node newJarNode = RepoUtils.copyBytesAsArtifact(javaSession.getRootNode(), getArtifact(),
62 out.toByteArray());
63 osgiFactory.indexNode(newJarNode);
64 newJarNode.getSession().save();
65 if (log.isDebugEnabled())
66 log.debug("Wrapped " + uri + " to " + newJarNode.getPath());
67
68 // sources
69 if (sourcesProvider != null) {
70 IOUtils.closeQuietly(in);
71 in = new ByteArrayInputStream(out.toByteArray());
72 jar = new Jar(null, in);
73 List<String> packages = jar.getPackages();
74
75 IOUtils.closeQuietly(out);
76 out = new ByteArrayOutputStream();
77 sourcesProvider.writeSources(packages, new ZipOutputStream(out));
78
79 IOUtils.closeQuietly(in);
80 in = new ByteArrayInputStream(out.toByteArray());
81 byte[] sourcesJar = RepoUtils.packageAsPdeSource(in, new DefaultNameVersion(this));
82 Artifact sourcesArtifact = new DefaultArtifact(getArtifact().getGroupId(),
83 getArtifact().getArtifactId() + ".source", "jar", getArtifact().getVersion());
84 Node sourcesJarNode = RepoUtils.copyBytesAsArtifact(javaSession.getRootNode(), sourcesArtifact,
85 sourcesJar);
86 sourcesJarNode.getSession().save();
87
88 if (log.isDebugEnabled())
89 log.debug("Added sources " + sourcesArtifact + " for bundle " + getArtifact());
90 }
91 } catch (Exception e) {
92 throw new SlcException("Cannot wrap URI " + uri, e);
93 } finally {
94 IOUtils.closeQuietly(in);
95 IOUtils.closeQuietly(out);
96 JcrUtils.logoutQuietly(distSession);
97 JcrUtils.logoutQuietly(javaSession);
98 if (jar != null)
99 jar.close();
100 }
101 }
102
103 public void setUri(String sourceCoords) {
104 this.uri = sourceCoords;
105 }
106
107 public String getEffectiveUri() {
108 if (uri == null) {
109 return baseUri + '/' + getName() + versionSeparator + getVersion() + "." + extension;
110 } else
111 return uri;
112 }
113
114 public void setOsgiFactory(OsgiFactory osgiFactory) {
115 this.osgiFactory = osgiFactory;
116 }
117
118 public void setBaseUri(String baseUri) {
119 this.baseUri = baseUri;
120 }
121
122 public void setVersionSeparator(String versionSeparator) {
123 this.versionSeparator = versionSeparator;
124 }
125
126 public void setSourcesProvider(SourcesProvider sourcesProvider) {
127 this.sourcesProvider = sourcesProvider;
128 }
129
130 public String getUri() {
131 return uri;
132 }
133
134 public String getBaseUri() {
135 return baseUri;
136 }
137
138 public String getVersionSeparator() {
139 return versionSeparator;
140 }
141
142 }