]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveSourcesProvider.java
73a8cd7aeaa9f9ad677445492b1eba9434c70029
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / osgi / ArchiveSourcesProvider.java
1 package org.argeo.slc.repo.osgi;
2
3 import java.util.List;
4 import java.util.Set;
5 import java.util.TreeSet;
6 import java.util.jar.JarEntry;
7 import java.util.zip.ZipEntry;
8 import java.util.zip.ZipInputStream;
9 import java.util.zip.ZipOutputStream;
10
11 import javax.jcr.Node;
12 import javax.jcr.Property;
13 import javax.jcr.Session;
14
15 import org.apache.commons.io.FilenameUtils;
16 import org.apache.commons.io.IOUtils;
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19 import org.argeo.jcr.JcrUtils;
20 import org.argeo.slc.SlcException;
21 import org.argeo.slc.repo.OsgiFactory;
22
23 public class ArchiveSourcesProvider implements SourcesProvider {
24 private final static Log log = LogFactory
25 .getLog(ArchiveSourcesProvider.class);
26
27 private OsgiFactory osgiFactory;
28 private String uri;
29 private String base;
30
31 @Override
32 public void writeSources(List<String> packages, ZipOutputStream zout) {
33 Session distSession = null;
34 ZipInputStream zin = null;
35 try {
36 distSession = osgiFactory.openDistSession();
37
38 if (log.isDebugEnabled())
39 log.debug("Wrapping " + uri);
40
41 Node distNode = osgiFactory.getDist(distSession, uri);
42 zin = new ZipInputStream(distNode.getNode(Node.JCR_CONTENT)
43 .getProperty(Property.JCR_DATA).getBinary().getStream());
44
45 // prepare
46 Set<String> directories = new TreeSet<String>();
47 for (String pkg : packages)
48 if (!pkg.equals("META-INF"))
49 directories.add(base + pkg.replace('.', '/') + '/');
50
51 ZipEntry zentry = null;
52 entries: while ((zentry = zin.getNextEntry()) != null) {
53 String name = zentry.getName();
54 if (!name.startsWith(base))
55 continue entries;
56
57 String dirPath = FilenameUtils.getPath(name);
58 if (name.equals(dirPath))// directory
59 continue entries;
60
61 if (directories.contains(dirPath)) {
62 String path = name.substring(base.length());
63 zout.putNextEntry(new JarEntry(path));
64 IOUtils.copy(zin, zout);
65 zin.closeEntry();
66 zout.closeEntry();
67 continue entries;
68 }
69 }
70 } catch (Exception e) {
71 throw new SlcException("Cannot retrieve sources from " + uri, e);
72 } finally {
73 IOUtils.closeQuietly(zin);
74 JcrUtils.logoutQuietly(distSession);
75 }
76
77 }
78
79 public void setOsgiFactory(OsgiFactory osgiFactory) {
80 this.osgiFactory = osgiFactory;
81 }
82
83 public void setUri(String uri) {
84 this.uri = uri;
85 }
86
87 public void setBase(String base) {
88 this.base = base;
89 }
90
91 }