blob: d3534067a57f160f0f5cbc4b5e2f8c988d60ec2c [file] [log] [blame]
package org.apache.maven.plugin.invoker;
/*
* 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.
*/
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TimeZone;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
import org.codehaus.plexus.util.xml.Xpp3DomUtils;
import org.codehaus.plexus.util.xml.Xpp3DomWriter;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* Provides utility methods for artifact metadata processing.
*
* @author Benjamin Bentmann
*/
class MetadataUtils
{
/**
* Creates local metadata files for the specified artifact. The goal is to simulate the installation of the artifact
* by a local build, thereby decoupling the forked builds from the inderministic collection of remote repositories
* that are available to the main build and from which the artifact was originally resolved.
*
* @param file The artifact's file in the local test repository, must not be <code>null</code>.
* @param artifact The artifact to create metadata for, must not be <code>null</code>.
* @throws IOException If the metadata could not be created.
*/
public static void createMetadata( File file, Artifact artifact )
throws IOException
{
TimeZone tz = java.util.TimeZone.getTimeZone( "UTC" );
SimpleDateFormat fmt = new SimpleDateFormat( "yyyyMMddHHmmss" );
fmt.setTimeZone( tz );
String timestamp = fmt.format( new Date() );
if ( artifact.isSnapshot() )
{
File metadataFile = new File( file.getParentFile(), "maven-metadata-local.xml" );
Xpp3Dom metadata = new Xpp3Dom( "metadata" );
addChild( metadata, "groupId", artifact.getGroupId() );
addChild( metadata, "artifactId", artifact.getArtifactId() );
addChild( metadata, "version", artifact.getBaseVersion() );
Xpp3Dom versioning = new Xpp3Dom( "versioning" );
versioning.addChild( addChild( new Xpp3Dom( "snapshot" ), "localCopy", "true" ) );
addChild( versioning, "lastUpdated", timestamp );
metadata.addChild( versioning );
writeMetadata( metadataFile, metadata );
}
File metadataFile = new File( file.getParentFile().getParentFile(), "maven-metadata-local.xml" );
Set<String> allVersions = new LinkedHashSet<String>();
Xpp3Dom metadata = readMetadata( metadataFile );
if ( metadata != null )
{
Xpp3Dom versioning = metadata.getChild( "versioning" );
if ( versioning != null )
{
Xpp3Dom versions = versioning.getChild( "versions" );
if ( versions != null )
{
Xpp3Dom[] children = versions.getChildren( "version" );
for ( Xpp3Dom aChildren : children )
{
allVersions.add( aChildren.getValue() );
}
}
}
}
allVersions.add( artifact.getBaseVersion() );
metadata = new Xpp3Dom( "metadata" );
addChild( metadata, "groupId", artifact.getGroupId() );
addChild( metadata, "artifactId", artifact.getArtifactId() );
Xpp3Dom versioning = new Xpp3Dom( "versioning" );
versioning.addChild( addChildren( new Xpp3Dom( "versions" ), "version", allVersions ) );
addChild( versioning, "lastUpdated", timestamp );
metadata.addChild( versioning );
metadata = Xpp3DomUtils.mergeXpp3Dom( metadata, readMetadata( metadataFile ) );
writeMetadata( metadataFile, metadata );
}
private static Xpp3Dom addChild( Xpp3Dom parent, String childName, String childValue )
{
Xpp3Dom child = new Xpp3Dom( childName );
child.setValue( childValue );
parent.addChild( child );
return parent;
}
private static Xpp3Dom addChildren( Xpp3Dom parent, String childName, Collection<String> childValues )
{
for ( String childValue : childValues )
{
addChild( parent, childName, childValue );
}
return parent;
}
private static Xpp3Dom readMetadata( File metadataFile )
throws IOException
{
if ( !metadataFile.isFile() )
{
return null;
}
Reader reader = null;
try
{
reader = ReaderFactory.newXmlReader( metadataFile );
final Xpp3Dom xpp3Dom = Xpp3DomBuilder.build( reader );
reader.close();
reader = null;
return xpp3Dom;
}
catch ( XmlPullParserException e )
{
throw (IOException) new IOException( e.getMessage() ).initCause( e );
}
finally
{
IOUtil.close( reader );
}
}
private static void writeMetadata( File metadataFile, Xpp3Dom metadata )
throws IOException
{
metadataFile.getParentFile().mkdirs();
Writer writer = null;
try
{
writer = WriterFactory.newXmlWriter( metadataFile );
Xpp3DomWriter.write( writer, metadata );
writer.close();
writer = null;
}
finally
{
IOUtil.close( writer );
}
}
}