blob: a1dffef583b2574357a48baba5c30ad843e65085 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 Bachmann electronic and others.
* 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:
* Bachmann electronic - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.core.maven;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
import org.codehaus.plexus.interpolation.SingleResponseValueSource;
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
import org.codehaus.plexus.interpolation.ValueSource;
import org.eclipse.tycho.core.shared.Interpolator;
/**
* Class thats interpolates string values like ${project.artifactId}. It is using the
* {@link StringSearchInterpolator} and hiding all plexus interfaces/classes.
* <p>
* Value sources this interpolator uses:
* <ul>
* <li>{@link MavenSession#getSystemProperties()}</li>
* <li>{@link MavenSession#getUserProperties()}</li>
* <li>{@link MavenProject#getProperties()}</li>
* <li>{@link MavenProject} as {@link PrefixedObjectValueSource}</li>
* <li>{@link MavenSession#getSettings()} as {@link PrefixedObjectValueSource}</li>
* <li>{@link MavenProject#getBasedir()} for ${basedir}</li>
* <li>{@link Settings#getLocalRepository()} for ${localRepository}</li>
* </ul>
* </p>
*
*/
public class TychoInterpolator implements Interpolator {
private StringSearchInterpolator interpolator;
public TychoInterpolator(MavenSession mavenSession, MavenProject mavenProject) {
final Properties baseProps = new Properties();
// The order how the properties been added is important!
// It defines which properties win over others
// (session user properties overwrite system properties overwrite project properties)
baseProps.putAll(mavenProject.getProperties());
baseProps.putAll(mavenSession.getSystemProperties());
baseProps.putAll(mavenSession.getUserProperties());
final Settings settings = mavenSession.getSettings();
// roughly match resources plugin behaviour
// Using the project and settings as object value source to get things replaces like
// ${project.artifactId}...;
// Simple string replacement for ${localRepository}, ${version}, ${basedir};
// An and string replacement for all property values
// (session user properties, system properties, project properties).
interpolator = new StringSearchInterpolator();
interpolator.addValueSource(new PrefixedObjectValueSource("project", mavenProject));
interpolator.addValueSource(new PrefixedObjectValueSource("settings", settings));
interpolator.addValueSource(new SingleResponseValueSource("localRepository", settings.getLocalRepository()));
interpolator.addValueSource(new SingleResponseValueSource("version", mavenProject.getVersion()));
interpolator.addValueSource(new SingleResponseValueSource("basedir", mavenProject.getBasedir()
.getAbsolutePath()));
interpolator.addValueSource(new ValueSource() {
@Override
public Object getValue(String expression) {
return baseProps.getProperty(expression);
}
@Override
public void clearFeedback() {
}
@Override
@SuppressWarnings("rawtypes")
public List getFeedback() {
return Collections.EMPTY_LIST;
}
});
}
@Override
public String interpolate(String input) {
try {
return interpolator.interpolate(input);
} catch (org.codehaus.plexus.interpolation.InterpolationException e) {
throw new RuntimeException("Error while interpolating value \"" + input + "\"", e);
}
}
}