/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java

https://bitbucket.org/nbargnesi/idea · Java · 239 lines · 181 code · 35 blank · 23 comment · 22 complexity · 25feae8679e7cbfb4a2e54cf343b1856 MD5 · raw file

  1. /*
  2. * Copyright 2000-2009 JetBrains s.r.o.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.jetbrains.idea.maven.wizards;
  17. import com.intellij.ide.util.EditorHelper;
  18. import com.intellij.openapi.application.ModalityState;
  19. import com.intellij.openapi.application.Result;
  20. import com.intellij.openapi.command.WriteCommandAction;
  21. import com.intellij.openapi.editor.Document;
  22. import com.intellij.openapi.fileEditor.FileDocumentManager;
  23. import com.intellij.openapi.project.Project;
  24. import com.intellij.openapi.util.io.FileUtil;
  25. import com.intellij.openapi.vfs.LocalFileSystem;
  26. import com.intellij.openapi.vfs.VfsUtil;
  27. import com.intellij.openapi.vfs.VirtualFile;
  28. import com.intellij.psi.PsiDocumentManager;
  29. import com.intellij.psi.PsiFile;
  30. import com.intellij.psi.PsiManager;
  31. import com.intellij.psi.codeStyle.CodeStyleManager;
  32. import com.intellij.psi.xml.XmlElement;
  33. import org.jetbrains.idea.maven.dom.MavenDomUtil;
  34. import org.jetbrains.idea.maven.dom.model.MavenDomModule;
  35. import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
  36. import org.jetbrains.idea.maven.execution.MavenRunner;
  37. import org.jetbrains.idea.maven.execution.MavenRunnerParameters;
  38. import org.jetbrains.idea.maven.execution.MavenRunnerSettings;
  39. import org.jetbrains.idea.maven.model.MavenArchetype;
  40. import org.jetbrains.idea.maven.model.MavenConstants;
  41. import org.jetbrains.idea.maven.model.MavenId;
  42. import org.jetbrains.idea.maven.project.MavenProject;
  43. import org.jetbrains.idea.maven.project.MavenProjectsManager;
  44. import org.jetbrains.idea.maven.project.MavenProjectsManagerWatcher;
  45. import org.jetbrains.idea.maven.utils.MavenLog;
  46. import org.jetbrains.idea.maven.utils.MavenUtil;
  47. import java.io.File;
  48. import java.io.IOException;
  49. import java.util.Collections;
  50. import java.util.Map;
  51. public class MavenModuleBuilderHelper {
  52. private final MavenId myProjectId;
  53. private final MavenProject myAggregatorProject;
  54. private final MavenProject myParentProject;
  55. private final boolean myInheritGroupId;
  56. private final boolean myInheritVersion;
  57. private final MavenArchetype myArchetype;
  58. private final Map<String, String> myPropertiesToCreateByArtifact;
  59. private final String myCommandName;
  60. public MavenModuleBuilderHelper(MavenId projectId,
  61. MavenProject aggregatorProject,
  62. MavenProject parentProject,
  63. boolean inheritGroupId,
  64. boolean inheritVersion,
  65. MavenArchetype archetype,
  66. Map<String, String> propertiesToCreateByArtifact,
  67. String commaneName) {
  68. myProjectId = projectId;
  69. myAggregatorProject = aggregatorProject;
  70. myParentProject = parentProject;
  71. myInheritGroupId = inheritGroupId;
  72. myInheritVersion = inheritVersion;
  73. myArchetype = archetype;
  74. myPropertiesToCreateByArtifact = propertiesToCreateByArtifact;
  75. myCommandName = commaneName;
  76. }
  77. public void configure(final Project project, final VirtualFile root, final boolean isInteractive) {
  78. PsiFile[] psiFiles = myAggregatorProject != null
  79. ? new PsiFile[]{getPsiFile(project, myAggregatorProject.getFile())}
  80. : PsiFile.EMPTY_ARRAY;
  81. final VirtualFile pom = new WriteCommandAction<VirtualFile>(project, myCommandName, psiFiles) {
  82. @Override
  83. protected void run(Result<VirtualFile> result) throws Throwable {
  84. VirtualFile file;
  85. try {
  86. file = root.createChildData(this, MavenConstants.POM_XML);
  87. MavenUtil.runOrApplyMavenProjectFileTemplate(project, file, myProjectId, isInteractive);
  88. result.setResult(file);
  89. }
  90. catch (IOException e) {
  91. showError(project, e);
  92. return;
  93. }
  94. updateProjectPom(project, file);
  95. if (myAggregatorProject != null) {
  96. MavenDomProjectModel model = MavenDomUtil.getMavenDomProjectModel(project, myAggregatorProject.getFile());
  97. model.getPackaging().setStringValue("pom");
  98. MavenDomModule module = model.getModules().addModule();
  99. module.setValue(getPsiFile(project, file));
  100. }
  101. }
  102. }.execute().getResultObject();
  103. if (pom == null) return;
  104. if (myAggregatorProject == null) {
  105. MavenProjectsManager manager = MavenProjectsManager.getInstance(project);
  106. manager.addManagedFiles(Collections.singletonList(pom));
  107. }
  108. if (myArchetype == null) {
  109. try {
  110. VfsUtil.createDirectories(root.getPath() + "/src/main/java");
  111. VfsUtil.createDirectories(root.getPath() + "/src/main/resources");
  112. VfsUtil.createDirectories(root.getPath() + "/src/test/java");
  113. }
  114. catch (IOException e) {
  115. MavenLog.LOG.info(e);
  116. }
  117. }
  118. // execute when current dialog is closed (e.g. Project Structure)
  119. MavenUtil.invokeLater(project, ModalityState.NON_MODAL, new Runnable() {
  120. public void run() {
  121. if (!pom.isValid()) return;
  122. EditorHelper.openInEditor(getPsiFile(project, pom));
  123. if (myArchetype != null) generateFromArchetype(project, pom);
  124. }
  125. });
  126. }
  127. private void updateProjectPom(final Project project, final VirtualFile pom) {
  128. if (myParentProject == null) return;
  129. new WriteCommandAction.Simple(project, myCommandName) {
  130. protected void run() throws Throwable {
  131. MavenDomProjectModel model = MavenDomUtil.getMavenDomProjectModel(project, pom);
  132. if (model == null) return;
  133. MavenDomUtil.updateMavenParent(model, myParentProject);
  134. if (myInheritGroupId) {
  135. XmlElement el = model.getGroupId().getXmlElement();
  136. if (el != null) el.delete();
  137. }
  138. if (myInheritVersion) {
  139. XmlElement el = model.getVersion().getXmlElement();
  140. if (el != null) el.delete();
  141. }
  142. CodeStyleManager.getInstance(project).reformat(getPsiFile(project, pom));
  143. pom.putUserData(MavenProjectsManagerWatcher.FORCE_IMPORT_AND_RESOLVE_ON_REFRESH, Boolean.TRUE);
  144. try {
  145. Document doc = FileDocumentManager.getInstance().getDocument(pom);
  146. PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(doc);
  147. FileDocumentManager.getInstance().saveDocument(doc);
  148. }
  149. finally {
  150. pom.putUserData(MavenProjectsManagerWatcher.FORCE_IMPORT_AND_RESOLVE_ON_REFRESH, null);
  151. }
  152. }
  153. }.execute();
  154. }
  155. private PsiFile getPsiFile(Project project, VirtualFile pom) {
  156. return PsiManager.getInstance(project).findFile(pom);
  157. }
  158. private void generateFromArchetype(final Project project, final VirtualFile pom) {
  159. final File workingDir;
  160. try {
  161. workingDir = FileUtil.createTempDirectory("archetype", "tmp");
  162. workingDir.deleteOnExit();
  163. }
  164. catch (IOException e) {
  165. showError(project, e);
  166. return;
  167. }
  168. MavenRunnerParameters params = new MavenRunnerParameters(
  169. false, workingDir.getPath(), Collections.singletonList("org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate"), null);
  170. MavenRunner runner = MavenRunner.getInstance(project);
  171. MavenRunnerSettings settings = runner.getState().clone();
  172. Map<String, String> props = settings.getMavenProperties();
  173. props.put("interactiveMode", "false");
  174. //props.put("archetypeGroupId", myArchetype.groupId);
  175. //props.put("archetypeArtifactId", myArchetype.artifactId);
  176. //props.put("archetypeVersion", myArchetype.version);
  177. //if (myArchetype.repository != null) props.put("archetypeRepository", myArchetype.repository);
  178. //props.put("groupId", myProjectId.getGroupId());
  179. //props.put("artifactId", myProjectId.getArtifactId());
  180. //props.put("version", myProjectId.getVersion());
  181. props.putAll(myPropertiesToCreateByArtifact);
  182. runner.run(params, settings, new Runnable() {
  183. public void run() {
  184. copyGeneratedFiles(workingDir, pom, project);
  185. }
  186. });
  187. }
  188. private void copyGeneratedFiles(File workingDir, VirtualFile pom, Project project) {
  189. try {
  190. FileUtil.copyDir(new File(workingDir, myProjectId.getArtifactId()), new File(pom.getParent().getPath()));
  191. }
  192. catch (IOException e) {
  193. showError(project, e);
  194. return;
  195. }
  196. FileUtil.delete(workingDir);
  197. pom.refresh(false, false);
  198. updateProjectPom(project, pom);
  199. LocalFileSystem.getInstance().refreshWithoutFileWatcher(true);
  200. }
  201. private void showError(Project project, Throwable e) {
  202. MavenUtil.showError(project, "Failed to create a Maven project", e);
  203. }
  204. }