blob: b4bcbadd681130ddde0f22d50e6d54d084213538 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.jena.tools.schemagen;
// Imports
///////////////
import java.lang.reflect.Method;
import java.util.List;
import jena.schemagen;
import jena.schemagen.OptionDefinition;
import org.apache.jena.rdf.model.* ;
/**
* <p>An extension to the option class built in to {@link schemagen}, in which we
* allow a two-level defaults hierarchy. Each option is tested against the local
* object. If the result is <code>true</code> or non-null, or if the object has
* no parent options object, then the result stands. Otherwise, the option value
* is delegated to the parent. This allows us to specify global defaults for an
* entire group of files to be processed with maven, while still allowing each
* file to have its own local options.
* </p>
*/
public class SchemagenOptions
extends schemagen.SchemagenOptionsImpl
{
/***********************************/
/* Constants */
/***********************************/
/***********************************/
/* Static variables */
/***********************************/
/***********************************/
/* Instance variables */
/***********************************/
/** The parent options for this options instance */
private SchemagenOptions parent;
/* Constructors */
public SchemagenOptions() throws SchemagenOptionsConfigurationException {
this(null, null);
}
public SchemagenOptions(String defaultOutputDir)
throws SchemagenOptionsConfigurationException {
this(defaultOutputDir, null);
}
public SchemagenOptions(String defaultOutputDir, Source options)
throws SchemagenOptionsConfigurationException {
super( new String[]{} );
//set output to default, source options may override
if (defaultOutputDir != null) {
setOption( OPT.OUTPUT, defaultOutputDir );
}
//set schemagen options from Maven plugin config Source
if (options != null) {
configure(options);
}
}
/***********************************/
/* External signature methods */
/***********************************/
/**
* Set the parent options object for this object
* @param parent Parent options object, or null
*/
protected void setParent( SchemagenOptions parent ) {
this.parent = parent;
}
/**
* Return the parent options object, or null
* @return The parent options object if defined
*/
public SchemagenOptions getParent() {
return parent;
}
/**
* Return true if this options object has a parent
* @return True if parent is defined
*/
public boolean hasParent() {
return getParent() != null;
}
/**
* Get the value of the given option, as a string. If the option is not defined
* locally, return the value of the same option of the parent, if the parent
* is non-null. Otherwise, return <code>null</code>
* @param option The name of the option to retrieve
* @return The value of the option as a string, or null if the option is not defined. If
* the parent is non-null and the option is not defined, delegate the <code>getOption</code>
* to the parent.
*/
public String getStringOption( OPT option ) {
String v = getStringValue( option );
return (v != null) ? v : (parent != null ? parent.getStringOption( option ) : null);
}
/**
* Get the value of the given option, as an RDF node. If the option is not defined
* locally, return the value of the same option of the parent, if the parent
* is non-null. Otherwise, return <code>null</code>
* @param option The name of the option to retrieve
* @return The value of the option as an RDFNode, or null if the option is not defined. If
* the parent is non-null and the option is not defined, delegate the <code>getOption</code>
* to the parent.
*/
public RDFNode getOption( OPT option ) {
RDFNode v = getValue( option );
return (v != null) ? v : (parent != null ? parent.getOption( option ) : null);
}
/**
* Set the value of the given option in the local options list
* @param optionName The option to set, as a string value
* @param value
*/
public void setOption( String optionName, String value ) {
setOption( asOption( optionName ), value );
}
/**
* Set the value of the given option in the local options list
* @param option The option to set
* @param value The string value of the option
*/
public void setOption( OPT option, String value ) {
OptionDefinition od = getOpt( option );
getConfigRoot().addProperty( od.getDeclarationProperty(), value );
}
/**
* Set the value of the given option in the local options list
* @param option The option to set
* @param value The Boolean value of the option
*/
public void setOption( OPT option, boolean value ) {
OptionDefinition od = getOpt( option );
getConfigRoot().addProperty( od.getDeclarationProperty(), ResourceFactory.createTypedLiteral( value ) );
}
/**
* Set the value of the given option in the local options list
* @param option The option to set
* @param value The Resource value of the option
*/
public void setOption( OPT option, Resource value ) {
OptionDefinition od = getOpt( option );
getConfigRoot().addProperty( od.getDeclarationProperty(), value );
}
/***********************************/
/* Internal implementation methods */
/***********************************/
/**
* Configure SchemagenOptions from Source object
* @param options Options from Maven configuration
* @throws SchemagenOptionsConfigurationException
*/
protected void configure(Source options) throws SchemagenOptionsConfigurationException {
for(Method method : options.getClass().getMethods()) {
SchemagenOption schemagenOptionAnnotation =
method.getAnnotation(SchemagenOption.class);
if (schemagenOptionAnnotation != null) {
Object optionValue = null;
try {
optionValue = method.invoke(options);
} catch (Exception e) {
throw new SchemagenOptionsConfigurationException(e);
}
OPT option = schemagenOptionAnnotation.opt();
if (optionValue != null) {
if (optionValue instanceof String) {
setOption(option, (String) optionValue);
} else if (optionValue instanceof Boolean) {
setOption(option, (Boolean) optionValue);
} else if (optionValue instanceof Resource) {
setOption(option, (Resource) optionValue);
} else {
throw new IllegalArgumentException("Schemagen options of type "
+ optionValue.getClass().getCanonicalName()
+ " are not allowed");
}
}
}
}
}
protected OPT asOption( String optString ) {
return OPT.valueOf( optString );
}
/**
* Return true if the given option is set to true, either locally or
* in the parent options object.
*/
@Override
protected boolean isTrue( OPT option ) {
return super.isTrue( option ) || (hasParent() && getParent().isTrue( option ));
}
/**
* Return true if the given option has a value, either locally or
* in the parent options object.
*/
@Override
protected boolean hasValue( OPT option ) {
return super.hasValue( option ) || (hasParent() && getParent().hasValue( option ));
}
/**
* Return the value of the option or null, , either locally or
* from the parent options object.
*/
@Override
protected RDFNode getValue( OPT option ) {
RDFNode v = super.getValue( option );
return (v == null && hasParent()) ? getParent().getValue( option ) : v;
}
/**
* Return the value of the option or null, , either locally or
* from the parent options object.
*/
@Override
protected String getStringValue( OPT option ) {
String v = super.getStringValue( option );
return (v == null && hasParent()) ? getParent().getStringValue( option ) : v;
}
/**
* Return true if the given option has a resource value, either locally or
* in the parent options object.
*/
@Override
protected boolean hasResourceValue( OPT option ) {
return super.hasResourceValue( option ) || (hasParent() && getParent().hasResourceValue( option ));
}
/**
* Return the value of the option or null, , either locally or
* from the parent options object.
*/
@Override
protected Resource getResource( OPT option ) {
Resource r = super.getResource( option );
return (r == null && hasParent()) ? getParent().getResource( option ) : r;
}
/**
* Return all values for the given options as Strings, either locally or
* from the parent options object.
*/
@Override
protected List<String> getAllValues( OPT option ) {
List<String> l = super.getAllValues( option );
return (l.isEmpty() && hasParent()) ? getParent().getAllValues( option ) : l;
}
}