package org.codehaus.modello.plugin;
/*
* Copyright (c) 2004, Codehaus.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.codehaus.modello.ModelloException;
import org.codehaus.modello.ModelloParameterConstants;
import org.codehaus.modello.ModelloRuntimeException;
import org.codehaus.modello.model.Model;
import org.codehaus.modello.model.ModelAssociation;
import org.codehaus.modello.model.ModelClass;
import org.codehaus.modello.model.ModelDefault;
import org.codehaus.modello.model.ModelField;
import org.codehaus.modello.model.Version;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.sonatype.plexus.build.incremental.BuildContext;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import org.codehaus.plexus.util.StringUtils;
/**
* @author <a href="mailto:jason@modello.org">Jason van Zyl</a>
* @author <a href="mailto:evenisse@codehaus.org">Emmanuel Venisse</a>
*/
public abstract class AbstractModelloGenerator
extends AbstractLogEnabled
implements ModelloGenerator, Contextualizable
{
private Model model;
private File outputDirectory;
private Version generatedVersion;
private boolean packageWithVersion;
private String encoding;
private BuildContext buildContext;
protected void initialize( Model model, Properties parameters )
throws ModelloException
{
this.model = model;
outputDirectory = new File( getParameter( parameters, ModelloParameterConstants.OUTPUT_DIRECTORY ) );
String version = getParameter( parameters, ModelloParameterConstants.VERSION );
generatedVersion = new Version( version );
packageWithVersion =
Boolean.valueOf( getParameter( parameters, ModelloParameterConstants.PACKAGE_WITH_VERSION ) );
encoding = parameters.getProperty( ModelloParameterConstants.ENCODING );
}
protected Model getModel()
{
return model;
}
protected Version getGeneratedVersion()
{
return generatedVersion;
}
protected boolean isPackageWithVersion()
{
return packageWithVersion;
}
public File getOutputDirectory()
{
return outputDirectory;
}
protected String getEncoding()
{
return encoding;
}
protected String getHeader()
{
String version = getClass().getPackage().getImplementationVersion();
return "=================== DO NOT EDIT THIS FILE ====================\n"
+ "Generated by Modello" + ( ( version == null ) ? "" : ( ' ' + version ) ) + ",\n"
+ "any modifications will be overwritten.\n"
+ "==============================================================";
}
protected boolean isClassInModel( String fieldType, Model model )
{
try
{
return model.getClass( fieldType, generatedVersion ) != null;
}
catch ( Exception e )
{
}
return false;
}
/**
* Return the child fields of this class.
* @param modelClass current class
* @return the list of fields of this class
*/
protected List<ModelField> getFieldsForClass( ModelClass modelClass )
{
List<ModelField> fields = new ArrayList<ModelField>();
while ( modelClass != null )
{
fields.addAll( modelClass.getFields( getGeneratedVersion() ) );
String superClass = modelClass.getSuperClass();
if ( superClass != null )
{
modelClass = getModel().getClass( superClass, getGeneratedVersion() );
}
else
{
modelClass = null;
}
}
return fields;
}
protected boolean isInnerAssociation( ModelField field )
{
return field instanceof ModelAssociation
&& isClassInModel( ( (ModelAssociation) field ).getTo(), getModel() );
}
protected boolean isMap( String fieldType )
{
return ModelDefault.MAP.equals( fieldType ) || ModelDefault.PROPERTIES.equals( fieldType );
}
protected boolean isCollection( String fieldType )
{
return ModelDefault.LIST.equals( fieldType ) || ModelDefault.SET.equals( fieldType );
}
protected String capitalise( String str )
{
if ( StringUtils.isEmpty( str ) )
{
return str;
}
return new StringBuffer( str.length() )
.append( Character.toTitleCase( str.charAt( 0 ) ) )
.append( str.substring( 1 ) )
.toString();
}
public static String singular( String name )
{
if ( StringUtils.isEmpty( name ) )
{
return name;
}
if ( name.endsWith( "ies" ) )
{
return name.substring( 0, name.length() - 3 ) + "y";
}
else if ( name.endsWith( "es" ) && name.endsWith( "ches" ) )
{
return name.substring( 0, name.length() - 2 );
}
else if ( name.endsWith( "xes" ) )
{
return name.substring( 0, name.length() - 2 );
}
else if ( name.endsWith( "s" ) && ( name.length() != 1 ) )
{
return name.substring( 0, name.length() - 1 );
}
return name;
}
public static String uncapitalise( String str )
{
if ( StringUtils.isEmpty( str ) )
{
return str;
}
return new StringBuffer( str.length() )
.append( Character.toLowerCase( str.charAt( 0 ) ) )
.append( str.substring( 1 ) )
.toString();
}
// ----------------------------------------------------------------------
// Text utils
// ----------------------------------------------------------------------
protected boolean isEmpty( String string )
{
return string == null || string.trim().length() == 0;
}
// ----------------------------------------------------------------------
// Parameter utils
// ----------------------------------------------------------------------
/**
* @deprecated @{link Use getParameter( Properties, String )} instead
*/
protected String getParameter( String name, Properties parameters )
{
return getParameter( parameters, name );
}
protected String getParameter( Properties parameters, String name )
{
String value = parameters.getProperty( name );
if ( value == null )
{
throw new ModelloRuntimeException( "Missing parameter '" + name + "'." );
}
return value;
}
protected String getParameter( Properties parameters, String name, String defaultValue )
{
String value = parameters.getProperty( name );
if ( value == null )
{
return defaultValue;
}
return value;
}
public void contextualize( Context ctx )
throws ContextException
{
PlexusContainer plexus = (PlexusContainer) ctx.get( PlexusConstants.PLEXUS_KEY );
try
{
buildContext = (BuildContext) plexus.lookup( BuildContext.class.getName() );
}
catch( ComponentLookupException e )
{
throw new ContextException( "Unable to lookup required component", e );
}
}
protected BuildContext getBuildContext()
{
return buildContext;
}
}