package au.com.langdale.inference; import static au.com.langdale.inference.StandardFunctorActions.check; import java.util.Map; import au.com.langdale.kena.ModelFactory; import au.com.langdale.kena.NodeIterator; import au.com.langdale.kena.OntResource; import au.com.langdale.kena.Property; import au.com.langdale.kena.ResourceFactory; import com.hp.hpl.jena.graph.Graph; import com.hp.hpl.jena.graph.Node; public class RepairLibrary extends RepairFunctors { public static class Remove extends RepairFunctor { @Override protected void checkArgs(Node[] args) { check(args.length >= 1 || args.length <= 3, ARGS); } @Override protected void repair(Node[] args, Graph graph, Map renames) { OntResource subj = ModelFactory.createMem(graph).createResource(args[0]); if( args.length == 1) subj.removeRecursive(); else { Property prop = ResourceFactory.createProperty(args[1]); if(args.length == 2) remove(subj, prop); else remove(subj, prop, args[2]); } } @Override public String getComment() { return "remove this item"; } @Override public String getDescription(Node[] args) { if( args.length == 1) return "remove all references to " + args[0]; else if( args.length == 2) return "remove property " + args[1] + " from " + args[0]; else return "remove property (" + args[0] + " " + args[1] + " " + args[2] + ")"; } @Override public int getPriority() { return 9; } } public static class SetProperty extends RepairFunctor { @Override protected void checkArgs(Node[] args) { check(args.length == 3, ARGS); } @Override protected void repair(Node[] args, Graph graph, Map renames) { OntResource subj = ModelFactory.createMem(graph).createResource(args[0]); Property prop = ResourceFactory.createProperty(args[1]); Node value = args[2]; remove(subj, prop, value); subj.addProperty(prop, value); } @Override public String getComment() { return "set property"; } @Override public String getDescription(Node[] args) { return "set property (" + args[0] + " " + args[1] + " " + args[2] + ")"; } @Override public int getPriority() { return 3; } } public static class Rename extends RepairFunctor { @Override protected void checkArgs(Node[] args) { check(args.length == 3, ARGS); } @Override protected void repair(Node[] args, Graph graph, Map renames) { renames.put(args[0], args[1]); } @Override public String getComment() { return "rename this item"; } @Override public String getDescription(Node[] args) { return "rename all references to " + args[0] + " as " + args[1]; } @Override public int getPriority() { return 1; } } protected static void remove(OntResource subj, Property prop, Node value) { subj.removeProperty(prop, value); if( value.isBlank()) { subj.getOntModel().createResource(value).removeRecursive(); } } protected static void remove(OntResource subj, Property prop) { for( NodeIterator it = subj.listObjects(prop); it.hasNext();) remove(subj, prop, it.nextNode()); } static void addAll() { add(new Remove()); add(new Rename()); add(new SetProperty()); } }