package com.collabinate.server.engine; import java.util.ArrayList; import java.util.List; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import com.collabinate.server.Tenant; import com.google.gson.Gson; import com.tinkerpop.blueprints.KeyIndexableGraph; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.util.wrappers.partition.PartitionGraph; /** * An implementation of Administration against a graph database. * * @author mafuba * */ public class GraphAdmin implements CollabinateAdmin { private CollabinateGraph graph; public GraphAdmin(CollabinateGraph graph) { if (null == graph) { throw new IllegalArgumentException("graph must not be null"); } this.graph = graph; } @Override public void putTenant(Tenant tenant) { Vertex tenantVertex = graph.getVertex( getTenantVertexId(tenant.getId())); if (null == tenantVertex) { tenantVertex = graph.addVertex(getTenantVertexId(tenant.getId())); } tenantVertex.setProperty(STRING_TYPE, STRING_TENANT); tenantVertex.setProperty(STRING_TENANT_ID, tenant.getId()); tenantVertex.setProperty(STRING_NAME, tenant.getName()); tenantVertex.setProperty(STRING_CREATED, DateTime.now(DateTimeZone.UTC).toString()); Gson gson = new Gson(); String tenantJson = gson.toJson(tenant); tenantVertex.setProperty(STRING_CONTENT, tenantJson); graph.commit(); } @Override public Tenant getTenant(String tenantId) { Vertex tenantVertex = graph.getVertex(getTenantVertexId(tenantId)); Tenant tenant = null; if (null != tenantVertex) { String tenantJson = (String)tenantVertex.getProperty(STRING_CONTENT); Gson gson = new Gson(); tenant = gson.fromJson(tenantJson, Tenant.class); } graph.commit(); return tenant; } @Override public void deleteTenant(String tenantId) { for (Vertex vertex : graph.getVertices(STRING_TENANT_ID, tenantId)) { vertex.remove(); } } @Override public List<Tenant> getAllTenants() { List<Tenant> tenants = new ArrayList<Tenant>(); for (Vertex vertex : graph.getVertices(STRING_TYPE, STRING_TENANT)) { tenants.add(getTenant(vertex.getProperty(STRING_TENANT_ID))); } return tenants; } @Override public String exportDatabase() { return CollabinateGraph.exportGraph(graph); } @Override public void importDatabase(String data) { graph.importGraph(data); } @Override public String exportTenantData(String tenantId) { PartitionGraph<KeyIndexableGraph> tenantGraph = new PartitionGraph<KeyIndexableGraph>( graph, STRING_TENANT_ID, tenantId); return CollabinateGraph.exportGraph(tenantGraph); } @Override public void importTenantData(String tenantId, String data) { if (null != getTenant(tenantId)) { throw new IllegalStateException( "Cannot import data for tenant with ID: '" + tenantId + "', tenant already exists."); } graph.importGraph(data); } private String getTenantVertexId(String tenantId) { return STRING_TENANT_PREFIX + tenantId; } private static final String STRING_TENANT_PREFIX = "collabinate.tenant."; private static final String STRING_CONTENT = "Content"; private static final String STRING_TENANT_ID = "TenantID"; private static final String STRING_NAME = "Name"; private static final String STRING_CREATED = "Created"; private static final String STRING_TYPE = "Type"; private static final String STRING_TENANT = "Tenant"; }