package org.codehaus.mojo.hibernate2;
/*
* 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.MojoExecutionException;
import org.codehaus.mojo.hibernate2.beans.CommonOperationsBean;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
/**
* @goal aggregate-mappings
*
* @requiresDependencyResolution
*
* @description A Maven 2.0 Hibernate plugin for schema update
*
* @phase process-sources
*
* @version $Id$
*/
public class MappingsAggregatorMojo
extends CommonOperationsBean
{
/**
* a filename to output the aggregated hibernate mappings to
*
* @parameter expression="${project.build.directory}/schema/aggregate.sql"
* @required
*/
private String outputFile;
public void execute()
throws MojoExecutionException
{
try
{
String version = null;
if ( getBasedir() == null )
{
throw new MojoExecutionException( "Required configuration missing: basedir" );
}
File files[] = getIncludeFiles();
if ( files == null || files.length <= 0 )
{
return;
}
File f = new File( getOutputFile() );
if ( !f.exists() )
{
f.getParentFile().mkdirs();
f.createNewFile();
}
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter( new FileWriter( f ), format );
writer.setEntityResolver( new HibernateEntityResolver() );
//writer.setResolveEntityRefs(false);
Document finalDoc = DocumentHelper.createDocument();
Element rootHM = null;
for ( int i = 0; i < files.length; i++ )
{
print( "Parsing: " + files[ i ].getAbsolutePath() );
SAXReader reader = new SAXReader( false );
reader.setEntityResolver( new HibernateEntityResolver() );
//reader.setIncludeExternalDTDDeclarations(false);
//reader.setIncludeExternalDTDDeclarations(false);
Document current = reader.read( files[ i ] );
String currentVersion = getVersion( current );
if ( version == null )
{
version = currentVersion;
finalDoc.setProcessingInstructions( current.processingInstructions() );
finalDoc.setDocType( current.getDocType() );
rootHM = finalDoc.addElement( "hibernate-mapping" );
}
else if ( !version.equals( currentVersion ) )
{
//LOG.warn("Mapping in " + files[i].getName() + " is not of the same mapping version as " + files[0].getName() + " mapping, so merge is impossible. Skipping");
continue;
}
for ( Iterator iter = current.selectSingleNode( "hibernate-mapping" ).selectNodes(
"class" ).iterator(); iter.hasNext(); rootHM.add( (Element) ( (Element) iter.next() ).clone() ) )
{
}
}
print( "Writing aggregate file: " + f.getAbsolutePath() );
writer.write( finalDoc );
writer.close();
}
catch ( Exception ex )
{
throw new MojoExecutionException( "Error in executing MappingsAgrregatorBean", ex );
}
}
public String getOutputFile()
{
return outputFile;
}
public void setOutputFile( String outputFile )
{
this.outputFile = outputFile;
}
private String getVersion( Document current )
{
String docType = current.getDocType().getText();
if ( docType == null || "".equals( docType.trim() ) )
{
return "";
}
if ( docType.indexOf( "hibernate-mapping-2.0.dtd" ) > 0 )
{
return "2.0";
}
if ( docType.indexOf( "hibernate-mapping-1.1.dtd" ) > 0 )
{
return "1.1";
}
else
{
return null;
}
}
}