com.joseflavio.uxiamarelo.rest.UxiAmareloREST.java Source code

Java tutorial

Introduction

Here is the source code for com.joseflavio.uxiamarelo.rest.UxiAmareloREST.java

Source

/*
 *  Copyright (C) 2016-2019 Jos Flvio de Souza Dias Jnior
 *  
 *  This file is part of Uxi-amarelo - <http://joseflavio.com/uxiamarelo/>.
 *  
 *  Uxi-amarelo is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  Uxi-amarelo 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 Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with Uxi-amarelo. If not, see <http://www.gnu.org/licenses/>.
 */

/*
 *  Direitos Autorais Reservados (C) 2016-2019 Jos Flvio de Souza Dias Jnior
 * 
 *  Este arquivo  parte de Uxi-amarelo - <http://joseflavio.com/uxiamarelo/>.
 * 
 *  Uxi-amarelo  software livre: voc pode redistribu-lo e/ou modific-lo
 *  sob os termos da Licena Pblica Menos Geral GNU conforme publicada pela
 *  Free Software Foundation, tanto a verso 3 da Licena, como
 *  (a seu critrio) qualquer verso posterior.
 * 
 *  Uxi-amarelo  distribudo na expectativa de que seja til,
 *  porm, SEM NENHUMA GARANTIA; nem mesmo a garantia implcita de
 *  COMERCIABILIDADE ou ADEQUAO A UMA FINALIDADE ESPEC?FICA. Consulte a
 *  Licena Pblica Menos Geral do GNU para mais detalhes.
 * 
 *  Voc deve ter recebido uma cpia da Licena Pblica Menos Geral do GNU
 *  junto com Uxi-amarelo. Se no, veja <http://www.gnu.org/licenses/>.
 */

package com.joseflavio.uxiamarelo.rest;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Base64;
import java.util.HashSet;
import java.util.Map;

import javax.ejb.EJB;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import com.joseflavio.copaiba.CopaibaConexao;
import com.joseflavio.urucum.json.JSON;
import com.joseflavio.uxiamarelo.UxiAmarelo;
import com.joseflavio.uxiamarelo.util.Util;

import org.apache.commons.io.IOUtils;

/**
 * Fachada REST para {@link com.joseflavio.copaiba.Copaiba Copaba}s.
 * @author Jos Flvio de Souza Dias Jnior
 */
@Path("/")
public class UxiAmareloREST {

    @EJB
    private UxiAmarelo uxiAmarelo;

    @GET
    @Path("teste")
    @Produces(MediaType.TEXT_PLAIN + "; charset=UTF-8")
    public String teste() {
        return "Uxi-amarelo";
    }

    /**
     * {@link CopaibaConexao#executar(String, String, java.io.Writer, boolean)}
     */
    @POST
    @Path("{copaiba}/executar/{linguagem}")
    @Consumes(MediaType.TEXT_PLAIN)
    public Response executar(@PathParam("copaiba") String copaiba, @PathParam("linguagem") String linguagem,
            String rotina) {
        try (CopaibaConexao cc = uxiAmarelo.conectarCopaiba(copaiba)) {
            String resultado = (String) cc.executar(linguagem, rotina, null, true);
            return respostaEXITO(resultado);
        } catch (Exception e) {
            return respostaERRO(e);
        }
    }

    /**
     * {@link CopaibaConexao#executar(String, String, java.io.Writer, boolean)}
     */
    @GET
    @Path("{copaiba}/executar/{linguagem}/{rotina}")
    @Consumes(MediaType.TEXT_PLAIN)
    public Response executarGet(@PathParam("copaiba") String copaiba, @PathParam("linguagem") String linguagem,
            @PathParam("rotina") String rotina) {
        return executar(copaiba, linguagem, rotina);
    }

    /**
     * {@link CopaibaConexao#obter(String, boolean)}
     */
    @GET
    @Path("{copaiba}/obter/{variavel: [a-zA-Z][a-zA-Z0-9_$]*}")
    public Response obter(@PathParam("copaiba") String copaiba, @PathParam("variavel") String variavel) {
        try (CopaibaConexao cc = uxiAmarelo.conectarCopaiba(copaiba)) {
            String resultado = (String) cc.obter(variavel, true);
            return respostaEXITO(resultado);
        } catch (Exception e) {
            return respostaERRO(e);
        }
    }

    /**
     * {@link CopaibaConexao#solicitar(String, String, String)}
     */
    @POST
    @Path("{copaiba}/solicitar/{classe: [a-zA-Z][a-zA-Z0-9_$.]*}/{metodo: [a-zA-Z][a-zA-Z0-9_$]*}")
    @Consumes({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON })
    public Response solicitar(@Context HttpHeaders cabecalho, @QueryParam("uxicmd") String comando,
            @PathParam("copaiba") String copaiba, @PathParam("classe") String classe,
            @PathParam("metodo") String metodo, String json) {
        return solicitar0(cabecalho, comando, copaiba, classe, metodo, json);
    }

    /**
     * {@link CopaibaConexao#solicitar(String, String, String)}
     */
    @GET
    @Path("{copaiba}/solicitar/{classe: [a-zA-Z][a-zA-Z0-9_$.]*}/{metodo: [a-zA-Z][a-zA-Z0-9_$]*}/{json}")
    @Consumes({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON })
    public Response solicitarGet(@Context HttpHeaders cabecalho, @QueryParam("uxicmd") String comando,
            @PathParam("copaiba") String copaiba, @PathParam("classe") String classe,
            @PathParam("metodo") String metodo, @PathParam("json") String json) {
        return solicitar0(cabecalho, comando, copaiba, classe, metodo, json);
    }

    private Response solicitar0(HttpHeaders cabecalho, String comando, String copaiba, String classe, String metodo,
            String json) {

        try {

            JSON objeto = null;

            if (uxiAmarelo.isCookieEnviar()) {
                Map<String, Cookie> cookies = cabecalho.getCookies();
                if (cookies.size() > 0) {
                    if (objeto == null)
                        objeto = new JSON(json);
                    for (Cookie cookie : cookies.values()) {
                        String nome = cookie.getName();
                        if (uxiAmarelo.cookieBloqueado(nome))
                            continue;
                        if (!objeto.has(nome)) {
                            try {
                                objeto.put(nome, URLDecoder.decode(cookie.getValue(), "UTF-8"));
                            } catch (UnsupportedEncodingException e) {
                                objeto.put(nome, cookie.getValue());
                            }
                        }
                    }
                }
            }

            if (uxiAmarelo.isEncapsulamentoAutomatico()) {
                if (objeto == null)
                    objeto = new JSON(json);
                final String sepstr = uxiAmarelo.getEncapsulamentoSeparador();
                final char sep0 = sepstr.charAt(0);
                for (String chave : new HashSet<>(objeto.keySet())) {
                    if (chave.indexOf(sep0) == -1)
                        continue;
                    String[] caminho = chave.split(sepstr);
                    if (caminho.length > 1) {
                        Util.encapsular(caminho, objeto.remove(chave), objeto);
                    }
                }
            }

            if (objeto != null)
                json = objeto.toString();

            String resultado;

            if (comando == null) {
                try (CopaibaConexao cc = uxiAmarelo.conectarCopaiba(copaiba)) {
                    resultado = cc.solicitar(classe, json, metodo);
                    if (resultado == null)
                        resultado = "";
                }
            } else if (comando.equals("voltar")) {
                resultado = json;
                comando = null;
            } else {
                resultado = "";
            }

            if (comando == null) {

                return respostaEXITO(resultado);

            } else if (comando.startsWith("redirecionar")) {

                return Response
                        .temporaryRedirect(new URI(Util.obterStringDeJSON("redirecionar", comando, resultado)))
                        .build();

            } else if (comando.startsWith("base64")) {

                String url = comando.substring("base64.".length());

                return Response
                        .temporaryRedirect(
                                new URI(url + Base64.getUrlEncoder().encodeToString(resultado.getBytes("UTF-8"))))
                        .build();

            } else if (comando.startsWith("html_url")) {

                HttpURLConnection con = (HttpURLConnection) new URL(
                        Util.obterStringDeJSON("html_url", comando, resultado)).openConnection();
                con.setRequestProperty("User-Agent", "Uxi-amarelo");

                if (con.getResponseCode() != HttpServletResponse.SC_OK)
                    throw new IOException("HTTP = " + con.getResponseCode());

                String conteudo = null;
                try (InputStream is = con.getInputStream()) {
                    conteudo = IOUtils.toString(is);
                }

                con.disconnect();

                return Response.status(Status.OK).type(MediaType.TEXT_HTML + "; charset=UTF-8").entity(conteudo)
                        .build();

            } else if (comando.startsWith("html")) {

                return Response.status(Status.OK).type(MediaType.TEXT_HTML + "; charset=UTF-8")
                        .entity(Util.obterStringDeJSON("html", comando, resultado)).build();

            } else {

                throw new IllegalArgumentException(comando);

            }

        } catch (Exception e) {
            return respostaERRO(e);
        }

    }

    private Response respostaEXITO(String resultado) {
        return Response.status(Status.OK).type(MediaType.APPLICATION_JSON + "; charset=UTF-8").entity(resultado)
                .build();
    }

    private Response respostaERRO(Throwable e) {
        return Response.status(Status.INTERNAL_SERVER_ERROR).type(MediaType.APPLICATION_JSON + "; charset=UTF-8")
                .entity(Util.gerarRespostaErro(e).toString()).build();
    }

}