package codeine.servlets.api_servlets.angular;
import codeine.api.CommandExecutionStatusInfo;
import codeine.api.NodeInfoNameAndAlias;
import codeine.command_peer.AllNodesCommandExecuter;
import codeine.command_peer.NodesCommandExecuterProvider;
import codeine.configuration.PathHelper;
import codeine.model.Constants;
import codeine.permissions.IUserWithPermissions;
import codeine.servlet.AbstractApiServlet;
import codeine.utils.JsonFileUtils;
import codeine.utils.TextFileUtils;
import org.apache.log4j.Logger;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* This class is used for command status page
*/
public class CommandStatusApiServlet extends AbstractApiServlet {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(CommandStatusApiServlet.class);
@Inject private PathHelper pathHelper;
@Inject private NodesCommandExecuterProvider allNodesCommandExecuterProvider;
protected CommandStatusApiServlet() {
}
@Override
protected void myGet(HttpServletRequest request, HttpServletResponse response) {
String projectName = getParameter(request, Constants.UrlParameters.PROJECT_NAME);
String commandName = getParameter(request, Constants.UrlParameters.COMMAND_NAME);
String includeOutputParameter = getParameter(request, Constants.UrlParameters.INCLUDE_OUTPUT);
boolean includeOutput = OptionalParameter.getValue(includeOutputParameter);
String file = pathHelper.getCommandOutputInfoFile(projectName, commandName);
String outputfile = pathHelper.getCommandOutputFile(projectName, commandName);
AllNodesCommandExecuter e = allNodesCommandExecuterProvider.getCommandOrNull(projectName, commandName);
CommandExecutionStatusInfo commandInfo;
if (e == null) {
commandInfo = getCommandInfo(file);
} else {
log.info("command is running so getting a lock " + e.commandString());
synchronized (e.fileWriteSync()) {
commandInfo = getCommandInfo(file);
}
}
if (includeOutput) {
commandInfo.output(TextFileUtils.getContents(outputfile));
}
commandInfo.clearPasswordParams();
commandInfo.can_cancel(getUser(request).isAdministrator() || getUser(request).user().username().equals(commandInfo.user()));
commandInfo.can_rerun(canRerun(request, projectName, commandInfo));
writeResponseGzipJson(commandInfo, request, response);
}
private boolean canRerun(HttpServletRequest request, String projectName, CommandExecutionStatusInfo commandInfo) {
boolean canRerun = true;
IUserWithPermissions user = getUser(request);
for (NodeInfoNameAndAlias node : commandInfo.nodes_list()) {
if (!user.canCommand(projectName, node.alias())) {
canRerun = false;
break;
}
}
return canRerun;
}
private CommandExecutionStatusInfo getCommandInfo(String file) {
return new JsonFileUtils(gson()).getConfFromFile(file, CommandExecutionStatusInfo.class);
}
@Override
protected boolean checkPermissions(HttpServletRequest request) {
return canReadProject(request);
}
}