Merge remote-tracking branch 'origin/master'
[idea/community.git] / plugins / gradle / src / org / jetbrains / plugins / gradle / service / project / wizard / GradleProjectImportBuilder.java
1 /*
2  * Copyright 2000-2013 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.plugins.gradle.service.project.wizard;
17
18 import com.intellij.externalSystem.JavaProjectData;
19 import com.intellij.ide.util.projectWizard.WizardContext;
20 import com.intellij.openapi.externalSystem.model.DataNode;
21 import com.intellij.openapi.externalSystem.model.project.ProjectData;
22 import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager;
23 import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalProjectImportBuilder;
24 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.projectRoots.*;
27 import com.intellij.openapi.roots.LanguageLevelProjectExtension;
28 import com.intellij.openapi.vfs.LocalFileSystem;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import com.intellij.pom.java.LanguageLevel;
31 import icons.GradleIcons;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34 import org.jetbrains.plugins.gradle.service.settings.ImportFromGradleControl;
35 import org.jetbrains.plugins.gradle.util.GradleBundle;
36 import org.jetbrains.plugins.gradle.util.GradleConstants;
37
38 import javax.swing.*;
39 import java.io.File;
40 import java.util.List;
41
42 /**
43  * @author Denis Zhdanov
44  * @since 4/15/13 2:29 PM
45  */
46 public class GradleProjectImportBuilder extends AbstractExternalProjectImportBuilder<ImportFromGradleControl> {
47
48   public GradleProjectImportBuilder(@NotNull ProjectDataManager dataManager) {
49     super(dataManager, new ImportFromGradleControl(), GradleConstants.SYSTEM_ID);
50   }
51
52   @NotNull
53   @Override
54   public String getName() {
55     return GradleBundle.message("gradle.name");
56   }
57
58   @Override
59   public Icon getIcon() {
60     return GradleIcons.Gradle;
61   }
62
63   @Override
64   protected void doPrepare(@NotNull WizardContext context) {
65     String pathToUse = getFileToImport();
66     VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(pathToUse);
67     if (file != null && file.isDirectory()) {
68       pathToUse = new File(pathToUse, GradleConstants.DEFAULT_SCRIPT_NAME).getAbsolutePath();
69     }
70     getControl(context.getProject()).setLinkedProjectPath(pathToUse);
71   }
72
73   @Override
74   protected void beforeCommit(@NotNull DataNode<ProjectData> dataNode, @NotNull Project project) {
75     if (!ExternalSystemApiUtil.isNewProjectConstruction()) {
76       return;
77     }
78     DataNode<JavaProjectData> javaProjectNode = ExternalSystemApiUtil.find(dataNode, JavaProjectData.KEY);
79     if (javaProjectNode == null) {
80       return;
81     }
82
83     final LanguageLevel externalLanguageLevel = javaProjectNode.getData().getLanguageLevel();
84     final LanguageLevelProjectExtension languageLevelExtension = LanguageLevelProjectExtension.getInstance(project);
85     if (externalLanguageLevel != languageLevelExtension.getLanguageLevel()) {
86       languageLevelExtension.setLanguageLevel(externalLanguageLevel);
87     }
88   }
89
90   @Override
91   protected void applyExtraSettings(@NotNull WizardContext context) {
92     DataNode<ProjectData> node = getExternalProjectNode();
93     if (node == null) {
94       return;
95     }
96
97     DataNode<JavaProjectData> javaProjectNode = ExternalSystemApiUtil.find(node, JavaProjectData.KEY);
98     if (javaProjectNode != null) {
99       JavaProjectData data = javaProjectNode.getData();
100       context.setCompilerOutputDirectory(data.getCompileOutputPath());
101       JavaSdkVersion version = data.getJdkVersion();
102       Sdk jdk = findJdk(version);
103       if (jdk != null) {
104         context.setProjectJdk(jdk);
105       }
106     }
107   }
108
109   @Nullable
110   private static Sdk findJdk(@NotNull JavaSdkVersion version) {
111     JavaSdk javaSdk = JavaSdk.getInstance();
112     List<Sdk> javaSdks = ProjectJdkTable.getInstance().getSdksOfType(javaSdk);
113     Sdk candidate = null;
114     for (Sdk sdk : javaSdks) {
115       JavaSdkVersion v = javaSdk.getVersion(sdk);
116       if (v == version) {
117         return sdk;
118       }
119       else if (candidate == null && v != null && version.getMaxLanguageLevel().isAtLeast(version.getMaxLanguageLevel())) {
120         candidate = sdk;
121       }
122     }
123     return candidate;
124   }
125
126   @NotNull
127   @Override
128   protected File getExternalProjectConfigToUse(@NotNull File file) {
129     return file.isDirectory() ? file : file.getParentFile();
130   }
131
132   @Override
133   public boolean isSuitableSdkType(SdkTypeId sdk) {
134     return sdk == JavaSdk.getInstance();
135   }
136 }