cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / jps / jps-builders-6 / src / org / jetbrains / jps / javac / JavacProtoUtil.java
1 // Copyright 2000-2020 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 org.jetbrains.jps.javac;
3
4 import com.google.protobuf.ByteString;
5 import com.intellij.openapi.util.io.FileUtilRt;
6 import org.jetbrains.annotations.Nullable;
7 import org.jetbrains.jps.incremental.BinaryContent;
8
9 import javax.tools.*;
10 import java.io.ByteArrayOutputStream;
11 import java.io.File;
12 import java.io.PrintStream;
13 import java.net.URI;
14 import java.util.*;
15
16 /**
17  * @author Eugene Zhuravlev
18  */
19 public final class JavacProtoUtil {
20   public static JavacRemoteProto.Message.Request createCancelRequest() {
21     return JavacRemoteProto.Message.Request.newBuilder().setRequestType(JavacRemoteProto.Message.Request.Type.CANCEL).build();
22   }
23
24   public static JavacRemoteProto.Message.Request createShutdownRequest() {
25     return JavacRemoteProto.Message.Request.newBuilder().setRequestType(JavacRemoteProto.Message.Request.Type.SHUTDOWN).build();
26   }
27
28   public static JavacRemoteProto.Message.Request createCompilationRequest(List<String> options,
29                                                                           Collection<? extends File> files,
30                                                                           Collection<? extends File> classpath,
31                                                                           Collection<? extends File> platformCp,
32                                                                           ModulePath modulePath,
33                                                                           Collection<? extends File> upgradeModulePath,
34                                                                           Collection<? extends File> sourcePath,
35                                                                           Map<File, Set<File>> outs) {
36     final JavacRemoteProto.Message.Request.Builder builder = JavacRemoteProto.Message.Request.newBuilder();
37     builder.setRequestType(JavacRemoteProto.Message.Request.Type.COMPILE);
38     builder.addAllOption(options);
39     for (File file : files) {
40       builder.addFile(FileUtilRt.toSystemIndependentName(file.getPath()));
41     }
42     for (File file : classpath) {
43       builder.addClasspath(FileUtilRt.toSystemIndependentName(file.getPath()));
44     }
45     for (File file : platformCp) {
46       builder.addPlatformClasspath(FileUtilRt.toSystemIndependentName(file.getPath()));
47     }
48     for (File file : modulePath.getPath()) {
49       final String pathEntry = FileUtilRt.toSystemIndependentName(file.getPath());
50       builder.addModulePath(pathEntry);
51       final String moduleName = modulePath.getModuleName(file);
52       if (moduleName != null) {
53         builder.putModuleNames(pathEntry, moduleName);
54       }
55     }
56     for (File file : upgradeModulePath) {
57       builder.addUpgradeModulePath(FileUtilRt.toSystemIndependentName(file.getPath()));
58     }
59     for (File file : sourcePath) {
60       builder.addSourcepath(FileUtilRt.toSystemIndependentName(file.getPath()));
61     }
62     for (Map.Entry<File, Set<File>> entry : outs.entrySet()) {
63       final JavacRemoteProto.Message.Request.OutputGroup.Builder groupBuilder = JavacRemoteProto.Message.Request.OutputGroup.newBuilder();
64       groupBuilder.setOutputRoot(FileUtilRt.toSystemIndependentName(entry.getKey().getPath()));
65       for (File srcRoot : entry.getValue()) {
66         groupBuilder.addSourceRoot(FileUtilRt.toSystemIndependentName(srcRoot.getPath()));
67       }
68       builder.addOutput(groupBuilder.build());
69     }
70     return builder.build();
71   }
72
73
74   public static JavacRemoteProto.Message.Response createOutputObjectResponse(OutputFileObject fileObject) {
75     final JavacRemoteProto.Message.Response.OutputObject.Builder msgBuilder = JavacRemoteProto.Message.Response.OutputObject.newBuilder();
76
77     msgBuilder.setKind(convertKind(fileObject.getKind()));
78     msgBuilder.setFilePath(FileUtilRt.toSystemIndependentName(fileObject.getFile().getPath()));
79     final BinaryContent content = fileObject.getContent();
80     if (content != null) {
81       msgBuilder.setContent(ByteString.copyFrom(content.getBuffer(), content.getOffset(), content.getLength()));
82     }
83     final String className = fileObject.getClassName();
84     if (className != null) {
85       msgBuilder.setClassName(className);
86     }
87     final File outputRoot = fileObject.getOutputRoot();
88     if (outputRoot != null) {
89       msgBuilder.setOutputRoot(FileUtilRt.toSystemIndependentName(outputRoot.getPath()));
90     }
91     final String relativePath = fileObject.getRelativePath();
92     if (relativePath != null) {
93       msgBuilder.setRelativePath(relativePath);
94     }
95     final URI srcUri = fileObject.getSourceUri();
96     if (srcUri != null) {
97       msgBuilder.setSourceUri(srcUri.toString());
98     }
99     final JavaFileManager.Location location = fileObject.getLocation();
100     if (location != null) {
101       msgBuilder.setLocation(location.getName());
102     }
103     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
104     builder.setResponseType(JavacRemoteProto.Message.Response.Type.OUTPUT_OBJECT).setOutputObject(msgBuilder.build());
105
106     return builder.build();
107   }
108
109   public static JavacRemoteProto.Message.Response createCustomDataResponse(String pluginId, String dataName, byte[] data) {
110     final JavacRemoteProto.Message.Response.OutputObject outObjMsg = JavacRemoteProto.Message.Response.OutputObject.newBuilder()
111       .setKind(JavacRemoteProto.Message.Response.OutputObject.Kind.OTHER)
112       .setFilePath(pluginId)
113       .setClassName(dataName)
114       .setContent(ByteString.copyFrom(data))
115       .build();
116     return JavacRemoteProto.Message.Response.newBuilder()
117       .setResponseType(JavacRemoteProto.Message.Response.Type.CUSTOM_OUTPUT_OBJECT)
118       .setOutputObject(outObjMsg)
119       .build();
120   }
121
122   public static JavacRemoteProto.Message.Response createSourceFileLoadedResponse(File srcFile) {
123     final JavacRemoteProto.Message.Response.OutputObject outObjMsg = JavacRemoteProto.Message.Response.OutputObject.newBuilder()
124       .setKind(convertKind(JavaFileObject.Kind.SOURCE)).setFilePath(FileUtilRt.toSystemIndependentName(srcFile.getPath())).build();
125
126     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
127     builder.setResponseType(JavacRemoteProto.Message.Response.Type.SRC_FILE_LOADED).setOutputObject(outObjMsg);
128
129     return builder.build();
130   }
131
132   public static JavacRemoteProto.Message.Response createClassDataResponse(String className, Collection<String> imports, Collection<String> staticImports) {
133     final JavacRemoteProto.Message.Response.ClassData.Builder msgBuilder = JavacRemoteProto.Message.Response.ClassData.newBuilder();
134     msgBuilder.setClassName(className);
135     if (!imports.isEmpty()) {
136       msgBuilder.addAllImportStatement(imports);
137     }
138     if (!staticImports.isEmpty()) {
139       msgBuilder.addAllStaticImport(imports);
140     }
141     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
142     builder.setResponseType(JavacRemoteProto.Message.Response.Type.CLASS_DATA).setClassData(msgBuilder.build());
143     return builder.build();
144   }
145
146   public static JavacRemoteProto.Message.Response createStdOutputResponse(String text) {
147     final JavacRemoteProto.Message.Response.CompileMessage.Builder msgBuilder = JavacRemoteProto.Message.Response.CompileMessage.newBuilder();
148     msgBuilder.setKind(JavacRemoteProto.Message.Response.CompileMessage.Kind.STD_OUT);
149     msgBuilder.setText(text);
150     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
151     builder.setResponseType(JavacRemoteProto.Message.Response.Type.BUILD_MESSAGE).setCompileMessage(msgBuilder.build());
152
153     return builder.build();
154   }
155
156   public static JavacRemoteProto.Message.Response createBuildMessageResponse(Diagnostic<? extends JavaFileObject> diagnostic) {
157     final JavacRemoteProto.Message.Response.CompileMessage.Builder msgBuilder = JavacRemoteProto.Message.Response.CompileMessage.newBuilder();
158
159     msgBuilder.setKind(convertKind(diagnostic.getKind()));
160     msgBuilder.setText(diagnostic.getMessage(Locale.US));
161
162     final JavaFileObject source = diagnostic.getSource();
163     URI srcUri = null;
164     try {
165       srcUri = source != null? source.toUri() : null;
166     }
167     catch (Exception ignored) {
168     }
169     if (srcUri != null) {
170       msgBuilder.setSourceUri(srcUri.toString());
171     }
172     msgBuilder.setLine(diagnostic.getLineNumber());
173     msgBuilder.setColumn(diagnostic.getColumnNumber());
174     msgBuilder.setProblemBeginOffset(diagnostic.getStartPosition());
175     msgBuilder.setProblemEndOffset(diagnostic.getEndPosition());
176     msgBuilder.setProblemLocationOffset(diagnostic.getPosition());
177
178     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
179     builder.setResponseType(JavacRemoteProto.Message.Response.Type.BUILD_MESSAGE).setCompileMessage(msgBuilder.build());
180
181     return builder.build();
182   }
183
184   public static JavacRemoteProto.Message.Response createRequestAckResponse() {
185     return JavacRemoteProto.Message.Response.newBuilder().setResponseType(JavacRemoteProto.Message.Response.Type.REQUEST_ACK).build();
186   }
187
188   public static JavacRemoteProto.Message.Response createBuildCompletedResponse(boolean code) {
189     final JavacRemoteProto.Message.Response.Builder builder = JavacRemoteProto.Message.Response.newBuilder();
190     builder.setResponseType(JavacRemoteProto.Message.Response.Type.BUILD_COMPLETED).setCompletionStatus(code);
191     return builder.build();
192   }
193
194   public static JavacRemoteProto.Message.Failure createFailure(String description, @Nullable Throwable ex) {
195     final JavacRemoteProto.Message.Failure.Builder builder = JavacRemoteProto.Message.Failure.newBuilder();
196     builder.setDescription(description);
197     if (ex != null) {
198       final ByteArrayOutputStream baos = new ByteArrayOutputStream();
199       ex.printStackTrace(new PrintStream(baos));
200       builder.setStacktrace(new String(baos.toByteArray()));
201     }
202     return builder.build();
203   }
204
205   public static JavacRemoteProto.Message toMessage(UUID requestId, JavacRemoteProto.Message.Request request) {
206     return JavacRemoteProto.Message.newBuilder().setMessageType(JavacRemoteProto.Message.Type.REQUEST).setSessionId(toProtoUUID(requestId)).setRequest(request).build();
207   }
208
209   public static JavacRemoteProto.Message toMessage(UUID requestId, JavacRemoteProto.Message.Response response) {
210     return JavacRemoteProto.Message.newBuilder().setMessageType(JavacRemoteProto.Message.Type.RESPONSE).setSessionId(toProtoUUID(requestId)).setResponse(response).build();
211   }
212
213   public static JavacRemoteProto.Message toMessage(UUID requestId, JavacRemoteProto.Message.Failure failure) {
214     return JavacRemoteProto.Message.newBuilder().setMessageType(JavacRemoteProto.Message.Type.FAILURE).setSessionId(toProtoUUID(requestId)).setFailure(failure).build();
215   }
216
217   public static JavacRemoteProto.Message.UUID toProtoUUID(UUID requestId) {
218     return JavacRemoteProto.Message.UUID.newBuilder().setMostSigBits(requestId.getMostSignificantBits()).setLeastSigBits(requestId.getLeastSignificantBits()).build();
219   }
220
221   public static UUID fromProtoUUID(JavacRemoteProto.Message.UUID requestId) {
222     return new UUID(requestId.getMostSigBits(), requestId.getLeastSigBits());
223   }
224
225   private static JavacRemoteProto.Message.Response.OutputObject.Kind convertKind(JavaFileObject.Kind kind) {
226     switch (kind) {
227       case CLASS:
228         return JavacRemoteProto.Message.Response.OutputObject.Kind.CLASS;
229       case SOURCE:
230         return JavacRemoteProto.Message.Response.OutputObject.Kind.SOURCE;
231       case HTML:
232         return JavacRemoteProto.Message.Response.OutputObject.Kind.HTML;
233       default:
234         return JavacRemoteProto.Message.Response.OutputObject.Kind.OTHER;
235     }
236   }
237
238   private static JavacRemoteProto.Message.Response.CompileMessage.Kind convertKind(Diagnostic.Kind kind) {
239     switch (kind) {
240       case ERROR: return JavacRemoteProto.Message.Response.CompileMessage.Kind.ERROR;
241       case MANDATORY_WARNING: return JavacRemoteProto.Message.Response.CompileMessage.Kind.MANDATORY_WARNING;
242       case WARNING: return JavacRemoteProto.Message.Response.CompileMessage.Kind.WARNING;
243       case NOTE: return JavacRemoteProto.Message.Response.CompileMessage.Kind.NOTE;
244       default:
245         return JavacRemoteProto.Message.Response.CompileMessage.Kind.OTHER;
246     }
247   }
248 }