diff --git a/build.txt b/build.txt
index adc7998b208d..685efed608ac 100644
--- a/build.txt
+++ b/build.txt
@@ -1,2 +1 @@
-98.SNAPSHOT
-
+100.SNAPSHOT
diff --git a/build/scripts/dist.gant b/build/scripts/dist.gant
index 3b37c8f796ed..d2635baf3b05 100644
--- a/build/scripts/dist.gant
+++ b/build/scripts/dist.gant
@@ -67,7 +67,7 @@ def wire_build_date(String buildNumber) {
target('default': 'The default target') {
depends(compile)
layoutAll(
- buildNumber: "IC-98.SNAPSHOT",
+ buildNumber: "IC-100.SNAPSHOT",
version: "IdeaX",
system_selector: "IntelliJIdeaCE10",
jdk_req: "1.6*",
diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
index c3e32608983d..b6adb108a10e 100644
--- a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
+++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
@@ -17,8 +17,10 @@ package com.intellij.execution.junit2.segments;
import com.intellij.execution.junit.SegmentedInputStreamReader;
import com.intellij.execution.junit2.SegmentedInputStream;
+import com.intellij.execution.testframework.Printable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.rt.execution.junit.segments.PacketProcessor;
import java.io.InputStream;
@@ -31,6 +33,8 @@ import java.nio.charset.Charset;
public class Extractor {
private DeferredActionsQueue myFulfilledWorkGate = null;
private final SegmentedInputStream myStream;
+ private OutputPacketProcessor myEventsDispatcher;
+ private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName());
public Extractor(final InputStream stream, final Charset charset) {
myStream = new SegmentedInputStream(stream, charset);
@@ -54,7 +58,7 @@ public class Extractor {
queue.setDispactchListener(listener);
}
};
- myStream.setEventsDispatcher(new PacketProcessor() {
+ myEventsDispatcher = new OutputPacketProcessor() {
public void processPacket(final String packet) {
myFulfilledWorkGate.addLast(new Runnable() {
public void run() {
@@ -62,7 +66,22 @@ public class Extractor {
}
});
}
- });
+
+ @Override
+ public void processOutput(final Printable printable) {
+ LOG.assertTrue(packetProcessor instanceof OutputPacketProcessor);
+ myFulfilledWorkGate.addLast(new Runnable() {
+ public void run() {
+ ((OutputPacketProcessor)packetProcessor).processOutput(printable);
+ }
+ });
+ }
+ };
+ myStream.setEventsDispatcher(myEventsDispatcher);
+ }
+
+ public OutputPacketProcessor getEventsDispatcher() {
+ return myEventsDispatcher;
}
public Reader createReader() {
diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java
new file mode 100644
index 000000000000..455ae6e60f41
--- /dev/null
+++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2010 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 com.intellij.execution.junit2.segments;
+
+import com.intellij.execution.testframework.Printable;
+import com.intellij.rt.execution.junit.segments.PacketProcessor;
+
+/**
+ * User: anna
+ * Date: 12/6/10
+ */
+public interface OutputPacketProcessor extends PacketProcessor{
+ void processOutput(Printable printable);
+}
diff --git a/java/java-impl/java-impl.iml b/java/java-impl/java-impl.iml
index 72169b16647d..d9a746ec0564 100644
--- a/java/java-impl/java-impl.iml
+++ b/java/java-impl/java-impl.iml
@@ -27,6 +27,7 @@
+
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java
index ce178c3e1fb4..1133ac80ea82 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java
@@ -19,6 +19,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
+import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiMethodStub;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.util.PatchedSoftReference;
@@ -33,7 +34,7 @@ public class PsiAnnotationMethodImpl extends PsiMethodImpl implements PsiAnnotat
private PatchedSoftReference myCachedDefaultValue = null;
public PsiAnnotationMethodImpl(final PsiMethodStub stub) {
- super(stub);
+ super(stub, JavaStubElementTypes.ANNOTATION_METHOD);
}
public PsiAnnotationMethodImpl(final ASTNode node) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java
index 536ec8893160..5ab126d30990 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiAnonymousClassImpl.java
@@ -19,6 +19,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.PsiSuperMethodImplUtil;
+import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiClassStub;
import com.intellij.psi.impl.source.parsing.Parsing;
import com.intellij.psi.impl.source.tree.ChildRole;
@@ -35,7 +36,7 @@ public class PsiAnonymousClassImpl extends PsiClassImpl implements PsiAnonymousC
private PatchedSoftReference myCachedBaseType = null;
public PsiAnonymousClassImpl(final PsiClassStub stub) {
- super(stub);
+ super(stub, JavaStubElementTypes.ANONYMOUS_CLASS);
}
public PsiAnonymousClassImpl(final ASTNode node) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java
index e11fd84687df..b69a6c16a454 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java
@@ -31,7 +31,6 @@ import com.intellij.psi.impl.InheritanceImplUtil;
import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.PsiSuperMethodImplUtil;
-import com.intellij.psi.impl.java.stubs.JavaClassElementType;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiClassStub;
import com.intellij.psi.impl.light.LightMethod;
@@ -73,7 +72,7 @@ public class PsiClassImpl extends JavaStubPsiElement> implements
@NonNls private static final String VALUE_OF_METHOD = "valueOf";
public PsiClassImpl(final PsiClassStub stub) {
- this(stub, typeForClass(stub.isAnonymous(), stub.isEnumConstantInitializer()));
+ this(stub, JavaStubElementTypes.CLASS);
}
protected PsiClassImpl(final PsiClassStub stub, final IStubElementType type) {
@@ -84,12 +83,6 @@ public class PsiClassImpl extends JavaStubPsiElement> implements
super(node);
}
- public static JavaClassElementType typeForClass(final boolean anonymous, final boolean enumConst) {
- return enumConst
- ? JavaStubElementTypes.ENUM_CONSTANT_INITIALIZER
- : anonymous ? JavaStubElementTypes.ANONYMOUS_CLASS : JavaStubElementTypes.CLASS;
- }
-
public void subtreeChanged() {
dropCaches();
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiEnumConstantInitializerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiEnumConstantInitializerImpl.java
index 90305a8dfa05..dd485c1b675f 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiEnumConstantInitializerImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiEnumConstantInitializerImpl.java
@@ -18,6 +18,7 @@ package com.intellij.psi.impl.source;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
+import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiClassStub;
import com.intellij.psi.impl.light.LightClassReference;
import org.jetbrains.annotations.NotNull;
@@ -27,14 +28,13 @@ public class PsiEnumConstantInitializerImpl extends PsiClassImpl implements PsiE
private PsiClassType myCachedBaseType = null;
public PsiEnumConstantInitializerImpl(final PsiClassStub stub) {
- super(stub);
+ super(stub, JavaStubElementTypes.ENUM_CONSTANT_INITIALIZER);
}
public PsiEnumConstantInitializerImpl(final ASTNode node) {
super(node);
}
-
protected Object clone() {
PsiEnumConstantInitializerImpl clone = (PsiEnumConstantInitializerImpl)super.clone();
clone.myCachedBaseType = null;
@@ -56,7 +56,6 @@ public class PsiEnumConstantInitializerImpl extends PsiClassImpl implements PsiE
return false;
}
-
@NotNull
public PsiJavaCodeReferenceElement getBaseClassReference() {
PsiClass containingClass = getBaseClass();
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementBaseImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementBaseImpl.java
index 9d54fe8bfdaf..187cb31ef043 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementBaseImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementBaseImpl.java
@@ -19,9 +19,9 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiImportStatementBase;
import com.intellij.psi.PsiJavaCodeReferenceElement;
-import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiImportStatementStub;
import com.intellij.psi.impl.source.tree.ChildRole;
+import com.intellij.psi.stubs.IStubElementType;
/**
* @author dsl
@@ -29,8 +29,8 @@ import com.intellij.psi.impl.source.tree.ChildRole;
public abstract class PsiImportStatementBaseImpl extends JavaStubPsiElement implements PsiImportStatementBase{
public static final PsiImportStatementBaseImpl[] EMPTY_ARRAY = new PsiImportStatementBaseImpl[0];
- protected PsiImportStatementBaseImpl(final PsiImportStatementStub stub) {
- super(stub, stub.isStatic() ? JavaStubElementTypes.IMPORT_STATIC_STATEMENT : JavaStubElementTypes.IMPORT_STATEMENT);
+ protected PsiImportStatementBaseImpl(final PsiImportStatementStub stub, final IStubElementType type) {
+ super(stub, type);
}
protected PsiImportStatementBaseImpl(final ASTNode node) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementImpl.java
index 0d6b9c452a2b..95543aea709e 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStatementImpl.java
@@ -17,6 +17,7 @@ package com.intellij.psi.impl.source;
import com.intellij.lang.ASTNode;
import com.intellij.psi.*;
+import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiImportStatementStub;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NotNull;
@@ -30,7 +31,7 @@ public class PsiImportStatementImpl extends PsiImportStatementBaseImpl implement
};
public PsiImportStatementImpl(final PsiImportStatementStub stub) {
- super(stub);
+ super(stub, JavaStubElementTypes.IMPORT_STATEMENT);
}
public PsiImportStatementImpl(final ASTNode node) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStaticStatementImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStaticStatementImpl.java
index 86bb921a94e1..e6ac53611ab9 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStaticStatementImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiImportStaticStatementImpl.java
@@ -17,6 +17,7 @@ package com.intellij.psi.impl.source;
import com.intellij.lang.ASTNode;
import com.intellij.psi.*;
+import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiImportStatementStub;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NotNull;
@@ -31,7 +32,7 @@ public class PsiImportStaticStatementImpl extends PsiImportStatementBaseImpl imp
};
public PsiImportStaticStatementImpl(final PsiImportStatementStub stub) {
- super(stub);
+ super(stub, JavaStubElementTypes.IMPORT_STATIC_STATEMENT);
}
public PsiImportStaticStatementImpl(final ASTNode node) {
diff --git a/java/java-tests/testSrc/com/intellij/openapi/vfs/changes/PsiChangeTrackerTest.java b/java/java-tests/testSrc/com/intellij/openapi/vfs/changes/PsiChangeTrackerTest.java
index cc7cfce098de..67ebd8da3e2f 100644
--- a/java/java-tests/testSrc/com/intellij/openapi/vfs/changes/PsiChangeTrackerTest.java
+++ b/java/java-tests/testSrc/com/intellij/openapi/vfs/changes/PsiChangeTrackerTest.java
@@ -28,7 +28,7 @@ public class PsiChangeTrackerTest extends IdeaTestCase {
final VirtualFile testRoot = getTestRoot();
final VirtualFile child = testRoot.findChild("PsiChangesTest.java");
assert child != null : "Can't find PsiChangesTest.java";
- final PsiFile original = this.getPsiManager().findFile(child);
+ final PsiFile original = getPsiManager().findFile(child);
assert original != null : "Can't create PsiFile from VirtualFile " + child.getName();
myOriginalFile = original;
diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationModule.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationModule.java
index 43fdf26a15e4..d7d9638d9569 100644
--- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationModule.java
+++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationModule.java
@@ -17,14 +17,13 @@
package com.intellij.execution.configurations;
import com.intellij.execution.ExecutionBundle;
+import com.intellij.openapi.application.ApplicationManager;
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.ModuleRootManager;
-import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMExternalizable;
-import com.intellij.openapi.util.WriteExternalException;
+import com.intellij.openapi.util.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
@@ -85,7 +84,13 @@ public class RunConfigurationModule implements JDOMExternalizable {
@Nullable
public Module findModule(final String moduleName) {
- return getModuleManager().findModuleByName(moduleName);
+ return ApplicationManager.getApplication().runReadAction(new Computable() {
+ @Nullable
+ @Override
+ public Module compute() {
+ return getModuleManager().findModuleByName(moduleName);
+ }
+ });
}
public void setModule(final Module module) {
diff --git a/platform/lang-impl/src/com/intellij/execution/KillableProcess.java b/platform/lang-impl/src/com/intellij/execution/KillableProcess.java
new file mode 100644
index 000000000000..041e61fb955e
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/execution/KillableProcess.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2010 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 com.intellij.execution;
+
+/**
+ * @author nik
+ */
+public interface KillableProcess {
+ boolean canKillProcess();
+
+ void killProcess();
+}
diff --git a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java
index c6256dc28ef2..b71b79a3da41 100644
--- a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java
+++ b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java
@@ -17,20 +17,33 @@
package com.intellij.execution.actions;
import com.intellij.execution.ExecutionManager;
+import com.intellij.execution.KillableProcess;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.ui.RunContentManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.IconLoader;
import org.jetbrains.annotations.Nullable;
+import javax.swing.*;
+
public class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate {
+ public static final Icon KILL_PROCESS_ICON = IconLoader.getIcon("/debugger/killProcess.png");
+
public void actionPerformed(final AnActionEvent e) {
final ProcessHandler processHandler = getProcessHandler(e);
if(processHandler == null) return;
+
+ if (processHandler instanceof KillableProcess && processHandler.isProcessTerminating()) {
+ ((KillableProcess)processHandler).killProcess();
+ return;
+ }
+
if(processHandler.detachIsDefault()) {
processHandler.detachProcess();
} else {
@@ -40,8 +53,24 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU
public void update(final AnActionEvent e) {
final ProcessHandler processHandler = getProcessHandler(e);
- boolean enable = processHandler != null && !processHandler.isProcessTerminating() && !processHandler.isProcessTerminated();
- e.getPresentation().setEnabled(enable);
+ final Presentation presentation = e.getPresentation();
+
+ boolean enable = false;
+ Icon icon = getTemplatePresentation().getIcon();
+ String description = getTemplatePresentation().getDescription();
+ if (processHandler != null && !processHandler.isProcessTerminated()) {
+ if (!processHandler.isProcessTerminating()) {
+ enable = true;
+ }
+ else if (processHandler instanceof KillableProcess && ((KillableProcess)processHandler).canKillProcess()) {
+ enable = true;
+ icon = KILL_PROCESS_ICON;
+ description = "Kill process";
+ }
+ }
+ presentation.setEnabled(enable);
+ presentation.setIcon(icon);
+ presentation.setDescription(description);
}
@Nullable
diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java
index a1f25fa7abb3..e08c4a7d677e 100644
--- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java
+++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java
@@ -1784,7 +1784,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
return;
}
- final int deferredOffset = myContentSize - consoleView.myDeferredUserInput.length();
+ final int deferredOffset = myContentSize - consoleView.myDeferredOutput.length() - consoleView.myDeferredUserInput.length();
if (offset > info.endOffset) {
startOffset = info.endOffset;
}
@@ -1835,7 +1835,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
}
if (consoleView.myDeferredUserInput.length() == 0) return;
- final int deferredOffset = myContentSize - consoleView.myDeferredUserInput.length();
+ final int deferredOffset = myContentSize - consoleView.myDeferredOutput.length() - consoleView.myDeferredUserInput.length();
startOffset = getStartOffset(start, info, deferredOffset);
endOffset = getEndOffset(end, info);
@@ -1883,7 +1883,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
if (info.contentType != ConsoleViewContentType.USER_INPUT) return;
if (consoleView.myDeferredUserInput.length() == 0) return;
- final int deferredOffset = myContentSize - consoleView.myDeferredUserInput.length();
+ final int deferredOffset = myContentSize - consoleView.myDeferredOutput.length() - consoleView.myDeferredUserInput.length();
startOffset = getStartOffset(offset, info, deferredOffset);
endOffset = getEndOffset(offset + length, info);
if (startOffset == -1 ||
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java
index 0487a68a3ef4..527b438002e8 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java
@@ -170,15 +170,11 @@ public class CompositeElement extends TreeElement {
@NotNull
public String getText() {
- char[] buffer = new char[getTextLength()];
- AstBufferUtil.toBuffer(this, buffer, 0);
- return new String(buffer);
+ return new String(textToCharArray());
}
public CharSequence getChars() {
- char[] buffer = new char[getTextLength()];
- AstBufferUtil.toBuffer(this, buffer, 0);
- return new CharArrayCharSequence(buffer);
+ return new CharArrayCharSequence(textToCharArray());
}
public int getNotCachedLength() {
@@ -220,7 +216,7 @@ public class CompositeElement extends TreeElement {
return curOffset;
}
-
+ @Nullable
public final PsiElement findChildByRoleAsPsiElement(int role) {
ASTNode element = findChildByRole(role);
if (element == null) return null;
diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java
index 18fda16f4679..724a9cf8c945 100644
--- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java
+++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java
@@ -45,6 +45,7 @@ import com.intellij.util.io.DataInputOutputUtil;
import gnu.trove.TIntArrayList;
import gnu.trove.TObjectIntHashMap;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.io.DataInput;
import java.io.DataOutput;
@@ -52,6 +53,7 @@ import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
@State(
@@ -64,6 +66,7 @@ import java.util.concurrent.locks.Lock;
}
)
public class StubIndexImpl extends StubIndex implements ApplicationComponent, PersistentStateComponent {
+ private static final AtomicReference ourForcedClean = new AtomicReference(null);
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubIndexImpl");
private final Map, MyIndex>> myIndices = new HashMap, MyIndex>>();
private final TObjectIntHashMap> myIndexIdToVersionMap = new TObjectIntHashMap>();
@@ -71,19 +74,29 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe
private StubIndexState myPreviouslyRegistered;
public StubIndexImpl(FileBasedIndex fileBasedIndex /* need this to ensure initialization order*/ ) throws IOException {
+ final boolean forceClean = Boolean.TRUE == ourForcedClean.getAndSet(Boolean.FALSE);
+
final StubIndexExtension, ?>[] extensions = Extensions.getExtensions(StubIndexExtension.EP_NAME);
boolean needRebuild = false;
for (StubIndexExtension extension : extensions) {
//noinspection unchecked
- needRebuild |= registerIndexer(extension);
+ needRebuild |= registerIndexer(extension, forceClean);
}
if (needRebuild) {
requestRebuild();
}
dropUnregisteredIndices();
}
-
- private boolean registerIndexer(final StubIndexExtension extension) throws IOException {
+
+ @Nullable
+ public static StubIndexImpl getInstanceOrInvalidate() {
+ if (ourForcedClean.compareAndSet(null, Boolean.TRUE)) {
+ return null;
+ }
+ return (StubIndexImpl)getInstance();
+ }
+
+ private boolean registerIndexer(final StubIndexExtension extension, final boolean forceClean) throws IOException {
final StubIndexKey indexKey = extension.getKey();
final int version = extension.getVersion();
myIndexIdToVersionMap.put(indexKey, version);
@@ -91,10 +104,10 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe
final boolean versionFileExisted = versionFile.exists();
final File indexRootDir = IndexInfrastructure.getIndexRootDir(indexKey);
boolean needRebuild = false;
- if (IndexInfrastructure.versionDiffers(versionFile, version)) {
+ if (forceClean || IndexInfrastructure.versionDiffers(versionFile, version)) {
final String[] children = indexRootDir.list();
// rebuild only if there exists what to rebuild
- needRebuild = versionFileExisted || children != null && children.length > 0;
+ needRebuild = !forceClean && (versionFileExisted || children != null && children.length > 0);
if (needRebuild) {
LOG.info("Version has changed for stub index " + extension.getKey() + ". The index will be rebuilt.");
}
diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java
index 65c4f326a2b6..d8d71241774e 100644
--- a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java
+++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java
@@ -370,19 +370,25 @@ public class StubUpdatingIndex extends CustomImplementationFileBasedIndexExtensi
}
public void clear() throws StorageException {
- final StubIndexImpl stubIndex = getStubIndex();
+ final StubIndexImpl stubIndex = StubIndexImpl.getInstanceOrInvalidate();
try {
- for (StubIndexKey key : stubIndex.getAllStubIndexKeys()) {
- stubIndex.getWriteLock(key).lock();
+ if (stubIndex != null) {
+ for (StubIndexKey key : stubIndex.getAllStubIndexKeys()) {
+ stubIndex.getWriteLock(key).lock();
+ }
}
getWriteLock().lock();
- stubIndex.clearAllIndices();
+ if (stubIndex != null) {
+ stubIndex.clearAllIndices();
+ }
super.clear();
}
finally {
getWriteLock().unlock();
- for (StubIndexKey key : stubIndex.getAllStubIndexKeys()) {
- stubIndex.getWriteLock(key).unlock();
+ if (stubIndex != null) {
+ for (StubIndexKey key : stubIndex.getAllStubIndexKeys()) {
+ stubIndex.getWriteLock(key).unlock();
+ }
}
}
}
diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileContent.java b/platform/lang-impl/src/com/intellij/util/indexing/FileContent.java
index 545d79dc89c2..55908f4429a0 100644
--- a/platform/lang-impl/src/com/intellij/util/indexing/FileContent.java
+++ b/platform/lang-impl/src/com/intellij/util/indexing/FileContent.java
@@ -96,7 +96,7 @@ public final class FileContent extends UserDataHolderBase {
public FileContent(@NotNull final VirtualFile file, @NotNull final byte[] content) {
this(file);
myContent = content;
- myCharset = LoadTextUtil.detectCharset(file, content);
+ myCharset = LoadTextUtil.detectCharsetAndSetBOM(file, content);
}
public FileContent(@NotNull final VirtualFile file) {
diff --git a/platform/lvcs-impl/src/com/intellij/history/integration/ui/actions/LocalHistoryAction.java b/platform/lvcs-impl/src/com/intellij/history/integration/ui/actions/LocalHistoryAction.java
index 200952674cb5..c59d39a24186 100644
--- a/platform/lvcs-impl/src/com/intellij/history/integration/ui/actions/LocalHistoryAction.java
+++ b/platform/lvcs-impl/src/com/intellij/history/integration/ui/actions/LocalHistoryAction.java
@@ -27,6 +27,7 @@ import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.Nullable;
public abstract class LocalHistoryAction extends AnAction implements DumbAware {
@Override
@@ -39,7 +40,10 @@ public abstract class LocalHistoryAction extends AnAction implements DumbAware {
}
p.setVisible(true);
p.setText(getText(e), true);
- p.setEnabled(isEnabled(getVcs(), getGateway(), getFile(e), e));
+
+ LocalHistoryFacade vcs = getVcs();
+ IdeaGateway gateway = getGateway();
+ p.setEnabled(vcs != null && gateway != null && isEnabled(vcs, gateway, getFile(e), e));
}
protected String getText(AnActionEvent e) {
@@ -58,6 +62,7 @@ public abstract class LocalHistoryAction extends AnAction implements DumbAware {
return LocalHistoryImpl.getInstanceImpl().getGateway();
}
+ @Nullable
protected VirtualFile getFile(AnActionEvent e) {
VirtualFile[] ff = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY);
if (ff == null || ff.length == 0) return null;
diff --git a/platform/platform-api/src/com/intellij/ide/plugins/PluginManager.java b/platform/platform-api/src/com/intellij/ide/plugins/PluginManager.java
index cc3140451a29..d642879ca706 100644
--- a/platform/platform-api/src/com/intellij/ide/plugins/PluginManager.java
+++ b/platform/platform-api/src/com/intellij/ide/plugins/PluginManager.java
@@ -760,11 +760,11 @@ public class PluginManager {
ourBuildNumber = BuildNumber.fromString(new String(FileUtil.loadFileText(buildTxtFile)).trim());
}
else {
- ourBuildNumber = BuildNumber.fromString("98.SNAPSHOT");
+ ourBuildNumber = BuildNumber.fromString("100.SNAPSHOT");
}
}
catch (IOException e) {
- ourBuildNumber = BuildNumber.fromString("98.SNAPSHOT");
+ ourBuildNumber = BuildNumber.fromString("100.SNAPSHOT");
}
}
}
diff --git a/platform/platform-impl/src/com/intellij/ide/impl/DataManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/impl/DataManagerImpl.java
index cd020df0c144..866ab977907c 100644
--- a/platform/platform-impl/src/com/intellij/ide/impl/DataManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/ide/impl/DataManagerImpl.java
@@ -34,7 +34,7 @@ import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.util.KeyedLazyInstanceEP;
import com.intellij.util.StringSetSpinAllocator;
-import com.intellij.util.containers.WeakHashMap;
+import com.intellij.util.containers.WeakValueHashMap;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -299,7 +299,7 @@ public class DataManagerImpl extends DataManager implements ApplicationComponent
// the weak reference. For example, Swing often remembers menu items
// that have DataContext as a field.
private final WeakReference myRef;
- private WeakHashMap mySavedData;
+ private WeakValueHashMap mySavedData;
public MyDataContext(final Component component) {
myEventCount = -1;
@@ -375,9 +375,9 @@ public class DataManagerImpl extends DataManager implements ApplicationComponent
getOrCreateMap().put(key, value);
}
- private WeakHashMap getOrCreateMap() {
+ private WeakValueHashMap getOrCreateMap() {
if (mySavedData == null) {
- mySavedData = new WeakHashMap();
+ mySavedData = new WeakValueHashMap();
}
return mySavedData;
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java
index 800d857bd1f0..a0fa01191c61 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java
@@ -94,7 +94,7 @@ public final class LoadTextUtil {
return Pair.create(result, detectedLineSeparator);
}
- public static Charset detectCharset(final VirtualFile virtualFile, final byte[] content) {
+ private static Charset detectCharset(final VirtualFile virtualFile, final byte[] content) {
Charset charset = dodetectCharset(virtualFile, content);
charset = charset == null ? EncodingManager.getInstance().getDefaultCharset() : charset;
if (virtualFile.getFileType() == StdFileTypes.PROPERTIES && EncodingManager.getInstance().isNative2AsciiForPropertiesFiles(virtualFile)) {
@@ -104,6 +104,12 @@ public final class LoadTextUtil {
return charset;
}
+ public static Charset detectCharsetAndSetBOM(final VirtualFile virtualFile, final byte[] content) {
+ Charset charset = detectCharset(virtualFile, content);
+ detectAndSetBOM(virtualFile, content);
+ return charset;
+ }
+
private static Charset dodetectCharset(final VirtualFile virtualFile, final byte[] content) {
EncodingManager settings = EncodingManager.getInstance();
boolean shouldGuess = settings != null && settings.isUseUTFGuessing(virtualFile);
@@ -133,7 +139,8 @@ public final class LoadTextUtil {
return CharsetToolkit.forName(charsetName);
}
- private static int skipBOM(final VirtualFile virtualFile, byte[] content) {
+ // returns offset of the BOM end
+ private static int detectAndSetBOM(final VirtualFile virtualFile, byte[] content) {
final byte[] bom = getBOM(content, Patches.SUN_BUG_ID_4508058 ? virtualFile.getCharset() : null);
if (bom.length != 0) {
virtualFile.setBOM(bom);
@@ -268,7 +275,7 @@ public final class LoadTextUtil {
@NotNull
public static CharSequence getTextByBinaryPresentation(@NotNull byte[] bytes, @NotNull VirtualFile virtualFile, final boolean rememberDetectedSeparators) {
final Charset charset = detectCharset(virtualFile, bytes);
- final int offset = skipBOM(virtualFile, bytes);
+ final int offset = detectAndSetBOM(virtualFile, bytes);
final Pair result = convertBytes(bytes, charset, offset);
if (rememberDetectedSeparators) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java
index b920db656fc2..ffe0ed3b534b 100644
--- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java
+++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java
@@ -271,6 +271,7 @@ public abstract class VirtualFileSystemEntry extends NewVirtualFile {
if (isDirectory()) {
Charset configured = EncodingManager.getInstance().getEncoding(this, true);
charset = configured == null ? Charset.defaultCharset() : configured;
+ setCharset(charset);
}
else {
try {
@@ -282,7 +283,7 @@ public abstract class VirtualFileSystemEntry extends NewVirtualFile {
// file has already been deleted from disk
return super.getCharset();
}
- charset = LoadTextUtil.detectCharset(this, content);
+ charset = LoadTextUtil.detectCharsetAndSetBOM(this, content);
}
catch (FileTooBigException e) {
return super.getCharset();
@@ -291,7 +292,6 @@ public abstract class VirtualFileSystemEntry extends NewVirtualFile {
throw new RuntimeException(e);
}
}
- setCharset(charset);
}
return charset;
}
diff --git a/platform/testRunner/src/com/intellij/execution/testframework/ui/TestsOutputConsolePrinter.java b/platform/testRunner/src/com/intellij/execution/testframework/ui/TestsOutputConsolePrinter.java
index 52deae07eb3e..78d9c99c84d0 100644
--- a/platform/testRunner/src/com/intellij/execution/testframework/ui/TestsOutputConsolePrinter.java
+++ b/platform/testRunner/src/com/intellij/execution/testframework/ui/TestsOutputConsolePrinter.java
@@ -118,11 +118,11 @@ public class TestsOutputConsolePrinter implements Printer, Disposable {
}
public boolean isCurrent(CompositePrintable printable) {
- return myCurrentTest == printable || (isRoot() && myUnboundOutputRoot != null);
+ return myCurrentTest == printable || isRoot();
}
private boolean isRoot() {
- return myCurrentTest.getParent() == myUnboundOutputRoot;
+ return myCurrentTest != null && myCurrentTest.getParent() == myUnboundOutputRoot;
}
public void printHyperlink(final String text, final HyperlinkInfo info) {
diff --git a/platform/util/src/com/intellij/openapi/util/BuildNumber.java b/platform/util/src/com/intellij/openapi/util/BuildNumber.java
index 40e746430c4b..b72e58173df9 100644
--- a/platform/util/src/com/intellij/openapi/util/BuildNumber.java
+++ b/platform/util/src/com/intellij/openapi/util/BuildNumber.java
@@ -26,7 +26,7 @@ public class BuildNumber implements Comparable {
private final int myBaselineVersion;
private final int myBuildNumber;
private static final String BUILD_NUMBER = "__BUILD_NUMBER__";
- private static final int TOP_BASELINE_VERSION = 98;
+ private static final int TOP_BASELINE_VERSION = 100;
public BuildNumber(String productCode, int baselineVersion, int buildNumber) {
myProductCode = productCode;
diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
index 734b4d13a612..6237307a8ccb 100644
--- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
+++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
@@ -534,6 +534,7 @@ public class FileUtil {
return true;
}
catch (IOException e) {
+ LOG.info(e);
return false;
}
}
diff --git a/platform/util/src/com/intellij/util/xmlb/SkipDefaultValuesSerializationFilters.java b/platform/util/src/com/intellij/util/xmlb/SkipDefaultValuesSerializationFilters.java
index b09cbc774790..c122ce77aceb 100644
--- a/platform/util/src/com/intellij/util/xmlb/SkipDefaultValuesSerializationFilters.java
+++ b/platform/util/src/com/intellij/util/xmlb/SkipDefaultValuesSerializationFilters.java
@@ -27,6 +27,9 @@ public class SkipDefaultValuesSerializationFilters implements SerializationFilte
private final Map myDefaultBeans = new HashMap();
public boolean accepts(final Accessor accessor, final Object bean) {
+ if (bean == null) {
+ return true;
+ }
Object defaultBean = getDefaultBean(bean);
final Object defValue = accessor.read(defaultBean);
diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java
index c1d6d18afc9f..2ca796d00f54 100644
--- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java
+++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java
@@ -152,6 +152,9 @@ public class AnnotationUtilEx {
}
}
}
+ else if (parent instanceof PsiConditionalExpression && ((PsiConditionalExpression)parent).getCondition() == element) {
+ return false;
+ }
else if (parent instanceof PsiReturnStatement) {
final PsiMethod m = PsiTreeUtil.getParentOfType(parent, PsiMethod.class);
if (m != null) {
diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java
index feed23cd41fe..b37a8e7e361e 100644
--- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java
+++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java
@@ -65,7 +65,6 @@ public class ContextComputationProcessor {
}
public void collectOperands(final PsiElement expression, final List
+
+
+
+
+
diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.form
index 22d36f23a421..6fe13b6383eb 100644
--- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.form
+++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.form
@@ -1,6 +1,6 @@
+
+
+
+
+
diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java
index 6c35036f255e..84ba85436d9e 100644
--- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java
+++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java
@@ -23,6 +23,7 @@ import com.intellij.execution.junit2.TestProxy;
import com.intellij.execution.junit2.segments.DeferredActionsQueue;
import com.intellij.execution.junit2.segments.DeferredActionsQueueImpl;
import com.intellij.execution.junit2.segments.DispatchListener;
+import com.intellij.execution.junit2.segments.Extractor;
import com.intellij.execution.junit2.ui.JUnitTreeConsoleView;
import com.intellij.execution.junit2.ui.TestsPacketsReceiver;
import com.intellij.execution.junit2.ui.actions.RerunFailedTestsAction;
@@ -263,7 +264,7 @@ public abstract class TestObject implements JavaCommandLine {
consoleView.attachToProcess(handler);
unboundOutputRoot.setPrinter(consoleView.getPrinter());
Disposer.register(consoleView, unboundOutputRoot);
- final TestsPacketsReceiver packetsReceiver = new TestsPacketsReceiver(consoleView) {
+ final TestsPacketsReceiver packetsReceiver = new TestsPacketsReceiver(consoleView, unboundOutputRoot) {
@Override
public void notifyStart(TestProxy root) {
super.notifyStart(root);
@@ -309,20 +310,23 @@ public abstract class TestObject implements JavaCommandLine {
public void onTextAvailable(final ProcessEvent event, final Key outputType) {
final String text = event.getText();
final ConsoleViewContentType consoleViewType = ConsoleViewContentType.getConsoleViewType(outputType);
- final Set currentTests = packetsReceiver.getCurrentTests();
final Printable printable = new Printable() {
public void printOn(final Printer printer) {
printer.print(text, consoleViewType);
}
};
-
- if (!currentTests.isEmpty()) {
- for (TestProxy currentTest : currentTests) {
- currentTest.addLast(printable);
- }
+ if (consoleViewType == ConsoleViewContentType.SYSTEM_OUTPUT) {
+ unboundOutputRoot.addLast(printable);
}
else {
- unboundOutputRoot.addLast(printable);
+ final Extractor extractor;
+ if (consoleViewType == ConsoleViewContentType.ERROR_OUTPUT) {
+ extractor = handler.getErr();
+ }
+ else {
+ extractor = handler.getOut();
+ }
+ extractor.getEventsDispatcher().processOutput(printable);
}
}
});
diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java
index a19acc43863a..a3588c08df2f 100644
--- a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java
+++ b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java
@@ -25,31 +25,36 @@ import com.intellij.execution.junit2.info.ClassBasedInfo;
import com.intellij.execution.junit2.info.DisplayTestInfoExtractor;
import com.intellij.execution.junit2.segments.InputObjectRegistry;
import com.intellij.execution.junit2.segments.ObjectReader;
+import com.intellij.execution.junit2.segments.OutputPacketProcessor;
import com.intellij.execution.junit2.states.*;
import com.intellij.execution.junit2.ui.model.CompletionEvent;
import com.intellij.execution.junit2.ui.model.JUnitListenersNotifier;
import com.intellij.execution.junit2.ui.model.JUnitRunningModel;
import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties;
import com.intellij.execution.testframework.AbstractTestProxy;
+import com.intellij.execution.testframework.Printable;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.rt.execution.junit.segments.PacketProcessor;
import com.intellij.rt.execution.junit.segments.PoolOfDelimiters;
import com.intellij.rt.execution.junit.states.PoolOfTestStates;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
-public class TestsPacketsReceiver implements PacketProcessor, Disposable {
+public class TestsPacketsReceiver implements OutputPacketProcessor, Disposable {
public static final Map STATE_CLASSES = new HashMap();
private Map myKnownDynamicParents;
+ private TestProxy myUnboundOutput;
static {
mapClass(PoolOfTestStates.RUNNING_INDEX, new RunningStateSetter());
@@ -74,18 +79,13 @@ public class TestsPacketsReceiver implements PacketProcessor, Disposable {
private final JUnitConsoleProperties myConsoleProperties;
- public TestsPacketsReceiver(final JUnitTreeConsoleView consoleView) {
+ public TestsPacketsReceiver(final JUnitTreeConsoleView consoleView, TestProxy unboundOutput) {
+ myUnboundOutput = unboundOutput;
myObjectRegistry = new InputObjectRegistry();
myConsoleProperties = (JUnitConsoleProperties)consoleView.getProperties();
Disposer.register(consoleView, this);
}
- public Set getCurrentTests() {
- synchronized (myCurrentTests) {
- return new HashSet(myCurrentTests);
- }
- }
-
public void processPacket(final String packet) {
ApplicationManager.getApplication().assertIsDispatchThread();
@@ -110,6 +110,18 @@ public class TestsPacketsReceiver implements PacketProcessor, Disposable {
}
}
+ @Override
+ public void processOutput(Printable printable) {
+ synchronized (myCurrentTests) {
+ if (myCurrentTests.isEmpty()) {
+ myUnboundOutput.addLast(printable);
+ } else {
+ for (TestProxy currentTest : myCurrentTests) {
+ currentTest.addLast(printable);
+ }
+ }
+ }
+ }
public void notifyStart(TestProxy root) {
myModel = new JUnitRunningModel(root, myConsoleProperties);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenServicesConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenServicesConfigurable.java
index 793f93df4833..1906590c48d4 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenServicesConfigurable.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenServicesConfigurable.java
@@ -261,6 +261,8 @@ public class MavenServicesConfigurable extends BaseConfigurable implements Searc
}
public void disposeUIResources() {
+ if (myRepaintTimer == null) return; // has not yet been initialized and reset
+
myRepaintTimer.removeActionListener(myTimerListener);
myRepaintTimer.stop();
Disposer.dispose(myUpdatingIcon);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
index 71b8d64b0726..daf1f2c34ed0 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
@@ -46,6 +46,7 @@ import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.update.Update;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.idea.maven.model.MavenConstants;
import org.jetbrains.idea.maven.utils.MavenMergingUpdateQueue;
@@ -168,25 +169,30 @@ public class MavenProjectsManagerWatcher {
File parentFile = settingsFile.getParentFile();
if (parentFile != null) {
- myWatchedRoots.add(LocalFileSystem.getInstance().addRootToWatch(getNormalizedPath(parentFile), false));
+ String path = getNormalizedPath(parentFile);
+ if (path != null) {
+ myWatchedRoots.add(LocalFileSystem.getInstance().addRootToWatch(path, false));
+ }
}
- String url = VfsUtil.pathToUrl(getNormalizedPath(settingsFile));
- mySettingsFilesPointers
- .add(VirtualFilePointerManager.getInstance().create(url, myChangedDocumentsQueue, new VirtualFilePointerListener() {
- public void beforeValidityChanged(VirtualFilePointer[] pointers) {
- }
+ String path = getNormalizedPath(settingsFile);
+ if (path != null) {
+ String url = VfsUtil.pathToUrl(path);
+ mySettingsFilesPointers.add(
+ VirtualFilePointerManager.getInstance().create(url, myChangedDocumentsQueue, new VirtualFilePointerListener() {
+ public void beforeValidityChanged(VirtualFilePointer[] pointers) {
+ }
- public void validityChanged(VirtualFilePointer[] pointers) {
- }
- }));
+ public void validityChanged(VirtualFilePointer[] pointers) {
+ }
+ }));
+ }
}
+ @Nullable
private static String getNormalizedPath(@NotNull File settingsFile) {
String canonized = PathUtil.getCanonicalPath(settingsFile.getAbsolutePath());
- // todo hook for IDEADEV-40110
- assert canonized != null : "cannot normalize path for: " + settingsFile;
- return FileUtil.toSystemIndependentName(canonized);
+ return canonized == null ? null : FileUtil.toSystemIndependentName(canonized);
}
public synchronized void stop() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
index adfddb53638f..d7ccdcdd4dce 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
@@ -54,11 +54,12 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
private List mySelectedProfiles = new ArrayList();
private MavenProjectsTree myMavenProjectTree;
+ private List mySelectedProjects;
private boolean myOpenModulesConfigurator;
}
- private Parameters myParamaters;
+ private Parameters myParameters;
public String getName() {
return ProjectBundle.message("maven.name");
@@ -69,7 +70,7 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
}
public void cleanup() {
- myParamaters = null;
+ myParameters = null;
super.cleanup();
}
@@ -79,10 +80,10 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
}
private Parameters getParameters() {
- if (myParamaters == null) {
- myParamaters = new Parameters();
+ if (myParameters == null) {
+ myParameters = new Parameters();
}
- return myParamaters;
+ return myParameters;
}
@Override
@@ -101,8 +102,7 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
settings.importingSettings = getImportingSettings();
MavenProjectsManager manager = MavenProjectsManager.getInstance(project);
- List files = getParameters().myMavenProjectTree.getRootProjectsFiles();
- manager.addManagedFilesWithProfiles(files, getSelectedProfiles());
+ manager.addManagedFilesWithProfiles(MavenUtil.collectFiles(getParameters().mySelectedProjects), getSelectedProfiles());
manager.waitForReadingCompletion();
boolean isFromUI = model != null;
@@ -196,7 +196,9 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
MavenProjectsTree tree = new MavenProjectsTree();
tree.addManagedFilesWithProfiles(getParameters().myFiles, getParameters().mySelectedProfiles);
tree.updateAll(false, getGeneralSettings(), process);
+
getParameters().myMavenProjectTree = tree;
+ getParameters().mySelectedProjects = tree.getRootProjects();
}
public List getList() {
@@ -204,10 +206,11 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
}
public void setList(List projects) {
+ getParameters().mySelectedProjects = projects;
}
- public boolean isMarked(final MavenProject element) {
- return true;
+ public boolean isMarked(MavenProject element) {
+ return getParameters().mySelectedProjects.contains(element);
}
public boolean isOpenProjectSettingsAfter() {