1 package org
.argeo
.slc
.repo
.osgi
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.net
.MalformedURLException
;
7 import java
.util
.ArrayList
;
10 import javax
.jcr
.Node
;
11 import javax
.jcr
.Repository
;
12 import javax
.jcr
.RepositoryException
;
13 import javax
.jcr
.Session
;
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
;
25 public class OsgiFactoryImpl
implements OsgiFactory
{
26 private final static Log log
= LogFactory
.getLog(OsgiFactoryImpl
.class);
28 private String workspace
;
29 private Repository distRepository
;
30 private Repository javaRepository
;
32 private List
<NodeIndexer
> nodeIndexers
= new ArrayList
<NodeIndexer
>();
35 if (workspace
== null)
36 throw new SlcException("A workspace must be specified");
38 Session javaSession
= null;
39 Session distSession
= null;
41 javaSession
= JcrUtils
.loginOrCreateWorkspace(javaRepository
,
43 distSession
= JcrUtils
.loginOrCreateWorkspace(distRepository
,
47 JcrUtils
.addPrivilege(javaSession
, "/", SlcConstants
.ROLE_SLC
,
49 JcrUtils
.addPrivilege(distSession
, "/", SlcConstants
.ROLE_SLC
,
51 } catch (RepositoryException e
) {
52 throw new SlcException("Cannot initialize OSGi Factory "
55 JcrUtils
.logoutQuietly(javaSession
);
56 JcrUtils
.logoutQuietly(distSession
);
60 public void destroy() {
64 public Session
openJavaSession() throws RepositoryException
{
65 return javaRepository
.login(workspace
);
68 public Session
openDistSession() throws RepositoryException
{
69 return distRepository
.login(workspace
);
72 public void indexNode(Node node
) {
73 for (NodeIndexer nodeIndexer
: nodeIndexers
) {
74 nodeIndexer
.index(node
);
78 public Node
getDist(Session distSession
, String uri
)
79 throws RepositoryException
{
81 String distPath
= '/' + JcrUtils
.urlAsPath(uri
);
83 // TODO manage mirrors
85 if (!distSession
.itemExists(distPath
))
86 loadUrlToPath(uri
, distSession
, distPath
);
87 Node distNode
= distSession
.getNode(distPath
);
91 protected void loadUrlToPath(String url
, Session distSession
, String path
)
92 throws RepositoryException
{
93 if (log
.isDebugEnabled())
94 log
.debug("Downloading " + url
+ "...");
96 InputStream in
= null;
97 Node folderNode
= JcrUtils
.mkfolders(distSession
,
98 JcrUtils
.parentPath(path
));
100 URL u
= new URL(url
);
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
);
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
);
118 public void setWorkspace(String workspace
) {
119 this.workspace
= workspace
;
122 public void setDistRepository(Repository distRepository
) {
123 this.distRepository
= distRepository
;
126 public void setJavaRepository(Repository javaRepository
) {
127 this.javaRepository
= javaRepository
;
130 public void setNodeIndexers(List
<NodeIndexer
> nodeIndexers
) {
131 this.nodeIndexers
= nodeIndexers
;