From 35ba698781668e166e35b45190c101fd53c9b20a Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 24 Apr 2013 04:38:27 -0700 Subject: [PATCH] google app engine: create artifact when support for framework is added if it isn't created yet --- .../facet/AppEngineSupportProvider.java | 45 +++++++++++-------- .../facet/AppEngineWebIntegration.java | 3 ++ .../AppEngineCommunityWebIntegration.java | 5 +++ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineSupportProvider.java b/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineSupportProvider.java index b5b1be386585..255145fd9449 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineSupportProvider.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineSupportProvider.java @@ -39,6 +39,10 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.artifacts.ArtifactType; +import com.intellij.packaging.elements.ArtifactRootElement; +import com.intellij.packaging.elements.PackagingElementFactory; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.HyperlinkLabel; @@ -94,28 +98,29 @@ public class AppEngineSupportProvider extends FacetBasedFrameworkSupportProvider private void addSupport(final Module module, final ModifiableRootModel rootModel, String sdkPath, @Nullable PersistenceApi persistenceApi) { super.addSupport(module, rootModel, null, null); - final VirtualFile descriptorDir = AppEngineWebIntegration.getInstance().suggestParentDirectoryForAppEngineWebXml(module, rootModel); - if (descriptorDir != null) { - createFileFromTemplate(AppEngineTemplateGroupDescriptorFactory.APP_ENGINE_WEB_XML_TEMPLATE, descriptorDir, - AppEngineUtil.APP_ENGINE_WEB_XML_NAME); - } - final AppEngineFacet appEngineFacet = AppEngineFacet.getAppEngineFacetByModule(module); LOG.assertTrue(appEngineFacet != null); final AppEngineFacetConfiguration facetConfiguration = appEngineFacet.getConfiguration(); facetConfiguration.setSdkHomePath(sdkPath); final AppEngineSdk sdk = appEngineFacet.getSdk(); - final Artifact artifact = findContainingArtifact(appEngineFacet); + final Artifact artifact = findOrCreateArtifact(appEngineFacet); + + final VirtualFile descriptorDir = AppEngineWebIntegration.getInstance().suggestParentDirectoryForAppEngineWebXml(module, rootModel); + if (descriptorDir != null) { + VirtualFile descriptor = createFileFromTemplate(AppEngineTemplateGroupDescriptorFactory.APP_ENGINE_WEB_XML_TEMPLATE, descriptorDir, + AppEngineUtil.APP_ENGINE_WEB_XML_NAME); + if (descriptor != null) { + AppEngineWebIntegration.getInstance().addDescriptor(artifact, module.getProject(), descriptor); + } + } final Project project = module.getProject(); AppEngineWebIntegration.getInstance().setupRunConfiguration(rootModel, sdk, artifact, project); final Library apiJar = addProjectLibrary(module, "AppEngine API", sdk.getLibUserDirectoryPath(), VirtualFile.EMPTY_ARRAY); rootModel.addLibraryEntry(apiJar); - if (artifact != null) { - AppEngineWebIntegration.getInstance().addLibraryToArtifact(apiJar, artifact, project); - } + AppEngineWebIntegration.getInstance().addLibraryToArtifact(apiJar, artifact, project); if (persistenceApi != null) { facetConfiguration.setRunEnhancerOnMake(true); @@ -146,21 +151,25 @@ public class AppEngineSupportProvider extends FacetBasedFrameworkSupportProvider } final Library library = addProjectLibrary(module, "AppEngine ORM", sdk.getOrmLibDirectoryPath(), sdk.getOrmLibSources()); rootModel.addLibraryEntry(library); - if (artifact != null) { - AppEngineWebIntegration.getInstance().addLibraryToArtifact(library, artifact, project); - } + AppEngineWebIntegration.getInstance().addLibraryToArtifact(library, artifact, project); } } - @Nullable - private static Artifact findContainingArtifact(AppEngineFacet appEngineFacet) { - final Collection artifacts = ArtifactUtil.getArtifactsContainingModuleOutput(appEngineFacet.getModule()); + @NotNull + private static Artifact findOrCreateArtifact(AppEngineFacet appEngineFacet) { + Module module = appEngineFacet.getModule(); + ArtifactType artifactType = AppEngineWebIntegration.getInstance().getAppEngineTargetArtifactType(); + final Collection artifacts = ArtifactUtil.getArtifactsContainingModuleOutput(module); for (Artifact artifact : artifacts) { - if (AppEngineWebIntegration.getInstance().getAppEngineTargetArtifactType().equals(artifact.getArtifactType())) { + if (artifactType.equals(artifact.getArtifactType())) { return artifact; } } - return null; + ArtifactManager artifactManager = ArtifactManager.getInstance(module.getProject()); + PackagingElementFactory elementFactory = PackagingElementFactory.getInstance(); + ArtifactRootElement root = elementFactory.createArtifactRootElement(); + elementFactory.getOrCreateDirectory(root, "WEB-INF/classes").addOrFindChild(elementFactory.createModuleOutput(module)); + return artifactManager.addArtifact(module.getName(), artifactType, root); } private static Library addProjectLibrary(final Module module, final String name, final String path, final VirtualFile[] sources) { diff --git a/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineWebIntegration.java b/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineWebIntegration.java index 82076bf1d301..f1d8a67f6779 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineWebIntegration.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/facet/AppEngineWebIntegration.java @@ -52,4 +52,7 @@ public abstract class AppEngineWebIntegration { public abstract void addLibraryToArtifact(@NotNull Library library, @NotNull Artifact artifact, @NotNull Project project); public abstract List getSdkForConfiguredDevServers(); + + public void addDescriptor(@NotNull Artifact artifact, @NotNull Project project, @NotNull VirtualFile descriptor) { + } } diff --git a/plugins/google-app-engine/source/com/intellij/appengine/facet/impl/AppEngineCommunityWebIntegration.java b/plugins/google-app-engine/source/com/intellij/appengine/facet/impl/AppEngineCommunityWebIntegration.java index 060355357829..90ea918678ee 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/facet/impl/AppEngineCommunityWebIntegration.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/facet/impl/AppEngineCommunityWebIntegration.java @@ -94,4 +94,9 @@ public class AppEngineCommunityWebIntegration extends AppEngineWebIntegration { public List getSdkForConfiguredDevServers() { return Collections.emptyList(); } + + @Override + public void addDescriptor(@NotNull Artifact artifact, @NotNull Project project, @NotNull VirtualFile descriptor) { + ArtifactManager.getInstance(project).addElementsToDirectory(artifact, "WEB-INF", PackagingElementFactory.getInstance().createFileCopy(descriptor.getPath(), null)); + } }