The following code shows how to work with facets programmatically. It shows how to access both system and user defined facets and how to do overrides.
----------------------------------------------------------------------
package test;
import java.util.*;
import edu.stanford.smi.protege.model.*;
import edu.stanford.smi.protege.util.*;
/**
* This example shows how to work with system and user defined facets programmatically.
*
* @author Ray Fergerson <fergerson@smi.stanford.edu>
*/
public class FacetsExample {
public static void main(String[] args) {
Collection errors = new ArrayList();
Project project = Project.createNewProject(null, errors);
dumpErrors(errors);
KnowledgeBase kb = project.getKnowledgeBase();
playWithSystemFacet(kb);
playWithUserDefinedFacet(kb);
System.out.println("Done");
}
private static void dumpErrors(Collection errors) {
if (!errors.isEmpty()) {
Iterator i = errors.iterator();
while (i.hasNext()) {
Object o = i.next();
System.out.println("Error: " + o);
}
System.exit(-1);
}
}
private static void playWithSystemFacet(KnowledgeBase kb) {
Collection rootClses = kb.getRootClses();
Cls cls = kb.createCls(null, rootClses);
Slot slot = kb.createSlot(null);
slot.setValueType(ValueType.INTEGER);
Facet numericMinimumFacet = kb.getFacet(Model.Facet.NUMERIC_MINIMUM);
assertTrue(numericMinimumFacet != null);
Slot associatedSlot = numericMinimumFacet.getAssociatedSlot();
playWithFacet(cls, slot, numericMinimumFacet, associatedSlot);
}
/**
* Same stuff as above but with a user defined facet. In order to get a user defined facet we first have to
* define a metaslot and add a template slot to it. This template slot becomes the "associated class" for the facet
* which the system creates for us.
*/
private static void playWithUserDefinedFacet(KnowledgeBase kb) {
Cls defaultMetaSlot = kb.getDefaultSlotMetaCls();
Collection parents = CollectionUtilities.createCollection(defaultMetaSlot);
Cls mySlotMetaSlot = kb.createCls(null, parents);
Slot slotAssociatedWithFacet = kb.createSlot(null);
mySlotMetaSlot.addDirectTemplateSlot(slotAssociatedWithFacet);
Facet myFacet = kb.createFacet(null);
slotAssociatedWithFacet.setAssociatedFacet(myFacet);
Collection rootClses = kb.getRootClses();
Cls cls = kb.createCls(null, rootClses);
Slot slot = kb.createSlot(null, mySlotMetaSlot); // an instance of the new metaslot
slot.setValueType(ValueType.INTEGER);
playWithFacet(cls, slot, myFacet, slotAssociatedWithFacet);
}
private static void playWithFacet(Cls cls, Slot slot, Facet facet, Slot associatedSlot) {
// set the numeric minimum on the slot This is the "top-level facet value"
Integer topLevelValueSet = new Integer(3);
slot.setOwnSlotValue(associatedSlot, topLevelValueSet);
cls.addDirectTemplateSlot(slot);
// now the "facet value at the class" (the real facet value) equal to the top-level value.
Object facetValue = cls.getTemplateFacetValue(slot, facet);
assertTrue(facetValue.equals(topLevelValueSet));
// now set the facet at the class
Integer facetAtClassValueSet = new Integer(5);
cls.setTemplateFacetValue(slot, facet, facetAtClassValueSet);
Object facetAtClassValue = cls.getTemplateFacetValue(slot, facet);
assertTrue(facetAtClassValue.equals(facetAtClassValueSet));
}
private static void assertTrue(boolean b) {
if (!b) {
System.err.println("assert failed");
new Throwable().printStackTrace();
System.exit(-1);
}
}
}