diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactUtil.java
index 5752c3f5f77b..3fcfc8df5529 100644
--- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactUtil.java
+++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactUtil.java
@@ -26,10 +26,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.packaging.artifacts.Artifact;
-import com.intellij.packaging.artifacts.ArtifactManager;
-import com.intellij.packaging.artifacts.ArtifactProperties;
-import com.intellij.packaging.artifacts.ArtifactType;
+import com.intellij.packaging.artifacts.*;
import com.intellij.packaging.elements.*;
import com.intellij.packaging.impl.elements.*;
import com.intellij.util.PathUtil;
@@ -599,5 +596,31 @@ public class ArtifactUtil {
public static String suggestArtifactFileName(String artifactName) {
return PathUtil.suggestFileName(artifactName, true, true);
}
+
+ @Nullable
+ public static Artifact addArtifact(@NotNull ModifiableArtifactModel artifactModel,
+ @NotNull ArtifactType type,
+ @NotNull ArtifactTemplate artifactTemplate) {
+ final ArtifactTemplate.NewArtifactConfiguration configuration = artifactTemplate.createArtifact();
+ if (configuration == null) {
+ return null;
+ }
+
+ final String baseName = configuration.getArtifactName();
+ String name = baseName;
+ int i = 2;
+ while (artifactModel.findArtifact(name) != null) {
+ name = baseName + i;
+ i++;
+ }
+
+ ArtifactType actualType = configuration.getArtifactType();
+ if (actualType == null) {
+ actualType = type;
+ }
+ final ModifiableArtifact artifact = artifactModel.addArtifact(name, actualType, configuration.getRootElement());
+ artifactTemplate.setUpArtifact(artifact, configuration);
+ return artifact;
+ }
}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurable.java
index 52b601e4d9fe..5deea9c75f74 100644
--- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurable.java
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurable.java
@@ -286,25 +286,7 @@ public class ArtifactsStructureConfigurable extends BaseStructureConfigurable {
}
private void addArtifact(@NotNull ArtifactType type, @NotNull ArtifactTemplate artifactTemplate) {
- final ArtifactTemplate.NewArtifactConfiguration configuration = artifactTemplate.createArtifact();
- if (configuration == null) {
- return;
- }
-
- final String baseName = configuration.getArtifactName();
- String name = baseName;
- int i = 2;
- while (myPackagingEditorContext.getArtifactModel().findArtifact(name) != null) {
- name = baseName + i;
- i++;
- }
-
- ArtifactType actualType = configuration.getArtifactType();
- if (actualType == null) {
- actualType = type;
- }
- final ModifiableArtifact artifact = myPackagingEditorContext.getOrCreateModifiableArtifactModel().addArtifact(name, actualType, configuration.getRootElement());
- artifactTemplate.setUpArtifact(artifact, configuration);
+ Artifact artifact = ArtifactUtil.addArtifact(myPackagingEditorContext.getOrCreateModifiableArtifactModel(), type, artifactTemplate);
selectNodeInTree(findNodeByObject(myRoot, artifact));
}
diff --git a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
index 24a0776ccd29..692199e3bb2c 100644
--- a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
+++ b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
@@ -2,7 +2,7 @@
+ interface="com.intellij.remoteServer.impl.module.CloudModuleBuilderContributionFactory"/>
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java
index 14bd043a7f23..e235eeeb55aa 100644
--- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java
@@ -15,152 +15,20 @@
*/
package com.intellij.remoteServer.impl.module;
-import com.intellij.openapi.Disposable;
import com.intellij.openapi.options.ConfigurationException;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Disposer;
import com.intellij.remoteServer.configuration.RemoteServer;
-import com.intellij.remoteServer.runtime.Deployment;
-import com.intellij.remoteServer.runtime.ServerConnection;
-import com.intellij.remoteServer.runtime.ServerConnector;
-import com.intellij.remoteServer.runtime.deployment.ServerRuntimeInstance;
-import com.intellij.remoteServer.util.*;
-import com.intellij.util.concurrency.Semaphore;
-import com.intellij.util.ui.UIUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import javax.swing.*;
-import java.util.Collection;
-import java.util.concurrent.atomic.AtomicReference;
+import java.awt.*;
-public abstract class CloudApplicationConfigurable<
- SC extends CloudConfigurationBase,
- DC extends CloudDeploymentNameConfiguration,
- SR extends CloudMultiSourceServerRuntimeInstance,
- AC extends CloudApplicationConfiguration> {
+public abstract class CloudApplicationConfigurable {
- private final Project myProject;
- private final Disposable myParentDisposable;
+ public abstract Component getComponent();
- private DelayedRunner myRunner;
+ public abstract void setAccount(RemoteServer> account);
- private RemoteServer> myAccount;
-
- public CloudApplicationConfigurable(@Nullable Project project, Disposable parentDisposable) {
- myProject = project;
- myParentDisposable = parentDisposable;
- }
-
- public void setAccount(RemoteServer> account) {
- myAccount = account;
- clearCloudData();
- }
-
- protected RemoteServer getAccount() {
- return (RemoteServer)myAccount;
- }
-
- public JComponent getComponent() {
- JComponent result = getMainPanel();
- if (myRunner == null) {
- myRunner = new DelayedRunner(result) {
-
- private RemoteServer> myPreviousAccount;
-
- @Override
- protected boolean wasChanged() {
- boolean result = myPreviousAccount != myAccount;
- if (result) {
- myPreviousAccount = myAccount;
- }
- return result;
- }
-
- @Override
- protected void run() {
- loadCloudData();
- }
- };
- Disposer.register(myParentDisposable, myRunner);
- }
- return result;
- }
-
- protected void clearCloudData() {
- getExistingComboBox().removeAllItems();
- }
-
- protected void loadCloudData() {
- new ConnectionTask>("Loading existing applications list") {
-
- @Override
- protected void run(final ServerConnection connection,
- final Semaphore semaphore,
- final AtomicReference> result) {
- connection.connectIfNeeded(new ServerConnector.ConnectionCallback() {
-
- @Override
- public void connected(@NotNull ServerRuntimeInstance serverRuntimeInstance) {
- connection.computeDeployments(new Runnable() {
-
- @Override
- public void run() {
- result.set(connection.getDeployments());
- semaphore.up();
- UIUtil.invokeLaterIfNeeded(new Runnable() {
- @Override
- public void run() {
- if (!Disposer.isDisposed(myParentDisposable)) {
- setupExistingApplications(result.get());
- }
- }
- });
- }
- });
- }
-
- @Override
- public void errorOccurred(@NotNull String errorMessage) {
- runtimeErrorOccurred(errorMessage);
- semaphore.up();
- }
- });
- }
-
- @Override
- protected Collection run(SR serverRuntimeInstance) throws ServerRuntimeException {
- return null;
- }
- }.performAsync();
- }
-
- private void setupExistingApplications(Collection deployments) {
- JComboBox existingComboBox = getExistingComboBox();
- existingComboBox.removeAllItems();
- for (Deployment deployment : deployments) {
- existingComboBox.addItem(deployment.getName());
- }
- }
-
- protected Project getProject() {
- return myProject;
- }
-
- protected abstract JComboBox getExistingComboBox();
-
- protected abstract JComponent getMainPanel();
-
- public abstract AC createConfiguration();
+ public abstract CloudApplicationConfiguration createConfiguration();
public abstract void validate() throws ConfigurationException;
-
- protected abstract class ConnectionTask extends CloudConnectionTask {
-
- public ConnectionTask(String title) {
- super(myProject, title, CloudApplicationConfigurable.this.getAccount());
- }
- }
}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java
index 9af0f1ad472b..af9fa723e82a 100644
--- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java
@@ -18,19 +18,4 @@ package com.intellij.remoteServer.impl.module;
public abstract class CloudApplicationConfiguration {
- private boolean myExisting;
- private final String myExistingAppName;
-
- protected CloudApplicationConfiguration(boolean existing, String existingAppName) {
- myExisting = existing;
- myExistingAppName = existingAppName;
- }
-
- public boolean isExisting() {
- return myExisting;
- }
-
- public String getExistingAppName() {
- return myExistingAppName;
- }
}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java
index 25b60523a0b3..62e256c14c8e 100644
--- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java
@@ -16,6 +16,7 @@
package com.intellij.remoteServer.impl.module;
import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase;
import com.intellij.ide.util.projectWizard.JavaModuleBuilder;
import com.intellij.ide.util.projectWizard.ModuleBuilderListener;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
@@ -23,20 +24,42 @@ import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
+import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
+import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.remoteServer.ServerType;
import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.util.containers.hash.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.util.Map;
public class CloudModuleBuilder extends JavaModuleBuilder {
private RemoteServer> myAccount;
private CloudApplicationConfiguration myApplicationConfiguration;
+ private FrameworkSupportModelBase myFrameworkSupportModel;
+
+ private Map, CloudModuleBuilderContribution> myCloudType2Contribution;
+ private Project myProject;
public CloudModuleBuilder() {
+ myCloudType2Contribution = new HashMap, CloudModuleBuilderContribution>();
+
+ ModuleConfigurationUpdater configurationUpdater = new ModuleConfigurationUpdater() {
+
+ public void update(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel) {
+ preConfigureModule(module, rootModel);
+ }
+ };
+ addModuleConfigurationUpdater(configurationUpdater);
+
addListener(new ModuleBuilderListener() {
@Override
@@ -93,19 +116,59 @@ public class CloudModuleBuilder extends JavaModuleBuilder {
@Nullable
@Override
public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) {
- return new CloudModuleWizardStep(this, context.getProject(), parentDisposable);
+ myProject = context.getProject();
+ return new CloudModuleWizardStep(this, myProject, parentDisposable);
}
public void setAccount(RemoteServer> account) {
myAccount = account;
}
+ public RemoteServer> getAccount() {
+ return myAccount;
+ }
+
public void setApplicationConfiguration(CloudApplicationConfiguration applicationConfiguration) {
myApplicationConfiguration = applicationConfiguration;
}
+ public CloudApplicationConfiguration getApplicationConfiguration() {
+ return myApplicationConfiguration;
+ }
+
+ public CloudModuleBuilderContribution getContribution(ServerType> cloudType) {
+ CloudModuleBuilderContribution result = myCloudType2Contribution.get(cloudType);
+ if (result == null) {
+ result = CloudModuleBuilderContributionFactory.getInstanceByType(cloudType).createContribution(this);
+ myCloudType2Contribution.put(cloudType, result);
+ }
+ return result;
+ }
+
+ private CloudModuleBuilderContribution getContribution() {
+ return getContribution(myAccount.getType());
+ }
+
+ private void preConfigureModule(Module module, ModifiableRootModel model) {
+ getContribution().preConfigureModule(module, model);
+ }
+
private void configureModule(final Module module) {
- CloudModuleBuilderContribution
- .getInstanceByType(myAccount.getType()).configureModule(module, myAccount, myApplicationConfiguration, getContentEntryPath());
+ getContribution().configureModule(module);
+ }
+
+ public FrameworkSupportModelBase getFrameworkSupportModel() {
+ if (myFrameworkSupportModel == null) {
+ final LibrariesContainer librariesContainer = LibrariesContainerFactory.createContainer(myProject);
+ myFrameworkSupportModel = new FrameworkSupportModelBase(myProject, this, librariesContainer) {
+
+ @NotNull
+ @Override
+ public String getBaseDirectoryForLibrariesPath() {
+ return StringUtil.notNullize(getContentEntryPath());
+ }
+ };
+ }
+ return myFrameworkSupportModel;
}
}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java
index 945812ae05e0..dd2d9d9af563 100644
--- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java
@@ -16,34 +16,51 @@
package com.intellij.remoteServer.impl.module;
import com.intellij.openapi.Disposable;
-import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.remoteServer.ServerType;
-import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.remoteServer.configuration.deployment.DeploymentConfiguration;
+import com.intellij.remoteServer.configuration.deployment.DeploymentSource;
import org.jetbrains.annotations.Nullable;
public abstract class CloudModuleBuilderContribution {
- public static final ExtensionPointName EP_NAME
- = ExtensionPointName.create("com.intellij.remoteServer.moduleBuilderContribution");
+ private final CloudModuleBuilder myModuleBuilder;
- public abstract ServerType> getCloudType();
+ private final ServerType> myCloudType;
+ private CloudApplicationConfigurable myApplicationConfigurable;
- public abstract CloudApplicationConfigurable createApplicationConfigurable(@Nullable Project project, Disposable parentDisposable);
+ public CloudModuleBuilderContribution(CloudModuleBuilder moduleBuilder, ServerType> cloudType) {
+ myModuleBuilder = moduleBuilder;
+ myCloudType = cloudType;
+ }
- public abstract void configureModule(Module module,
- RemoteServer> account,
- CloudApplicationConfiguration configuration,
- String contentPath);
+ protected CloudModuleBuilder getModuleBuilder() {
+ return myModuleBuilder;
+ }
- public static CloudModuleBuilderContribution getInstanceByType(ServerType> cloudType) {
- for (CloudModuleBuilderContribution contribution : EP_NAME.getExtensions()) {
- if (contribution.getCloudType() == cloudType) {
- return contribution;
- }
+ protected ServerType> getCloudType() {
+ return myCloudType;
+ }
+
+ public CloudApplicationConfigurable getApplicationConfigurable(@Nullable Project project, Disposable parentDisposable) {
+ if (myApplicationConfigurable == null) {
+ myApplicationConfigurable = createApplicationConfigurable(project, parentDisposable);
}
- return null;
+ return myApplicationConfigurable;
+ }
+
+ public void preConfigureModule(Module module, ModifiableRootModel model) {
+
+ }
+
+ public abstract void configureModule(Module module);
+
+ protected abstract CloudApplicationConfigurable createApplicationConfigurable(@Nullable Project project, Disposable parentDisposable);
+
+ protected DeploymentConfiguration createDeploymentConfiguration(DeploymentSource deploymentSource) {
+ return myCloudType.createDeploymentConfigurator(null).createDefaultConfiguration(deploymentSource);
}
}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionFactory.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionFactory.java
new file mode 100644
index 000000000000..20ebc29fe148
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionFactory.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2014 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.remoteServer.impl.module;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.remoteServer.ServerType;
+
+
+public abstract class CloudModuleBuilderContributionFactory {
+
+ public static final ExtensionPointName EP_NAME
+ = ExtensionPointName.create("com.intellij.remoteServer.moduleBuilderContribution");
+
+ public abstract ServerType> getCloudType();
+
+ public abstract CloudModuleBuilderContribution createContribution(CloudModuleBuilder moduleBuilder);
+
+ public static CloudModuleBuilderContributionFactory getInstanceByType(ServerType> cloudType) {
+ for (CloudModuleBuilderContributionFactory contribution : EP_NAME.getExtensions()) {
+ if (contribution.getCloudType() == cloudType) {
+ return contribution;
+ }
+ }
+ return null;
+ }
+}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderSourceContribution.java
similarity index 85%
rename from java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java
rename to java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderSourceContribution.java
index 3652e4e757db..b5fdcc3995c8 100644
--- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderSourceContribution.java
@@ -41,29 +41,24 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-public abstract class CloudModuleBuilderContributionBase<
+public abstract class CloudModuleBuilderSourceContribution<
SC extends CloudConfigurationBase,
DC extends CloudDeploymentNameConfiguration,
- AC extends CloudApplicationConfiguration,
+ AC extends CloudSourceApplicationConfiguration,
SR extends CloudMultiSourceServerRuntimeInstance>
extends CloudModuleBuilderContribution {
private CloudNotifier myNotifier;
- private CloudNotifier getNotifier() {
- if (myNotifier == null) {
- myNotifier = new CloudNotifier(getCloudType().getPresentableName());
- }
- return myNotifier;
+ public CloudModuleBuilderSourceContribution(CloudModuleBuilder moduleBuilder, ServerType cloudType) {
+ super(moduleBuilder, cloudType);
}
@Override
- public void configureModule(final Module module,
- RemoteServer> account,
- CloudApplicationConfiguration applicationConfiguration,
- final String contentPath) {
- RemoteServer castedAccount = (RemoteServer)account;
- final AC castedApplicationConfiguration = (AC)applicationConfiguration;
+ public void configureModule(final Module module) {
+ final CloudModuleBuilder moduleBuilder = getModuleBuilder();
+ RemoteServer account = (RemoteServer)moduleBuilder.getAccount();
+ final AC applicationConfiguration = (AC)moduleBuilder.getApplicationConfiguration();
DC deploymentConfiguration = createDeploymentConfiguration();
@@ -73,19 +68,19 @@ public abstract class CloudModuleBuilderContributionBase<
}
final DeployToServerRunConfiguration runConfiguration
- = CloudAccountSelectionEditor.createRunConfiguration(castedAccount, module, deploymentConfiguration);
+ = CloudRunConfigurationUtil.createRunConfiguration(account, module, deploymentConfiguration);
final ServerType> cloudType = account.getType();
final Project project = module.getProject();
new CloudConnectionTask