1 package org
.argeo
.slc
.jcr
.execution
;
3 import java
.net
.InetAddress
;
4 import java
.net
.UnknownHostException
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.RepositoryException
;
10 import javax
.jcr
.Session
;
11 import javax
.jcr
.security
.Privilege
;
13 import org
.argeo
.jcr
.JcrUtils
;
14 import org
.argeo
.slc
.SlcConstants
;
15 import org
.argeo
.slc
.SlcException
;
16 import org
.argeo
.slc
.SlcNames
;
17 import org
.argeo
.slc
.SlcTypes
;
18 import org
.argeo
.slc
.runtime
.DefaultAgent
;
19 import org
.argeo
.slc
.execution
.ExecutionModulesManager
;
20 import org
.argeo
.slc
.execution
.ExecutionProcess
;
21 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
22 import org
.argeo
.slc
.runtime
.ProcessThread
;
24 /** SLC VM agent synchronizing with a JCR repository. */
25 public class JcrAgent
extends DefaultAgent
implements SlcNames
{
26 // final static String ROLE_REMOTE = "ROLE_REMOTE";
27 final static String NODE_REPO_URI
= "argeo.node.repo.uri";
29 private Repository repository
;
31 private String agentNodeName
= "default";
36 protected String
initAgentUuid() {
37 Session session
= null;
39 session
= repository
.login();
41 String agentFactoryPath
= getAgentFactoryPath();
42 Node vmAgentFactoryNode
= JcrUtils
.mkdirsSafe(session
, agentFactoryPath
, SlcTypes
.SLC_AGENT_FACTORY
);
43 JcrUtils
.addPrivilege(session
, SlcJcrConstants
.SLC_BASE_PATH
, SlcConstants
.ROLE_SLC
, Privilege
.JCR_ALL
);
44 if (!vmAgentFactoryNode
.hasNode(agentNodeName
)) {
45 String uuid
= UUID
.randomUUID().toString();
46 Node agentNode
= vmAgentFactoryNode
.addNode(agentNodeName
, SlcTypes
.SLC_AGENT
);
47 agentNode
.setProperty(SLC_UUID
, uuid
);
50 return vmAgentFactoryNode
.getNode(agentNodeName
).getProperty(SLC_UUID
).getString();
51 } catch (RepositoryException e
) {
52 JcrUtils
.discardQuietly(session
);
53 throw new SlcException("Cannot find JCR agent UUID", e
);
55 JcrUtils
.logoutQuietly(session
);
60 public void destroy() {
68 protected ProcessThread
createProcessThread(ThreadGroup processesThreadGroup
,
69 ExecutionModulesManager modulesManager
, ExecutionProcess process
) {
70 if (process
instanceof JcrExecutionProcess
)
71 return new JcrProcessThread(processesThreadGroup
, modulesManager
, (JcrExecutionProcess
) process
);
73 return super.createProcessThread(processesThreadGroup
, modulesManager
, process
);
79 public String
getNodePath() {
80 return getAgentFactoryPath() + '/' + getAgentNodeName();
83 public String
getAgentFactoryPath() {
85 Boolean isRemote
= System
.getProperty(NODE_REPO_URI
) != null;
86 String agentFactoryPath
;
88 InetAddress localhost
= InetAddress
.getLocalHost();
89 agentFactoryPath
= SlcJcrConstants
.AGENTS_BASE_PATH
+ "/" + localhost
.getCanonicalHostName();
91 if (agentFactoryPath
.equals(SlcJcrConstants
.VM_AGENT_FACTORY_PATH
))
92 throw new SlcException("Unsupported hostname " + localhost
.getCanonicalHostName());
94 agentFactoryPath
= SlcJcrConstants
.VM_AGENT_FACTORY_PATH
;
96 return agentFactoryPath
;
97 } catch (UnknownHostException e
) {
98 throw new SlcException("Cannot find agent factory base path", e
);
105 public String
getAgentNodeName() {
106 return agentNodeName
;
109 public void setRepository(Repository repository
) {
110 this.repository
= repository
;
113 public void setAgentNodeName(String agentNodeName
) {
114 this.agentNodeName
= agentNodeName
;