blob: 2ea257fe3dec39984610cd25223d397d7d17820e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 SAP SE 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:
* SAP SE - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.core.osgitools;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map.Entry;
import java.util.Properties;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
import org.eclipse.tycho.core.maven.TychoInterpolator;
import org.eclipse.tycho.core.shared.BuildProperties;
import org.eclipse.tycho.core.shared.BuildPropertiesImpl;
import org.eclipse.tycho.core.shared.BuildPropertiesParser;
import org.eclipse.tycho.core.shared.LRUCache;
import org.eclipse.tycho.core.utils.MavenSessionUtils;
@Component(role = BuildPropertiesParser.class)
public class BuildPropertiesParserImpl implements BuildPropertiesParser, Disposable {
@Requirement
private LegacySupport legacySupport;
@Requirement
private Logger logger;
private final LRUCache<String, BuildProperties> cache = new LRUCache<>(50);
public BuildPropertiesParserImpl() {
// empty to let plexus create new instances
}
/**
* Must only be used for tests!
*
* @param legacySupport
*/
protected BuildPropertiesParserImpl(LegacySupport legacySupport, Logger logger) {
this.legacySupport = legacySupport;
this.logger = logger;
}
@Override
public BuildProperties parse(File baseDir) {
File propsFile = new File(baseDir, BUILD_PROPERTIES);
String filePath = propsFile.getAbsolutePath();
BuildProperties buildProperties = cache.get(filePath);
if (buildProperties == null) {
Properties properties = readProperties(propsFile);
interpolate(properties, baseDir);
buildProperties = new BuildPropertiesImpl(properties);
cache.put(filePath, buildProperties);
}
return buildProperties;
}
@Override
public void dispose() {
cache.clear();
}
protected static Properties readProperties(File propsFile) {
Properties properties = new Properties();
if (propsFile.canRead()) {
// TODO should we fail the build if build.properties is missing?
InputStream is = null;
try {
try {
is = new FileInputStream(propsFile);
properties.load(is);
} finally {
if (is != null) {
is.close();
}
}
} catch (IOException e) {
// ignore
}
}
return properties;
}
protected void interpolate(Properties properties, File baseDir) {
if (properties.isEmpty()) {
return;
}
MavenSession mavenSession = legacySupport.getSession();
if (mavenSession == null) {
logger.warn("No maven session available, values in the build.properties will not be interpolated!");
return;
}
// find the maven project for the currently used basedir, so that the correct maven project is used by the interpolator.
// if no project could be found, it does not make sense to interpolate the properties
MavenProject mavenProject = MavenSessionUtils.getMavenProject(mavenSession, baseDir);
if (mavenProject == null) {
logger.warn("No maven project found for baseDir '" + baseDir.getAbsolutePath()
+ "', values in the build.properties will not be interpolated!");
return;
}
TychoInterpolator interpolator = new TychoInterpolator(mavenSession, mavenProject);
for (Entry<Object, Object> entry : properties.entrySet()) {
entry.setValue(interpolator.interpolate((String) entry.getValue()));
}
}
}