refs #7355 - Check Source-Target Relation compatibility
Added creation of instances in admin context git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/information-system/resource-registry@146252 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
6cdc2af21f
commit
ecff48a91a
|
@ -0,0 +1,124 @@
|
||||||
|
package org.gcube.informationsystem.resourceregistry.schema;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.gcube.informationsystem.model.AccessType;
|
||||||
|
import org.gcube.informationsystem.model.embedded.Embedded;
|
||||||
|
import org.gcube.informationsystem.model.entity.Entity;
|
||||||
|
import org.gcube.informationsystem.model.relation.Relation;
|
||||||
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException;
|
||||||
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException;
|
||||||
|
import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper;
|
||||||
|
import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper.PermissionMode;
|
||||||
|
import org.gcube.informationsystem.types.TypeBinder.TypeDefinition;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.orientechnologies.orient.core.record.impl.ODocument;
|
||||||
|
import com.tinkerpop.blueprints.Vertex;
|
||||||
|
import com.tinkerpop.blueprints.impls.orient.OrientEdge;
|
||||||
|
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
|
||||||
|
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory;
|
||||||
|
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
|
||||||
|
|
||||||
|
public class SchemaContextManagement implements SchemaManagement {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(SchemaContextManagement.class);
|
||||||
|
|
||||||
|
public static final String SCHEMA = "__SCHEMA";
|
||||||
|
|
||||||
|
protected Vertex getVertex(OrientGraph orientGraph, String vertexType) throws Exception{
|
||||||
|
Iterable<Vertex> iterable = orientGraph.getVerticesOfClass(vertexType, false);
|
||||||
|
Iterator<Vertex> iterator = iterable.iterator();
|
||||||
|
|
||||||
|
Vertex vertex = null;
|
||||||
|
if(iterator.hasNext()){
|
||||||
|
vertex = iterator.next();
|
||||||
|
} else {
|
||||||
|
String error = String.format("%s is not a registered type", vertexType);
|
||||||
|
logger.trace(error);
|
||||||
|
throw new Exception(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(iterator.hasNext()){
|
||||||
|
String error = String.format("More than one instance of %s found in Management Context. This MUST not happen. Please contact system administrator.", vertexType);
|
||||||
|
logger.error(error);
|
||||||
|
throw new Exception(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return vertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String create(String json, AccessType baseType) throws SchemaException {
|
||||||
|
|
||||||
|
|
||||||
|
OrientGraphFactory orientGraphFactory = SecurityContextMapper
|
||||||
|
.getSecurityContextFactory(
|
||||||
|
SecurityContextMapper.ADMIN_SECURITY_CONTEXT_UUID,
|
||||||
|
PermissionMode.WRITER);
|
||||||
|
|
||||||
|
OrientGraph orientGraph = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
orientGraph = orientGraphFactory.getTx();
|
||||||
|
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
TypeDefinition typeDefinition = mapper.readValue(json, TypeDefinition.class);
|
||||||
|
|
||||||
|
if (Entity.class.isAssignableFrom(baseType.getTypeClass())) {
|
||||||
|
OrientVertex orientVertex = orientGraph.addVertex("class:" + typeDefinition.getName());
|
||||||
|
orientVertex.setProperty(SCHEMA, json);
|
||||||
|
orientVertex.save();
|
||||||
|
} else if (Relation.class.isAssignableFrom(baseType.getTypeClass())) {
|
||||||
|
String sourceClass = typeDefinition.getSourceType();
|
||||||
|
Vertex source = getVertex(orientGraph, sourceClass);
|
||||||
|
|
||||||
|
String targetClass = typeDefinition.getTargetType();
|
||||||
|
Vertex target = getVertex(orientGraph, targetClass);
|
||||||
|
|
||||||
|
OrientEdge orientEdge = orientGraph.addEdge(null, source, target, typeDefinition.getName());
|
||||||
|
orientEdge.setProperty(SCHEMA, json);
|
||||||
|
orientEdge.save();
|
||||||
|
|
||||||
|
} else if (Embedded.class.isAssignableFrom(baseType.getTypeClass())) {
|
||||||
|
ODocument doc = new ODocument(typeDefinition.getName());
|
||||||
|
doc.field(SCHEMA, json);
|
||||||
|
doc.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
orientGraph.commit();
|
||||||
|
return json;
|
||||||
|
|
||||||
|
}catch (Exception e) {
|
||||||
|
if (orientGraph != null) {
|
||||||
|
orientGraph.rollback();
|
||||||
|
}
|
||||||
|
throw new SchemaException(e);
|
||||||
|
} finally {
|
||||||
|
if (orientGraph != null) {
|
||||||
|
orientGraph.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String read(String type, boolean includeSubtypes) throws SchemaNotFoundException, SchemaException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String update(String type, AccessType accessType, String json)
|
||||||
|
throws SchemaNotFoundException, SchemaException {
|
||||||
|
throw new UnsupportedOperationException("Not Yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String delete(String type, AccessType accessType) throws SchemaNotFoundException {
|
||||||
|
throw new UnsupportedOperationException("Not Yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -192,6 +192,15 @@ public class SchemaManagementImpl implements SchemaManagement {
|
||||||
} else if (Relation.class.isAssignableFrom(baseType.getTypeClass())) {
|
} else if (Relation.class.isAssignableFrom(baseType.getTypeClass())) {
|
||||||
oClass = orientGraphNoTx.createEdgeType(typeDefinition
|
oClass = orientGraphNoTx.createEdgeType(typeDefinition
|
||||||
.getName());
|
.getName());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This information are persisted in Management Context
|
||||||
|
*
|
||||||
|
* String outBaseType = typeDefinition.getOutBaseType();
|
||||||
|
* String inBaseType = typeDefinition.getInBaseType();
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
} else if (Embedded.class.isAssignableFrom(baseType.getTypeClass())) {
|
} else if (Embedded.class.isAssignableFrom(baseType.getTypeClass())) {
|
||||||
oClass = oSchema.createClass(typeDefinition.getName());
|
oClass = oSchema.createClass(typeDefinition.getName());
|
||||||
} else {
|
} else {
|
||||||
|
@ -210,6 +219,7 @@ public class SchemaManagementImpl implements SchemaManagement {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// oClass.setAbstract(false); // Used to allow to persist Schema in Context Management
|
||||||
oClass.setAbstract(typeDefinition.isAbstract());
|
oClass.setAbstract(typeDefinition.isAbstract());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(
|
logger.error(
|
||||||
|
@ -240,6 +250,8 @@ public class SchemaManagementImpl implements SchemaManagement {
|
||||||
* so that on Type declaration they are forced to false
|
* so that on Type declaration they are forced to false
|
||||||
* ovp.setMandatory(property.isMandatory());
|
* ovp.setMandatory(property.isMandatory());
|
||||||
* ovp.setNotNull(property.isNotnull());
|
* ovp.setNotNull(property.isNotnull());
|
||||||
|
*
|
||||||
|
* This information are persisted in Management Context
|
||||||
*/
|
*/
|
||||||
op.setMandatory(false);
|
op.setMandatory(false);
|
||||||
op.setNotNull(false);
|
op.setNotNull(false);
|
||||||
|
@ -277,7 +289,14 @@ public class SchemaManagementImpl implements SchemaManagement {
|
||||||
typeDefinition.getName());
|
typeDefinition.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SchemaContextManagement managementUtility = new SchemaContextManagement();
|
||||||
|
String ret = managementUtility.create(jsonSchema, baseType);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TODO Remove when the previous has been implemented
|
||||||
String ret = getTypeDefinitionAsString(toBeSerializedOClass);
|
String ret = getTypeDefinitionAsString(toBeSerializedOClass);
|
||||||
|
|
||||||
logger.info("{} type registered successfully: {}",
|
logger.info("{} type registered successfully: {}",
|
||||||
baseType.getName(), jsonSchema);
|
baseType.getName(), jsonSchema);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -307,12 +326,23 @@ public class SchemaManagementImpl implements SchemaManagement {
|
||||||
OClass baseOClass = getTypeSchema(oSchema, type, null);
|
OClass baseOClass = getTypeSchema(oSchema, type, null);
|
||||||
|
|
||||||
List<TypeDefinition> typeDefinitions = new ArrayList<>();
|
List<TypeDefinition> typeDefinitions = new ArrayList<>();
|
||||||
|
typeDefinitions.add(getTypeDefinition(baseOClass));
|
||||||
|
|
||||||
|
if(includeSubtypes){
|
||||||
|
Collection<OClass> subClasses = baseOClass.getAllSubclasses();
|
||||||
|
for (OClass oClass : subClasses) {
|
||||||
|
typeDefinitions.add(getTypeDefinition(oClass));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
Collection<OClass> oClasses = oSchema.getClasses();
|
Collection<OClass> oClasses = oSchema.getClasses();
|
||||||
for (OClass oClass : oClasses) {
|
for (OClass oClass : oClasses) {
|
||||||
if (oClass.isSubClassOf(baseOClass)) {
|
if (oClass.isSubClassOf(baseOClass)) {
|
||||||
typeDefinitions.add(getTypeDefinition(oClass));
|
typeDefinitions.add(getTypeDefinition(oClass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
return TypeBinder.serializeTypeDefinitions(typeDefinitions);
|
return TypeBinder.serializeTypeDefinitions(typeDefinitions);
|
||||||
} catch (SchemaException e) {
|
} catch (SchemaException e) {
|
||||||
|
|
Loading…
Reference in New Issue