Java tutorial
/* * 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(); } }