NPE in JpsProjectLoader.loadFromDirectory() when trying to run a Run Configuration
authorVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Wed, 20 Dec 2017 13:05:55 +0000 (14:05 +0100)
committerVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Wed, 20 Dec 2017 13:06:42 +0000 (14:06 +0100)
java/testFramework/src/com/intellij/testFramework/CompilerTester.java
jps/model-serialization/src/org/jetbrains/jps/model/serialization/JDomSerializationUtil.java
jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java
platform/projectModel-api/src/com/intellij/configurationStore/StreamProvider.kt
platform/projectModel-api/src/com/intellij/openapi/project/ProjectUtilCore.kt
platform/projectModel-impl/src/com/intellij/openapi/module/impl/ExternalModuleListStorage.kt
platform/testFramework/src/com/intellij/testFramework/fixtures/IdeaTestFixtureFactory.java
platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java
platform/testFramework/src/com/intellij/testFramework/fixtures/impl/IdeaTestFixtureFactoryImpl.java

index 81d0c9cc74ae96a6e8575f6f9de73c82aee67c6b..89cc3b140ad9717d28c471697817db5fadb63745 100644 (file)
@@ -1,17 +1,5 @@
 /*
- * Copyright 2000-2017 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.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 package com.intellij.testFramework;
 
@@ -33,6 +21,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.project.ProjectKt;
 import com.intellij.psi.JavaPsiFacade;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.search.GlobalSearchScope;
@@ -188,11 +177,14 @@ public class CompilerTester {
 
       PlatformTestUtil.saveProject(getProject());
       CompilerTestUtil.saveApplicationSettings();
-      for (Module module : myModules) {
-        Path ioFile = Paths.get(module.getModuleFilePath());
-        if (!Files.exists(ioFile)) {
-          getProject().save();
-          assert Files.exists(ioFile) : "File does not exist: " + ioFile.toString();
+      // for now directory based project is used for external storage
+      if (!ProjectKt.isDirectoryBased(myProject)) {
+        for (Module module : myModules) {
+          Path ioFile = Paths.get(module.getModuleFilePath());
+          if (!Files.exists(ioFile)) {
+            getProject().save();
+            assert Files.exists(ioFile) : "File does not exist: " + ioFile.toString();
+          }
         }
       }
       runnable.consume(callback);
index 820739194eb45be127035ac6c54f02a75c24cd3f..8f9e9055e8cb14feb37dc74af3e5076031b23a75 100644 (file)
@@ -1,17 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 package org.jetbrains.jps.model.serialization;
 
@@ -25,7 +13,7 @@ import org.jetbrains.annotations.Nullable;
  * @author nik
  */
 public class JDomSerializationUtil {
-  @NonNls protected static final String COMPONENT_ELEMENT = "component";
+  @NonNls public static final String COMPONENT_ELEMENT = "component";
   @NonNls protected static final String OPTION_ELEMENT = "option";
   @NonNls protected static final String NAME_ATTRIBUTE = "name";
   @NonNls protected static final String VALUE_ATTRIBUTE = "value";
index 0e83777310ca9ebd00b8df328539a16f0287c582..c8a625e956b5c49df5f0ffcde1f0d7f2f61c86b6 100644 (file)
@@ -1,4 +1,6 @@
-// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+/*
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+ */
 package org.jetbrains.jps.model.serialization;
 
 import com.intellij.openapi.diagnostic.Logger;
@@ -149,7 +151,26 @@ public class JpsProjectLoader extends JpsLoaderBase {
     }
 
     Element moduleData = JDomSerializationUtil.findComponent(loadRootElement(dir.resolve("modules.xml")), "ProjectModuleManager");
-    Element externalModuleData = externalConfigDir == null ? null : loadRootElement(externalConfigDir.resolve("modules.xml"));
+    Element externalModuleData;
+    if (externalConfigDir == null) {
+      externalModuleData = null;
+    }
+    else {
+      Element rootElement = loadRootElement(externalConfigDir.resolve("modules.xml"));
+      if (rootElement == null) {
+        externalModuleData = null;
+      }
+      else {
+        externalModuleData = JDomSerializationUtil.findComponent(rootElement, "ExternalProjectModuleManager");
+        if (externalModuleData == null) {
+          externalModuleData = JDomSerializationUtil.findComponent(rootElement, "ExternalModuleListStorage");
+        }
+        // old format (root tag is "component")
+        if (externalModuleData == null && rootElement.getName().equals(JDomSerializationUtil.COMPONENT_ELEMENT)) {
+          externalModuleData = rootElement;
+        }
+      }
+    }
     if (externalModuleData != null) {
       String componentName = externalModuleData.getAttributeValue("name");
       LOG.assertTrue(componentName != null && componentName.startsWith("External"));
index 5f74c156631601a7025213a18e25029b7ccec0ab..d38c0f03dad5d9dcb2e1392a3f421b83ad7241ea 100644 (file)
@@ -1,17 +1,5 @@
 /*
- * Copyright 2000-2017 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.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 package com.intellij.configurationStore
 
@@ -20,9 +8,6 @@ import com.intellij.openapi.util.io.BufferExposingByteArrayOutputStream
 import org.jetbrains.annotations.TestOnly
 import java.io.InputStream
 
-@set:TestOnly
-var IS_EXTERNAL_STORAGE_ENABLED = false
-
 interface StreamProvider {
   val enabled: Boolean
     get() = true
index 465a1c760226eedba26621b78db093fdd655b0f2..77e76ce130130292e243f38765426961dbeb5959 100644 (file)
@@ -1,22 +1,9 @@
 /*
- * Copyright 2000-2017 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.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 @file:JvmName("ProjectUtilCore")
 package com.intellij.openapi.project
 
-import com.intellij.configurationStore.IS_EXTERNAL_STORAGE_ENABLED
 import com.intellij.openapi.module.ModuleUtilCore
 import com.intellij.openapi.roots.JdkOrderEntry
 import com.intellij.openapi.roots.libraries.LibraryUtil
@@ -67,5 +54,5 @@ val Project.isExternalStorageEnabled: Boolean
   get() {
     val key = "com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManager"
     val manager = picoContainer.getComponentInstance(key) as? ProjectFileStoreOptionManager ?: return false
-    return manager.isStoredExternally || Registry.`is`("store.imported.project.elements.separately", false) || IS_EXTERNAL_STORAGE_ENABLED
+    return manager.isStoredExternally || Registry.`is`("store.imported.project.elements.separately", false)
   }
\ No newline at end of file
index 285fcc5679627fc1217feb06ac4eaa78894baddc..8058a0b368400242a0895e83568046a62ec888e9 100644 (file)
@@ -1,4 +1,6 @@
-// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+/*
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+ */
 package com.intellij.openapi.module.impl
 
 import com.intellij.openapi.components.PersistentStateComponent
@@ -12,7 +14,7 @@ import com.intellij.openapi.roots.ProjectModelElement
 import com.intellij.openapi.roots.ProjectModelExternalSource
 import org.jdom.Element
 
-@State(name = "ExternalModuleListStorage", storages = arrayOf(Storage("modules.xml")), externalStorageOnly = true)
+@State(name = "ExternalProjectModuleManager", storages = arrayOf(Storage("modules.xml")), externalStorageOnly = true)
 internal class ExternalModuleListStorage(private val project: Project) : PersistentStateComponent<Element>, ProjectModelElement {
   var loadedState: Set<ModulePath>? = null
     private set
index 091da2af6fa5bb8395e935ad48c3b023dc5fe5bc..51115432f2ac78017800119702bd5a4d25598e3e 100644 (file)
@@ -1,17 +1,5 @@
 /*
- * Copyright 2000-2015 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.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 package com.intellij.testFramework.fixtures;
 
@@ -41,7 +29,11 @@ public abstract class IdeaTestFixtureFactory {
   public abstract void registerFixtureBuilder(@NotNull Class<? extends ModuleFixtureBuilder> aClass, @NotNull String implClassName);
 
   @NotNull
-  public abstract TestFixtureBuilder<IdeaProjectTestFixture> createFixtureBuilder(@NotNull String name);
+  public TestFixtureBuilder<IdeaProjectTestFixture> createFixtureBuilder(@NotNull String name) {
+    return createFixtureBuilder(name, false);
+  }
+
+  public abstract TestFixtureBuilder<IdeaProjectTestFixture> createFixtureBuilder(@NotNull String name, boolean isDirectoryBasedProject);
 
   @NotNull
   public abstract TestFixtureBuilder<IdeaProjectTestFixture> createLightFixtureBuilder();
index bf9b69d267cef18080c430cd19753e7c33ecb7ca..865a3ccb275f12df949682dbcc1ad50c0f283c0f 100644 (file)
@@ -65,10 +65,12 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
   private EditorListenerTracker myEditorListenerTracker;
   private ThreadTracker myThreadTracker;
   private final String myName;
+  private final boolean myIsDirectoryBasedProject;
   private SdkLeakTracker myOldSdks;
 
-  HeavyIdeaTestFixtureImpl(@NotNull String name) {
+  HeavyIdeaTestFixtureImpl(@NotNull String name, boolean isDirectoryBasedProject) {
     myName = name;
+    myIsDirectoryBasedProject = isDirectoryBasedProject;
   }
 
   void addModuleFixtureBuilder(ModuleFixtureBuilder builder) {
@@ -140,7 +142,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
       .synchronizeTempDirVfs(ObjectUtils.assertNotNull(LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempDirectory)));
     myFilesToDelete.add(tempDirectory);
 
-    String projectPath = FileUtil.toSystemIndependentName(tempDirectory.getPath()) + "/" + myName + ProjectFileType.DOT_DEFAULT_EXTENSION;
+    String projectPath = generateProjectPath(tempDirectory);
     ByteArrayOutputStream buffer = new ByteArrayOutputStream();
     new Throwable(projectPath).printStackTrace(new PrintStream(buffer));
     myProject = PlatformTestCase.createProject(projectPath, buffer.toString());
@@ -157,6 +159,12 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
     });
   }
 
+  @NotNull
+  protected String generateProjectPath(@NotNull File tempDirectory) {
+    String suffix = myIsDirectoryBasedProject ? "" : ProjectFileType.DOT_DEFAULT_EXTENSION;
+    return FileUtil.toSystemIndependentName(tempDirectory.getPath()) + "/" + myName + suffix;
+  }
+
   private void initApplication() {
     myApplication = IdeaTestApplication.getInstance();
     myApplication.setDataProvider(new MyDataProvider());
index 55b22acaa79582a4a65a765318b338252b0002d4..2643f3b98da8a45e98236993c0d61bc312e7f979 100644 (file)
@@ -1,17 +1,5 @@
 /*
- * Copyright 2000-2015 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.
+ * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  */
 package com.intellij.testFramework.fixtures.impl;
 
@@ -56,8 +44,8 @@ public class IdeaTestFixtureFactoryImpl extends IdeaTestFixtureFactory {
 
   @NotNull
   @Override
-  public TestFixtureBuilder<IdeaProjectTestFixture> createFixtureBuilder(@NotNull String name) {
-    return new HeavyTestFixtureBuilderImpl(new HeavyIdeaTestFixtureImpl(name), myFixtureBuilderProviders);
+  public TestFixtureBuilder<IdeaProjectTestFixture> createFixtureBuilder(@NotNull String name, boolean isDirectoryBasedProject) {
+    return new HeavyTestFixtureBuilderImpl(new HeavyIdeaTestFixtureImpl(name, isDirectoryBasedProject), myFixtureBuilderProviders);
   }
 
   @NotNull