/*******************************************************************************
* Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.aether.internal.ant.tasks;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.tools.ant.BuildException;
import org.eclipse.aether.artifact.Artifact;
/**
*/
class Layout
{
public static final String GID = "{groupId}";
public static final String GID_DIRS = "{groupIdDirs}";
public static final String AID = "{artifactId}";
public static final String VER = "{version}";
public static final String BVER = "{baseVersion}";
public static final String EXT = "{extension}";
public static final String CLS = "{classifier}";
private String[] tokens;
public Layout( String layout )
throws BuildException
{
Collection<String> valid = new HashSet<String>( Arrays.asList( GID, GID_DIRS, AID, VER, BVER, EXT, CLS ) );
List<String> tokens = new ArrayList<String>();
Matcher m = Pattern.compile( "(\\{[^}]*\\})|([^{]+)" ).matcher( layout );
while ( m.find() )
{
if ( m.group( 1 ) != null && !valid.contains( m.group( 1 ) ) )
{
throw new BuildException( "Invalid variable '" + m.group() + "' in layout, supported variables are "
+ new TreeSet<String>( valid ) );
}
tokens.add( m.group() );
}
this.tokens = tokens.toArray( new String[tokens.size()] );
}
public String getPath( Artifact artifact )
{
StringBuilder buffer = new StringBuilder( 128 );
for ( int i = 0; i < tokens.length; i++ )
{
String token = tokens[i];
if ( GID.equals( token ) )
{
buffer.append( artifact.getGroupId() );
}
else if ( GID_DIRS.equals( token ) )
{
buffer.append( artifact.getGroupId().replace( '.', '/' ) );
}
else if ( AID.equals( token ) )
{
buffer.append( artifact.getArtifactId() );
}
else if ( VER.equals( token ) )
{
buffer.append( artifact.getVersion() );
}
else if ( BVER.equals( token ) )
{
buffer.append( artifact.getBaseVersion() );
}
else if ( CLS.equals( token ) )
{
if ( artifact.getClassifier().length() <= 0 )
{
if ( i > 0 )
{
String lt = tokens[i - 1];
if ( lt.length() > 0 && "-_".indexOf( lt.charAt( lt.length() - 1 ) ) >= 0 )
{
buffer.setLength( buffer.length() - 1 );
}
}
}
else
{
buffer.append( artifact.getClassifier() );
}
}
else if ( EXT.equals( token ) )
{
buffer.append( artifact.getExtension() );
}
else
{
buffer.append( token );
}
}
return buffer.toString();
}
}