/* * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.argeo.slc.jcr.execution; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.UUID; import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.security.Privilege; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcConstants; import org.argeo.slc.SlcException; import org.argeo.slc.SlcNames; import org.argeo.slc.SlcTypes; import org.argeo.slc.core.execution.DefaultAgent; import org.argeo.slc.core.execution.ProcessThread; import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.execution.ExecutionProcess; import org.argeo.slc.jcr.SlcJcrConstants; /** SLC VM agent synchronizing with a JCR repository. */ public class JcrAgent extends DefaultAgent implements SlcNames { // final static String ROLE_REMOTE = "ROLE_REMOTE"; final static String NODE_REPO_URI = "argeo.node.repo.uri"; private Repository repository; private String agentNodeName = "default"; /* * LIFECYCLE */ protected String initAgentUuid() { Session session = null; try { session = repository.login(); String agentFactoryPath = getAgentFactoryPath(); Node vmAgentFactoryNode = JcrUtils.mkdirsSafe(session, agentFactoryPath, SlcTypes.SLC_AGENT_FACTORY); JcrUtils.addPrivilege(session, SlcJcrConstants.SLC_BASE_PATH, SlcConstants.ROLE_SLC, Privilege.JCR_ALL); if (!vmAgentFactoryNode.hasNode(agentNodeName)) { String uuid = UUID.randomUUID().toString(); Node agentNode = vmAgentFactoryNode.addNode(agentNodeName, SlcTypes.SLC_AGENT); agentNode.setProperty(SLC_UUID, uuid); } session.save(); return vmAgentFactoryNode.getNode(agentNodeName).getProperty(SLC_UUID).getString(); } catch (RepositoryException e) { JcrUtils.discardQuietly(session); throw new SlcException("Cannot find JCR agent UUID", e); } finally { JcrUtils.logoutQuietly(session); } } @Override public void destroy() { super.destroy(); } /* * SLC AGENT */ @Override protected ProcessThread createProcessThread(ThreadGroup processesThreadGroup, ExecutionModulesManager modulesManager, ExecutionProcess process) { if (process instanceof JcrExecutionProcess) return new JcrProcessThread(processesThreadGroup, modulesManager, (JcrExecutionProcess) process); else return super.createProcessThread(processesThreadGroup, modulesManager, process); } /* * UTILITIES */ public String getNodePath() { return getAgentFactoryPath() + '/' + getAgentNodeName(); } public String getAgentFactoryPath() { try { Boolean isRemote = System.getProperty(NODE_REPO_URI) != null; String agentFactoryPath; if (isRemote) { InetAddress localhost = InetAddress.getLocalHost(); agentFactoryPath = SlcJcrConstants.AGENTS_BASE_PATH + "/" + localhost.getCanonicalHostName(); if (agentFactoryPath.equals(SlcJcrConstants.VM_AGENT_FACTORY_PATH)) throw new SlcException("Unsupported hostname " + localhost.getCanonicalHostName()); } else {// local agentFactoryPath = SlcJcrConstants.VM_AGENT_FACTORY_PATH; } return agentFactoryPath; } catch (UnknownHostException e) { throw new SlcException("Cannot find agent factory base path", e); } } /* * BEAN */ public String getAgentNodeName() { return agentNodeName; } public void setRepository(Repository repository) { this.repository = repository; } public void setAgentNodeName(String agentNodeName) { this.agentNodeName = agentNodeName; } }