Merge branch 'leneshka/template-projects'
[idea/community.git] / platform / lang-impl / src / com / intellij / ide / util / projectWizard / ExistingModuleLoader.java
1 /*
2  * Copyright 2000-2016 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 com.intellij.ide.util.projectWizard;
17
18 import com.intellij.CommonBundle;
19 import com.intellij.application.options.PathMacrosCollector;
20 import com.intellij.application.options.PathMacrosImpl;
21 import com.intellij.conversion.ConversionResult;
22 import com.intellij.conversion.ConversionService;
23 import com.intellij.ide.IdeBundle;
24 import com.intellij.openapi.application.PathMacros;
25 import com.intellij.openapi.diagnostic.Logger;
26 import com.intellij.openapi.module.ModifiableModuleModel;
27 import com.intellij.openapi.module.Module;
28 import com.intellij.openapi.module.ModuleType;
29 import com.intellij.openapi.module.ModuleWithNameAlreadyExists;
30 import com.intellij.openapi.options.ConfigurationException;
31 import com.intellij.openapi.project.Project;
32 import com.intellij.openapi.project.impl.ProjectMacrosUtil;
33 import com.intellij.openapi.roots.ModifiableRootModel;
34 import com.intellij.openapi.ui.Messages;
35 import com.intellij.openapi.util.InvalidDataException;
36 import com.intellij.openapi.util.JDOMUtil;
37 import org.jdom.Element;
38 import org.jdom.JDOMException;
39 import org.jetbrains.annotations.NotNull;
40
41 import java.io.File;
42 import java.io.IOException;
43 import java.util.Set;
44
45 /**
46  * @author Eugene Zhuravlev
47  *         Date: Sep 7, 2004
48  */
49 public class ExistingModuleLoader extends ModuleBuilder {
50   private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.projectWizard.ExistingModuleLoader");
51
52   public static ExistingModuleLoader setUpLoader(final String moduleFilePath) {
53     final ExistingModuleLoader moduleLoader = new ExistingModuleLoader();
54     moduleLoader.setModuleFilePath(moduleFilePath);
55     final int startIndex = moduleFilePath.lastIndexOf('/');
56     final int endIndex = moduleFilePath.lastIndexOf(".");
57     if (startIndex >= 0 && endIndex > startIndex + 1) {
58       final String name = moduleFilePath.substring(startIndex + 1, endIndex);
59       moduleLoader.setName(name);
60     }
61     return moduleLoader;
62   }
63
64   @Override
65   @NotNull
66   public Module createModule(@NotNull ModifiableModuleModel moduleModel)
67     throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException {
68     LOG.assertTrue(getName() != null);
69
70     final String moduleFilePath = getModuleFilePath();
71
72     LOG.assertTrue(moduleFilePath != null);
73     LOG.assertTrue(new File(moduleFilePath).exists());
74
75     return moduleModel.loadModule(moduleFilePath);
76   }
77
78   @Override
79   public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException {
80     // empty
81   }
82
83   @Override
84   public ModuleType getModuleType() {
85     return null; // no matter
86   }
87
88   @Override
89   public boolean validate(final Project current, final Project dest) {
90     if (getName() == null) return false;
91     String moduleFilePath = getModuleFilePath();
92     if (moduleFilePath == null) return false;
93     final File file = new File(moduleFilePath);
94     if (file.exists()) {
95       try {
96         final ConversionResult result = ConversionService.getInstance().convertModule(dest, file);
97         if (result.openingIsCanceled()) {
98           return false;
99         }
100         final Element root = JDOMUtil.load(file);
101         final Set<String> usedMacros = PathMacrosCollector.getMacroNames(root);
102         final Set<String> definedMacros = PathMacros.getInstance().getAllMacroNames();
103         usedMacros.remove("$" + PathMacrosImpl.MODULE_DIR_MACRO_NAME + "$");
104         usedMacros.removeAll(definedMacros);
105
106         if (usedMacros.size() > 0) {
107           final boolean ok = ProjectMacrosUtil.showMacrosConfigurationDialog(current, usedMacros);
108           if (!ok) {
109             return false;
110           }
111         }
112       }
113       catch (JDOMException e) {
114         Messages.showMessageDialog(e.getMessage(), IdeBundle.message("title.error.reading.file"), Messages.getErrorIcon());
115         return false;
116       }
117       catch (IOException e) {
118         Messages.showMessageDialog(e.getMessage(), IdeBundle.message("title.error.reading.file"), Messages.getErrorIcon());
119         return false;
120       }
121     } else {
122       Messages.showErrorDialog(current, IdeBundle.message("title.module.file.does.not.exist", moduleFilePath),
123                                CommonBundle.message("title.error"));
124       return false;
125     }
126     return true;
127   }
128 }