/**
This file is part of Waarp Project.
Copyright 2009, Frederic Bregier, and individual contributors by the @author
tags. See the COPYRIGHT.txt in the distribution for a full listing of
individual contributors.
All Waarp Project is free software: you can redistribute it and/or
modify it under the terms of the GNU General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Waarp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Waarp . If not, see <http://www.gnu.org/licenses/>.
*/
package org.waarp.openr66.protocol.http.rest.handler;
import java.util.Date;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.waarp.common.database.data.AbstractDbData;
import org.waarp.common.database.data.DbValue;
import org.waarp.common.json.JsonHandler;
import org.waarp.common.logging.WaarpLogger;
import org.waarp.common.logging.WaarpLoggerFactory;
import org.waarp.gateway.kernel.exception.HttpIncorrectRequestException;
import org.waarp.gateway.kernel.exception.HttpInvalidAuthenticationException;
import org.waarp.gateway.kernel.rest.HttpRestHandler;
import org.waarp.gateway.kernel.rest.RestConfiguration;
import org.waarp.gateway.kernel.rest.DataModelRestMethodHandler.COMMAND_TYPE;
import org.waarp.gateway.kernel.rest.HttpRestHandler.METHOD;
import org.waarp.gateway.kernel.rest.RestArgument;
import org.waarp.openr66.context.ErrorCode;
import org.waarp.openr66.context.R66Result;
import org.waarp.openr66.context.R66Session;
import org.waarp.openr66.database.DbConstant;
import org.waarp.openr66.database.data.DbTaskRunner;
import org.waarp.openr66.protocol.exception.OpenR66ProtocolNoDataException;
import org.waarp.openr66.protocol.exception.OpenR66ProtocolNotAuthenticatedException;
import org.waarp.openr66.protocol.exception.OpenR66ProtocolPacketException;
import org.waarp.openr66.protocol.http.rest.HttpRestR66Handler;
import org.waarp.openr66.protocol.http.rest.HttpRestR66Handler.RESTHANDLERS;
import org.waarp.openr66.protocol.localhandler.ServerActions;
import org.waarp.openr66.protocol.localhandler.packet.ValidPacket;
import org.waarp.openr66.protocol.localhandler.packet.json.InformationJsonPacket;
import org.waarp.openr66.protocol.localhandler.packet.json.JsonPacket;
import org.waarp.openr66.protocol.localhandler.packet.json.StopOrCancelJsonPacket;
import org.waarp.openr66.protocol.localhandler.packet.json.RestartTransferJsonPacket;
import org.waarp.openr66.protocol.localhandler.packet.json.TransferRequestJsonPacket;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* Transfer Http REST interface: http://host/control?... +
* InformationJsonPacket (should be on Transfer only) RestartTransferJsonPacket StopOrCancelJsonPacket TransferRequestJsonPacket
* as GET PUT PUT POST
*
* @author "Frederic Bregier"
*
*/
public class HttpRestControlR66Handler extends HttpRestAbstractR66Handler {
public static final String BASEURI = "control";
/**
* Internal Logger
*/
private static final WaarpLogger logger = WaarpLoggerFactory
.getLogger(HttpRestControlR66Handler.class);
public HttpRestControlR66Handler(RestConfiguration config, METHOD... methods) {
super(BASEURI, config, METHOD.OPTIONS);
setIntersectionMethods(methods, METHOD.GET, METHOD.PUT, METHOD.POST);
}
@Override
public void endParsingRequest(HttpRestHandler handler, RestArgument arguments, RestArgument result, Object body)
throws HttpIncorrectRequestException, HttpInvalidAuthenticationException {
logger.debug("debug: {} ### {}", arguments, result);
if (body != null) {
logger.debug("Obj: {}", body);
}
handler.setWillClose(false);
ServerActions serverHandler = ((HttpRestR66Handler) handler).getServerHandler();
R66Session session = serverHandler.getSession();
// now action according to body
JsonPacket json = (JsonPacket) body;
if (json == null) {
result.setDetail("not enough information");
setError(handler, result, HttpResponseStatus.BAD_REQUEST);
return;
}
result.getAnswer().put(AbstractDbData.JSON_MODEL, RESTHANDLERS.Control.name());
METHOD method = arguments.getMethod();
try {
if (json instanceof InformationJsonPacket && method == METHOD.GET) {//
InformationJsonPacket node = (InformationJsonPacket) json;
if (node.isIdRequest()) {
result.setCommand(ACTIONS_TYPE.GetTransferInformation.name());
ValidPacket validPacket = null;
if (node.isIdRequest()) {
validPacket = serverHandler.informationRequest(node.getId(), node.isTo(), node.getRulename(),
true);
} else {
validPacket = serverHandler.informationFile(node.getRequest(), node.getRulename(),
node.getFilename(), true);
}
if (validPacket != null) {
ObjectNode resp = JsonHandler.getFromString(validPacket.getSheader());
handler.setStatus(HttpResponseStatus.OK);
result.setResult(HttpResponseStatus.OK);
result.getResults().add(resp);
} else {
result.setDetail("Error during information request");
setError(handler, result, HttpResponseStatus.NOT_ACCEPTABLE);
}
} else {
result.setCommand(ACTIONS_TYPE.GetInformation.name());
result.setDetail("Error: FileInformation is not applicable with URI " + BASEURI);
setError(handler, result, HttpResponseStatus.NOT_ACCEPTABLE);
}
} else if (json instanceof RestartTransferJsonPacket && method == METHOD.PUT) {//
result.setCommand(ACTIONS_TYPE.RestartTransfer.name());
RestartTransferJsonPacket node = (RestartTransferJsonPacket) json;
R66Result r66result = serverHandler.requestRestart(node.getRequested(), node.getRequester(),
node.getSpecialid(), node.getRestarttime());
if (serverHandler.isCodeValid(r66result.getCode())) {
result.setDetail("Restart Transfer done");
setOk(handler, result, node, HttpResponseStatus.OK);
} else {
result.setDetail("Restart Transfer in error");
setError(handler, result, node, HttpResponseStatus.NOT_ACCEPTABLE);
}
} else if (json instanceof StopOrCancelJsonPacket && method == METHOD.PUT) {//
result.setCommand(ACTIONS_TYPE.StopOrCancelTransfer.name());
StopOrCancelJsonPacket node = (StopOrCancelJsonPacket) json;
R66Result resulttest;
if (node.getRequested() == null || node.getRequester() == null
|| node.getSpecialid() == DbConstant.ILLEGALVALUE) {
ErrorCode code = ErrorCode.CommandNotFound;
resulttest = new R66Result(session, true,
code, session.getRunner());
result.setDetail("Not enough argument passed to identify a transfer");
setError(handler, result, node, HttpResponseStatus.NOT_FOUND);
} else {
String reqd = node.getRequested();
String reqr = node.getRequester();
long id = node.getSpecialid();
resulttest = serverHandler.stopOrCancel(node.getRequestUserPacket(), reqd, reqr, id);
result.setDetail(resulttest.getCode().mesg);
setOk(handler, result, node, HttpResponseStatus.OK);
}
} else if (json instanceof TransferRequestJsonPacket && method == METHOD.POST) {
result.setCommand(ACTIONS_TYPE.CreateTransfer.name());
TransferRequestJsonPacket node = (TransferRequestJsonPacket) json;
R66Result r66result = serverHandler.transferRequest(node);
if (serverHandler.isCodeValid(r66result.getCode())) {
result.setDetail("New Transfer registered");
setOk(handler, result, node, HttpResponseStatus.OK);
} else {
result.setDetail("New Transfer cannot be registered");
setError(handler, result, HttpResponseStatus.NOT_ACCEPTABLE);
}
} else {
logger.info("Validation is ignored: " + json);
result.setDetail("Unknown command");
setError(handler, result, json, HttpResponseStatus.PRECONDITION_FAILED);
}
} catch (OpenR66ProtocolNotAuthenticatedException e) {
throw new HttpInvalidAuthenticationException(e);
} catch (OpenR66ProtocolPacketException e) {
throw new HttpIncorrectRequestException(e);
} catch (OpenR66ProtocolNoDataException e) {
throw new HttpIncorrectRequestException(e);
}
}
protected ArrayNode getDetailedAllow() {
ArrayNode node = JsonHandler.createArrayNode();
if (this.methods.contains(METHOD.GET)) {
InformationJsonPacket node3 = new InformationJsonPacket(Long.MIN_VALUE, false, "remoteHost");
node3.setComment("Information on Transfer request (GET)");
ArrayNode node1 = JsonHandler.createArrayNode();
ObjectNode node1b = JsonHandler.createObjectNode();
node1b.put(DbTaskRunner.JSON_MODEL, DbTaskRunner.class.getSimpleName());
DbValue[] values = DbTaskRunner.getAllType();
for (DbValue dbValue : values) {
node1b.put(dbValue.getColumn(), dbValue.getType());
}
node1.add(node1b);
ObjectNode node2;
try {
node2 = RestArgument.fillDetailedAllow(METHOD.GET, this.path,
ACTIONS_TYPE.GetTransferInformation.name(), node3.createObjectNode(), node1);
node.add(node2);
} catch (OpenR66ProtocolPacketException e1) {
}
}
if (this.methods.contains(METHOD.PUT)) {
RestartTransferJsonPacket node4 = new RestartTransferJsonPacket();
node4.setRequestUserPacket();
node4.setComment("Restart Transfer request (PUT)");
node4.setRequested("Requested host");
node4.setRequester("Requester host");
node4.setRestarttime(new Date());
ArrayNode node1 = JsonHandler.createArrayNode();
try {
node1.add(node4.createObjectNode());
ObjectNode node2 = RestArgument.fillDetailedAllow(METHOD.PUT, this.path,
ACTIONS_TYPE.RestartTransfer.name(), node4.createObjectNode(), node1);
node.add(node2);
} catch (OpenR66ProtocolPacketException e1) {
}
StopOrCancelJsonPacket node5 = new StopOrCancelJsonPacket();
node5.setRequestUserPacket();
node5.setComment("Stop Or Cancel request (PUT)");
node5.setRequested("Requested host");
node5.setRequester("Requester host");
node1 = JsonHandler.createArrayNode();
try {
node1.add(node5.createObjectNode());
ObjectNode node2 = RestArgument.fillDetailedAllow(METHOD.PUT, this.path,
ACTIONS_TYPE.StopOrCancelTransfer.name(), node5.createObjectNode(), node1);
node.add(node2);
} catch (OpenR66ProtocolPacketException e1) {
}
}
if (this.methods.contains(METHOD.POST)) {
TransferRequestJsonPacket node6 = new TransferRequestJsonPacket();
node6.setRequestUserPacket();
node6.setComment("Transfer Request (POST)");
node6.setFilename("Filename");
node6.setFileInformation("File information");
node6.setRequested("Requested host");
node6.setRulename("Rulename");
node6.setStart(new Date());
ArrayNode node1 = JsonHandler.createArrayNode();
try {
node1.add(node6.createObjectNode());
ObjectNode node2 = RestArgument.fillDetailedAllow(METHOD.POST, this.path,
ACTIONS_TYPE.CreateTransfer.name(), node6.createObjectNode(), node1);
node.add(node2);
} catch (OpenR66ProtocolPacketException e1) {
}
}
ObjectNode node2 = RestArgument.fillDetailedAllow(METHOD.OPTIONS, this.path, COMMAND_TYPE.OPTIONS.name(), null,
null);
node.add(node2);
return node;
}
}