diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/context/SecurityContextMapper.java b/src/main/java/org/gcube/informationsystem/resourceregistry/context/SecurityContextMapper.java index fe73d4c..083bfbf 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/context/SecurityContextMapper.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/context/SecurityContextMapper.java @@ -20,42 +20,46 @@ import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory; */ public abstract class SecurityContextMapper { - private static Logger logger = LoggerFactory.getLogger(SecurityContextMapper.class); + private static Logger logger = LoggerFactory + .getLogger(SecurityContextMapper.class); public static final String MANAGEMENT_SECURITY_CONTEXT = "ManagementSecurityContext"; - + private static final Map> securityContextFactories; - + static { try { boolean created = DatabaseIntializator.initGraphDB(); logger.trace("Creating factory for {} connecting as {}", - DatabaseEnvironment.getDBURI(), + DatabaseEnvironment.DB_URI, DatabaseEnvironment.DEFAULT_ADMIN_USERNAME); - + securityContextFactories = new HashMap<>(); - + OrientGraphFactory factory = new OrientGraphFactory( - DatabaseEnvironment.getDBURI(), + DatabaseEnvironment.DB_URI, DatabaseEnvironment.DEFAULT_ADMIN_USERNAME, DatabaseEnvironment.CHANGED_ADMIN_PASSWORD) .setupPool(1, 10); - - for(PermissionMode p : PermissionMode.values()){ - Map map = new HashMap<>(); + + for (PermissionMode p : PermissionMode.values()) { + Map map = new HashMap<>(); map.put(null, factory); securityContextFactories.put(p, map); map.put(null, factory); } - - if(created){ + + if (created) { OrientGraph orientGraph = factory.getTx(); - SecurityContext.createSecurityContext(orientGraph, MANAGEMENT_SECURITY_CONTEXT, true); - - getSecurityContextFactory(MANAGEMENT_SECURITY_CONTEXT, PermissionMode.READER); - getSecurityContextFactory(MANAGEMENT_SECURITY_CONTEXT, PermissionMode.WRITER); - + SecurityContext.createSecurityContext(orientGraph, + MANAGEMENT_SECURITY_CONTEXT, true); + + getSecurityContextFactory(MANAGEMENT_SECURITY_CONTEXT, + PermissionMode.READER); + getSecurityContextFactory(MANAGEMENT_SECURITY_CONTEXT, + PermissionMode.WRITER); + DatabaseIntializator.createEntitiesAndRelations(); } @@ -99,29 +103,31 @@ public abstract class SecurityContextMapper { * use null for no context (used for admin operations) * @return */ - public static OrientGraphFactory getSecurityContextFactory(String contextID, PermissionMode permissionMode) { + public static OrientGraphFactory getSecurityContextFactory( + String contextID, PermissionMode permissionMode) { OrientGraphFactory factory = null; - - Map permissionSecurityContextFactories = - securityContextFactories.get(permissionMode); - + + Map permissionSecurityContextFactories = securityContextFactories + .get(permissionMode); + factory = permissionSecurityContextFactories.get(contextID); - + if (factory == null) { - + String username = getSecurityRoleOrUserName(permissionMode, - SecurityType.USER, contextID); - String password = DatabaseEnvironment.DEFAULT_PASSWORDS.get(permissionMode); - - factory = new OrientGraphFactory(DatabaseEnvironment.getDBURI(), - username, password).setupPool(1, 10); - + SecurityType.USER, contextID); + String password = DatabaseEnvironment.DEFAULT_PASSWORDS + .get(permissionMode); + + factory = new OrientGraphFactory(DatabaseEnvironment.DB_URI, + username, password).setupPool(1, 10); + permissionSecurityContextFactories.put(contextID, factory); } - + return factory; } - + public static String getSecurityRoleOrUserName( PermissionMode permissionMode, SecurityType securityType, String contextID) { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java b/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java index 27dbde0..175d873 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java @@ -62,28 +62,17 @@ public class DatabaseEnvironment { public static final Map DEFAULT_PASSWORDS; - protected static int currentHost; + protected static final String HOSTS; + protected static final String[] HOST_ARRAY; + public static final String DB_URI; - public static final String[] HOSTS; public static final String[] HTTP_URL_STRINGS; - public static final String[] URI_DBS; - - public static String getDBURI(){ - return URI_DBS[currentHost]; - } - - - public static String getHTTPURL(){ - return HTTP_URL_STRINGS[currentHost]; - } static { Properties properties = new Properties(); InputStream input = null; - currentHost = 0; - try { input = DatabaseEnvironment.class.getClassLoader().getResourceAsStream(PROPERTY_FILENAME); @@ -91,8 +80,7 @@ public class DatabaseEnvironment { // load a properties file properties.load(input); - String hostsString = properties.getProperty(HOST_VARNAME); - HOSTS = hostsString.split(","); + HOSTS = properties.getProperty(HOST_VARNAME); REMOTE_PROTOCOL = properties.getProperty(REMOTE_PROTOCOL_VARNAME); @@ -100,7 +88,7 @@ public class DatabaseEnvironment { HTTP_PORT = properties.getProperty(HTTP_PORT_VARNAME); DB = properties.getProperty(DB_VARNAME); - + DB_URI = REMOTE_PROTOCOL + HOSTS + "/" + DB; USERNAME = properties.getProperty(USERNAME_VARNAME); PASSWORD = properties.getProperty(PASSWORD_VARNAME); @@ -121,13 +109,11 @@ public class DatabaseEnvironment { DEFAULT_PASSWORDS.put(PermissionMode.READER, DEFAULT_CREATED_READER_USER_PASSWORD); + HOST_ARRAY = HOSTS.split(";"); + HTTP_URL_STRINGS = new String[HOST_ARRAY.length]; - HTTP_URL_STRINGS = new String[HOSTS.length]; - URI_DBS = new String[HOSTS.length]; - - for(int i=0; i edges = context.getEdges(Direction.OUT, IsParentOf.NAME); if (edges != null && edges.iterator().hasNext()) { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/EntityManagementImpl.java b/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/EntityManagementImpl.java index 35ad8a0..7da50cf 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/EntityManagementImpl.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/EntityManagementImpl.java @@ -508,8 +508,8 @@ public class EntityManagementImpl implements EntityManagement { logger.trace("Creating {} ({}) beetween {} -> {}", Relation.class.getSimpleName(), relationType, - Utility.toJsonString(source), - Utility.toJsonString(target)); + Utility.toJsonString(source, true), + Utility.toJsonString(target, true)); Edge edge = orientGraph.addEdge(null, source, target, relationType); diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImpl.java b/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImpl.java index 89a4144..8211e2f 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImpl.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImpl.java @@ -3,24 +3,22 @@ */ package org.gcube.informationsystem.resourceregistry.resources.impl; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; +import java.io.StringWriter; +import java.io.Writer; +import java.util.List; import org.gcube.informationsystem.resourceregistry.api.Query; import org.gcube.informationsystem.resourceregistry.api.exceptions.InvalidQueryException; -import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException; -import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper; +import org.gcube.informationsystem.resourceregistry.api.rest.AccessPath; import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper.PermissionMode; -import org.gcube.informationsystem.resourceregistry.dbinitialization.DatabaseEnvironment; import org.gcube.informationsystem.resourceregistry.resources.utils.ContextUtility; -import org.glassfish.jersey.internal.util.Base64; +import org.gcube.informationsystem.resourceregistry.resources.utils.Utility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sun.research.ws.wadl.HTTPMethods; +import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; +import com.orientechnologies.orient.core.record.impl.ODocument; +import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; /** * @author Luca Frosini (ISTI - CNR) @@ -30,15 +28,17 @@ public class QueryImpl implements Query { private static Logger logger = LoggerFactory.getLogger(QueryImpl.class); + /* private static final String QUERY = "query/"; private static final String SQL = "sql/"; - private static final String DEFAULT_LIMIT = "20/"; + + private static final String DEFAULT_LIMIT = DEFAULT_LIMIT_INT + "/"; private static final URL BASE_QUERY_URL; static { try { - URL url = new URL(DatabaseEnvironment.getHTTPURL()); + URL url = new URL(DatabaseEnvironment.HTTP_URL_STRINGS[0]); URL urlQuery = new URL(url, QUERY); URL urlDB = new URL(urlQuery, DatabaseEnvironment.DB + "/"); BASE_QUERY_URL = new URL(urlDB, SQL); @@ -76,13 +76,13 @@ public class QueryImpl implements Query { URL queryURL = new URL(BASE_QUERY_URL, URLEncoder.encode(query, "UTF-8") + "/"); - /* + / * if (limit != null && limit > 0) { queryURL = new URL(queryURL, limit.toString() + "/"); } else { queryURL = new URL(queryURL, DEFAULT_LIMIT); } - */ + * / queryURL = new URL(queryURL, DEFAULT_LIMIT); @@ -119,5 +119,54 @@ public class QueryImpl implements Query { throw new InvalidQueryException(e.getMessage(), e); } + } + */ + + @Override + public String query(String query, int limit, String fetchPlan) + throws InvalidQueryException { + + int sanitizedLimit = limit > 4 ? limit : AccessPath.DEFAULT_LIMIT; + + ODatabaseDocumentTx oDatabaseDocumentTx = null; + + try { + oDatabaseDocumentTx = ContextUtility + .getActualSecurityContextDatabaseTx(PermissionMode.READER); + + + OSQLSynchQuery osqlSynchQuery = new OSQLSynchQuery<>(query, sanitizedLimit); + osqlSynchQuery.setFetchPlan(fetchPlan); + osqlSynchQuery.setCacheableResult(true); + + logger.debug("Going to execute query : \"{}\", fetchPlan : \"{}\", limit : {}", + osqlSynchQuery.getText(), osqlSynchQuery.getFetchPlan(), + osqlSynchQuery.getLimit()); + + List records = oDatabaseDocumentTx.query(osqlSynchQuery); + + Writer writer = new StringWriter(); + writer.append("{\"result\":["); + for(int i=0; i iterator = vertexes.iterator(); Vertex entity = iterator.next(); - logger.trace("{} with {} is : {}", entityType, uuid, Utility.toJsonString(entity)); + logger.trace("{} with {} is : {}", entityType, uuid, Utility.toJsonString(entity, true)); if (iterator.hasNext()) { throw new ResourceRegistryException("Found more than one " @@ -136,7 +140,7 @@ public class Utility { Edge relation = iterator.next(); logger.trace("{} with {} is : {}", relationType, uuid, - Utility.toJsonString(relation)); + Utility.toJsonString(relation, true)); if (iterator.hasNext()) { throw new ResourceRegistryException("Found more than one " diff --git a/src/test/java/org/gcube/informationsystem/resourceregistry/QueryManagerFactory.java b/src/test/java/org/gcube/informationsystem/resourceregistry/QueryManagerFactory.java index 3d0fbab..42b8381 100644 --- a/src/test/java/org/gcube/informationsystem/resourceregistry/QueryManagerFactory.java +++ b/src/test/java/org/gcube/informationsystem/resourceregistry/QueryManagerFactory.java @@ -17,7 +17,7 @@ public class QueryManagerFactory implements Factory{ return new Query() { @Override - public String execute(String query, String fetchPlan) throws InvalidQueryException { + public String query(String query, int limit, String fetchPlan) throws InvalidQueryException { if (query.equals("error")) throw new InvalidQueryException("error in query"); return "result"; diff --git a/src/test/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImplTest.java b/src/test/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImplTest.java index 4c64562..913ed39 100644 --- a/src/test/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImplTest.java +++ b/src/test/java/org/gcube/informationsystem/resourceregistry/resources/impl/QueryImplTest.java @@ -21,7 +21,10 @@ public class QueryImplTest { public void testQuery() throws InvalidQueryException{ ScopeProvider.instance.set("/gcube/devNext"); QueryImpl queryImpl = new QueryImpl(); - String ret = queryImpl.execute("select * from CPUFacet", null); + + String query = "select * from CPUFacet"; + String ret = queryImpl.query(query, 2, null); + logger.debug(ret); } diff --git a/src/test/resources/config.properties.dev b/src/test/resources/config.properties.dev index a7e73bc..b7ab753 100644 --- a/src/test/resources/config.properties.dev +++ b/src/test/resources/config.properties.dev @@ -1,4 +1,4 @@ -HOST=orientdb01-d-d4s.d4science.org,orientdb02-d-d4s.d4science.org,orientdb02-d-d4s.d4science.org +HOST=orientdb01-d-d4s.d4science.org;orientdb02-d-d4s.d4science.org;orientdb03-d-d4s.d4science.org REMOTE_PROTOCOL=remote: HTTP_PROTOCOL=https:// HTTP_PORT=:443 diff --git a/src/test/resources/config.properties.test b/src/test/resources/config.properties.test index 010b53a..f010f83 100644 --- a/src/test/resources/config.properties.test +++ b/src/test/resources/config.properties.test @@ -1,4 +1,3 @@ -#HOST=orientdb01-d-d4s.d4science.org HOST=pc-frosini.isti.cnr.it REMOTE_PROTOCOL= remote: diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index 9a440a7..4f36cc8 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -7,7 +7,7 @@ - +