diff --git a/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java b/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java index 1e0008cb867d..1a3244595e6d 100644 --- a/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java +++ b/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java @@ -27,7 +27,7 @@ import com.intellij.refactoring.rename.PsiElementRenameHandler; * @author ven */ public class RenameFileAction extends AnAction implements DumbAware { - public static final String RENAME_FILE = "Rename File"; + public static final String RENAME_FILE = "Rename File..."; public void actionPerformed(final AnActionEvent e) { final PsiFile file = e.getData(LangDataKeys.PSI_FILE); @@ -47,7 +47,7 @@ public class RenameFileAction extends AnAction implements DumbAware { presentation.setVisible(enabled); if (enabled) { presentation.setText(RENAME_FILE); - presentation.setDescription(RENAME_FILE); + presentation.setDescription("Rename selected file"); } } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java index 992c6883f1c7..a28814e37b73 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java @@ -15,7 +15,6 @@ */ package org.jetbrains.ether; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; @@ -31,7 +30,6 @@ import org.jetbrains.jps.Sdk; import org.jetbrains.jps.api.CanceledStatus; import org.jetbrains.jps.idea.IdeaProjectLoader; import org.jetbrains.jps.incremental.*; -import org.jetbrains.jps.incremental.java.JavaBuilder; import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.ProjectTimestamps; import org.jetbrains.jps.server.ClasspathBootstrap; @@ -154,8 +152,12 @@ public abstract class IncrementalTestCase extends TestCase { @Override protected void tearDown() throws Exception { - super.tearDown(); - delete(new File(workDir)); + try { + super.tearDown(); + } + finally { + delete(new File(workDir)); + } } private String getProjectName() { @@ -199,7 +201,7 @@ public abstract class IncrementalTestCase extends TestCase { if (files != null) { for (File f : files) { - copy(f, new File(output.getPath() + File.separator + f.getName())); + copy(f, new File(output.getPath(), f.getName())); } } } @@ -208,16 +210,26 @@ public abstract class IncrementalTestCase extends TestCase { } } else if (input.isFile()) { - final FileReader in = new FileReader(input); - final FileWriter out = new FileWriter(output); + FileReader in = null; + FileWriter out = null; try { + in = new FileReader(input); + out = new FileWriter(output); int c; while ((c = in.read()) != -1) out.write(c); } finally { - in.close(); - out.close(); + try { + if (in != null) { + in.close(); + } + } + finally { + if (out != null) { + out.close(); + } + } } } } @@ -241,7 +253,7 @@ public abstract class IncrementalTestCase extends TestCase { final String basename = pathSep == -1 ? postfix : postfix.substring(pathSep + 1); final String path = getWorkDir() + File.separator + (pathSep == -1 ? "src" : postfix.substring(0, pathSep).replace('-', File.separatorChar)); - final File output = new File(path + File.separator + basename); + final File output = new File(path, basename); if (copy) { copy(input, output); @@ -275,7 +287,7 @@ public abstract class IncrementalTestCase extends TestCase { final Sdk jdk = project.createSdk("JavaSDK", "IDEA jdk", System.getProperty("java.home"), null); final List paths = new LinkedList(); - + paths.add(FileUtil.toSystemIndependentName(ClasspathBootstrap.getResourcePath(Object.class).getCanonicalPath())); jdk.setClasspath(paths); @@ -285,20 +297,32 @@ public abstract class IncrementalTestCase extends TestCase { final ProjectDescriptor projectDescriptor = new ProjectDescriptor(projectPath, project, new FSState(true), new ProjectTimestamps(projectName), new BuildDataManager(projectName, true)); - final IncProjectBuilder builder = new IncProjectBuilder(projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL); + try { - builder.build(new AllProjectScope(project, true), false, true); + new IncProjectBuilder( + projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL + ).build( + new AllProjectScope(project, true), false, true + ); - modify(); + modify(); - if (SystemInfo.isUnix) { - Thread.sleep(1000); + if (SystemInfo.isUnix) { + Thread.sleep(1000L); + } + + new IncProjectBuilder( + projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL + ).build( + new AllProjectScope(project, false), true, false + ); + + FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); + } + finally { + projectDescriptor.release(); } - builder.build(new AllProjectScope(project, false), true, false); - projectDescriptor.release(); - - FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); } } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java index c2650490286c..4df4ce644252 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java @@ -25,30 +25,40 @@ import java.util.Map; * @author yole */ public class CoreJarHandler extends JarHandlerBase { - private final Map myFileMap = new HashMap(); + private final CoreJarFileSystem myFileSystem; + private final VirtualFile myRoot; public CoreJarHandler(CoreJarFileSystem fileSystem, String path) { super(path); myFileSystem = fileSystem; + + Map entries = new HashMap(); + + for (EntryInfo info : getEntriesMap().values()) { + getOrCreateFile(info, entries); + } + + myRoot = getOrCreateFile(getEntryInfo(""), entries); + } + + private CoreJarVirtualFile getOrCreateFile(EntryInfo info, Map entries) { + CoreJarVirtualFile answer = entries.get(info); + if (answer == null) { + EntryInfo parentEntry = info.parent; + answer = new CoreJarVirtualFile(this, info, parentEntry != null ? getOrCreateFile(parentEntry, entries) : null); + entries.put(info, answer); + } + + return answer; } @Nullable public VirtualFile findFileByPath(String pathInJar) { - if (getZip() == null) { - return null; - } - VirtualFile file = myFileMap.get(pathInJar); - if (file == null) { - if (pathInJar.length() > 0) { - EntryInfo entryInfo = getEntryInfo(pathInJar); - if (entryInfo == null) { - return null; - } - } - file = new CoreJarVirtualFile(myFileSystem, this, pathInJar); - myFileMap.put(pathInJar, file); - } - return file; + return myRoot != null ? myRoot.findFileByRelativePath(pathInJar) : null; + } + + public CoreJarFileSystem getFileSystem() { + return myFileSystem; } } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java index c2969d9edc09..e0c4af1adc4a 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java @@ -23,44 +23,42 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.List; /** * @author yole */ public class CoreJarVirtualFile extends VirtualFile { - private final CoreJarFileSystem myFileSystem; private final CoreJarHandler myHandler; - private final String myPathInJar; private final VirtualFile myParent; - private VirtualFile[] myChildren; + private final ArrayList myChildren = new ArrayList(); + private final JarHandlerBase.EntryInfo myEntry; - public CoreJarVirtualFile(CoreJarFileSystem fileSystem, CoreJarHandler handler, String pathInJar) { - myFileSystem = fileSystem; + public CoreJarVirtualFile(CoreJarHandler handler, JarHandlerBase.EntryInfo entry, CoreJarVirtualFile parent) { myHandler = handler; - myPathInJar = pathInJar; - myParent = calcParent(); + myParent = parent; + myEntry = entry; + + if (parent != null) { + parent.myChildren.add(this); + } } @NotNull @Override public String getName() { - final int lastSlash = myPathInJar.lastIndexOf('/'); - if (lastSlash < 0) { - return myPathInJar; - } - return myPathInJar.substring(lastSlash+1); + return myEntry.shortName; } @NotNull @Override public VirtualFileSystem getFileSystem() { - return myFileSystem; + return myHandler.getFileSystem(); } @Override public String getPath() { - return myHandler.myBasePath + "!/" + myPathInJar; + if (myParent == null) return myHandler.myBasePath + "!/"; + return myParent.getPath() + "/" + myEntry.shortName; } @Override @@ -70,7 +68,7 @@ public class CoreJarVirtualFile extends VirtualFile { @Override public boolean isDirectory() { - return myHandler.isDirectory(this); + return myEntry.isDirectory; } @Override @@ -83,35 +81,9 @@ public class CoreJarVirtualFile extends VirtualFile { return myParent; } - private VirtualFile calcParent() { - if (myPathInJar.length() == 0) { - return null; - } - int lastSlash = myPathInJar.lastIndexOf('/'); - if (lastSlash < 0) { - return myHandler.findFileByPath(""); - } - return myHandler.findFileByPath(myPathInJar.substring(0, lastSlash)); - } - @Override public VirtualFile[] getChildren() { - VirtualFile[] answer = myChildren; - if (answer == null) { - answer = calcChildren(); - myChildren = answer; - } - return answer; - } - - private VirtualFile[] calcChildren() { - List result = new ArrayList(); - final String[] children = myHandler.list(this); - for (String child : children) { - final VirtualFile childFile = myPathInJar.isEmpty() ? myHandler.findFileByPath(child) : myHandler.findFileByPath(myPathInJar + "/" + child); - result.add(childFile); - } - return result.toArray(new VirtualFile[result.size()]); + return myChildren.toArray(new VirtualFile[myChildren.size()]); } @NotNull diff --git a/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java b/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java index bf7df2e7e171..4f33e81c9f68 100644 --- a/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java +++ b/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java @@ -137,4 +137,6 @@ public interface ModifiableModuleModel { boolean hasModuleGroups(); void setModuleGroupPath(Module module, String[] groupPath); + + void setModuleFilePath(Module module, String oldPath, String newFilePath); } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java index 98e956b9f60c..2ec203bf6131 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java @@ -22,6 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.command.undo.BasicUndoableAction; +import com.intellij.openapi.command.undo.UndoManager; +import com.intellij.openapi.command.undo.UndoableAction; +import com.intellij.openapi.command.undo.UnexpectedUndoException; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.ModifiableModuleModel; @@ -37,6 +41,7 @@ import com.intellij.psi.PsiFile; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.RenameHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author dsl @@ -86,6 +91,41 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler { } public boolean canClose(final String inputString) { + final String oldName = myModule.getName(); + final ModifiableModuleModel modifiableModel = renameModule(inputString); + if (modifiableModel == null) return false; + final Ref success = Ref.create(Boolean.TRUE); + CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { + public void run() { + UndoableAction action = new BasicUndoableAction() { + public void undo() throws UnexpectedUndoException { + final ModifiableModuleModel modifiableModel = renameModule(oldName); + if (modifiableModel != null) { + modifiableModel.commit(); + } + } + + @Override + public void redo() throws UnexpectedUndoException { + final ModifiableModuleModel modifiableModel = renameModule(inputString); + if (modifiableModel != null) { + modifiableModel.commit(); + } + } + }; + UndoManager.getInstance(myProject).undoableActionPerformed(action); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + modifiableModel.commit(); + } + }); + } + }, IdeBundle.message("command.renaming.module", oldName), null); + return success.get().booleanValue(); + } + + @Nullable + private ModifiableModuleModel renameModule(String inputString) { final ModifiableModuleModel modifiableModel = ModuleManager.getInstance(myProject).getModifiableModel(); try { modifiableModel.renameModule(myModule, inputString); @@ -93,19 +133,9 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler { catch (ModuleWithNameAlreadyExists moduleWithNameAlreadyExists) { Messages.showErrorDialog(myProject, IdeBundle.message("error.module.already.exists", inputString), IdeBundle.message("title.rename.module")); - return false; + return null; } - final Ref success = Ref.create(Boolean.TRUE); - CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { - public void run() { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - public void run() { - modifiableModel.commit(); - } - }); - } - }, IdeBundle.message("command.renaming.module", myModule.getName()), null); - return success.get().booleanValue(); + return modifiableModel; } } diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java index 423711e8b47c..f8dda219271d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java @@ -29,6 +29,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.AreaInstance; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleComponent; import com.intellij.openapi.module.impl.scopes.ModuleWithDependenciesScope; @@ -36,6 +37,7 @@ import com.intellij.openapi.module.impl.scopes.ModuleWithDependentsScope; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.storage.ClasspathStorage; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.psi.search.GlobalSearchScope; @@ -329,6 +331,20 @@ public class ModuleImpl extends ComponentManagerImpl implements Module { final Object requestor = event.getRequestor(); if (MODULE_RENAMING_REQUESTOR.equals(requestor)) return; if (!VirtualFile.PROP_NAME.equals(event.getPropertyName())) return; + + final VirtualFile parent = event.getParent(); + if (parent != null) { + final String parentPath = parent.getPath(); + final String ancestorPath = parentPath + "/" + event.getOldValue(); + final String moduleFilePath = getModuleFilePath(); + if (VfsUtil.isAncestor(new File(ancestorPath), new File(moduleFilePath), true)) { + final String newValue = (String)event.getNewValue(); + final String relativePath = FileUtil.getRelativePath(ancestorPath, moduleFilePath, '/'); + final String newFilePath = parentPath + "/" + newValue + "/" + relativePath; + setModuleFilePath(moduleFilePath, newFilePath); + } + } + final VirtualFile moduleFile = getModuleFile(); if (moduleFile == null) return; if (moduleFile.equals(event.getFile())) { @@ -336,6 +352,29 @@ public class ModuleImpl extends ComponentManagerImpl implements Module { ModuleManagerImpl.getInstanceImpl(getProject()).fireModuleRenamedByVfsEvent(ModuleImpl.this); } } + + private void setModuleFilePath(String moduleFilePath, String newFilePath) { + ClasspathStorage.modulePathChanged(ModuleImpl.this, newFilePath); + + final ModifiableModuleModel modifiableModel = ModuleManagerImpl.getInstanceImpl(getProject()).getModifiableModel(); + modifiableModel.setModuleFilePath(ModuleImpl.this, moduleFilePath, newFilePath); + modifiableModel.commit(); + + getStateStore().setModuleFilePath(newFilePath); + } + + @Override + public void fileMoved(VirtualFileMoveEvent event) { + final VirtualFile oldParent = event.getOldParent(); + final VirtualFile newParent = event.getNewParent(); + final String dirName = event.getFileName(); + final String ancestorPath = oldParent.getPath() + "/" + dirName; + final String moduleFilePath = getModuleFilePath(); + if (VfsUtil.isAncestor(new File(ancestorPath), new File(moduleFilePath), true)) { + final String relativePath = FileUtil.getRelativePath(ancestorPath, moduleFilePath, '/'); + setModuleFilePath(moduleFilePath, newParent.getPath() + "/" + dirName + "/" + relativePath); + } + } } protected MutablePicoContainer createPicoContainer() { diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java index 9cec66af96d5..4c7b91dcb961 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java @@ -919,6 +919,12 @@ public class ModuleManagerImpl extends ModuleManager implements ProjectComponent myModuleGroupPath.put(module, groupPath); } } + + @Override + public void setModuleFilePath(Module module, String oldPath, String newFilePath) { + myPathToModule.remove(oldPath); + myPathToModule.put(newFilePath, module); + } } private void commitModel(final ModuleModelImpl moduleModel, final Runnable runnable) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java index 934b00982e0b..e4c70d8f3651 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java @@ -328,6 +328,10 @@ public class ClasspathStorage implements StateStorage { getProvider(getStorageType(module)).moduleRenamed(module, newName); } + public static void modulePathChanged(Module module, String path) { + getProvider(getStorageType(module)).modulePathChanged(module, path); + } + private static class DefaultStorageProvider implements ClasspathStorageProvider { @NonNls public String getID() { @@ -356,6 +360,10 @@ public class ClasspathStorage implements StateStorage { public String getContentRoot(ModifiableRootModel model) { return null; } + + @Override + public void modulePathChanged(Module module, String path) { + } } public static class UnsupportedStorageProvider implements ClasspathStorageProvider { @@ -406,5 +414,10 @@ public class ClasspathStorage implements StateStorage { public String getContentRoot(ModifiableRootModel model) { return null; } + + @Override + public void modulePathChanged(Module module, String path) { + throw new UnsupportedOperationException(getDescription()); + } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java index 66ef390a49d0..20935866199b 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java @@ -53,6 +53,8 @@ public interface ClasspathStorageProvider { String getContentRoot(ModifiableRootModel model); + void modulePathChanged(Module module, String path); + interface ClasspathConverter { FileSet getFileSet(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java index c69ca7f5379c..81e6f06cf1c4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.impl.local.LocalFileSystemBase; +import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import java.io.FileNotFoundException; @@ -91,6 +92,10 @@ public class Win32LocalFileSystem extends LocalFileSystemBase { @NotNull @Override public String[] list(@NotNull VirtualFile file) { + if (isInvalidSymLink(file)) { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + try { String[] strings = myKernel.list(file.getPath()); if (checkMe && !Arrays.asList(strings).equals(Arrays.asList(super.list(file)))) { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java index c76e5a112113..a3ea474cd6c9 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java @@ -44,7 +44,10 @@ public class SymLinkHandlingTest extends LightPlatformLangTestCase { } public void testBadLinksAreIgnored() throws Exception { - if (!SystemInfo.areSymLinksSupported) return; + if (!SystemInfo.areSymLinksSupported) { + System.out.println("Test not passed"); + return; + } final File missingFile = new File(FileUtil.getTempDirectory(), "missing_file"); assertTrue(missingFile.getAbsolutePath(), !missingFile.exists() || missingFile.delete()); diff --git a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java index 965953f761b2..73b60845b61e 100644 --- a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java +++ b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java @@ -152,7 +152,7 @@ public class UnixProcessManager { result = false; } - StringBuffer errorStr = new StringBuffer(); + StringBuilder errorStr = new StringBuilder(); while ((s = stdError.readLine()) != null) { errorStr.append(s).append("\n"); } @@ -172,24 +172,21 @@ public class UnixProcessManager { } public static String[] getPSCmd(boolean commandLineOnly) { + String psCommand = "/bin/ps"; + if (!new File(psCommand).isFile()) { + psCommand = "ps"; + } if (SystemInfo.isLinux) { - return new String[]{"ps", "-e", "e", "--format", commandLineOnly ? "%a" : "%P%p%a"}; + return new String[]{psCommand, "-e", "--format", commandLineOnly ? "%a" : "%P%p%a"}; } - else if (SystemInfo.isMac) { - return new String[]{"ps", "-ax", "-E", "-o", commandLineOnly ? "command" : "ppid,pid,command"}; - } - else if (SystemInfo.isFreeBSD) { - return new String[]{"ps", "-ax", "-e", "-o", commandLineOnly ? "command" : "ppid,pid,command"}; + else if (SystemInfo.isMac || SystemInfo.isFreeBSD) { + return new String[]{psCommand, "-ax", "-o", commandLineOnly ? "command" : "ppid,pid,command"}; } else { throw new IllegalStateException(System.getProperty("os.name") + " is not supported."); } } - public static boolean containsMarker(@NotNull String environ, @NotNull String uid) { - return environ.contains(uid); - } - @NotNull public static String readProcEnviron(int child_pid) throws FileNotFoundException { StringBuffer res = new StringBuffer(); diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 4ed608cd7172..b32689f9ade4 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -322,4 +322,5 @@ android.lint.inspections.set.to.wrap.content=Replace size attribute with 'wrap_c android.lint.inspections.add.permission.attribute=Add 'permission' attribute android.lint.inspections.add.input.type.attribute=Add 'inputType' attribute android.lint.inspections.remove.unnecessary.view=Remove unnecessary view -android.lint.inspections.replace.with.suggested.characters=Replace with suggested characters \ No newline at end of file +android.lint.inspections.replace.with.suggested.characters=Replace with suggested characters +android.facet.settings.pack.test.sources=Include test code and resources into APK \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 858500668f22..726a42a95bc2 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -35,6 +35,7 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; @@ -351,14 +352,24 @@ public class AndroidCompileUtil { } public static void generate(final Module module, final GeneratingCompiler compiler) { - module.getProject().getComponent(AndroidProjectComponent.class).runIfNotInCompilation(new Runnable() { + final Project project = module.getProject(); + final AndroidProjectComponent component = ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + @Override + public AndroidProjectComponent compute() { + return !project.isDisposed() ? project.getComponent(AndroidProjectComponent.class) : null; + } + }); + if (component == null) { + return; + } + component.runIfNotInCompilation(new Runnable() { @Override public void run() { assert !ApplicationManager.getApplication().isDispatchThread(); final CompileContext[] contextWrapper = new CompileContext[1]; ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - Project project = module.getProject(); if (project.isDisposed()) return; CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); CompileScope scope = new ModuleCompileScope(module, false); diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java index 95fe18f85242..1be64ac6c0d4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java @@ -105,11 +105,6 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } } } - - private static boolean shouldRunProguard(@NotNull AndroidFacet facet, @NotNull CompileContext context) { - return AndroidCompileUtil.isReleaseBuild(context) && - AndroidCompileUtil.getProguardConfigFile(facet) != null; - } private static final class PrepareAction implements Computable { private final CompileContext myContext; @@ -129,7 +124,10 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { Collection files; - if (shouldRunProguard(facet, myContext)) { + final boolean shouldRunProguard = myContext.getCompileScope(). + getUserData(AndroidProguardCompiler.PROGUARD_CFG_PATH_KEY) != null; + + if (shouldRunProguard) { final VirtualFile obfuscatedSourcesJar = dexOutputDir.findChild(AndroidProguardCompiler.PROGUARD_OUTPUT_JAR_NAME); if (obfuscatedSourcesJar == null) { myContext.addMessage(CompilerMessageCategory.INFORMATION, "Dex won't be launched for module " + @@ -166,10 +164,12 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } } - VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests(); + if (facet.getConfiguration().PACK_TEST_CODE) { + VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests(); - if (outputDirForTests != null) { - addModuleOutputDir(files, outputDirForTests); + if (outputDirForTests != null) { + addModuleOutputDir(files, outputDirForTests); + } } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java index 594e6a40429c..dddc60b173d4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java @@ -226,7 +226,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { } try { - VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule); + VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule, false); final String[] sourceRootPaths = AndroidCompileUtil.toOsPaths(sourceRoots); final Map> messages = AndroidIdl diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java index 9fa3535efe81..d39188ed8012 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java @@ -65,11 +65,14 @@ public class AndroidPackagingCompiler implements PackagingCompiler { return VirtualFile.EMPTY_ARRAY; } - private static void fillSourceRoots(@NotNull Module module, @NotNull Set visited, @NotNull Set result) { + private static void fillSourceRoots(@NotNull Module module, + @NotNull Set visited, + @NotNull Set result, + boolean includingTests) { visited.add(module); VirtualFile resDir = AndroidRootUtil.getResourceDir(module); ModuleRootManager manager = ModuleRootManager.getInstance(module); - for (VirtualFile sourceRoot : manager.getSourceRoots()) { + for (VirtualFile sourceRoot : manager.getSourceRoots(includingTests)) { if (resDir != sourceRoot) { result.add(sourceRoot); } @@ -78,10 +81,10 @@ public class AndroidPackagingCompiler implements PackagingCompiler { if (entry instanceof ModuleOrderEntry) { ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry; DependencyScope scope = moduleOrderEntry.getScope(); - if (scope == DependencyScope.COMPILE || scope == DependencyScope.TEST) { + if (scope == DependencyScope.COMPILE) { Module depModule = moduleOrderEntry.getModule(); if (depModule != null && !visited.contains(depModule)) { - fillSourceRoots(depModule, visited, result); + fillSourceRoots(depModule, visited, result, false); } } } @@ -89,9 +92,9 @@ public class AndroidPackagingCompiler implements PackagingCompiler { } @NotNull - public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module) { + public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module, boolean includingTests) { Set result = new HashSet(); - fillSourceRoots(module, new HashSet(), result); + fillSourceRoots(module, new HashSet(), result, includingTests); return VfsUtil.toVirtualFileArray(result); } @@ -102,7 +105,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { AndroidFacet facet = AndroidFacet.getInstance(module); if (facet != null && !facet.getConfiguration().LIBRARY_PROJECT) { VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet); - VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module); + VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module, facet.getConfiguration().PACK_TEST_CODE); if (manifestFile != null) { AndroidFacetConfiguration configuration = facet.getConfiguration(); VirtualFile outputDir = AndroidDexCompiler.getOutputDirectoryForDex(module); diff --git a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java index 28d55346b78c..4e2d2eee87a4 100644 --- a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java +++ b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java @@ -21,6 +21,8 @@ import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; @@ -30,8 +32,8 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.util.PsiNavigateUtil; import com.intellij.util.xml.*; -import org.jetbrains.android.dom.ResourceType; import org.jetbrains.android.dom.AdditionalConverter; +import org.jetbrains.android.dom.ResourceType; import org.jetbrains.android.dom.resources.Item; import org.jetbrains.android.dom.resources.ResourceElement; import org.jetbrains.android.dom.resources.ResourceValue; @@ -110,7 +112,8 @@ public class ResourceReferenceConverter extends ResolvingConverter recommendedTypes = getResourceTypes(context); + + final Set recommendedTypes = getResourceTypes(context); // hack to check if it is a real id attribute if (recommendedTypes.contains("id") && recommendedTypes.size() == 1) { @@ -122,7 +125,7 @@ public class ResourceReferenceConverter extends ResolvingConverter filteringSet = SYSTEM_RESOURCE_PACKAGE.equals(resourcePackage) + ? null + : getResourceTypesInCurrentModule(facet); + for (String type : ResourceManager.REFERABLE_RESOURCE_TYPES) { String typePrefix = getTypePrefix(resourcePackage, type); if (value.startsWith(typePrefix)) { addResourceReferenceValues(facet, type, resourcePackage, result, true); } - else if (recommendedTypes.contains(type)) { + else if (recommendedTypes.contains(type) && + (filteringSet == null || filteringSet.contains(type))) { result.add(ResourceValue.literal(typePrefix)); } } @@ -157,6 +165,23 @@ public class ResourceReferenceConverter extends ResolvingConverter getResourceTypesInCurrentModule(@NotNull AndroidFacet facet) { + final Set result = new HashSet(); + final LocalResourceManager manager = facet.getLocalResourceManager(); + + for (VirtualFile resSubdir : manager.getResourceSubdirs(null)) { + final String resType = AndroidResourceUtil.getResourceTypeByDirName(resSubdir.getName()); + + if (resType != null && com.android.resources.ResourceType.getEnum(resType) != null) { + result.add(resType); + } + } + + result.addAll(manager.getValueResourceTypes()); + return result; + } @NotNull private String getTypePrefix(String resourcePackage, String type) { diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java index 1e400ddc4cba..510911d99ac0 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java @@ -81,6 +81,8 @@ public class AndroidFacetConfiguration implements FacetConfiguration { public String CUSTOM_DEBUG_KEYSTORE_PATH = ""; + public boolean PACK_TEST_CODE = false; + private AndroidFacet myFacet = null; public void init(@NotNull Module module, @NotNull VirtualFile contentRoot) { diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form index 73c9b53d0f2d..c588020758ea 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form @@ -115,8 +115,8 @@ - - + + @@ -124,7 +124,7 @@ - + @@ -198,11 +198,11 @@ - + - + @@ -237,7 +237,7 @@ - + @@ -297,6 +297,14 @@ + + + + + + + + diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java index dbbdfa6fc0e2..658462b9787c 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java @@ -93,6 +93,7 @@ public class AndroidFacetEditorTab extends FacetEditorTab { private JLabel myRGenPathLabel; private TextFieldWithBrowseButton myCustomDebugKeystoreField; private JBLabel myCustomKeystoreLabel; + private JCheckBox myIncludeTestCodeAndCheckBox; public AndroidFacetEditorTab(FacetEditorContext context, AndroidFacetConfiguration androidFacetConfiguration) { final Project project = context.getProject(); @@ -282,6 +283,9 @@ public class AndroidFacetEditorTab extends FacetEditorTab { if (!myConfiguration.CUSTOM_DEBUG_KEYSTORE_PATH.equals(getSelectedCustomKeystorePath())) { return true; } + if (myConfiguration.PACK_TEST_CODE != myIncludeTestCodeAndCheckBox.isSelected()) { + return true; + } return false; } @@ -390,6 +394,8 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myConfiguration.RUN_PROCESS_RESOURCES_MAVEN_TASK = myRunProcessResourcesRadio.isSelected(); myConfiguration.GENERATE_UNSIGNED_APK = myGenerateUnsignedApk.isSelected(); + + myConfiguration.PACK_TEST_CODE = myIncludeTestCodeAndCheckBox.isSelected(); boolean useCustomAptSrc = myUseCustomSourceDirectoryRadio.isSelected(); @@ -513,6 +519,7 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myCompileResourcesByIdeRadio.setSelected(!myConfiguration.RUN_PROCESS_RESOURCES_MAVEN_TASK); myGenerateUnsignedApk.setSelected(myConfiguration.GENERATE_UNSIGNED_APK); + myIncludeTestCodeAndCheckBox.setSelected(myConfiguration.PACK_TEST_CODE); updateAptPanel(); diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java index 27d7809494f8..e422429d59a3 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java @@ -16,6 +16,7 @@ package org.jetbrains.android.facet; +import com.android.resources.ResourceFolderType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.GeneratingCompiler; import com.intellij.openapi.module.Module; @@ -31,6 +32,7 @@ import org.jetbrains.android.compiler.*; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.fileTypes.AndroidIdlFileType; import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; +import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.android.util.ResourceEntry; import org.jetbrains.annotations.NotNull; @@ -147,7 +149,7 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { final GeneratingCompiler compilerToRun = ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable public GeneratingCompiler compute() { - return computeCompilerToRun(); + return computeCompilerToRunAndInvalidateLocalAttributesMap(); } }); @@ -175,7 +177,7 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { } @Nullable - private GeneratingCompiler computeCompilerToRun() { + private GeneratingCompiler computeCompilerToRunAndInvalidateLocalAttributesMap() { if (myFacet.isDisposed()) { return null; } @@ -197,10 +199,18 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { return null; } - parent = parent.getParent(); + final VirtualFile gp = parent.getParent(); + + final VirtualFile resourceDir = AndroidRootUtil.getResourceDir(module); + + if (gp == resourceDir && + ResourceFolderType.VALUES.getName().equals(AndroidResourceUtil.getResourceTypeByDirName(parent.getName()))) { + myFacet.getLocalResourceManager().invalidateAttributeDefinitions(); + } + if (AndroidAptCompiler.isToCompileModule(module, myFacet.getConfiguration()) && - (myFacet.getConfiguration().REGENERATE_R_JAVA && parent == AndroidRootUtil.getResourceDir(module) || - AndroidRootUtil.getManifestFile(module) == file)) { + (myFacet.getConfiguration().REGENERATE_R_JAVA && (gp == resourceDir || + AndroidRootUtil.getManifestFile(module) == file))) { final Manifest manifest = myFacet.getManifest(); final String aPackage = manifest != null ? manifest.getPackage().getValue() : null; @@ -209,8 +219,6 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { AndroidCompileUtil.removeDuplicatingClasses(myModule, myCachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath); } myCachedPackage = aPackage; - myFacet.getLocalResourceManager().invalidateAttributeDefinitions(); - return new AndroidAptCompiler(); } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java index 34b5b2f15aa4..0b7a0410bb6d 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java @@ -256,14 +256,9 @@ public class AndroidRootUtil { } } } - else { - if (!outputDirs.contains(classDir) && classDir != null && classDir.exists()) { - outputDirs.add(classDir); - } - VirtualFile classDirForTests = extension.getCompilerOutputPathForTests(); - if (!outputDirs.contains(classDirForTests) && classDirForTests != null && classDirForTests.exists()) { - outputDirs.add(classDirForTests); - } + // do not support android-app->android-app compile dependencies + else if (facet == null && !outputDirs.contains(classDir) && classDir != null && classDir.exists()) { + outputDirs.add(classDir); } } fillExternalLibrariesAndModules(depModule, outputDirs, libraries, visited, !libraryProject || exportedLibrariesOnly); diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java index 35a6e6e89c82..672a47f4bb79 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java @@ -128,6 +128,7 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { if (myProjectType == ProjectType.TEST) { assert myTestedModule != null; + facet.getConfiguration().PACK_TEST_CODE = true; ModuleOrderEntry entry = rootModel.addModuleOrderEntry(myTestedModule); entry.setScope(DependencyScope.PROVIDED); } diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index 5a7a1f8d265f..750a3f0c882c 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -17,6 +17,7 @@ package org.jetbrains.android.resourceManagers; import com.android.AndroidConstants; +import com.android.resources.ResourceType; import com.intellij.CommonBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -27,10 +28,14 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlFile; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; +import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.android.AndroidFileTemplateProvider; +import org.jetbrains.android.AndroidValueResourcesIndex; import org.jetbrains.android.actions.CreateResourceFileAction; import org.jetbrains.android.dom.attrs.AttributeDefinitions; import org.jetbrains.android.dom.resources.Attr; @@ -42,13 +47,12 @@ import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.ResourceEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.jetbrains.android.util.AndroidUtils.loadDomElement; @@ -135,6 +139,43 @@ public class LocalResourceManager extends ResourceManager { return facet != null ? facet.getLocalResourceManager() : null; } + @NotNull + public Set getValueResourceTypes() { + final Map> file2Types = new HashMap>(); + final FileBasedIndex index = FileBasedIndex.getInstance(); + final GlobalSearchScope scope = GlobalSearchScope.projectScope(myModule.getProject()); + + for (String resourceType : ResourceType.getNames()) { + final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType); + + for (Set entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) { + for (ResourceEntry entry : entrySet) { + final Collection files = index.getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, entry, scope); + + for (VirtualFile file : files) { + Set resourcesInFile = file2Types.get(file); + + if (resourcesInFile == null) { + resourcesInFile = new HashSet(); + file2Types.put(file, resourcesInFile); + } + resourcesInFile.add(entry.getType()); + } + } + } + } + final Set result = new HashSet(); + + for (VirtualFile file : getAllValueResourceFiles()) { + final Set types = file2Types.get(file); + + if (types != null) { + result.addAll(types); + } + } + return result; + } + @NotNull public AttributeDefinitions getAttributeDefinitions() { if (myAttrDefs == null) { diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java index 436dbf46988b..ce0a5c8cf1c6 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java @@ -92,11 +92,10 @@ public class AndroidRunConfiguration extends AndroidRunConfigurationBase impleme } @Override - public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { - RunProfileState state = super.getState(executor, env); + public AndroidRunningState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + AndroidRunningState state = super.getState(executor, env); if (state != null) { - assert state instanceof AndroidRunningState; - ((AndroidRunningState)state).setDeploy(DEPLOY); + state.setDeploy(DEPLOY); } return state; } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java index ab6a6a3ab281..54e28b8b1012 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java @@ -31,7 +31,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.roots.ModuleOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; @@ -158,7 +157,8 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati TARGET_SELECTION_MODE = mode.name(); } - private static boolean fillRuntimeAndTestDependencies(@NotNull Module module, @NotNull Map module2PackageName) { + private static boolean fillRuntimeAndTestDependencies(@NotNull Module module, + @NotNull Map module2PackageName) { for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { if (entry instanceof ModuleOrderEntry) { ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry; @@ -167,8 +167,7 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati AndroidFacet depFacet = AndroidFacet.getInstance(depModule); if (depFacet != null && !module2PackageName.containsKey(depFacet) && - !depFacet.getConfiguration().LIBRARY_PROJECT && - moduleOrderEntry.getScope() != DependencyScope.COMPILE) { + !depFacet.getConfiguration().LIBRARY_PROJECT) { String packageName = getPackageName(depFacet); if (packageName == null) { return false; @@ -184,7 +183,7 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati return true; } - public RunProfileState getState(@NotNull final Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + public AndroidRunningState getState(@NotNull final Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { final Module module = getConfigurationModule().getModule(); if (module == null) { throw new ExecutionException("Module is not found"); diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 4f6233148d6f..976b7eb14a90 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -218,10 +218,6 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb return myLock; } - public AndroidFacet getAndroidFacet() { - return myFacet; - } - public String getPackageName() { return myPackageName; } @@ -230,6 +226,7 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb return myFacet.getModule(); } + @NotNull public AndroidFacet getFacet() { return myFacet; } diff --git a/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java b/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java index 9f64c41095cc..210a3984fc4d 100644 --- a/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java @@ -28,6 +28,7 @@ import com.intellij.execution.Executor; import com.intellij.execution.configurations.*; import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; import com.intellij.execution.ui.ConsoleView; @@ -35,6 +36,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; @@ -43,6 +46,7 @@ import com.intellij.psi.PsiPackage; import org.jetbrains.android.dom.manifest.Instrumentation; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.android.run.AndroidApplicationLauncher; import org.jetbrains.android.run.AndroidRunConfigurationBase; import org.jetbrains.android.run.AndroidRunConfigurationEditor; @@ -108,6 +112,44 @@ public class AndroidTestRunConfiguration extends AndroidRunConfigurationBase { } } + @Override + public AndroidRunningState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + final AndroidRunningState state = super.getState(executor, env); + + if (state == null) { + return null; + } + + final AndroidFacet facet = state.getFacet(); + final AndroidFacetConfiguration configuration = facet.getConfiguration(); + + if (!configuration.PACK_TEST_CODE) { + final Module module = facet.getModule(); + final int count = getTestSourceRootCount(module); + + if (count > 0) { + final String message = "Code and resources under test source " + (count > 1 ? "roots" : "root") + + " aren't included into debug APK.\nWould you like to include them and recompile " + + module.getName() + " module?" + "\n(You may change this option in Android facet settings later)"; + final int result = + Messages.showYesNoCancelDialog(getProject(), message, "Test code not included into APK", Messages.getQuestionIcon()); + + if (result == Messages.YES) { + configuration.PACK_TEST_CODE = true; + } + else if (result == Messages.CANCEL) { + return null; + } + } + } + return state; + } + + private static int getTestSourceRootCount(@NotNull Module module) { + final ModuleRootManager manager = ModuleRootManager.getInstance(module); + return manager.getSourceRoots(true).length - manager.getSourceRoots(false).length; + } + private void checkTestMethod() throws RuntimeConfigurationException { JavaRunConfigurationModule configurationModule = getConfigurationModule(); final PsiClass testClass = @@ -166,7 +208,7 @@ public class AndroidTestRunConfiguration extends AndroidRunConfigurationBase { BaseTestsOutputConsoleView consoleView = SMTestRunnerConnectionUtil .createAndAttachConsole("Android", state.getProcessHandler(), properties, state.getRunnerSettings(), state.getConfigurationSettings() ); - Disposer.register(state.getAndroidFacet().getModule().getProject(), consoleView); + Disposer.register(state.getFacet().getModule().getProject(), consoleView); return consoleView; } diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java index 64916c814fc5..f51c00b5a798 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java @@ -76,10 +76,17 @@ class AndroidSdkConfigurableForm { final IAndroidTarget target = (IAndroidTarget)e.getItem(); List roots = AndroidSdkUtils.getLibraryRootsForTarget(target, mySdkLocation); - Map configuredRoots = new HashMap(); + Map configuredRoots = new HashMap(); for (OrderRootType type : OrderRootType.getAllTypes()) { - configuredRoots.put(type, sdkModificator.getRoots(type)); + final VirtualFile[] oldRoots = sdkModificator.getRoots(type); + final String[] oldRootPaths = new String[oldRoots.length]; + + for (int i = 0; i < oldRootPaths.length; i++) { + oldRootPaths[i] = oldRoots[i].getPath(); + } + + configuredRoots.put(type, oldRootPaths); } for (OrderRoot root : roots) { @@ -87,8 +94,8 @@ class AndroidSdkConfigurableForm { sdkModificator.removeRoot(root.getFile(), root.getType()); } else { - VirtualFile[] configuredRootsForType = configuredRoots.get(root.getType()); - if (ArrayUtil.find(configuredRootsForType, root.getFile()) == -1) { + String[] configuredRootsForType = configuredRoots.get(root.getType()); + if (ArrayUtil.find(configuredRootsForType, root.getFile().getPath()) == -1) { sdkModificator.addRoot(root.getFile(), root.getType()); } } diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java index 12615f7ae66e..9bc4c6a0675a 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java @@ -455,12 +455,15 @@ public class AndroidUtils { LOG.info(commandLine.getCommandLineString()); OSProcessHandler handler = new OSProcessHandler(commandLine.createProcess(), ""); + final StringBuffer buffer = new StringBuffer(); + final ProcessAdapter listener = new ProcessAdapter() { + public void onTextAvailable(final ProcessEvent event, final Key outputType) { + buffer.append(event.getText()); + } + }; + if (timeout == null || timeout > 0) { - handler.addProcessListener(new ProcessAdapter() { - public void onTextAvailable(final ProcessEvent event, final Key outputType) { - messageBuilder.append(event.getText()); - } - }); + handler.addProcessListener(listener); } handler.startNotify(); @@ -483,7 +486,9 @@ public class AndroidUtils { } if (timeout == null || timeout > 0) { - String message = messageBuilder.toString(); + handler.removeProcessListener(listener); + final String message = buffer.toString(); + messageBuilder.append(message); LOG.info(message); } diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java index ebf4b0d9ac74..c326a2ae1dc2 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java @@ -9,7 +9,6 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.util.ArrayUtil; import java.io.IOException; import java.util.ArrayList; @@ -116,9 +115,7 @@ public class AndroidLayoutDomTest extends AndroidDomTest { public void testResourceCompletion() throws Throwable { doTestCompletionVariants("av3.xml", "@color/", "@android:", "@drawable/"); - List list = getAllResources(); - list.add("@android:"); - doTestCompletionVariants("av8.xml", ArrayUtil.toStringArray(list)); + doTestCompletionVariants("av8.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@layout/", "@string/", "@style/"); } public void testLocalResourceCompletion1() throws Throwable { diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java index 0175d09e004d..5e06bc821029 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java @@ -1,11 +1,8 @@ package org.jetbrains.android.dom; import com.android.sdklib.SdkConstants; -import com.intellij.util.ArrayUtil; import org.jetbrains.android.inspections.AndroidUnknownAttributeInspection; -import java.util.List; - /** * @author coyote */ @@ -73,9 +70,7 @@ public class AndroidManifestDomTest extends AndroidDomTest { } public void testResourceCompletion3() throws Throwable { - List list = getAllResources(); - list.add("@android:"); - doTestCompletionVariants("av4.xml", ArrayUtil.toStringArray(list)); + doTestCompletionVariants("av4.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@string/", "@style/"); } public void testTagNameCompletion1() throws Throwable { diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java index 6a26285225b3..28471448c01d 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java @@ -103,6 +103,14 @@ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider return model.getContentRoots()[0].getPath(); } + @Override + public void modulePathChanged(Module module, String path) { + final EclipseModuleManager moduleManager = EclipseModuleManager.getInstance(module); + if (moduleManager != null) { + moduleManager.setDocumentSet(null); + } + } + public static void registerFiles(final CachedXmlDocumentSet fileCache, final Module module, final String moduleRoot, final String storageRoot) { fileCache.register(EclipseXml.CLASSPATH_FILE, storageRoot); fileCache.register(EclipseXml.PROJECT_FILE, storageRoot); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java index 2414a8852270..85689bea5aa5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java @@ -89,12 +89,13 @@ public class MavenPluginConfigurationDomExtender extends DomExtender d2.getRequiringLevel(); + } + private static void fillParameterData(String name, ParameterData data, MavenDomMojo mojo) { XmlTag config = mojo.getConfiguration().getXmlTag(); if (config == null) return; @@ -153,15 +164,27 @@ public class MavenPluginConfigurationDomExtender extends DomExtender annotationType() { + return Required.class; + } + }); } } @@ -181,43 +204,32 @@ public class MavenPluginConfigurationDomExtender extends DomExtender collectionClasses = Arrays.asList("java.util.List", - "java.util.Set", - "java.util.Collection"); - return collectionClasses.contains(type); + return type.equals("java.util.List") || type.equals("java.util.Set") || type.equals("java.util.Collection"); } public static class ParameterData { - public MavenDomParameter parameter; + public final MavenDomParameter parameter; public @Nullable String defaultValue; public @Nullable String expression; private ParameterData(MavenDomParameter parameter) { this.parameter = parameter; } - } - - private static class MyRequired implements Required { - private final String myRequired; - - public MyRequired(String required) { - myRequired = required; + + @NotNull + public MavenDomMojo getMojo() { + return (MavenDomMojo)parameter.getParent().getParent(); } - public boolean value() { - return Boolean.valueOf(myRequired); - } + public int getRequiringLevel() { + if (!Boolean.parseBoolean(parameter.getRequired().getStringValue())) return 0; - public boolean nonEmpty() { - return false; - } + if (!StringUtil.isEmptyOrSpaces(defaultValue) || !StringUtil.isEmptyOrSpaces(expression)) { + return 1; + } - public boolean identifier() { - return false; - } - - public Class annotationType() { - return Required.class; + return 2; } } + } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java index 93eef0da0547..6df04f0965d1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java @@ -23,6 +23,9 @@ public interface MavenDomMojo extends MavenDomElement { @NotNull GenericDomValue getGoal(); + @NotNull + GenericDomValue getPhase(); + @NotNull MavenDomParameters getParameters(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java index dbdf23ca459f..1dbbd29ab12b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java @@ -31,6 +31,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomUtil; @@ -51,13 +52,12 @@ import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem; import javax.swing.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Set; public class MavenPropertyPsiReference extends MavenPsiReference { private static final Set BASEDIR_PROPS = - new THashSet(Arrays.asList("basedir", "project.basedir", "pom.basedir", "baseUri", "project.baseUri", "pom.baseUri")); + CollectionFactory.newTroveSet("basedir", "project.basedir", "pom.basedir", "baseUri", "project.baseUri", "pom.baseUri"); private static final String TIMESTAMP_PROP = "maven.build.timestamp"; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index cb5a81b73cdd..93afbfdd96d9 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -896,25 +896,23 @@ public class MavenProject { MavenProjectChanges result = new MavenProjectChanges(); - result.packaging |= !Comparing.equal(myPackaging, other.myPackaging); + result.packaging = !Comparing.equal(myPackaging, other.myPackaging); - result.output |= !Comparing.equal(myFinalName, other.myFinalName); - result.output |= !Comparing.equal(myBuildDirectory, other.myBuildDirectory); - result.output |= !Comparing.equal(myOutputDirectory, other.myOutputDirectory); - result.output |= !Comparing.equal(myTestOutputDirectory, other.myTestOutputDirectory); + result.output = !Comparing.equal(myFinalName, other.myFinalName) + || !Comparing.equal(myBuildDirectory, other.myBuildDirectory) + || !Comparing.equal(myOutputDirectory, other.myOutputDirectory) + || !Comparing.equal(myTestOutputDirectory, other.myTestOutputDirectory); - result.sources |= !Comparing.equal(mySources, other.mySources); - result.sources |= !Comparing.equal(myTestSources, other.myTestSources); - result.sources |= !Comparing.equal(myResources, other.myResources); - result.sources |= !Comparing.equal(myTestResources, other.myTestResources); + result.sources = !Comparing.equal(mySources, other.mySources) + || !Comparing.equal(myTestSources, other.myTestSources) + || !Comparing.equal(myResources, other.myResources) + || !Comparing.equal(myTestResources, other.myTestResources); boolean repositoryChanged = !Comparing.equal(myLocalRepository, other.myLocalRepository); - result.dependencies |= repositoryChanged; - result.dependencies |= !Comparing.equal(myDependencies, other.myDependencies); + result.dependencies = repositoryChanged || !Comparing.equal(myDependencies, other.myDependencies); - result.plugins |= repositoryChanged; - result.plugins |= !Comparing.equal(myPlugins, other.myPlugins); + result.plugins = repositoryChanged || !Comparing.equal(myPlugins, other.myPlugins); return result; } diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 new file mode 100644 index 000000000000..66f7045df9cb --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 @@ -0,0 +1 @@ +4d0907396ac6a770e05c81f6e8ed6348740f86a0 diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom new file mode 100644 index 000000000000..f74aea0ce484 --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom @@ -0,0 +1,203 @@ + + + + + + 4.0.0 + + + maven-plugins + org.apache.maven.plugins + 19 + ../maven-plugins/pom.xml + + + maven-resources-plugin + 2.5 + maven-plugin + + Maven Resources Plugin + + The Resources Plugin handles the copying of project resources to the output + directory. There are two different kinds of resources: main resources and test resources. The + difference is that the main resources are the resources associated to the main + source code while the test resources are associated to the test source code. + Thus, this allows the separation of resources for the main source code and its + unit tests. + + 2001 + + + ${mavenVersion} + + + + scm:svn:http://svn.apache.org/repos/asf/maven/plugins/tags/maven-resources-plugin-2.5 + scm:svn:https://svn.apache.org/repos/asf/maven/plugins/tags/maven-resources-plugin-2.5 + http://svn.apache.org/viewvc/maven/plugins/tags/maven-resources-plugin-2.5 + + + JIRA + http://jira.codehaus.org/browse/MRESOURCES + + + + 1.0 + 2.0.6 + + + + + org.apache.maven + maven-plugin-api + ${mavenVersion} + + + org.apache.maven + maven-project + ${mavenVersion} + + + org.apache.maven + maven-core + ${mavenVersion} + + + org.apache.maven + maven-artifact + ${mavenVersion} + + + org.apache.maven + maven-settings + ${mavenVersion} + + + org.apache.maven + maven-model + ${mavenVersion} + + + org.apache.maven + maven-monitor + ${mavenVersion} + + + + org.codehaus.plexus + plexus-container-default + 1.0-alpha-9-stable-1 + + + + org.codehaus.plexus + plexus-utils + 2.0.5 + + + + org.apache.maven.shared + maven-filtering + ${mavenFilteringVersion} + + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + + org.apache.maven.shared + maven-plugin-testing-harness + 1.0-beta-1 + test + + + commons-io + commons-io + 1.4 + test + + + + + + run-its + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + org.codehaus.plexus + plexus-maven-plugin + + + + test-descriptor + + + + + + org.apache.maven.plugins + maven-invoker-plugin + + true + src/it + + **/pom.xml + + verify + ${project.build.directory}/local-repo + + clean + process-test-resources + + src/it/settings.xml + ${project.build.directory}/it + + fromExecProps + + + + + integration-test + + install + run + + + + + + + + + diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 new file mode 100644 index 000000000000..ed141e784c90 --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 @@ -0,0 +1 @@ +2d44c4a29ea56775c87002edb5aa23aab47e71ac diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java index abb177cb9160..c0d3a9cee077 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java @@ -65,7 +65,7 @@ public class MavenExtensionCompletionAndResolutionTest extends MavenDomWithIndic " " + ""); - assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-eclipse-plugin", "maven-surefire-plugin"); + assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-eclipse-plugin", "maven-surefire-plugin", "maven-resources-plugin"); } public void testArtifactWithoutGroupCompletion() throws Exception { @@ -86,6 +86,7 @@ public class MavenExtensionCompletionAndResolutionTest extends MavenDomWithIndic "maven-war-plugin", "maven-surefire-plugin", "build-helper-maven-plugin", + "maven-resources-plugin", "maven-eclipse-plugin"); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java index eaea5c74b3c3..b98768519a1e 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java @@ -71,7 +71,7 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT " " + ""); - assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-surefire-plugin", "maven-eclipse-plugin"); + assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-surefire-plugin", "maven-eclipse-plugin", "maven-resources-plugin"); } public void testArtifactWithoutGroupCompletion() throws Exception { @@ -92,6 +92,7 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT "maven-war-plugin", "build-helper-maven-plugin", "maven-surefire-plugin", + "maven-resources-plugin", "maven-eclipse-plugin"); } @@ -902,4 +903,59 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT assertCompletionVariants(myProjectPom); } + + public void testRequiringParameter() throws Throwable { + createProjectPom("test" + + "project" + + "1" + + + "" + + " " + + " \n" + + " maven-resources-plugin\n" + + " \n" + + " <outputDirectory/>\n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + "" + + " \n" + + " aaa\n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + "" + + " \n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + " " + + " " + + " " + + " copy-resources" + + " resources" + + " " + + " <configuration>\n" + + " \n" + + " " + + " " + + " " + + "" + + " \n" + + " \n" + + " \n" + + + + " " + + ""); + + checkHighlighting(); + } + } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java index fa1f228af021..cdbeeedd4d67 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java @@ -129,6 +129,7 @@ public final class GuiEditor extends JPanel implements DataProvider { private final Document myDocument; final MainProcessor myProcessor; + @NotNull private final JScrollPane myScrollPane; /** * This layered pane contains all layers to lay components out and to * show all necessary decoration items @@ -302,11 +303,12 @@ public final class GuiEditor extends JPanel implements DataProvider { gbc.gridy = 1; gbc.weightx = 1.0; gbc.weighty = 1.0; - final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myLayeredPane); - scrollPane.setBackground(Color.WHITE); - panel.add(scrollPane, gbc); - myHorzCaptionPanel.attachToScrollPane(scrollPane); - myVertCaptionPanel.attachToScrollPane(scrollPane); + + myScrollPane = ScrollPaneFactory.createScrollPane(myLayeredPane); + myScrollPane.setBackground(Color.WHITE); + panel.add(myScrollPane, gbc); + myHorzCaptionPanel.attachToScrollPane(myScrollPane); + myVertCaptionPanel.attachToScrollPane(myScrollPane); myValidCard.add(panel, BorderLayout.CENTER); @@ -319,7 +321,7 @@ public final class GuiEditor extends JPanel implements DataProvider { myPsiTreeChangeListener = new MyPsiTreeChangeListener(); PsiManager.getInstance(module.getProject()).addPsiTreeChangeListener(myPsiTreeChangeListener); - myQuickFixManager = new QuickFixManagerImpl(this, myGlassLayer, scrollPane.getViewport()); + myQuickFixManager = new QuickFixManagerImpl(this, myGlassLayer, myScrollPane.getViewport()); myDropTargetListener = new DesignDropTargetListener(this); if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { @@ -987,7 +989,9 @@ public final class GuiEditor extends JPanel implements DataProvider { width += 50; height += 40; - return new Dimension(width, height); + Rectangle bounds = myScrollPane.getViewport().getBounds(); + + return new Dimension(Math.max(width, bounds.width), Math.max(height, bounds.height)); } public Dimension getPreferredScrollableViewportSize() {