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;
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;
@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)) {
* 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() + '/'
}
}
- 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);
}
- 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);
}
- // /** Expose injected repository */
- // public Repository getRepository() {
- // return repository;
- // }
+ /** Expose injected repository */
+ public Repository getRepository() {
+ return repository;
+ }
/* DEPENDENCY INJECTION */
public void setRepository(Repository repository) {