summaryrefslogtreecommitdiff
path: root/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerClient.java
blob: 8085068b56e6a014c8434508905bad7287ac0786 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jetbrains.jps.javac;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.api.RequestFuture;
import org.jetbrains.jps.client.SimpleProtobufClient;
import org.jetbrains.jps.client.UUIDGetter;
import org.jetbrains.jps.service.SharedThreadPool;

import java.io.File;
import java.util.*;

/**
 * @author Eugene Zhuravlev
 *         Date: 1/22/12
 */
public class JavacServerClient extends SimpleProtobufClient<JavacServerResponseHandler>{

  public JavacServerClient() {
    super(JavacRemoteProto.Message.getDefaultInstance(), SharedThreadPool.getInstance(), new UUIDGetter() {
      @Override
      @NotNull
      public UUID getSessionUUID(@NotNull JavacRemoteProto.Message message) {
        final JavacRemoteProto.Message.UUID uuid = message.getSessionId();
        return new UUID(uuid.getMostSigBits(), uuid.getLeastSigBits());
      }
    });
  }

  public RequestFuture<JavacServerResponseHandler> sendCompileRequest(List<String> options, Collection<File> files, Collection<File> classpath, Collection<File> platformCp, Collection<File> sourcePath, Map<File, Set<File>> outs, DiagnosticOutputConsumer diagnosticSink, OutputFileConsumer outputSink) {
    final JavacServerResponseHandler rh = new JavacServerResponseHandler(diagnosticSink, outputSink, getEncodingName(options));
    final JavacRemoteProto.Message.Request request = JavacProtoUtil.createCompilationRequest(options, files, classpath, platformCp, sourcePath, outs);
    return sendRequest(request, rh, new RequestFuture.CancelAction<JavacServerResponseHandler>() {
      @Override
      public void cancel(RequestFuture<JavacServerResponseHandler> javacServerResponseHandlerRequestFuture) throws Exception {
        sendRequest(JavacProtoUtil.createCancelRequest(), null, null);
      }
    });
  }

  public RequestFuture sendShutdownRequest() {
    return sendRequest(JavacProtoUtil.createShutdownRequest(), null, null);
  }

  private RequestFuture<JavacServerResponseHandler> sendRequest(final JavacRemoteProto.Message.Request request, final JavacServerResponseHandler responseHandler, final RequestFuture.CancelAction<JavacServerResponseHandler> cancelAction) {
    final UUID requestId = UUID.randomUUID();
    return sendMessage(requestId, JavacProtoUtil.toMessage(requestId, request), responseHandler, cancelAction);
  }

  @Nullable
  private static String getEncodingName(List<String> options) {
    boolean found = false;
    for (String option : options) {
      if (found) {
        return option;
      }
      if ("-encoding".equalsIgnoreCase(option)) {
        found = true;
      }
    }
    return null;
  }
}