1
2
3
4
5
6
7
8
9
10
11 package de.funfried.netbeans.plugins.external.formatter.eclipse.xml;
12
13 import java.io.FileInputStream;
14 import java.io.IOException;
15 import java.net.URL;
16 import java.nio.file.Path;
17 import java.nio.file.Paths;
18 import java.util.HashMap;
19 import java.util.LinkedHashMap;
20 import java.util.Map;
21 import java.util.Properties;
22 import java.util.logging.Level;
23 import java.util.logging.Logger;
24 import java.util.prefs.Preferences;
25 import java.util.stream.Collectors;
26 import java.util.stream.Stream;
27
28 import javax.swing.text.Document;
29
30 import org.apache.commons.lang3.StringUtils;
31 import org.netbeans.api.annotations.common.CheckForNull;
32 import org.netbeans.api.annotations.common.NonNull;
33 import org.netbeans.api.project.FileOwnerQuery;
34 import org.netbeans.api.project.Project;
35 import org.netbeans.modules.editor.NbEditorUtilities;
36 import org.openide.filesystems.FileObject;
37
38 import de.funfried.netbeans.plugins.external.formatter.eclipse.mechanic.WorkspaceMechanicConfigParser;
39 import de.funfried.netbeans.plugins.external.formatter.exceptions.CannotLoadConfigurationException;
40 import de.funfried.netbeans.plugins.external.formatter.exceptions.ConfigReadException;
41 import de.funfried.netbeans.plugins.external.formatter.exceptions.ProfileNotFoundException;
42
43
44
45
46
47 public class EclipseFormatterUtils {
48
49 private static final Logger log = Logger.getLogger(EclipseFormatterUtils.class.getName());
50
51
52 public static final String EPF_FILE_EXTENSION = ".epf";
53
54
55 public static final String XML_FILE_EXTENSION = ".xml";
56
57
58
59
60 private EclipseFormatterUtils() {
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 public static String getEclipseFormatterFile(Preferences preferences, Document document, String configFileLocationKey, String useProjectPrefsKey, String projectPrefFile) {
80 String formatterFilePref = null;
81 if (preferences.getBoolean(useProjectPrefsKey, true)) {
82
83 formatterFilePref = getFormatterFileFromProjectConfiguration(document, ".settings/" + projectPrefFile);
84 }
85
86 if (StringUtils.isBlank(formatterFilePref)) {
87 formatterFilePref = preferences.get(configFileLocationKey, null);
88 if (StringUtils.isNotBlank(formatterFilePref)) {
89 Path formatterFilePath = Paths.get(formatterFilePref);
90 if (!formatterFilePath.isAbsolute()) {
91 formatterFilePref = getFormatterFileFromProjectConfiguration(document, formatterFilePref);
92 }
93 }
94 }
95
96 return formatterFilePref;
97 }
98
99
100
101
102
103
104
105
106
107
108
109 @CheckForNull
110 private static String getFormatterFileFromProjectConfiguration(Document document, String relativeFileName) {
111 FileObject fileForDocument = NbEditorUtilities.getFileObject(document);
112 if (null != fileForDocument) {
113 Project project = FileOwnerQuery.getOwner(fileForDocument);
114 if (null != project) {
115 FileObject projectDirectory = project.getProjectDirectory();
116 FileObject preferenceFile = projectDirectory.getFileObject(StringUtils.replace(relativeFileName, "\\", "/"));
117 if (null != preferenceFile) {
118 return preferenceFile.getPath();
119 }
120 }
121 }
122
123 return null;
124 }
125
126
127
128
129
130
131
132
133
134
135 public static boolean isProjectSetting(String filename, String projectPrefFile) {
136 return filename != null && StringUtils.isNotBlank(projectPrefFile) && filename.endsWith(projectPrefFile);
137 }
138
139
140
141
142
143
144
145
146
147 public static boolean isWorkspaceMechanicFile(String filename) {
148 return filename != null && filename.endsWith(EPF_FILE_EXTENSION);
149 }
150
151
152
153
154
155
156
157
158
159 public static boolean isXMLConfigurationFile(String filename) {
160 return filename != null && filename.endsWith(XML_FILE_EXTENSION);
161 }
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 public static Map<String, String> parseConfig(String formatterFile, String formatterProfile, Map<String, String> defaultProperties, Map<String, String> additionalProperties,
182 String workspaceMechanicPrefix, String projectPrefFile) throws ProfileNotFoundException, ConfigReadException, CannotLoadConfigurationException {
183 Map<String, String> allConfig = new HashMap<>();
184 try {
185 Map<String, String> configFromFile;
186 if (EclipseFormatterUtils.isWorkspaceMechanicFile(formatterFile)) {
187 configFromFile = WorkspaceMechanicConfigParser.readPropertiesFromConfiguration(formatterFile, workspaceMechanicPrefix);
188 } else if (EclipseFormatterUtils.isXMLConfigurationFile(formatterFile)) {
189 configFromFile = ConfigReader.getProfileSettings(ConfigReader.readContentFromFilePath(formatterFile), formatterProfile);
190 } else if (EclipseFormatterUtils.isProjectSetting(formatterFile, projectPrefFile)) {
191 configFromFile = EclipseFormatterUtils.readPropertiesFromConfigurationFile(formatterFile);
192 } else {
193 configFromFile = new LinkedHashMap<>();
194 }
195
196 allConfig.putAll(defaultProperties);
197 allConfig.putAll(configFromFile);
198
199 if (additionalProperties != null) {
200 allConfig.putAll(additionalProperties);
201 }
202 } catch (ConfigReadException | ProfileNotFoundException ex) {
203 log.log(Level.WARNING, "Could not load configuration: " + formatterFile, ex);
204
205 throw ex;
206 } catch (Exception ex) {
207 log.log(Level.WARNING, "Could not load configuration: " + formatterFile, ex);
208
209 throw new CannotLoadConfigurationException(ex);
210 }
211
212 return allConfig;
213 }
214
215
216
217
218
219
220
221
222
223
224 @NonNull
225 public static Map<String, String> readPropertiesFromConfigurationFile(String filePath) throws IOException {
226 Properties properties = new Properties();
227
228 try {
229 URL url = new URL(filePath);
230
231 properties.load(url.openStream());
232 } catch (IOException ex) {
233 log.log(Level.FINEST, "Could not read file via URL, fallback to local file reading", ex);
234
235 try (FileInputStream is = new FileInputStream(filePath)) {
236 properties.load(is);
237 }
238 }
239
240 return EclipseFormatterUtils.toMap(properties, null);
241 }
242
243
244
245
246
247
248
249
250
251 public static Map<String, String> toMap(Properties properties, String prefix) {
252 Stream<Object> stream = properties.keySet().stream();
253 if (StringUtils.isNotBlank(prefix)) {
254 return stream.filter(key -> ((String) key).startsWith(prefix)).collect(Collectors.toMap(key -> ((String) key).substring(prefix.length()), key -> properties.getProperty((String) key)));
255 }
256
257 return stream.collect(Collectors.toMap(key -> (String) key, key -> properties.getProperty((String) key)));
258 }
259 }