Java tutorial
/** 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.sql.Timestamp; import org.joda.time.DateTime; import org.waarp.common.database.DbPreparedStatement; import org.waarp.common.database.data.DbValue; import org.waarp.common.database.exception.WaarpDatabaseException; import org.waarp.common.database.exception.WaarpDatabaseNoConnectionException; import org.waarp.common.database.exception.WaarpDatabaseSqlException; import org.waarp.common.json.JsonHandler; import org.waarp.common.role.RoleDefault.ROLE; import org.waarp.gateway.kernel.exception.HttpForbiddenRequestException; import org.waarp.gateway.kernel.exception.HttpIncorrectRequestException; import org.waarp.gateway.kernel.exception.HttpInvalidAuthenticationException; import org.waarp.gateway.kernel.exception.HttpNotFoundRequestException; import org.waarp.gateway.kernel.rest.DataModelRestMethodHandler; import org.waarp.gateway.kernel.rest.HttpRestHandler; import org.waarp.gateway.kernel.rest.RestArgument; import org.waarp.gateway.kernel.rest.HttpRestHandler.METHOD; import org.waarp.gateway.kernel.rest.RestConfiguration; import org.waarp.openr66.context.R66Session; import org.waarp.openr66.database.data.DbTaskRunner; import org.waarp.openr66.database.data.DbTaskRunner.Columns; import org.waarp.openr66.protocol.http.rest.HttpRestR66Handler; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; /** * DbTaskRunner Rest handler * * @author "Frederic Bregier" * */ public class DbTaskRunnerR66RestMethodHandler extends DataModelRestMethodHandler<DbTaskRunner> { public static final String BASEURI = "transfers"; public static enum FILTER_ARGS { LIMIT("number"), ORDERBYID("boolean"), STARTID("transfer id"), STOPID("transfer id"), IDRULE( "rule name"), PARTNER("partner (requester or requested) name"), PENDING("boolean"), INTRANSFER( "boolean"), INERROR("boolean"), DONE("boolean"), ALLSTATUS("boolean"), STARTTRANS( "Date in ISO 8601 format or ms"), STOPTRANS("Date in ISO 8601 format or ms"); public String type; FILTER_ARGS(String type) { this.type = type; } } /** * @param config * @param method */ public DbTaskRunnerR66RestMethodHandler(RestConfiguration config, METHOD... method) { super(BASEURI, config, method); } protected DbTaskRunner getItem(HttpRestHandler handler, RestArgument arguments, RestArgument result, Object body) throws HttpIncorrectRequestException, HttpInvalidAuthenticationException, HttpNotFoundRequestException { ObjectNode arg = arguments.getUriArgs().deepCopy(); arg.setAll(arguments.getBody()); try { JsonNode node = RestArgument.getId(arg); long id; if (node.isMissingNode()) { // shall not be but continue however id = arg.path(DbTaskRunner.Columns.SPECIALID.name()).asLong(); } else { id = node.asLong(); } return new DbTaskRunner(handler.getDbSession(), id, arg.path(DbTaskRunner.Columns.REQUESTER.name()).asText(), arg.path(DbTaskRunner.Columns.REQUESTED.name()).asText(), arg.path(DbTaskRunner.Columns.OWNERREQ.name()).asText()); } catch (WaarpDatabaseException e) { throw new HttpNotFoundRequestException("Issue while reading from database " + arg, e); } } @Override protected DbTaskRunner createItem(HttpRestHandler handler, RestArgument arguments, RestArgument result, Object body) throws HttpIncorrectRequestException, HttpInvalidAuthenticationException { ObjectNode arg = arguments.getUriArgs().deepCopy(); arg.setAll(arguments.getBody()); try { return new DbTaskRunner(handler.getDbSession(), arg); } catch (WaarpDatabaseException e) { throw new HttpIncorrectRequestException("Issue while inserting into database", e); } } @Override protected DbPreparedStatement getPreparedStatement(HttpRestHandler handler, RestArgument arguments, RestArgument result, Object body) throws HttpIncorrectRequestException, HttpInvalidAuthenticationException { ObjectNode arg = arguments.getUriArgs().deepCopy(); arg.setAll(arguments.getBody()); int limit = arg.path(FILTER_ARGS.LIMIT.name()).asInt(0); boolean orderBySpecialId = arg.path(FILTER_ARGS.ORDERBYID.name()).asBoolean(false); JsonNode node = arg.path(FILTER_ARGS.STARTID.name()); String startid = null; if (!node.isMissingNode()) { startid = node.asText(); } if (startid == null || startid.isEmpty()) { startid = null; } node = arg.path(FILTER_ARGS.STOPID.name()); String stopid = null; if (!node.isMissingNode()) { stopid = node.asText(); } if (stopid == null || stopid.isEmpty()) { stopid = null; } String rule = arg.path(FILTER_ARGS.IDRULE.name()).asText(); if (rule == null || rule.isEmpty()) { rule = null; } String req = arg.path(FILTER_ARGS.PARTNER.name()).asText(); if (req == null || req.isEmpty()) { req = null; } String owner = arg.path(DbTaskRunner.Columns.OWNERREQ.name()).asText(); if (owner == null || owner.isEmpty()) { owner = null; } boolean pending = arg.path(FILTER_ARGS.PENDING.name()).asBoolean(false); boolean transfer = arg.path(FILTER_ARGS.INTRANSFER.name()).asBoolean(false); boolean error = arg.path(FILTER_ARGS.INERROR.name()).asBoolean(false); boolean done = arg.path(FILTER_ARGS.DONE.name()).asBoolean(false); boolean all = arg.path(FILTER_ARGS.ALLSTATUS.name()).asBoolean(false); Timestamp start = null; node = arg.path(FILTER_ARGS.STARTTRANS.name()); if (!node.isMissingNode()) { long val = node.asLong(); if (val == 0) { DateTime received = DateTime.parse(node.asText()); val = received.getMillis(); } start = new Timestamp(val); } Timestamp stop = null; node = arg.path(FILTER_ARGS.STOPTRANS.name()); if (!node.isMissingNode()) { long val = node.asLong(); if (val == 0) { DateTime received = DateTime.parse(node.asText()); val = received.getMillis(); } stop = new Timestamp(val); } try { return DbTaskRunner.getFilterPrepareStatement(handler.getDbSession(), limit, orderBySpecialId, startid, stopid, start, stop, rule, req, pending, transfer, error, done, all, owner); } catch (WaarpDatabaseNoConnectionException e) { throw new HttpIncorrectRequestException("Issue while reading from database", e); } catch (WaarpDatabaseSqlException e) { throw new HttpIncorrectRequestException("Issue while reading from database", e); } } @Override protected DbTaskRunner getItemPreparedStatement(DbPreparedStatement statement) throws HttpIncorrectRequestException, HttpNotFoundRequestException { try { return DbTaskRunner.getFromStatementNoDbRule(statement); } catch (WaarpDatabaseNoConnectionException e) { throw new HttpIncorrectRequestException("Issue while selecting from database", e); } catch (WaarpDatabaseSqlException e) { throw new HttpNotFoundRequestException("Issue while selecting from database", e); } } @Override protected ArrayNode getDetailedAllow() { ArrayNode node = JsonHandler.createArrayNode(); ObjectNode node1 = JsonHandler.createObjectNode(); node1.put(DbTaskRunner.JSON_MODEL, DbTaskRunner.class.getSimpleName()); DbValue[] values = DbTaskRunner.getAllType(); for (DbValue dbValue : values) { node1.put(dbValue.column, dbValue.getType()); } ObjectNode node2; ObjectNode node3 = JsonHandler.createObjectNode(); if (this.methods.contains(METHOD.GET)) { node3.put(DbTaskRunner.Columns.SPECIALID.name(), "Special Id as LONG in URI as " + this.path + "/id"); node3.put(DbTaskRunner.Columns.REQUESTER.name(), "Partner as requester as VARCHAR"); node3.put(DbTaskRunner.Columns.REQUESTED.name(), "Partner as requested as VARCHAR"); node3.put(DbTaskRunner.Columns.OWNERREQ.name(), "Owner of this request (optional) as VARCHAR"); node2 = RestArgument.fillDetailedAllow(METHOD.GET, this.path + "/id", COMMAND_TYPE.GET.name(), node3, node1); node.add(node2); node3 = JsonHandler.createObjectNode(); for (FILTER_ARGS arg : FILTER_ARGS.values()) { node3.put(arg.name(), arg.type); } node3.put(DbTaskRunner.Columns.OWNERREQ.name(), "Owner of this request (optional) as VARCHAR"); node2 = RestArgument.fillDetailedAllow(METHOD.GET, this.path, COMMAND_TYPE.MULTIGET.name(), node3, JsonHandler.createArrayNode().add(node1)); node.add(node2); } if (this.methods.contains(METHOD.PUT)) { node3 = JsonHandler.createObjectNode(); node3.put(DbTaskRunner.Columns.SPECIALID.name(), "Special Id as LONG in URI as " + this.path + "/id"); node3.put(DbTaskRunner.Columns.REQUESTER.name(), "Partner as requester as VARCHAR"); node3.put(DbTaskRunner.Columns.REQUESTED.name(), "Partner as requested as VARCHAR"); node3.put(DbTaskRunner.Columns.OWNERREQ.name(), "Owner of this request (optional) as VARCHAR"); for (DbValue dbValue : values) { if (dbValue.column.equalsIgnoreCase(DbTaskRunner.Columns.IDRULE.name())) { continue; } node3.put(dbValue.column, dbValue.getType()); } node2 = RestArgument.fillDetailedAllow(METHOD.PUT, this.path + "/id", COMMAND_TYPE.UPDATE.name(), node3, node1); node.add(node2); } if (this.methods.contains(METHOD.DELETE)) { node3 = JsonHandler.createObjectNode(); node3.put(DbTaskRunner.Columns.SPECIALID.name(), "Special Id as LONG in URI as " + this.path + "/id"); node3.put(DbTaskRunner.Columns.REQUESTER.name(), "Partner as requester as VARCHAR"); node3.put(DbTaskRunner.Columns.REQUESTED.name(), "Partner as requested as VARCHAR"); node3.put(DbTaskRunner.Columns.OWNERREQ.name(), "Owner of this request (optional) as VARCHAR"); node2 = RestArgument.fillDetailedAllow(METHOD.DELETE, this.path + "/id", COMMAND_TYPE.DELETE.name(), node3, node1); node.add(node2); } if (this.methods.contains(METHOD.POST)) { node3 = JsonHandler.createObjectNode(); for (DbValue dbValue : values) { node3.put(dbValue.column, dbValue.getType()); } node2 = RestArgument.fillDetailedAllow(METHOD.POST, this.path, COMMAND_TYPE.CREATE.name(), node3, node1); node.add(node2); } node2 = RestArgument.fillDetailedAllow(METHOD.OPTIONS, this.path, COMMAND_TYPE.OPTIONS.name(), null, null); node.add(node2); return node; } @Override public String getPrimaryPropertyName() { return Columns.SPECIALID.name(); } @Override protected void checkAuthorization(HttpRestHandler handler, RestArgument arguments, RestArgument result, METHOD method) throws HttpForbiddenRequestException { HttpRestR66Handler r66handler = (HttpRestR66Handler) handler; R66Session session = r66handler.serverHandler.getSession(); if (!session.getAuth().isValidRole(ROLE.SYSTEM)) { throw new HttpForbiddenRequestException("Partner must have System role"); } } }