org.waarp.openr66.protocol.http.rest.handler.DbTaskRunnerR66RestMethodHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.waarp.openr66.protocol.http.rest.handler.DbTaskRunnerR66RestMethodHandler.java

Source

/**
   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");
        }
    }

}