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