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 result, final Ref unparsable) { - final PsiElement firstChild; if (expression instanceof PsiParenthesizedExpression) { collectOperands(((PsiParenthesizedExpression)expression).getExpression(), result, unparsable); } @@ -93,17 +92,17 @@ public class ContextComputationProcessor { else if (PsiUtilEx.isStringOrCharacterLiteral(expression)) { result.add(expression); } - else { + else if (expression instanceof PsiExpression) { final SmartList uncomputables = new SmartList(); - final Object o = expression instanceof PsiExpression? myEvaluationHelper.computeExpression((PsiExpression)expression, uncomputables) : null; + final Object o = myEvaluationHelper.computeExpression((PsiExpression)expression, uncomputables); + addStringFragment(String.valueOf(o), result); if (uncomputables.size() > 0) { unparsable.set(Boolean.TRUE); } - if (o == null) { - result.add(expression); - } else { - addStringFragment(String.valueOf(o), result); - } + } + else { + unparsable.set(Boolean.TRUE); + result.add(expression); } } diff --git a/plugins/ant/src/com/intellij/lang/ant/dom/AntResolveInspection.java b/plugins/ant/src/com/intellij/lang/ant/dom/AntResolveInspection.java index eb10fd8c0c05..ac614411971c 100644 --- a/plugins/ant/src/com/intellij/lang/ant/dom/AntResolveInspection.java +++ b/plugins/ant/src/com/intellij/lang/ant/dom/AntResolveInspection.java @@ -18,6 +18,7 @@ package com.intellij.lang.ant.dom; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.lang.ant.AntBundle; import com.intellij.lang.ant.validation.AntInspection; +import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiReference; import com.intellij.psi.xml.XmlElement; import com.intellij.util.containers.ContainerUtil; @@ -98,7 +99,7 @@ public class AntResolveInspection extends AntInspection { if (processed != null && processed.contains(ref)) { continue; } - if (ref.resolve() == null) { + if (!isResolvable(ref)) { holder.createProblem(domElement, ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, antDomRef.getUnresolvedMessagePattern(), ref.getRangeInElement() /*todo add quickfixes*/); if (ref instanceof AntDomFileReference) { if (processed == null) { @@ -115,5 +116,13 @@ public class AntResolveInspection extends AntInspection { } } - + private static boolean isResolvable(PsiReference ref) { + if (ref.resolve() != null) { + return true; + } + if (ref instanceof PsiPolyVariantReference) { + return ((PsiPolyVariantReference)ref).multiResolve(false).length > 0; + } + return false; + } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubCheckoutProvider.java b/plugins/github/src/org/jetbrains/plugins/github/GithubCheckoutProvider.java index 07575279763f..4f5e19ef37eb 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubCheckoutProvider.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubCheckoutProvider.java @@ -2,7 +2,9 @@ package org.jetbrains.plugins.github; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.CheckoutProvider; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -54,13 +56,17 @@ public class GithubCheckoutProvider implements CheckoutProvider { @Override public List compute() { ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); - return GithubUtil.getAvailableRepos(settings.getLogin(), settings.getPassword()); + return GithubUtil.getAvailableRepos(settings.getLogin(), settings.getPassword(), false); } }); } catch (GithubUtil.CancelledException e) { return; } + if (availableRepos.isEmpty()){ + Messages.showErrorDialog(project, "You don't have any repository available on GitHub.", "Cannot clone"); + return; + } Collections.sort(availableRepos, new Comparator() { @Override public int compare(final RepositoryInfo r1, final RepositoryInfo r2) { @@ -68,11 +74,20 @@ public class GithubCheckoutProvider implements CheckoutProvider { } }); final GithubCloneProjectDialog checkoutDialog = new GithubCloneProjectDialog(project, availableRepos); - // Change default directory to ~/work if exists - final File work = new File(System.getProperty("user.home"), "work"); - if (work.exists() && work.isDirectory()){ - checkoutDialog.setSelectedPath(work.getPath()); + // Configure folder to select project to + String clonePath = settings.getClonePath(); + final String homePath = System.getProperty("user.home"); + if (StringUtil.isEmpty(clonePath)) { + clonePath = homePath; } + else { + final File file = new File(clonePath); + if (!file.exists() || !file.isDirectory()){ + clonePath = homePath; + } + } + settings.setClonePath(clonePath); + checkoutDialog.setSelectedPath(clonePath); checkoutDialog.show(); if (!checkoutDialog.isOK()) { return; diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java index f7c9a26b4e1f..ba216d1fe522 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java @@ -25,21 +25,24 @@ public class GithubSettings implements PersistentStateComponent { private static final String GITHUB_SETTINGS_TAG = "GithubSettings"; private static final String LOGIN = "Login"; private static final String PASSWORD = "Password"; + private static final String CLONE_PATH = "ClonePath"; private String myLogin; private String myPassword; + private String myClonePath; public static GithubSettings getInstance(){ return ServiceManager.getService(GithubSettings.class); } public Element getState() { - if (StringUtil.isEmptyOrSpaces(myLogin) && StringUtil.isEmptyOrSpaces(myPassword)) { + if (StringUtil.isEmptyOrSpaces(myLogin) && StringUtil.isEmptyOrSpaces(myPassword) && StringUtil.isEmpty(myClonePath)) { return null; } final Element element = new Element(GITHUB_SETTINGS_TAG); element.setAttribute(LOGIN, myLogin); element.setAttribute(PASSWORD, getEncodedPassword()); + element.setAttribute(CLONE_PATH, myClonePath); return element; } @@ -60,6 +63,7 @@ public class GithubSettings implements PersistentStateComponent { try { setLogin(element.getAttributeValue(LOGIN)); setEncodedPassword(element.getAttributeValue(PASSWORD)); + setClonePath(element.getAttributeValue(CLONE_PATH)); } catch (Exception e) { // ignore @@ -81,4 +85,12 @@ public class GithubSettings implements PersistentStateComponent { public void setPassword(final String password) { myPassword = password; } + + public String getClonePath() { + return myClonePath; + } + + public void setClonePath(String clonePath) { + myClonePath = clonePath; + } } \ No newline at end of file diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java index c9a9cde06a42..1bf837fd04c5 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java @@ -29,7 +29,6 @@ import git4idea.checkin.GitPushUtils; import git4idea.commands.*; import git4idea.i18n.GitBundle; import git4idea.ui.GitUIUtil; -import org.jetbrains.plugins.github.ui.GithubLoginDialog; import org.jetbrains.plugins.github.ui.GithubShareDialog; import javax.swing.*; @@ -83,21 +82,29 @@ public class GithubShareAction extends DumbAwareAction { } BasicAction.saveAll(); - final GithubSettings settings = GithubSettings.getInstance(); - if (!GithubUtil.testConnection(settings.getLogin(), settings.getPassword())){ - final GithubLoginDialog dialog = new GithubLoginDialog(project); - dialog.show(); - if (!dialog.isOK()) { - return; - } + final List availableRepos = GithubUtil.getAvailableRepos(project, true); + if (availableRepos == null){ + return; } - final HashSet names = new HashSet(); - for (RepositoryInfo info : GithubUtil.getAvailableRepos(settings.getLogin(), settings.getPassword())) { + for (RepositoryInfo info : availableRepos) { names.add(info.getName()); } - final boolean privateRepoAllowed = GithubUtil.isPrivateRepoAllowed(settings.getLogin(), settings.getPassword()); + final GithubSettings settings = GithubSettings.getInstance(); + final boolean privateRepoAllowed; + try { + privateRepoAllowed = GithubUtil.accessToGithubWithModalProgress(project, new Computable() { + @Override + public Boolean compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); + return GithubUtil.isPrivateRepoAllowed(settings.getLogin(), settings.getPassword()); + } + }); + } + catch (GithubUtil.CancelledException ex) { + return; + } final GithubShareDialog shareDialog = new GithubShareDialog(project, names, privateRepoAllowed); shareDialog.show(); if (!shareDialog.isOK()) { diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java index 7aff71f0ee95..f2399d1ca986 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java @@ -1,5 +1,6 @@ package org.jetbrains.plugins.github; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; @@ -16,6 +17,8 @@ import org.apache.commons.httpclient.methods.PostMethod; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.github.ui.GithubLoginDialog; import java.io.InputStream; import java.util.ArrayList; @@ -28,6 +31,7 @@ import java.util.List; public class GithubUtil { public static final String GITHUB_HOST = "https://github.com"; private static final String API_URL = "/api/v2/xml"; + private static final Logger LOG = Logger.getInstance(GithubUtil.class.getName()); public static T accessToGithubWithModalProgress(final Project project, final Computable computable) throws CancelledException { final Ref result = new Ref(); @@ -81,11 +85,16 @@ public class GithubUtil { return GITHUB_HOST + API_URL; } - public static List getAvailableRepos(final String login, final String password) { + public static List getAvailableRepos(final String login, final String password, final boolean ownOnly) { try { - final HttpMethod method = doREST(login, password, "/repos/watched/" + login, false); + final String request = (ownOnly ? "/repos/show/" : "/repos/watched/") + login; + final HttpMethod method = doREST(login, password, request, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); + if ("error".equals(element.getName())){ + LOG.warn("Got error element by request: " + request); + return Collections.emptyList(); + } final List repositories = element.getChildren(); final List result = new ArrayList(); for (int i = 0; i < repositories.size(); i++) { @@ -102,9 +111,14 @@ public class GithubUtil { public static boolean isPrivateRepoAllowed(final String login, final String password) { try { - final HttpMethod method = doREST(login, password, "/user/show/" + login, false); + final String request = "/user/show/" + login; + final HttpMethod method = doREST(login, password, request, false); final InputStream stream = method.getResponseBodyAsStream(); final Element element = new SAXBuilder(false).build(stream).getRootElement(); + if ("error".equals(element.getName())){ + LOG.warn("Got error element by request: " + request); + return false; + } final Element plan = element.getChild("plan"); assert plan != null : "Authentification failed"; final String privateRepos = plan.getChildText("private_repos"); @@ -117,4 +131,48 @@ public class GithubUtil { } public static class CancelledException extends RuntimeException {} + + /** + * Shows GitHub login settings if credentials are wrong or empty and return the list of all the watched repos by user + * @param project + * @return + */ + @Nullable + public static List getAvailableRepos(final Project project, final boolean ownOnly) { + final GithubSettings settings = GithubSettings.getInstance(); + final boolean validCredentials; + try { + validCredentials = accessToGithubWithModalProgress(project, new Computable() { + @Override + public Boolean compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); + return testConnection(settings.getLogin(), settings.getPassword()); + } + }); + } + catch (CancelledException e) { + return null; + } + if (!validCredentials){ + final GithubLoginDialog dialog = new GithubLoginDialog(project); + dialog.show(); + if (!dialog.isOK()) { + return null; + } + } + // Otherwise our credentials are valid and they are successfully stored in settings + try { + return accessToGithubWithModalProgress(project, new Computable>() { + @Override + public List compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); + return getAvailableRepos(settings.getLogin(), settings.getPassword(), ownOnly); + } + }); + } + catch (CancelledException e) { + return null; + } + } + } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCloneProjectPane.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCloneProjectPane.form index b93620963ac8..4b43f7674fc2 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCloneProjectPane.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCloneProjectPane.form @@ -1,9 +1,9 @@
- + - + @@ -55,6 +55,11 @@ + + + + + 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 @@
- + @@ -61,6 +61,11 @@ + + + + + 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() {