delete(source);
}
- public static boolean startsWith(@NonNls String path1, @NonNls String path2) {
- return startsWith(path1, path2, SystemInfo.isFileSystemCaseSensitive);
+ public static boolean startsWith(@NonNls String path, @NonNls String start) {
+ return startsWith(path, start, SystemInfo.isFileSystemCaseSensitive);
}
- public static boolean startsWith(final String path1, final String path2, final boolean caseSensitive) {
- final int length1 = path1.length();
- final int length2 = path2.length();
+ public static boolean startsWith(final String path, final String start, final boolean caseSensitive) {
+ final int length1 = path.length();
+ final int length2 = start.length();
if (length2 == 0) return true;
if (length2 > length1) return false;
- if (!path1.regionMatches(!caseSensitive, 0, path2, 0, length2)) return false;
+ if (!path.regionMatches(!caseSensitive, 0, start, 0, length2)) return false;
if (length1 == length2) return true;
- char last2 = path2.charAt(length2 - 1);
+ char last2 = start.charAt(length2 - 1);
char next1;
if (last2 == '/' || last2 == File.separatorChar) {
- next1 = path1.charAt(length2 -1);
+ next1 = path.charAt(length2 -1);
}
else {
- next1 = path1.charAt(length2);
+ next1 = path.charAt(length2);
}
return next1 == '/' || next1 == File.separatorChar;
}
OrderRootType type,
MavenArtifact artifact,
String classifier) {
- String newUrl = artifact.getUrlForClassifier(classifier);
+ String newUrl = artifact.getUrlForExtraArtifact(classifier);
for (String url : libraryModel.getUrls(type)) {
if (newUrl.equals(url)) return;
if (MavenConstants.SCOPE_SYSTEM.equals(artifact.getScope()) || isRepositoryUrl(artifact, url, classifier)) {
}
private boolean isRepositoryUrl(MavenArtifact artifact, String url, String classifier) {
- return url.endsWith(artifact.getRelativePathForClassifier(classifier) + JarFileSystem.JAR_SEPARATOR);
+ return url.endsWith(artifact.getRelativePathForExtraArtifact(classifier) + JarFileSystem.JAR_SEPARATOR);
}
public static boolean isChangedByUser(Library library) {
String classes = classRoots[0];
- int dotPos = classes.lastIndexOf(".");
+ if (!classes.endsWith("!/")) return true;
+
+ int dotPos = classes.lastIndexOf("/", classes.length() - 2 /* trim ending !/ */);
if (dotPos == -1) return true;
- String path = classes.substring(0, dotPos);
+ String pathToJar = classes.substring(0, dotPos);
- String jarSuffix = ".jar" + JarFileSystem.JAR_SEPARATOR;
- String sourcesPath = path + "-" + MavenConstants.CLASSIFIER_SOURCES + jarSuffix;
- String javadocPath = path + "-" + MavenConstants.CLASSIFIER_JAVADOC + jarSuffix;
+ String[] sources = library.getUrls(OrderRootType.SOURCES);
+ if (sources.length != 1 || !FileUtil.startsWith(sources[0], pathToJar)) return true;
+
+ String[] javadoc = library.getUrls(JavadocOrderRootType.getInstance());
+ if (javadoc.length != 1 || !FileUtil.startsWith(javadoc[0], pathToJar)) return true;
- for (String each : library.getUrls(OrderRootType.SOURCES)) {
- if (!FileUtil.pathsEqual(each, sourcesPath)) return true;
- }
- for (String each : library.getUrls(JavadocOrderRootType.getInstance())) {
- if (!FileUtil.pathsEqual(each, javadocPath)) return true;
- }
return false;
}
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.embedder.CustomArtifact;
-import static org.jetbrains.idea.maven.project.MavenId.append;
import org.jetbrains.idea.maven.utils.MavenConstants;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import static org.jetbrains.idea.maven.project.MavenId.append;
+
public class MavenArtifact implements Serializable {
private String myGroupId;
private String myArtifactId;
}
public String getRelativePath() {
- return getRelativePathForClassifier(null);
+ return getRelativePathForExtraArtifact(null);
}
- public String getRelativePathForClassifier(String extraClassifier) {
+ public String getRelativePathForExtraArtifact(String extraArtifactClassifier) {
StringBuilder result = new StringBuilder();
result.append(myGroupId.replace('.', '/'));
result.append('/');
result.append(myArtifactId);
result.append('-');
result.append(myVersion);
- if (!StringUtil.isEmptyOrSpaces(myClassifier)) {
- result.append('-');
- result.append(myClassifier);
- }
- if (!StringUtil.isEmptyOrSpaces(extraClassifier)) {
+ if (!StringUtil.isEmptyOrSpaces(extraArtifactClassifier)) {
+ if (MavenConstants.TYPE_TEST_JAR.equals(myType)) {
+ result.append("-test");
+ }
result.append('-');
- result.append(extraClassifier);
+ result.append(extraArtifactClassifier);
result.append(".jar");
}
else {
+ if (!StringUtil.isEmptyOrSpaces(myClassifier)) {
+ result.append('-');
+ result.append(myClassifier);
+ }
result.append(".");
result.append(myExtension);
}
}
public String getUrl() {
- return getUrlForClassifier(null);
+ return getUrlForExtraArtifact(null);
}
- public String getUrlForClassifier(String extraClassifier) {
+ public String getUrlForExtraArtifact(String extraArtifactClassifier) {
String path = getPath();
- if (!StringUtil.isEmptyOrSpaces(extraClassifier)) {
- int dotPos = path.lastIndexOf(".");
- if (dotPos != -1) {// sometimes path doesn't contain '.'; but i can't find any reason.
- String withoutExtension = path.substring(0, dotPos);
- path = MessageFormat.format("{0}-{1}.jar", withoutExtension, extraClassifier);
+ if (!StringUtil.isEmptyOrSpaces(extraArtifactClassifier)) {
+ int repoEnd = path.lastIndexOf(getRelativePath());
+
+ if (repoEnd == -1) {
+ // unknown path format: try to add a classified at the end of the filename
+ int dotPos = path.lastIndexOf(".");
+ if (dotPos != -1) {// sometimes path doesn't contain '.'; but i can't find any reason why.
+ String withoutExtension = path.substring(0, dotPos);
+ path = MessageFormat.format("{0}-{1}.jar", withoutExtension, extraArtifactClassifier);
+ }
+ } else {
+ String repoPath = path.substring(0, repoEnd);
+ path = repoPath + getRelativePathForExtraArtifact(extraArtifactClassifier);
}
}
return VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, path) + JarFileSystem.JAR_SEPARATOR;
public boolean isSupportedDependency(MavenArtifact artifact) {
String t = artifact.getType();
- if (t.equalsIgnoreCase(MavenConstants.TYPE_JAR)
- || t.equalsIgnoreCase("test-jar")
- || t.equalsIgnoreCase("ejb")
- || t.equalsIgnoreCase("ejb-client")) {
+ if (MavenConstants.TYPE_JAR.equalsIgnoreCase(t)
+ || MavenConstants.TYPE_TEST_JAR.equalsIgnoreCase(t)
+ || "ejb".equalsIgnoreCase(t)
+ || "ejb-client".equalsIgnoreCase(t)) {
return true;
}
public static final String SETTINGS_XML = "settings.xml";
public static final String TYPE_JAR = "jar";
+ public static final String TYPE_TEST_JAR = "test-jar";
public static final String TYPE_WAR = "war";
public static final String CLASSIFIER_JAVADOC = "javadoc";
"jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-javadoc.jar!/");
}
+ public void testTestJarDependencies() throws Exception {
+ importProject("<groupId>test</groupId>" +
+ "<artifactId>project</artifactId>" +
+ "<version>1</version>" +
+
+ "<dependencies>" +
+ " <dependency>" +
+ " <groupId>junit</groupId>" +
+ " <artifactId>junit</artifactId>" +
+ " <version>4.0</version>" +
+ " <type>test-jar</type>" +
+ " </dependency>" +
+ "</dependencies>");
+
+ assertModules("project");
+ assertModuleLibDep("project", "Maven: junit:junit:test-jar:tests:4.0",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-tests.jar!/",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-test-sources.jar!/",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-test-javadoc.jar!/");
+ }
+
+ public void testDependencyWithClassifier() throws Exception {
+ importProject("<groupId>test</groupId>" +
+ "<artifactId>project</artifactId>" +
+ "<version>1</version>" +
+
+ "<dependencies>" +
+ " <dependency>" +
+ " <groupId>junit</groupId>" +
+ " <artifactId>junit</artifactId>" +
+ " <version>4.0</version>" +
+ " <classifier>bar</classifier>" +
+ " </dependency>" +
+ "</dependencies>");
+ assertModules("project");
+ assertModuleLibDep("project", "Maven: junit:junit:bar:4.0",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-bar.jar!/",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-sources.jar!/",
+ "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-javadoc.jar!/");
+ }
+
public void testSystemDependencyWithoutPath() throws Exception {
importProject("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"jar://" + envDir + "/lib/tools.jar!/");
}
- public void testTestJarDependencies() throws Exception {
- importProject("<groupId>test</groupId>" +
- "<artifactId>project</artifactId>" +
- "<version>1</version>" +
-
- "<dependencies>" +
- " <dependency>" +
- " <groupId>group</groupId>" +
- " <artifactId>artifact</artifactId>" +
- " <type>test-jar</type>" +
- " <version>1</version>" +
- " </dependency>" +
- "</dependencies>");
-
- assertModules("project");
- assertModuleLibDeps("project", "Maven: group:artifact:test-jar:tests:1");
- }
-
- public void testDependencyWithClassifier() throws Exception {
- importProject("<groupId>test</groupId>" +
- "<artifactId>project</artifactId>" +
- "<version>1</version>" +
-
- "<dependencies>" +
- " <dependency>" +
- " <groupId>group</groupId>" +
- " <artifactId>artifact</artifactId>" +
- " <classifier>bar</classifier>" +
- " <version>1</version>" +
- " </dependency>" +
- "</dependencies>");
- assertModules("project");
- assertModuleLibDeps("project", "Maven: group:artifact:bar:1");
- }
-
public void testDependencyWithVersionRangeOnModule() throws Exception {
createProjectPom("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
assertModuleLibDeps("project", "Maven: org.testng:testng:jdk15:5.8", "Maven: junit:junit:3.8.1");
assertModuleLibDep("project", "Maven: org.testng:testng:jdk15:5.8",
"jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15.jar!/",
- "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15-sources.jar!/",
- "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15-javadoc.jar!/");
+ "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-sources.jar!/",
+ "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-javadoc.jar!/");
setRepositoryPath(new File(myDir, "__repo").getPath());
myProjectsManager.getEmbeddersManagerInTests().reset(); // to recognize repository change
assertModuleLibDep("project", "Maven: org.testng:testng:jdk15:5.8",
"jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15.jar!/",
- "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15-sources.jar!/",
- "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-jdk15-javadoc.jar!/");
+ "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-sources.jar!/",
+ "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-javadoc.jar!/");
}
public void testDoNotPopulateSameRootEntriesOnEveryImport() throws Exception {