/*
* (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.foundation.ontology;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.ontology.owl.OWLOntology;
import org.openflexo.foundation.rm.DuplicateResourceException;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.rm.FlexoProjectOntologyResource;
import org.openflexo.foundation.rm.FlexoResource;
import org.openflexo.foundation.rm.InvalidFileNameException;
import org.openflexo.foundation.rm.ProjectRestructuration;
import org.openflexo.foundation.rm.SaveResourceException;
import org.openflexo.foundation.utils.FlexoProjectFile;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.localization.FlexoLocalization;
import com.hp.hpl.jena.ontology.DatatypeProperty;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class ProjectOWLOntology extends OWLOntology implements ProjectOntology {
private static final Logger logger = Logger.getLogger(FlexoOntology.class.getPackage().getName());
private FlexoProjectOntologyResource _resource;
/**
* Creates and returns a newly created data model with resource management (creates the resource)
*
* @return a newly created DMModel
*/
public static ProjectOWLOntology createNewProjectOntology(FlexoProject project) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("createNewProjectOntology(), project=" + project);
}
logger.info("-------------> Create ontology for " + project.getProjectName());
File owlFile = ProjectRestructuration.getExpectedProjectOntologyFile(project, project.getProjectName());
FlexoProjectFile ontologyFile = new FlexoProjectFile(owlFile, project);
ProjectOWLOntology newProjectOntology = createProjectOntology(project.getURI(), owlFile, project.getProjectOntologyLibrary());
project.getProjectOntologyLibrary().registerOntology(newProjectOntology);
FlexoProjectOntologyResource ontologyRes;
try {
ontologyRes = new FlexoProjectOntologyResource(project, newProjectOntology, ontologyFile);
} catch (InvalidFileNameException e) {
e.printStackTrace();
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("This should not happen: invalid file " + ontologyFile);
}
return null;
} catch (DuplicateResourceException e) {
e.printStackTrace();
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("This should not happen: DuplicateResourceException for " + ontologyFile);
}
return null;
}
// newDMModel.initializeDefaultRepositories(dmRes);
try {
// dmRes.saveResourceData();
project.registerResource(ontologyRes);
} catch (Exception e1) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e1.getClass().getName() + ". See console for details.");
}
e1.printStackTrace();
}
try {
ontologyRes.saveResourceData();
} catch (Exception e1) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e1.getClass().getName() + ". See console for details.");
}
e1.printStackTrace();
}
return newProjectOntology;
}
private static ProjectOWLOntology createProjectOntology(String anURI, File owlFile, ProjectOntologyLibrary ontologyLibrary) {
ProjectOWLOntology returned = new ProjectOWLOntology(anURI, owlFile, ontologyLibrary);
Model base = ModelFactory.createDefaultModel();
returned.ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, ontologyLibrary, base);
returned.ontModel.createOntology(anURI);
returned.ontModel.setDynamicImports(true);
returned.load();
return returned;
}
public ProjectOWLOntology(String anURI, File owlFile, ProjectOntologyLibrary ontologyLibrary) {
super(anURI, owlFile, ontologyLibrary);
}
@Override
public boolean getIsReadOnly() {
return false;
}
@Override
public String getName() {
return FlexoLocalization.localizedForKey("project_ontology");
}
@Override
public FlexoProjectOntologyResource getFlexoResource() {
return _resource;
}
@Override
public void setFlexoResource(FlexoResource resource) throws DuplicateResourceException {
_resource = (FlexoProjectOntologyResource) resource;
}
@Override
public void save() throws SaveResourceException {
getFlexoResource().saveResourceData();
}
@Override
public String getClassNameKey() {
return "project_ontology";
}
@Override
public String getDescription() {
return FlexoLocalization.localizedForKey("project_ontology");
}
@Override
public String getInspectorName() {
return Inspectors.VE.PROJECT_ONTOLOGY_INSPECTOR;
}
@Override
public String getDisplayableDescription() {
return "Ontology of project " + getProject().getName();
}
private void pourNePasOublier() {
String FLEXO_CONCEPTS_URI = "http://www.agilebirds.com/openflexo/ontologies/FlexoConceptsOntology.owl";
String FLEXO_MODEL_OBJECT = FLEXO_CONCEPTS_URI + "#FlexoModelObject";
String LINKED_TO_MODEL_PROPERTY = FLEXO_CONCEPTS_URI + "#linkedToModel";
String CLASS_NAME_PROPERTY = FLEXO_CONCEPTS_URI + "#className";
String FLEXO_ID_PROPERTY = FLEXO_CONCEPTS_URI + "#flexoID";
String RESOURCE_NAME_PROPERTY = FLEXO_CONCEPTS_URI + "#resourceName";
String BOT_URI = "http://www.agilebirds.com/openflexo/ontologies/OrganizationTree/BasicOrganizationTree.owl";
String COMPANY_NAME = BOT_URI + "#companyName";
String BOT_EDITOR_URI = "http://www.agilebirds.com/openflexo/ViewPoints/Tests/BasicOrganizationTreeEditor.owl";
String BOT_COMPANY = BOT_EDITOR_URI + "#BOTCompany";
OntModel ontModel = getProject().getProjectOntology().getOntModel();
OntClass fooClass = ontModel.createClass(getProject().getProjectOntology().getOntologyURI() + "#" + "foo");
OntClass foo2Class = ontModel.createClass(getProject().getProjectOntology().getOntologyURI() + "#" + "foo2");
foo2Class.addComment("Test de commentaire", "FR");
foo2Class.addComment("Comment test", "EN");
foo2Class.addSuperClass(fooClass);
FlexoProcess process = getProject().getWorkflow().getRootFlexoProcess();
OntClass flexoModelObject = ontModel.getOntClass(FLEXO_MODEL_OBJECT);
ObjectProperty linkedToModelProperty = ontModel.getObjectProperty(LINKED_TO_MODEL_PROPERTY);
DatatypeProperty classNameProperty = ontModel.getDatatypeProperty(CLASS_NAME_PROPERTY);
DatatypeProperty flexoIDProperty = ontModel.getDatatypeProperty(FLEXO_ID_PROPERTY);
DatatypeProperty resourceNameProperty = ontModel.getDatatypeProperty(RESOURCE_NAME_PROPERTY);
Individual myRootFlexoProcess = ontModel.createIndividual(getProject().getProjectOntology().getURI() + "#MyRootProcess",
flexoModelObject);
myRootFlexoProcess.addProperty(classNameProperty, process.getClass().getName());
myRootFlexoProcess.addProperty(flexoIDProperty, process.getSerializationIdentifier());
myRootFlexoProcess.addProperty(resourceNameProperty, process.getFlexoResource().getFullyQualifiedName());
OntClass botCompany = ontModel.getOntClass(BOT_COMPANY);
DatatypeProperty companyNameProperty = ontModel.getDatatypeProperty(COMPANY_NAME);
Individual agileBirdsCompany = ontModel.createIndividual(getProject().getProjectOntology().getURI() + "#AgileBirds", botCompany);
agileBirdsCompany.addProperty(companyNameProperty, "Agile Birds S.A.");
agileBirdsCompany.addProperty(linkedToModelProperty, myRootFlexoProcess);
}
}