]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java
work on active environments
[gpl/argeo-slc.git] / runtime / org.argeo.slc.akb / src / main / java / org / argeo / slc / akb / core / AkbServiceImpl.java
index ba7b6cc0470273a88bd118ce77588c8320f87d6f..83de7294c8b96b0c8d7cdc49d92dcd87d8460a5b 100644 (file)
@@ -10,10 +10,19 @@ import java.util.Map;
 
 import javax.annotation.Resource;
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.Property;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
+import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.Ordering;
+import javax.jcr.query.qom.QueryObjectModel;
+import javax.jcr.query.qom.QueryObjectModelConstants;
+import javax.jcr.query.qom.QueryObjectModelFactory;
+import javax.jcr.query.qom.Selector;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
@@ -26,6 +35,7 @@ import org.argeo.slc.akb.AkbException;
 import org.argeo.slc.akb.AkbNames;
 import org.argeo.slc.akb.AkbService;
 import org.argeo.slc.akb.AkbTypes;
+import org.argeo.slc.akb.utils.AkbJcrUtils;
 import org.argeo.slc.jsch.SimpleUserInfo;
 import org.argeo.util.security.Keyring;
 
@@ -102,26 +112,170 @@ public class AkbServiceImpl implements AkbService, AkbNames {
        @Override
        public Node createAkbTemplate(Node parentNode, String name)
                        throws RepositoryException {
-               String connectorParentName = "Connectors";
-               String itemsParentName = "Items";
-
                Node newTemplate = parentNode.addNode(name, AkbTypes.AKB_ENV_TEMPLATE);
                newTemplate.setProperty(Property.JCR_TITLE, name);
 
-               Node connectorParent = newTemplate.addNode(
-                               AkbTypes.AKB_CONNECTOR_FOLDER, AkbTypes.AKB_CONNECTOR_FOLDER);
-               connectorParent.setProperty(Property.JCR_TITLE, connectorParentName);
-
-               Node itemsParent = newTemplate.addNode(AkbTypes.AKB_ITEM_FOLDER,
-                               AkbTypes.AKB_ITEM_FOLDER);
-               itemsParent.setProperty(Property.JCR_TITLE, itemsParentName);
+               // Node connectorParent =
+               newTemplate.addNode(AkbTypes.AKB_CONNECTOR_FOLDER,
+                               AkbTypes.AKB_CONNECTOR_FOLDER);
+               // connectorParent.setProperty(Property.JCR_TITLE, connectorParentName);
 
                return newTemplate;
        }
 
+       // //////////////////////////
+       // ENVIRONMENTS
+       @Override
+       public Node createActiveEnv(Node template, String name,
+                       boolean copyDefaultConnectors) throws RepositoryException {
+
+               Session session = template.getSession();
+               Node parentEnvNode = session.getNode(AKB_ENVIRONMENTS_BASE_PATH);
+               Node createdEnv = parentEnvNode.addNode(name, AkbTypes.AKB_ENV);
+               createdEnv.setProperty(AKB_ENV_TEMPLATE_PATH, template.getPath());
+               createdEnv.setProperty(Property.JCR_TITLE, name);
+
+               Node connectorParent = createdEnv.addNode(
+                               AkbTypes.AKB_CONNECTOR_FOLDER, AkbTypes.AKB_CONNECTOR_FOLDER);
+
+               NodeIterator ni = template.getNode(AkbTypes.AKB_CONNECTOR_FOLDER)
+                               .getNodes();
+               while (ni.hasNext()) {
+                       Node currNode = ni.nextNode();
+                       if (currNode.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS)) {
+                               Node newConnector = connectorParent.addNode(currNode.getName(),
+                                               AkbTypes.AKB_CONNECTOR);
+                               newConnector.setProperty(AKB_CONNECTOR_ALIAS_PATH,
+                                               currNode.getPath());
+                               if (copyDefaultConnectors
+                                               && currNode
+                                                               .hasNode(AkbNames.AKB_DEFAULT_TEST_CONNECTOR)) {
+                                       Node defaultConn = currNode
+                                                       .getNode(AkbNames.AKB_DEFAULT_TEST_CONNECTOR);
+                                       if (defaultConn.hasProperty(AkbNames.AKB_CONNECTOR_URL))
+                                               newConnector
+                                                               .setProperty(
+                                                                               AkbNames.AKB_CONNECTOR_URL,
+                                                                               defaultConn.getProperty(
+                                                                                               AkbNames.AKB_CONNECTOR_URL)
+                                                                                               .getString());
+                                       if (defaultConn.hasProperty(AkbNames.AKB_CONNECTOR_USER))
+                                               newConnector.setProperty(
+                                                               AkbNames.AKB_CONNECTOR_USER,
+                                                               defaultConn.getProperty(
+                                                                               AkbNames.AKB_CONNECTOR_USER)
+                                                                               .getString());
+                               }
+                       }
+               }
+               return createdEnv;
+       }
+
        // ///////////////////////////////////////
-       // CONNECTORS
+       // CONNECTORS
 
+       @Override
+       public Node createConnectorAlias(Node templateNode, String name,
+                       String connectorType) throws RepositoryException {
+               Node parent = JcrUtils.mkdirs(templateNode,
+                               AkbTypes.AKB_CONNECTOR_FOLDER, AkbTypes.AKB_CONNECTOR_FOLDER);
+               Node newConnector = parent.addNode(name, AkbTypes.AKB_CONNECTOR_ALIAS);
+               newConnector.setProperty(Property.JCR_TITLE, name);
+               newConnector.setProperty(AkbNames.AKB_CONNECTOR_TYPE, connectorType);
+
+               // Node defaultConnector =
+               Node defaultConn = newConnector.addNode(
+                               AkbNames.AKB_DEFAULT_TEST_CONNECTOR, connectorType);
+               defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_PATH,
+                               newConnector.getPath());
+               return newConnector;
+       }
+
+       @Override
+       public NodeIterator getDefinedAliases(Node itemTemplate,
+                       String connectorType) throws RepositoryException {
+               try {
+                       Session session = itemTemplate.getSession();
+                       QueryManager queryManager = session.getWorkspace()
+                                       .getQueryManager();
+                       QueryObjectModelFactory factory = queryManager.getQOMFactory();
+
+                       Selector source = factory.selector(AkbTypes.AKB_CONNECTOR_ALIAS,
+                                       AkbTypes.AKB_CONNECTOR_ALIAS);
+                       Constraint defaultC = factory.descendantNode(
+                                       source.getSelectorName(), itemTemplate.getPath());
+
+                       if (connectorType != null) {
+                               Constraint connType = factory.comparison(factory.propertyValue(
+                                               source.getSelectorName(), AkbNames.AKB_CONNECTOR_TYPE),
+                                               QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO,
+                                               factory.literal(session.getValueFactory().createValue(
+                                                               connectorType)));
+                               defaultC = factory.and(defaultC, connType);
+                       }
+
+                       // Order by default by JCR TITLE
+                       // TODO check if node definition has MIX_TITLE mixin
+                       // TODO Apparently case insensitive ordering is not implemented in
+                       // current used JCR implementation
+                       Ordering order = factory
+                                       .ascending(factory.upperCase(factory.propertyValue(
+                                                       source.getSelectorName(), Property.JCR_TITLE)));
+                       QueryObjectModel query;
+                       query = factory.createQuery(source, defaultC,
+                                       new Ordering[] { order }, null);
+                       QueryResult result = query.execute();
+                       return result.getNodes();
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to list connector", e);
+               }
+       }
+
+       @Override
+       public Node getActiveConnectorByAlias(Node envNode, String aliasPath)
+                       throws RepositoryException {
+               try {
+                       Session session = envNode.getSession();
+                       QueryManager queryManager = session.getWorkspace()
+                                       .getQueryManager();
+                       QueryObjectModelFactory factory = queryManager.getQOMFactory();
+
+                       Selector source = factory.selector(AkbTypes.AKB_CONNECTOR,
+                                       AkbTypes.AKB_CONNECTOR);
+                       Constraint defaultC = factory.descendantNode(
+                                       source.getSelectorName(), envNode.getPath());
+
+                       Constraint connType = factory.comparison(
+                                       factory.propertyValue(source.getSelectorName(),
+                                                       AkbNames.AKB_CONNECTOR_ALIAS_PATH),
+                                       QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, factory
+                                                       .literal(session.getValueFactory().createValue(
+                                                                       aliasPath)));
+                       defaultC = factory.and(defaultC, connType);
+
+                       QueryObjectModel query;
+                       query = factory.createQuery(source, defaultC, null, null);
+                       QueryResult result = query.execute();
+                       NodeIterator ni = result.getNodes();
+
+                       if (!ni.hasNext())
+                               return null;
+                       else {
+                               Node connector = ni.nextNode();
+                               if (ni.hasNext())
+                                       throw new AkbException("More than  one alias with name "
+                                                       + aliasPath + " has been defined for environment "
+                                                       + envNode);
+                               else
+                                       return connector;
+                       }
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to get connector " + aliasPath
+                                       + " in " + envNode, e);
+               }
+       }
+
+       @Override
        public boolean testConnector(Node connectorNode) {
                try {
                        if (connectorNode.isNodeType(AkbTypes.AKB_JDBC_CONNECTOR)) {
@@ -172,19 +326,31 @@ public class AkbServiceImpl implements AkbService, AkbNames {
         * Opens a new connection each time. All resources must be cleaned by
         * caller.
         */
-       public PreparedStatement prepareJdbcQuery(Node node) {
+       public PreparedStatement prepareJdbcQuery(Node activeEnv, Node node) {
                PreparedStatement statement = null;
                try {
+
                        if (node.isNodeType(AkbTypes.AKB_JDBC_QUERY)) {
+                               String connectorAliasStr = node.getProperty(AKB_USED_CONNECTOR)
+                                               .getString();
+                               // in case of a template passed env can be null
+                               if (activeEnv == null) {
+                                       activeEnv = AkbJcrUtils.getCurrentTemplate(node);
+                               }
+                               Node connectorNode = getActiveConnectorByAlias(activeEnv,
+                                               connectorAliasStr);
+
                                String sqlQuery = node.getProperty(AKB_QUERY_TEXT).getString();
 
-                               String connectorPath = node.getProperty(AKB_USED_CONNECTOR)
-                                               .getString();
-                               Node connectorNode = node.getSession().getNode(connectorPath);
-                               String connectorUrl = connectorNode.getProperty(
-                                               AKB_CONNECTOR_URL).getString();
-                               String connectorUser = connectorNode.getProperty(
-                                               AKB_CONNECTOR_USER).getString();
+                               String connectorUrl = AkbJcrUtils.get(connectorNode,
+                                               AKB_CONNECTOR_URL);
+                               String connectorUser = AkbJcrUtils.get(connectorNode,
+                                               AKB_CONNECTOR_USER);
+
+                               // Sanity check
+                               if (AkbJcrUtils.isEmptyString(connectorUrl)
+                                               || AkbJcrUtils.isEmptyString(connectorUser))
+                                       return null;
 
                                String pwdPath = getPasswordPath(connectorNode);
                                // String pwdPath = connectorNode.getPath() + '/'
@@ -210,18 +376,30 @@ public class AkbServiceImpl implements AkbService, AkbNames {
                }
        }
 
-       public String executeCommand(Node node) {
+       public String executeCommand(Node activeEnv, Node node) {
                try {
-                       String command = node.getProperty(AkbNames.AKB_COMMAND_TEXT)
-                                       .getString();
 
-                       String connectorPath = node.getProperty(AKB_USED_CONNECTOR)
+                       String connectorAliasStr = node.getProperty(AKB_USED_CONNECTOR)
                                        .getString();
-                       Node connectorNode = node.getSession().getNode(connectorPath);
-                       String connectorUrl = connectorNode.getProperty(AKB_CONNECTOR_URL)
+                       // in case of a template passed env can be null
+                       if (activeEnv == null) {
+                               activeEnv = AkbJcrUtils.getCurrentTemplate(node);
+                       }
+                       Node connectorNode = getActiveConnectorByAlias(activeEnv,
+                                       connectorAliasStr);
+                       String command = node.getProperty(AkbNames.AKB_COMMAND_TEXT)
                                        .getString();
-                       String connectorUser = connectorNode
-                                       .getProperty(AKB_CONNECTOR_USER).getString();
+
+                       String connectorUrl = AkbJcrUtils.get(connectorNode,
+                                       AKB_CONNECTOR_URL);
+                       String connectorUser = AkbJcrUtils.get(connectorNode,
+                                       AKB_CONNECTOR_USER);
+
+                       // Sanity check
+                       if (AkbJcrUtils.isEmptyString(connectorUrl)
+                                       || AkbJcrUtils.isEmptyString(connectorUser))
+                               return null;
+
                        String pwdPath = getPasswordPath(connectorNode);
                        char[] pwd = keyring.getAsChars(pwdPath);
 
@@ -261,20 +439,32 @@ public class AkbServiceImpl implements AkbService, AkbNames {
 
        }
 
-       public String retrieveFile(Node node) {
+       public String retrieveFile(Node activeEnv, Node node) {
                try {
                        String filePath = node.getProperty(AkbNames.AKB_FILE_PATH)
                                        .getString();
                        String command = "cat " + filePath;
 
-                       // TODO do a proper scp
-                       String connectorPath = node.getProperty(AKB_USED_CONNECTOR)
+                       String connectorAliasStr = node.getProperty(AKB_USED_CONNECTOR)
                                        .getString();
-                       Node connectorNode = node.getSession().getNode(connectorPath);
-                       String connectorUrl = connectorNode.getProperty(AKB_CONNECTOR_URL)
-                                       .getString();
-                       String connectorUser = connectorNode
-                                       .getProperty(AKB_CONNECTOR_USER).getString();
+                       // in case of a template passed env can be null
+                       if (activeEnv == null) {
+                               activeEnv = AkbJcrUtils.getCurrentTemplate(node);
+                       }
+                       Node connectorNode = getActiveConnectorByAlias(activeEnv,
+                                       connectorAliasStr);
+
+                       // TODO do a proper scp
+                       String connectorUrl = AkbJcrUtils.get(connectorNode,
+                                       AKB_CONNECTOR_URL);
+                       String connectorUser = AkbJcrUtils.get(connectorNode,
+                                       AKB_CONNECTOR_USER);
+
+                       // Sanity check
+                       if (AkbJcrUtils.isEmptyString(connectorUrl)
+                                       || AkbJcrUtils.isEmptyString(connectorUser))
+                               return null;
+
                        String pwdPath = getPasswordPath(connectorNode);
                        char[] pwd = keyring.getAsChars(pwdPath);
 
@@ -333,10 +523,10 @@ public class AkbServiceImpl implements AkbService, AkbNames {
 
        }
 
-       // /** Expose injected repository */
-       // public Repository getRepository() {
-       // return repository;
-       // }
+       /** Expose injected repository */
+       public Repository getRepository() {
+               return repository;
+       }
 
        /* DEPENDENCY INJECTION */
        public void setRepository(Repository repository) {