diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java index 3643f3f20f86..675d5c18925e 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java @@ -17,7 +17,7 @@ package org.jetbrains.idea.maven.model; import java.io.Serializable; -public class MavenProfileActivation implements Serializable { +public class MavenProfileActivation implements Serializable, Cloneable { private boolean myActiveByDefault; private MavenProfileActivationOS myOs; private String myJdk; @@ -63,4 +63,14 @@ public class MavenProfileActivation implements Serializable { public void setFile(MavenProfileActivationFile file) { myFile = file; } + + @Override + public MavenProfileActivation clone() { + try { + return (MavenProfileActivation)super.clone(); + } + catch (CloneNotSupportedException e) { + throw new InternalError(); + } + } } diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java index 4d5d8597a0fb..0bee080b8c84 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java @@ -437,7 +437,7 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven if (expandedProfilesCache == null) expandedProfilesCache = doInterpolate(nativeModel, basedir).getProfiles(); Profile eachExpandedProfile = expandedProfilesCache.get(i); - for (ProfileActivator eachActivator : getProfileActivators()) { + for (ProfileActivator eachActivator : getProfileActivators(basedir)) { try { if (eachActivator.canDetermineActivation(eachExpandedProfile) && eachActivator.isActive(eachExpandedProfile)) { shouldAdd = true; @@ -471,7 +471,7 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven collectProfilesIds(activatedProfiles)); } - private static ProfileActivator[] getProfileActivators() throws RemoteException { + private static ProfileActivator[] getProfileActivators(File basedir) throws RemoteException { SystemPropertyProfileActivator sysPropertyActivator = new SystemPropertyProfileActivator(); DefaultContext context = new DefaultContext(); context.put("SystemProperties", MavenServerUtil.collectSystemProperties()); @@ -483,7 +483,7 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven return new ProfileActivator[0]; } - return new ProfileActivator[]{new FileProfileActivator(), + return new ProfileActivator[]{new MyFileProfileActivator(basedir), sysPropertyActivator, new JdkPrefixProfileActivator(), new OperatingSystemProfileActivator()}; diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/MyFileProfileActivator.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/MyFileProfileActivator.java new file mode 100644 index 000000000000..3d3515294c88 --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/MyFileProfileActivator.java @@ -0,0 +1,118 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.server.embedder; + +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 + * + * @author Sergey Evdokimov + */ +public class MyFileProfileActivator extends DetectedProfileActivator + implements LogEnabled +{ + private Logger logger; + + private final File baseDir; + + public MyFileProfileActivator(File baseDir) { + this.baseDir = baseDir; + } + + protected boolean canDetectActivation( Profile profile ) + { + return profile.getActivation() != null && profile.getActivation().getFile() != null; + } + + 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; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java index 70bd3d6942f6..ab9f229ac384 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java @@ -34,8 +34,7 @@ import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenUtil; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.*; import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces; @@ -440,7 +439,12 @@ public class MavenProjectReader { // todo: it is a quick-hack here - we add inherited dummy profiles to correctly collect activated profiles in 'applyProfiles'. List profiles = model.getProfiles(); for (MavenProfile each : parentModel.getProfiles()) { - addProfileIfDoesNotExist(new MavenProfile(each.getId(), each.getSource()), profiles); + MavenProfile copyProfile = new MavenProfile(each.getId(), each.getSource()); + if (each.getActivation() != null) { + copyProfile.setActivation(each.getActivation().clone()); + } + + addProfileIfDoesNotExist(copyProfile, profiles); } return model; } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/StructureImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/StructureImportingTest.java index 17c10e2c8001..aa5b2fe25357 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/StructureImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/StructureImportingTest.java @@ -1063,6 +1063,61 @@ public class StructureImportingTest extends MavenImportingTestCase { assertModules("project", "m"); } + public void testFileProfileActivationInParentPom() throws Exception { + createProjectPom("test" + + "project" + + "1" + + "pom" + + + " " + + " " + + " xxx" + + " " + + " " + + " junit" + + " junit" + + " 4.0" + + " " + + " " + + " " + + " " + + " src/io.properties" + + " " + + " " + + " " + + " " + + + "" + + " m1" + + " m2" + + ""); + + createModulePom("m1", "test" + + "m1" + + + "" + + " test" + + " project" + + " 1" + + ""); + + createModulePom("m2", "test" + + "m2" + + + "" + + " test" + + " project" + + " 1" + + ""); + createProjectSubFile("m2/src/io.properties", ""); + + importProject(); + + assertModules("project", "m1", "m2"); + assertModuleLibDeps("m1"); + assertModuleLibDeps("m2", "Maven: junit:junit:4.0"); + } + public void testProjectWithProfilesXmlFile() throws Exception { createProjectPom("test" + "project" +