package io.lumify.migrations; import io.lumify.core.config.Configuration; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import org.securegraph.*; public abstract class OntologyMigrationBase extends MigrationBase { protected OntologyMigrationBase( Graph graph, Configuration configuration ) { super(graph, configuration); } @Override protected Class<? extends ElementMigrationMapperBase> getVertexMigrationMapperClass() { return getMigrationMapperClass(); } protected abstract Class<? extends OntologyMigrationMapper> getMigrationMapperClass(); public static abstract class OntologyMigrationMapper extends ElementMigrationMapperBase { private final OntologyMigration[] migrations; protected OntologyMigrationMapper(OntologyMigration[] migrations) { this.migrations = migrations; } @Override protected boolean migrate(Element element, Context context) { boolean result = false; for (OntologyMigration migration : migrations) { if (migration.migrateElement(this, element)) { result = true; } } for (Property property : element.getProperties()) { for (OntologyMigration migration : migrations) { if (migration.migrateProperty(this, element, property)) { result = true; } } } return result; } } public static abstract class OntologyMigration { public boolean migrateElement(OntologyMigrationMapper ontologyMigrationMapper, Element element) { if (element instanceof Vertex) { return migrateVertex(ontologyMigrationMapper, (Vertex) element); } else if (element instanceof Edge) { return migrateEdge(ontologyMigrationMapper, (Edge) element); } return false; } @SuppressWarnings("unused") public boolean migrateVertex(OntologyMigrationMapper ontologyMigrationMapper, Vertex vertex) { return false; } @SuppressWarnings("unused") public boolean migrateEdge(OntologyMigrationMapper ontologyMigrationMapper, Edge edge) { return false; } @SuppressWarnings("unused") public boolean migrateProperty(OntologyMigrationMapper ontologyMigrationMapper, Element element, Property property) { return false; } } public static class RelationshipIriRenameOntologyMigration extends OntologyMigration { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(RelationshipIriRenameOntologyMigration.class); private final String fromIri; private final String toIri; public RelationshipIriRenameOntologyMigration(String fromIri, String toIri) { this.fromIri = fromIri; this.toIri = toIri; } @Override public boolean migrateEdge(OntologyMigrationMapper ontologyMigrationMapper, Edge edge) { if (!edge.getLabel().equalsIgnoreCase(this.fromIri)) { return false; } if (ontologyMigrationMapper.isDryRun()) { LOGGER.debug("altering edge iri: %s -> %s", edge.toString(), toIri); } else { ontologyMigrationMapper.prepareEdge(edge) .alterEdgeLabel(this.toIri) .save(ontologyMigrationMapper.getAuthorizations()); } return true; } } public static class PropertyIriRenameOntologyMigration extends OntologyMigration { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(PropertyIriRenameOntologyMigration.class); private final String fromIri; private final String toIri; public PropertyIriRenameOntologyMigration(String fromIri, String toIri) { this.fromIri = fromIri; this.toIri = toIri; } @Override public boolean migrateProperty(OntologyMigrationMapper ontologyMigrationMapper, Element element, Property property) { if (!property.getName().equals(this.fromIri)) { return false; } if (ontologyMigrationMapper.isDryRun()) { LOGGER.debug("changing property iri: %s -> %s", property.toString(), toIri); } else { if (element instanceof Vertex) { ontologyMigrationMapper.prepareVertex((Vertex) element) .removeProperty(property.getKey(), property.getName(), property.getVisibility()) .addPropertyValue(property.getKey(), toIri, property.getValue(), property.getMetadata(), property.getVisibility()) .save(ontologyMigrationMapper.getAuthorizations()); } else { ontologyMigrationMapper.prepareEdge((Edge) element) .removeProperty(property.getKey(), property.getName(), property.getVisibility()) .addPropertyValue(property.getKey(), toIri, property.getValue(), property.getMetadata(), property.getVisibility()) .save(ontologyMigrationMapper.getAuthorizations()); } } return true; } } }