/** * 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; } }