/*
* Copyright 2015-present Facebook, Inc.
*
* 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 com.facebook.buck.intellij.ideabuck.config;
import com.google.common.base.Strings;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class BuckWSServerPortUtils {
private static final int CONNECTION_FAILED_PORT = -1;
private static final String SEARCH_FOR = "http.port=";
public static int getPort(String runInPath)
throws NumberFormatException, IOException, ExecutionException {
BuckSettingsProvider.State state = BuckSettingsProvider.getInstance().getState();
if (state == null) {
throw new RuntimeException("Cannot load ideabuck settings.");
}
String exec = state.buckExecutable;
if (Strings.isNullOrEmpty(exec)) {
throw new RuntimeException("Buck executable is not defined in settings.");
}
GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setExePath(exec);
commandLine.withWorkDirectory(runInPath);
commandLine.addParameter("server");
commandLine.addParameter("status");
commandLine.addParameter("--http-port");
commandLine.setRedirectErrorStream(true);
Process p = commandLine.createProcess();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
int port = CONNECTION_FAILED_PORT;
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith(SEARCH_FOR)) {
port = Integer.parseInt(line.substring(SEARCH_FOR.length()));
if (port == CONNECTION_FAILED_PORT) {
// if the buck server is off, and it gives us -1, throw this exception
String error =
"Your buck server may be turned off, since the Buck daemon is on port "
+ port
+ ".\nTry adding to your '.buckconfig.local' or '.buckconfig' file,"
+ " if you don't have it already set:\n"
+ "[httpserver]\n"
+ " port = 0\n"
+ "After that, restart IntelliJ or reopen your project.\n";
throw new RuntimeException(error);
}
}
}
return port;
}
private BuckWSServerPortUtils() {}
}