package org.drools.shapes;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.drools.semantics.builder.DLFactory;
import org.drools.semantics.builder.DLFactoryBuilder;
import org.drools.semantics.builder.DLFactoryConfiguration;
import org.drools.semantics.builder.model.DRLModel;
import org.drools.semantics.builder.model.JarModel;
import org.drools.semantics.builder.model.ModelFactory;
import org.drools.semantics.builder.model.OntoModel;
import org.drools.semantics.builder.model.SemanticXSDModel;
import org.drools.semantics.builder.model.compilers.ModelCompiler;
import org.drools.semantics.builder.model.compilers.ModelCompilerFactory;
import org.drools.semantics.builder.model.compilers.XSDModelCompiler;
import org.w3._2002._07.owl.Thing;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Goal which creates various possible fact model representations from an ontology
*
* @goal cast
*
* @phase generate-sources
* @requiresDependencyResolution compile
*/
public class ShapeCaster
extends AbstractMojo
{
/**
* @parameter default-value="false"
*/
private String inheritanceMode = OntoModel.Mode.HIERARCHY.name();
private OntoModel.Mode mode;
public String getInheritanceMode() {
return inheritanceMode;
}
public void setInheritanceMode(String inheritanceMode) {
this.inheritanceMode = inheritanceMode;
this.mode = OntoModel.Mode.valueOf( inheritanceMode );
}
/**
* @parameter default-value="./target/gen-sources"
*/
private File outputDirectory;
public File getOutputDirectory() {
return outputDirectory;
}
public void setOutputDirectory(File outputDirectory) {
this.outputDirectory = outputDirectory;
}
/**
* @parameter
*/
private String persistenceTemplate;
public String getPersistenceTemplate() {
return persistenceTemplate;
}
public void setPersistenceTemplate(String persistenceTemplate) {
this.persistenceTemplate = persistenceTemplate;
}
/**
* @parameter
*/
private String ontology;
public String getOntology() {
return ontology;
}
public void setOntology(String ontology) {
this.ontology = ontology;
}
/**
* @parameter
*/
private List<String> ontologyImports;
public List<String> getOntologyImports() {
return ontologyImports;
}
public void setOntologyImports(List<String> ontologyImports) {
this.ontologyImports = ontologyImports;
}
/**
* @parameter default-value="model"
*/
private String modelName;
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
/**
* @parameter default-value="default"
*/
private String axiomInference = OntoModelCompiler.AXIOM_INFERENCE.DEFAULT.name();
public String getAxiomInference() {
return axiomInference;
}
public void setAxiomInference( String axiomInference ) {
this.axiomInference = axiomInference;
}
/**
* @parameter default-value="false"
*/
private boolean disableFullReasoning;
public boolean isDisableFullReasoning() {
return disableFullReasoning;
}
public void setDisableFullReasoning( boolean disableFullReasoning ) {
this.disableFullReasoning = disableFullReasoning;
}
/**
* @parameter default-value="true"
*/
private boolean generateInterfaces = true;
public boolean isGenerateInterfaces() {
return generateInterfaces;
}
public void setGenerateInterfaces(boolean generateInterfaces) {
this.generateInterfaces = generateInterfaces;
}
/**
* @parameter default-value="false"
*/
private boolean generateInterfaceJar = false;
public boolean isGenerateInterfaceJar() {
return generateInterfaceJar;
}
public void setGenerateInterfaceJar(boolean generateInterfaceJar) {
this.generateInterfaceJar = generateInterfaceJar;
}
/**
* @parameter default-value="true"
*/
private boolean generateTraitDRL = true;
public boolean isGenerateTraitDRL() {
return generateTraitDRL;
}
public void setGenerateTraitDRL(boolean generateTraitDRL) {
this.generateTraitDRL = generateTraitDRL;
}
/**
* @parameter default-value="true"
*/
private boolean generateDefaultImplClasses = true;
public boolean isGenerateDefaultImplClasses() {
return generateDefaultImplClasses;
}
public void setGenerateDefaultImplClasses(boolean generateDefaultImplClasses) {
this.generateDefaultImplClasses = generateDefaultImplClasses;
}
/**
* @parameter default-value="false"
*/
private boolean generateSpecXSDs = false;
public boolean isGenerateSpecXSDs() {
return generateSpecXSDs;
}
public void setGenerateSpecXSDs(boolean generateSpecXSDs) {
this.generateSpecXSDs = generateSpecXSDs;
}
/**
* @parameter default-value="true"
*/
private boolean generateIndividuals = true;
public boolean isGenerateIndividuals() {
return generateIndividuals;
}
public void setGenerateIndividuals(boolean generateIndividuals) {
this.generateIndividuals = generateIndividuals;
}
/**
* @parameter default-value="default"
*/
private String compilationOptionsPackage = "default";
public String getCompilationOptionsPackage() {
return compilationOptionsPackage;
}
public void setCompilationOptionsPackage( String compilationOptionsPackage ) {
this.compilationOptionsPackage = compilationOptionsPackage;
}
/**
* @parameter
*/
private List<String> compilationOptions;
public List<String> getCompilationOptions() {
return compilationOptions;
}
public void setCompilationOptions( List<String> compilationOptions ) {
this.compilationOptions = compilationOptions;
}
public void execute() throws MojoExecutionException {
File target = new File( outputDirectory.getAbsolutePath() );
OntoModel results = processOntology( mode );
OntoModelCompiler compiler = new OntoModelCompiler( results, target );
if ( compiler.existsResult() ) {
getLog().warn( "Target folder " + target + " seems to already contain generated code, " +
"the generation process will be skipped. Please consider using \'clean\' in the build process." );
return;
}
if ( isGenerateTraitDRL() ) {
// generateDRLDeclares(results);
compiler.streamDRLDeclares();
}
if ( isGenerateInterfaceJar() || isGenerateInterfaces() ) {
// generateJavaInterfaces( results );
compiler.streamJavaInterfaces( isGenerateInterfaceJar() );
}
if ( isGenerateSpecXSDs() ) {
// generateSpecXSDs( results );
}
if ( isGenerateDefaultImplClasses() ) {
compiler.streamXSDsWithBindings( true, persistenceTemplate );
}
if ( isGenerateIndividuals() ) {
compiler.streamIndividualFactory();
}
OntoModelCompiler.COMPILATION_OPTIONS opts = OntoModelCompiler.COMPILATION_OPTIONS.valueOf( getCompilationOptionsPackage().toUpperCase() );
if ( opts == null ) {
opts = OntoModelCompiler.COMPILATION_OPTIONS.DEFAULT;
}
Set<String> mergedOptions = new HashSet( opts.getOptions() );
if ( compilationOptions != null && compilationOptions.size() > 0 ) {
mergedOptions.addAll( compilationOptions );
}
compiler.mojo( new ArrayList( mergedOptions ),
OntoModelCompiler.MOJO_VARIANTS.JPA2 );
}
// private void generateSpecXSDs(OntoModel results) throws MojoExecutionException {
//
// ModelCompiler compiler = ModelCompilerFactory.newModelCompiler( ModelFactory.CompileTarget.XSDX );
// SemanticXSDModel xsdModel;
//
// ((XSDModelCompiler) compiler).setTransientPropertiesEnabled( false );
// ((XSDModelCompiler) compiler).setUseImplementation( false );
// ((XSDModelCompiler) compiler).setSchemaMode( XSDModelCompiler.XSDSchemaMode.SPEC );
// xsdModel = (SemanticXSDModel) compiler.compile( results );
//
// try {
// File fos = new File( metainf.getAbsolutePath() + File.separator + getModelName() + XSDModelCompiler.XSDSchemaMode.SPEC.getFileSuffix() + ".xsd" );
// xsdModel.stream( fos );
// } catch (Exception e) {
// throw new MojoExecutionException( e.getMessage() );
// }
//
//
// ((XSDModelCompiler) compiler).setTransientPropertiesEnabled( false );
// ((XSDModelCompiler) compiler).setUseImplementation( true );
// ((XSDModelCompiler) compiler).setSchemaMode( XSDModelCompiler.XSDSchemaMode.IMPL );
// xsdModel = (SemanticXSDModel) compiler.compile( results );
//
// try {
// File fos = new File( metainf.getAbsolutePath() + File.separator + getModelName() + XSDModelCompiler.XSDSchemaMode.IMPL.getFileSuffix() + ".xsd" );
// xsdModel.stream( fos );
// } catch (Exception e) {
// throw new MojoExecutionException( e.getMessage() );
// }
//
// ((XSDModelCompiler) compiler).setTransientPropertiesEnabled( true );
// ((XSDModelCompiler) compiler).setUseImplementation( false );
// ((XSDModelCompiler) compiler).setSchemaMode( XSDModelCompiler.XSDSchemaMode.FULL );
// xsdModel = (SemanticXSDModel) compiler.compile( results );
//
// try {
// File fos = new File( metainf.getAbsolutePath() + File.separator + getModelName() + XSDModelCompiler.XSDSchemaMode.FULL.getFileSuffix() + ".xsd" );
// xsdModel.stream( fos );
// } catch (Exception e) {
// throw new MojoExecutionException( e.getMessage() );
// }
//
// }
private OntoModel processOntology( OntoModel.Mode mode ) throws MojoExecutionException {
InputStream ontologyStream = null;
File ontoFile = new File( ontology );
if ( ontoFile.exists() ) {
try {
ontologyStream = new FileInputStream( new File( ontology ) );
} catch ( FileNotFoundException e ) {
e.printStackTrace();
}
} else {
try {
ontologyStream = ResourceFactory.newClassPathResource( ontology ).getInputStream();
} catch ( IOException e ) {
//
}
}
DLFactory factory = DLFactoryBuilder.newDLFactoryInstance();
if ( ontologyImports == null ) {
ontologyImports = Collections.emptyList();
}
int n = 1 + ontologyImports.size();
Resource[] res = new Resource[ n ];
int j = 0;
for ( String imp : ontologyImports ) {
if ( new File( imp ).exists() ) {
res[j++] = ResourceFactory.newFileResource( imp );
} else {
res[j++] = ResourceFactory.newClassPathResource( imp );
}
}
res[j] = ResourceFactory.newInputStreamResource( ontologyStream );
DLFactoryConfiguration conf = new DLFactoryConfiguration();
conf.setMode( mode );
conf.setAxiomGens( OntoModelCompiler.AXIOM_INFERENCE.valueOf( axiomInference.toUpperCase() ).getGenerators() );
conf.setDisableFullReasoner( this.disableFullReasoning );
return factory.buildModel( getModelName(),
res,
conf,
Thread.currentThread().getContextClassLoader() );
}
}