]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiFactoryImpl.java
3381eb892cade33a7e61b666619874e50720d143
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / osgi / OsgiFactoryImpl.java
1 package org.argeo.slc.repo.osgi;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.MalformedURLException;
6 import java.net.URL;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import javax.jcr.Node;
11 import javax.jcr.Repository;
12 import javax.jcr.RepositoryException;
13 import javax.jcr.Session;
14
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
17 import org.argeo.jcr.JcrUtils;
18 import org.argeo.slc.SlcConstants;
19 import org.argeo.slc.SlcException;
20 import org.argeo.slc.jcr.SlcNames;
21 import org.argeo.slc.jcr.SlcTypes;
22 import org.argeo.slc.repo.NodeIndexer;
23 import org.argeo.slc.repo.OsgiFactory;
24
25 public class OsgiFactoryImpl implements OsgiFactory {
26 private final static Log log = LogFactory.getLog(OsgiFactoryImpl.class);
27
28 private String workspace;
29 private Repository distRepository;
30 private Repository javaRepository;
31
32 private List<NodeIndexer> nodeIndexers = new ArrayList<NodeIndexer>();
33
34 public void init() {
35 if (workspace == null)
36 throw new SlcException("A workspace must be specified");
37
38 Session javaSession = null;
39 Session distSession = null;
40 try {
41 javaSession = JcrUtils.loginOrCreateWorkspace(javaRepository,
42 workspace);
43 distSession = JcrUtils.loginOrCreateWorkspace(distRepository,
44 workspace);
45
46 // Privileges
47 JcrUtils.addPrivilege(javaSession, "/", SlcConstants.ROLE_SLC,
48 "jcr:all");
49 JcrUtils.addPrivilege(distSession, "/", SlcConstants.ROLE_SLC,
50 "jcr:all");
51 } catch (RepositoryException e) {
52 throw new SlcException("Cannot initialize OSGi Factory "
53 + workspace, e);
54 } finally {
55 JcrUtils.logoutQuietly(javaSession);
56 JcrUtils.logoutQuietly(distSession);
57 }
58 }
59
60 public void destroy() {
61
62 }
63
64 public Session openJavaSession() throws RepositoryException {
65 return javaRepository.login(workspace);
66 }
67
68 public Session openDistSession() throws RepositoryException {
69 return distRepository.login(workspace);
70 }
71
72 public void indexNode(Node node) {
73 for (NodeIndexer nodeIndexer : nodeIndexers) {
74 nodeIndexer.index(node);
75 }
76 }
77
78 public Node getDist(Session distSession, String uri)
79 throws RepositoryException {
80
81 String distPath = '/' + JcrUtils.urlAsPath(uri);
82
83 // TODO manage mirrors
84
85 if (!distSession.itemExists(distPath))
86 loadUrlToPath(uri, distSession, distPath);
87 Node distNode = distSession.getNode(distPath);
88 return distNode;
89 }
90
91 protected void loadUrlToPath(String url, Session distSession, String path)
92 throws RepositoryException {
93 if (log.isDebugEnabled())
94 log.debug("Downloading " + url + "...");
95
96 InputStream in = null;
97 Node folderNode = JcrUtils.mkfolders(distSession,
98 JcrUtils.parentPath(path));
99 try {
100 URL u = new URL(url);
101 in = u.openStream();
102 Node fileNode = JcrUtils.copyStreamAsFile(folderNode,
103 JcrUtils.nodeNameFromPath(path), in);
104 fileNode.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
105 Node origin = fileNode.addNode(SlcNames.SLC_ORIGIN,
106 SlcTypes.SLC_PROXIED);
107 JcrUtils.urlToAddressProperties(origin, url);
108 distSession.save();
109
110 } catch (MalformedURLException e) {
111 throw new SlcException("URL " + url + " not valid.", e);
112 } catch (IOException e) {
113 throw new SlcException("Cannot load " + url + " to " + path, e);
114 }
115
116 }
117
118 public void setWorkspace(String workspace) {
119 this.workspace = workspace;
120 }
121
122 public void setDistRepository(Repository distRepository) {
123 this.distRepository = distRepository;
124 }
125
126 public void setJavaRepository(Repository javaRepository) {
127 this.javaRepository = javaRepository;
128 }
129
130 public void setNodeIndexers(List<NodeIndexer> nodeIndexers) {
131 this.nodeIndexers = nodeIndexers;
132 }
133
134 }