/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.maven.server;
import org.apache.maven.model.Activation;
import org.apache.maven.model.ActivationFile;
import org.apache.maven.model.Profile;
import org.apache.maven.profiles.activation.DetectedProfileActivator;
import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
import org.codehaus.plexus.interpolation.InterpolationException;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.io.IOException;
/**
* Copied from org.apache.maven.profiles.activation.FileProfileActivator,
* added parameter baseDit to test file existing.
*/
public class MavenFileProfileActivator extends DetectedProfileActivator implements LogEnabled {
private Logger logger;
private final File baseDir;
public MavenFileProfileActivator(File baseDir) {
this.baseDir = baseDir;
}
protected boolean canDetectActivation(Profile profile) {
return profile.getActivation() != null && profile.getActivation().getFile() != null;
}
/**
* Returns {@code true} if the file exists, if it does then the profile will be active, otherwise returns {@code false}.
*/
public boolean isActive(Profile profile) {
Activation activation = profile.getActivation();
ActivationFile actFile = activation.getFile();
if (actFile != null) {
// check if the file exists, if it does then the profile will be active
String fileString = actFile.getExists();
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
try {
interpolator.addValueSource(new EnvarBasedValueSource());
} catch (IOException e) {
// ignored
}
interpolator.addValueSource(new MapBasedValueSource(System.getProperties()));
try {
if (StringUtils.isNotEmpty(fileString)) {
fileString = StringUtils.replace(interpolator.interpolate(fileString, ""), "\\", "/");
return fileExists(fileString);
}
// check if the file is missing, if it is then the profile will be active
fileString = actFile.getMissing();
if (StringUtils.isNotEmpty(fileString)) {
fileString = StringUtils.replace(interpolator.interpolate(fileString, ""), "\\", "/");
return !fileExists(fileString);
}
} catch (InterpolationException e) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to interpolate missing file location for profile activator: " + fileString, e);
} else {
logger.warn("Failed to interpolate missing file location for profile activator: " + fileString +
". Run in debug mode (-X) for more information.");
}
}
}
return false;
}
private boolean fileExists(String path) {
return new File(path).exists() || new File(baseDir, path).exists();
}
public void enableLogging(Logger logger) {
this.logger = logger;
}
}