]> git.argeo.org Git - gpl/argeo-slc.git/blob - JcrAgent.java
7f776d1b164759d9b444add8f61165003b8292a3
[gpl/argeo-slc.git] / JcrAgent.java
1 package org.argeo.slc.jcr.execution;
2
3 import java.net.InetAddress;
4 import java.net.UnknownHostException;
5 import java.util.UUID;
6
7 import javax.jcr.Node;
8 import javax.jcr.Repository;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11 import javax.jcr.security.Privilege;
12
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;
23
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";
28
29 private Repository repository;
30
31 private String agentNodeName = "default";
32
33 /*
34 * LIFECYCLE
35 */
36 protected String initAgentUuid() {
37 Session session = null;
38 try {
39 session = repository.login();
40
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);
48 }
49 session.save();
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);
54 } finally {
55 JcrUtils.logoutQuietly(session);
56 }
57 }
58
59 @Override
60 public void destroy() {
61 super.destroy();
62 }
63
64 /*
65 * SLC AGENT
66 */
67 @Override
68 protected ProcessThread createProcessThread(ThreadGroup processesThreadGroup,
69 ExecutionModulesManager modulesManager, ExecutionProcess process) {
70 if (process instanceof JcrExecutionProcess)
71 return new JcrProcessThread(processesThreadGroup, modulesManager, (JcrExecutionProcess) process);
72 else
73 return super.createProcessThread(processesThreadGroup, modulesManager, process);
74 }
75
76 /*
77 * UTILITIES
78 */
79 public String getNodePath() {
80 return getAgentFactoryPath() + '/' + getAgentNodeName();
81 }
82
83 public String getAgentFactoryPath() {
84 try {
85 Boolean isRemote = System.getProperty(NODE_REPO_URI) != null;
86 String agentFactoryPath;
87 if (isRemote) {
88 InetAddress localhost = InetAddress.getLocalHost();
89 agentFactoryPath = SlcJcrConstants.AGENTS_BASE_PATH + "/" + localhost.getCanonicalHostName();
90
91 if (agentFactoryPath.equals(SlcJcrConstants.VM_AGENT_FACTORY_PATH))
92 throw new SlcException("Unsupported hostname " + localhost.getCanonicalHostName());
93 } else {// local
94 agentFactoryPath = SlcJcrConstants.VM_AGENT_FACTORY_PATH;
95 }
96 return agentFactoryPath;
97 } catch (UnknownHostException e) {
98 throw new SlcException("Cannot find agent factory base path", e);
99 }
100 }
101
102 /*
103 * BEAN
104 */
105 public String getAgentNodeName() {
106 return agentNodeName;
107 }
108
109 public void setRepository(Repository repository) {
110 this.repository = repository;
111 }
112
113 public void setAgentNodeName(String agentNodeName) {
114 this.agentNodeName = agentNodeName;
115 }
116 }