X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.akb%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fakb%2Fcore%2FAkbServiceImpl.java;h=83de7294c8b96b0c8d7cdc49d92dcd87d8460a5b;hb=44b4c78e6a082d51d0410c3995b5edf353d417b9;hp=ba7b6cc0470273a88bd118ce77588c8320f87d6f;hpb=ee9455a85f291bd41955aae4ab406f381b5dfd9a;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java index ba7b6cc04..83de7294c 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java @@ -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) {