package org.hivedb.services; import org.hivedb.Hive; import org.hivedb.HiveLockableException; import org.hivedb.HiveRuntimeException; import org.hivedb.Schema; import org.hivedb.meta.Node; import org.hivedb.util.database.DialectTools; import org.hivedb.util.database.HiveDbDialect; import org.hivedb.util.database.Schemas; import org.hivedb.util.functional.Maps; import org.hivedb.util.functional.Transform; import org.hivedb.util.functional.Unary; import javax.jws.WebService; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.NoSuchElementException; @WebService(endpointInterface = "org.hivedb.services.InstallService") public class InstallServiceImpl implements InstallService { private Map<String, Schema> schemata = Maps.newHashMap(); private Hive hive; public InstallServiceImpl(Collection<Schema> schemata, Hive hive) { this.hive = hive; for (Schema s : schemata) this.schemata.put(s.getName(), s); } public void addSchema(Schema schema) { schemata.put(schema.getName(), schema); } public Collection<Schema> getSchemata() { return schemata.values(); } public Boolean install(String schemaName, String nodeName, String dbName, String host, String dialect, String user, String password) { return install(schemaName, getOrAddNode(nodeName, dbName, host, dialect, user, password).getName()); } private Node getOrAddNode(String nodeName, String dbName, String host, String dialect, String user, String password) { Node node; try { node = hive.getNode(nodeName); } catch (NoSuchElementException e) { node = new Node(nodeName, dbName, host, DialectTools.stringToDialect(dialect)); node.setUsername(user); node.setPassword(password); try { hive.addNode(node); } catch (HiveLockableException e1) { throw new HiveRuntimeException("Hive was locked read-only.", e1); } } return node; } public Collection<String> listDialects() { return Transform.map(new Unary<HiveDbDialect, String>() { public String f(HiveDbDialect item) { return DialectTools.dialectToString(item); } }, Arrays.asList(HiveDbDialect.values())); } public Collection<String> listSchemas() { return schemata.keySet(); } public Boolean install(String schemaName, String nodeName) { Schema s = schemata.get(schemaName); String uri = hive.getNode(nodeName).getUri(); Schemas.install(s, uri); return true; } public Boolean installAll(String nodeName) { Boolean installed = true; for (String s : schemata.keySet()) installed &= install(s, nodeName); return installed; } public Boolean installAll(String nodeName, String dbName, String host, String dialect, String user, String password) { return installAll(getOrAddNode(nodeName, dbName, host, dialect, user, password).getName()); } public Boolean addNode(String nodeName, String dbName, String host, String dialect, String user, String password) { try { Node node = new Node(nodeName, dbName, host, DialectTools.stringToDialect(dialect)); node.setUsername(user); node.setPassword(password); hive.addNode(node); return true; } catch (HiveLockableException e) { throw new HiveRuntimeException("hive was locked read-only", e); } } public Collection<String> listNodes() { return Transform.map(new Unary<Node, String>() { public String f(Node item) { return item.getName(); } }, hive.getNodes()); } }