/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.components.widget; import java.io.File; import java.util.logging.Logger; import javax.swing.SwingUtilities; import org.openflexo.foundation.ontology.FlexoOntology; import org.openflexo.foundation.ontology.OntologicDataType; import org.openflexo.foundation.ontology.OntologyClass; import org.openflexo.foundation.ontology.OntologyProperty; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.toolbox.FileResource; /** * Widget allowing to select an OntologyProperty.<br> * * This widget provides many configuration options: * <ul> * <li>context: required, defines ontology context</li> * <li>strictMode: required, default is false, when true, indicates that properties are retrieved from declared context ontology only</li> * <li>hierarchicalMode: required, default is true, defines if properties are stored relative to a storage class, defined either as the * domain class, or the top-level class where this property is used as a restriction</li> * <li>rootClass: when set, defines top-level class used as storage location, available in hierarchical mode only</li> * <li>domain: when set, defines the domain class, properties not declared having a domain are excluded from this selector</li> * <li>range: when set, defines the range class for object properties, properties not declared having a range are excluded from this * selector</li> * <li>dataType: when set, defines the dataType for data properties, properties not declared having a datatype are excluded from this * selector</li> * <li>selectObjectProperties, indicated if object properties should be retrieved</li> * <li>selectDataProperties, indicated if data properties should be retrieved</li> * <li>selectAnnotationProperties, indicated if annotation properties should be retrieved</li> * </ul> * * @author sguerin * */ public class FIBPropertySelector extends FIBModelObjectSelector<OntologyProperty> { @SuppressWarnings("hiding") static final Logger logger = Logger.getLogger(FIBPropertySelector.class.getPackage().getName()); public static final FileResource FIB_FILE = new FileResource("Fib/FIBPropertySelector.fib"); private FlexoOntology context; private OntologyClass rootClass; private OntologyClass domain; private OntologyClass range; private OntologicDataType dataType; private boolean hierarchicalMode = true; private boolean selectObjectProperties = true; private boolean selectDataProperties = true; private boolean selectAnnotationProperties = false; private boolean strictMode = false; private boolean displayPropertiesInClasses = true; private boolean showOWLAndRDFConcepts = false; private OntologyBrowserModel model = null; public FIBPropertySelector(OntologyProperty editedObject) { super(editedObject); } @Override public void delete() { super.delete(); context = null; domain = null; range = null; range = null; } @Override public File getFIBFile() { return FIB_FILE; } @Override public Class<OntologyProperty> getRepresentedType() { return OntologyProperty.class; } @Override public String renderedString(OntologyProperty editedObject) { if (editedObject != null) { return editedObject.getName(); } return ""; } public FlexoOntology getContext() { return context; } @CustomComponentParameter(name = "context", type = CustomComponentParameter.Type.MANDATORY) public void setContext(FlexoOntology context) { this.context = context; } public String getContextOntologyURI() { if (getContext() != null) { return getContext().getURI(); } return null; } @CustomComponentParameter(name = "contextOntologyURI", type = CustomComponentParameter.Type.MANDATORY) public void setContextOntologyURI(String ontologyURI) { // logger.info("Sets ontology with " + ontologyURI); if (getProject() != null) { FlexoOntology context = getProject().getResourceCenter().getOpenFlexoResourceCenter().retrieveBaseOntologyLibrary() .getOntology(ontologyURI); if (context != null) { setContext(context); } } } public OntologyClass getRootClass() { return rootClass; } @CustomComponentParameter(name = "rootClass", type = CustomComponentParameter.Type.MANDATORY) public void setRootClass(OntologyClass rootClass) { this.rootClass = rootClass; } public String getRootClassURI() { if (getRootClass() != null) { return getRootClass().getURI(); } return null; } @CustomComponentParameter(name = "rootClassURI", type = CustomComponentParameter.Type.MANDATORY) public void setRootClassURI(String aRootClassURI) { // logger.info("Sets rootClassURI with " + aRootClassURI + " context=" + getContext()); if (getContext() != null) { OntologyClass rootClass = getContext().getClass(aRootClassURI); if (rootClass != null) { setRootClass(rootClass); } } } public OntologyClass getDomain() { return domain; } @CustomComponentParameter(name = "domain", type = CustomComponentParameter.Type.OPTIONAL) public void setDomain(OntologyClass domain) { this.domain = domain; } public String getDomainClassURI() { if (getDomain() != null) { return getDomain().getURI(); } return null; } @CustomComponentParameter(name = "domainClassURI", type = CustomComponentParameter.Type.MANDATORY) public void setDomainClassURI(String aDomainClassURI) { // logger.info("Sets domainClassURI with " + aDomainClassURI + " context=" + getContext()); if (getContext() != null) { OntologyClass rootClass = getContext().getClass(aDomainClassURI); if (rootClass != null) { setDomain(rootClass); } } } public OntologyClass getRange() { return range; } @CustomComponentParameter(name = "range", type = CustomComponentParameter.Type.OPTIONAL) public void setRange(OntologyClass range) { this.range = range; } public String getRangeClassURI() { if (getRange() != null) { return getRange().getURI(); } return null; } @CustomComponentParameter(name = "rangeClassURI", type = CustomComponentParameter.Type.MANDATORY) public void setRangeClassURI(String aRangeClassURI) { // logger.info("Sets rangeClassURI with " + aRangeClassURI + " context=" + getContext()); if (getContext() != null) { OntologyClass rootClass = getContext().getClass(aRangeClassURI); if (rootClass != null) { setRange(rootClass); } } } public OntologicDataType getDataType() { return dataType; } @CustomComponentParameter(name = "dataType", type = CustomComponentParameter.Type.OPTIONAL) public void setDataType(OntologicDataType dataType) { this.dataType = dataType; } public boolean getHierarchicalMode() { return hierarchicalMode; } @CustomComponentParameter(name = "hierarchicalMode", type = CustomComponentParameter.Type.OPTIONAL) public void setHierarchicalMode(boolean hierarchicalMode) { this.hierarchicalMode = hierarchicalMode; } public boolean getSelectObjectProperties() { return selectObjectProperties; } @CustomComponentParameter(name = "selectObjectProperties", type = CustomComponentParameter.Type.OPTIONAL) public void setSelectObjectProperties(boolean selectObjectProperties) { this.selectObjectProperties = selectObjectProperties; } public boolean getSelectDataProperties() { return selectDataProperties; } @CustomComponentParameter(name = "selectDataProperties", type = CustomComponentParameter.Type.OPTIONAL) public void setSelectDataProperties(boolean selectDataProperties) { this.selectDataProperties = selectDataProperties; } public boolean getSelectAnnotationProperties() { return selectAnnotationProperties; } @CustomComponentParameter(name = "selectAnnotationProperties", type = CustomComponentParameter.Type.OPTIONAL) public void setSelectAnnotationProperties(boolean selectAnnotationProperties) { this.selectAnnotationProperties = selectAnnotationProperties; } public boolean getStrictMode() { return strictMode; } @CustomComponentParameter(name = "strictMode", type = CustomComponentParameter.Type.OPTIONAL) public void setStrictMode(boolean strictMode) { this.strictMode = strictMode; } public boolean getDisplayPropertiesInClasses() { return displayPropertiesInClasses; } @CustomComponentParameter(name = "displayPropertiesInClasses", type = CustomComponentParameter.Type.OPTIONAL) public void setDisplayPropertiesInClasses(boolean displayPropertiesInClasses) { this.displayPropertiesInClasses = displayPropertiesInClasses; update(); } public boolean getShowOWLAndRDFConcepts() { return showOWLAndRDFConcepts; } @CustomComponentParameter(name = "showOWLAndRDFConcepts", type = CustomComponentParameter.Type.OPTIONAL) public void setShowOWLAndRDFConcepts(boolean showOWLAndRDFConcepts) { this.showOWLAndRDFConcepts = showOWLAndRDFConcepts; update(); } public OntologyBrowserModel getModel() { if (model == null) { model = new OntologyBrowserModel(getContext()) { @Override public void recomputeStructure() { super.recomputeStructure(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { getPropertyChangeSupport().firePropertyChange("model", null, getModel()); } }); } }; model.setStrictMode(getStrictMode()); model.setHierarchicalMode(getHierarchicalMode()); model.setDisplayPropertiesInClasses(getDisplayPropertiesInClasses()); model.setRootClass(getRootClass()); model.setDomain(getDomain()); model.setRange(getRange()); model.setDataType(getDataType()); model.setShowClasses(false); model.setShowIndividuals(false); model.setShowObjectProperties(getSelectObjectProperties()); model.setShowDataProperties(getSelectDataProperties()); model.setShowAnnotationProperties(getSelectAnnotationProperties()); model.setShowOWLAndRDFConcepts(getShowOWLAndRDFConcepts()); /*System.out.println("Recomputing..."); System.out.println("context=" + getContext()); System.out.println("getStrictMode()=" + getStrictMode()); System.out.println("getHierarchicalMode()=" + getHierarchicalMode()); System.out.println("getDisplayPropertiesInClasses()=" + getDisplayPropertiesInClasses()); System.out.println("getRootClass()=" + getRootClass()); System.out.println("getDomain()=" + getDomain()); System.out.println("getRange()=" + getRange()); System.out.println("getDataType()=" + getDataType()); System.out.println("getSelectObjectProperties()=" + getSelectObjectProperties()); System.out.println("getSelectDataProperties()=" + getSelectDataProperties()); System.out.println("getSelectAnnotationProperties()=" + getSelectAnnotationProperties()); System.out.println("getShowOWLAndRDFConcepts()=" + getShowOWLAndRDFConcepts()); model.recomputeStructure();*/ } return model; } public void update() { if (model != null) { model.delete(); model = null; // setEditedObject(this); fireEditedObjectChanged(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { getPropertyChangeSupport().firePropertyChange("model", null, getModel()); } }); } } @Override public void setProject(FlexoProject project) { super.setProject(project); if (project != null) { setContext(project.getProjectOntology()); } } // Please uncomment this for a live test // Never commit this uncommented since it will not compile on continuous build // To have icon, you need to choose "Test interface" in the editor (otherwise, flexo controller is not insanciated in EDIT mode) /*public static void main(String[] args) { FIBAbstractEditor editor = new FIBAbstractEditor() { @Override public Object[] getData() { try { FlexoLoggingManager.initialize(-1, true, null, Level.INFO, null); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } FlexoResourceCenter testResourceCenter = LocalResourceCenterImplementation .instanciateTestLocalResourceCenterImplementation(new FileResource("TestResourceCenter")); // selector.setContext(resourceCenter.retrieveBaseOntologyLibrary().getFlexoConceptOntology()); FlexoOntology o = testResourceCenter.retrieveBaseOntologyLibrary().getOntology( // "http://www.thalesgroup.com/ontologies/sepel-ng/MappingSpecifications.owl"); // "http://www.cpmf.org/ontologies/cpmfInstance"); // "http://www.agilebirds.com/openflexo/ontologies/FlexoConceptsOntology.owl"); // "http://www.w3.org/2002/07/owl"); // "http://www.thalesgroup.com/ontologies/sepel-ng/SEPELOutputModel1.owl"); // "http://www.openflexo.org/test/TestProperties.owl"); // "http://www.w3.org/2000/01/rdf-schema"); "http://www.agilebirds.com/openflexo/ontologies/UML/UML2.owl"); o.loadWhenUnloaded(); FIBPropertySelector selector = new FIBPropertySelector(null); selector.setContext(o); selector.setHierarchicalMode(true); // false selector.setSelectAnnotationProperties(true); selector.setSelectObjectProperties(true); selector.setSelectDataProperties(true); selector.setStrictMode(true); selector.setDomainClassURI("http://www.agilebirds.com/openflexo/ontologies/UML/UML2.owl#Property"); // selector.setRangeClassURI("http://www.thalesgroup.com/ontologies/sepel-ng/SEPELOutputModel1.owl#EmSubMode"); return makeArray(selector); } @Override public File getFIBFile() { return FIB_FILE; } @Override public FIBController makeNewController(FIBComponent component) { return new FlexoFIBController(component); } }; editor.launch(); }*/ }