package org.simantics.graph.refactoring; import java.util.Arrays; import org.simantics.databoard.util.URIStringUtils; import org.simantics.graph.query.Path; import org.simantics.graph.query.PathChild; import org.simantics.graph.query.TransferableGraphConversion; import org.simantics.graph.query.UriUtils; import org.simantics.graph.refactoring.MappingSpecification.MappingRule; import org.simantics.graph.representation.External; import org.simantics.graph.representation.Identity; import org.simantics.graph.representation.Internal; import org.simantics.graph.representation.Root; import org.simantics.graph.representation.TransferableGraph1; import org.simantics.graph.representation.TransferableGraphUtils; import org.simantics.graph.store.GraphStore; import org.simantics.graph.store.IdentityStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import gnu.trove.set.hash.TIntHashSet; public class GraphRefactoringUtils { private static final Logger LOGGER = LoggerFactory.getLogger(GraphRefactoringUtils.class); /** * Moves an external resource. Returns true if did something. * @param parentsAffected */ public static boolean moveExternal(TransferableGraph1 tg, IdentityStore ids, Path from, PathChild to, TIntHashSet parentsAffected) throws GraphRefactoringException { // Find from id int fromId = ids.pathToId(from); if(fromId < 0) return false; if(ids.isNewResource(fromId)) throw new GraphRefactoringException("Cannot move internal resource " + from + "."); // Remove old identity int parentId = ids.removeIdentity(fromId); if(parentId >= 0) parentsAffected.add(parentId); // Find parent id int toParentId = ids.createPathToId(to.parent); if(ids.hasChild(toParentId, to.name)) { LOGGER.info("refactor statements from " + from + " to " + to); //throw new GraphRefactoringException("External reference to " + to + " already exists."); int toId = ids.pathToId(to); int[] statements = tg.statements; for(int i=0;i