Java tutorial
/******************************************************************************* * 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); } } }