]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java
Edit connector wizard
[gpl/argeo-slc.git] / runtime / org.argeo.slc.akb / src / main / java / org / argeo / slc / akb / core / AkbServiceImpl.java
index bd79ace0f42a893c5f5b13aecbccf2880ae23522..df24ef108fc427f3a24cf7f6c95ea029956d3ee7 100644 (file)
@@ -35,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;
 
@@ -111,20 +112,70 @@ public class AkbServiceImpl implements AkbService, AkbNames {
        @Override
        public Node createAkbTemplate(Node parentNode, String name)
                        throws RepositoryException {
-               String connectorParentName = "Connectors";
-
                Node newTemplate = parentNode.addNode(name, AkbTypes.AKB_ENV_TEMPLATE);
                newTemplate.setProperty(Property.JCR_TITLE, name);
+               newTemplate.addNode(AkbTypes.AKB_CONNECTOR_FOLDER,
+                               AkbTypes.AKB_CONNECTOR_FOLDER);
+               return newTemplate;
+       }
+
+       // //////////////////////////
+       // ENVIRONMENTS
+       @Override
+       public Node createActiveEnv(Node template, String name,
+                       boolean copyDefaultConnectors) throws RepositoryException {
 
-               Node connectorParent = newTemplate.addNode(
+               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);
-               connectorParent.setProperty(Property.JCR_TITLE, connectorParentName);
 
-               return newTemplate;
+               NodeIterator ni = template.getNode(AkbTypes.AKB_CONNECTOR_FOLDER)
+                               .getNodes();
+               activeConns: while (ni.hasNext()) {
+                       Node currNode = ni.nextNode();
+                       if (currNode.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS)) {
+                               String connType = currNode.getProperty(AKB_CONNECTOR_TYPE)
+                                               .getString();
+                               
+                               if (AkbJcrUtils.isEmptyString(connType))
+                                       // Cannot create an instance if the type is undefined
+                                       continue activeConns;
+
+                               Node newConnector = connectorParent.addNode(currNode.getName(),
+                                               connType);
+                               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,
@@ -138,7 +189,8 @@ public class AkbServiceImpl implements AkbService, AkbNames {
                // Node defaultConnector =
                Node defaultConn = newConnector.addNode(
                                AkbNames.AKB_DEFAULT_TEST_CONNECTOR, connectorType);
-               defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_NAME, name);
+               defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_PATH,
+                               newConnector.getPath());
                return newConnector;
        }
 
@@ -183,7 +235,7 @@ public class AkbServiceImpl implements AkbService, AkbNames {
        }
 
        @Override
-       public Node getConnectorByAlias(Node envNode, String aliasName)
+       public Node getActiveConnectorByAlias(Node envNode, String aliasPath)
                        throws RepositoryException {
                try {
                        Session session = envNode.getSession();
@@ -198,10 +250,10 @@ public class AkbServiceImpl implements AkbService, AkbNames {
 
                        Constraint connType = factory.comparison(
                                        factory.propertyValue(source.getSelectorName(),
-                                                       AkbNames.AKB_CONNECTOR_ALIAS_NAME),
+                                                       AkbNames.AKB_CONNECTOR_ALIAS_PATH),
                                        QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, factory
                                                        .literal(session.getValueFactory().createValue(
-                                                                       aliasName)));
+                                                                       aliasPath)));
                        defaultC = factory.and(defaultC, connType);
 
                        QueryObjectModel query;
@@ -215,13 +267,13 @@ public class AkbServiceImpl implements AkbService, AkbNames {
                                Node connector = ni.nextNode();
                                if (ni.hasNext())
                                        throw new AkbException("More than  one alias with name "
-                                                       + aliasName + " has been defined for environment "
+                                                       + aliasPath + " has been defined for environment "
                                                        + envNode);
                                else
                                        return connector;
                        }
                } catch (RepositoryException e) {
-                       throw new AkbException("Unable to get connector " + aliasName
+                       throw new AkbException("Unable to get connector " + aliasPath
                                        + " in " + envNode, e);
                }
        }
@@ -280,23 +332,28 @@ public class AkbServiceImpl implements AkbService, AkbNames {
        public PreparedStatement prepareJdbcQuery(Node activeEnv, Node node) {
                PreparedStatement statement = null;
                try {
-                       
+
                        if (node.isNodeType(AkbTypes.AKB_JDBC_QUERY)) {
-                               String connectorPath = node.getProperty(AKB_USED_CONNECTOR)
+                               String connectorAliasStr = node.getProperty(AKB_USED_CONNECTOR)
                                                .getString();
-                               Node connectorNode = node.getSession().getNode(connectorPath);
-                               
-                               if (activeEnv != null){
-                                       String aliasName = connectorNode.getProperty(Property.JCR_TITLE).getString();
-                                       connectorNode = getConnectorByAlias(activeEnv, aliasName); 
+                               // 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 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() + '/'
@@ -324,16 +381,28 @@ public class AkbServiceImpl implements AkbService, AkbNames {
 
        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);
 
@@ -379,14 +448,26 @@ public class AkbServiceImpl implements AkbService, AkbNames {
                                        .getString();
                        String command = "cat " + filePath;
 
-                       // TODO do a proper scp
-                       String connectorPath = node.getProperty(AKB_USED_CONNECTOR)
-                                       .getString();
-                       Node connectorNode = node.getSession().getNode(connectorPath);
-                       String connectorUrl = connectorNode.getProperty(AKB_CONNECTOR_URL)
+                       String connectorAliasStr = node.getProperty(AKB_USED_CONNECTOR)
                                        .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);
 
@@ -445,10 +526,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) {