View Javadoc
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  }