EditorConfig documentation test
[idea/community.git] / java / java-impl / src / com / intellij / externalSystem / JavaProjectData.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.externalSystem;
3
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.externalSystem.model.Key;
6 import com.intellij.openapi.externalSystem.model.ProjectKeys;
7 import com.intellij.openapi.externalSystem.model.ProjectSystemId;
8 import com.intellij.openapi.externalSystem.model.project.AbstractExternalEntityData;
9 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
10 import com.intellij.openapi.projectRoots.JavaSdkVersion;
11 import com.intellij.pom.java.LanguageLevel;
12 import com.intellij.serialization.PropertyMapping;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 import java.util.regex.Matcher;
17 import java.util.regex.Pattern;
18
19 public final class JavaProjectData extends AbstractExternalEntityData {
20   public static final Key<JavaProjectData> KEY = Key.create(JavaProjectData.class, ProjectKeys.PROJECT.getProcessingWeight() + 1);
21
22   private static final Logger LOG = Logger.getInstance(JavaProjectData.class);
23
24   private static final LanguageLevel  DEFAULT_LANGUAGE_LEVEL = LanguageLevel.JDK_1_6;
25   private static final JavaSdkVersion DEFAULT_JDK_VERSION    = JavaSdkVersion.JDK_1_6;
26   private static final Pattern        JDK_VERSION_PATTERN    = Pattern.compile(".*1.(\\d+).*");
27
28   @NotNull private JavaSdkVersion jdkVersion = DEFAULT_JDK_VERSION;
29   @NotNull private LanguageLevel languageLevel = DEFAULT_LANGUAGE_LEVEL;
30
31   @NotNull private String compileOutputPath;
32
33   @PropertyMapping({"owner", "compileOutputPath"})
34   public JavaProjectData(@NotNull ProjectSystemId owner, @NotNull String compileOutputPath) {
35     super(owner);
36
37     this.compileOutputPath = compileOutputPath;
38   }
39
40   @NotNull
41   public String getCompileOutputPath() {
42     return compileOutputPath;
43   }
44
45   public void setCompileOutputPath(@NotNull String compileOutputPath) {
46     this.compileOutputPath = ExternalSystemApiUtil.toCanonicalPath(compileOutputPath);
47   }
48
49   @NotNull
50   public JavaSdkVersion getJdkVersion() {
51     return jdkVersion;
52   }
53
54   public void setJdkVersion(@NotNull JavaSdkVersion jdkVersion) {
55     this.jdkVersion = jdkVersion;
56   }
57
58   public void setJdkVersion(@Nullable String jdk) {
59     if (jdk == null) {
60       return;
61     }
62     try {
63       int version = Integer.parseInt(jdk.trim());
64       if (applyJdkVersion(version)) {
65         return;
66       }
67     }
68     catch (NumberFormatException e) {
69       // Ignore.
70     }
71
72     Matcher matcher = JDK_VERSION_PATTERN.matcher(jdk);
73     if (!matcher.matches()) {
74       return;
75     }
76     String versionAsString = matcher.group(1);
77     try {
78       applyJdkVersion(Integer.parseInt(versionAsString));
79     }
80     catch (NumberFormatException e) {
81       // Ignore.
82     }
83   }
84
85   public boolean applyJdkVersion(int version) {
86     if (version < 0 || version >= JavaSdkVersion.values().length) {
87       LOG.warn(String.format(
88         "Unsupported jdk version detected (%d). Expected to get number from range [0; %d]", version, JavaSdkVersion.values().length
89       ));
90       return false;
91     }
92     for (JavaSdkVersion sdkVersion : JavaSdkVersion.values()) {
93       if (sdkVersion.ordinal() == version) {
94         jdkVersion = sdkVersion;
95         return true;
96       }
97     }
98     assert false : version + ", max value: " + JavaSdkVersion.values().length;
99     return false;
100   }
101
102   @NotNull
103   public LanguageLevel getLanguageLevel() {
104     return languageLevel;
105   }
106
107   public void setLanguageLevel(@NotNull LanguageLevel level) {
108     languageLevel = level;
109   }
110
111   public void setLanguageLevel(@Nullable String languageLevel) {
112     LanguageLevel level = LanguageLevel.parse(languageLevel);
113     if (level != null) {
114       this.languageLevel = level;
115     }
116   }
117
118   @Override
119   public int hashCode() {
120     int result = super.hashCode();
121     result = 31 * result + jdkVersion.hashCode();
122     result = 31 * result + languageLevel.hashCode();
123     result = 31 * result + compileOutputPath.hashCode();
124     return result;
125   }
126
127   @Override
128   public boolean equals(Object o) {
129     if (this == o) return true;
130     if (o == null || getClass() != o.getClass()) return false;
131     if (!super.equals(o)) return false;
132
133     JavaProjectData project = (JavaProjectData)o;
134
135     if (!compileOutputPath.equals(project.compileOutputPath)) return false;
136     if (jdkVersion != project.jdkVersion) return false;
137     if (languageLevel != project.languageLevel) return false;
138
139     return true;
140   }
141
142   @Override
143   public String toString() {
144     return "java project";
145   }
146 }