Desafios no desenvolvimento de uma aplicação real com Flex

julho 19th, 2010

Para o primeiro encontro do FUGSC, fiz uma apresentação sobre os problemas que nossa equipe enfrentou ao desenvolver uma aplicação em Flex. O objetivo da apresentação foi mostrar que ainda existem áreas em que o Flex é deficiente e que, as vezes, olhar para um problema por outro ângulo pode ser a melhor solução. Os slides são auto-explicativos, e vale a pena dar uma olhada.

Tags: , , , , ,
Posted in real life | 4 Comments »

Gravação e slides da minha palestra no Flexmania 2010

julho 13th, 2010

Para quem perdeu minha palestra no Flexmania 2010, falando de Grails + Flex, pode assistir sua gravação em http://experts.na3.acrobat.com/p67616118/. Além disso, se encontra abaixo os slides que utilizei no evento.

Ainda estou devendo um tutorial sobre o assunto e prometo que, assim que possível, farei um post sobre isso.

Tags: , , ,
Posted in Sem categoria | No Comments »

[Vídeo] NOUS – Plataforma Social em Flex

julho 13th, 2010

A título de curiosidade, abaixo está um dos vídeos promocionais do NOUS, uma plataforma social de negócios desenvolvida em Flex, que permite a adoção das melhores práticas de inovação.

Seu desenvolvimento foi iniciado em meados de 2008 e semana passada foi lançada a versão 4.0. Além disso, esse é o projeto no qual venho trabalhando nos últimos 1 ano e meio.

Quinta-feira, 15/07/10, no encontro do FUGSC, estarei falando dos desafios que enfrentamos no desenvolvimento do NOUS e como passamos por esses obstáculos.

Para saber mais sobre o NOUS, acesse www.noussoftware.com.

Tags: , ,
Posted in real life | No Comments »

1º Encontro FUGSC em Joinville

junho 25th, 2010

Estamos inaugurando um Grupo de Usuários da Adobe em Joinville e o primeiro encontro vai ser no auditório da Softville sobre Flex.
Esse primeiro encontro que ocorrerá no dia 15/07 será para reunir profissionais da região e vamos contar com 3 palestras, do básico e intermediário ao avançado.

- Introdução ao Flex
- Flex e Java com BlazeDS
- Desafios no desenvolvimento de uma aplicação real

Como o auditório possui espaço limitado, para garantir seu espaço peço que confirmem a presença neste link.

Lista de Presença

Mais informações em http://fugsc.groups.adobe.com

Até mais!

fugsc20100715

 

 

Tags: , , , ,
Posted in Sem categoria | 1 Comment »

Criando uma aplicação AIR usando a plataforma Force.com

maio 25th, 2010

sfdc_lockup_cs3R1Há algum tempo quero escrever sobre esse assunto mas sempre espero ter tempo de fazer um screencast ou um cookbook. Vi que se eu fosse esperar por isso esse post corria o risco de sair só ano que vem. Separei então alguns artigos interessantes sobre esse assunto.

Depois de assistir a uma palestra na última developer week, fiquei impressionado com a rapidez e a simplicidade em se criar uma aplicação AIR para a plataforma Force.com.

Force.com é a primeira do mundo sob o conceito de plataforma como serviço (PaaS), permitindo que desenvolvedores criem e distribuam qualquer tipo de aplicação de negócios na nuvem, totalmente on-demand e sem nenhum software.

Ela foi lançada pela SalesForce em 2007, empresa que iniciou desenvolvendo e vendendo uma solução CRM em SaaS e agora oferece sua estrutura para outras pessoas que queiram criar suas aplicações SaaS.

Agora a Force.com disponibiliza aos desenvolvedores o Adobe Flash Builder for Force.com, uma IDE que auxilia no desenvolvimento de aplicações AIR para a Force.com. Essa aplicações podem ser executadas mesmo quando você está offline e gerenciam toda a sincronização com sua aplicação SaaS.

Para você iniciar o desenvolvimento na plataforma Force.com você precisa primeiramente criar um cadastro em developer.force.com e logo após isso baixar a IDE em developer.force.com/flashbuilder.

Esse artigo explica extamente como criar sua conta de desenvolvedor e rodar sua primeira aplicação Force.com, bem como este pdf. Se você quiser entender um pouco melhor como funciona a plataforma sugiro ler a documentação em developer.force.com.

O vídeo abaixo apresenta a IDE, e neste site você encontra um screencast da criação de uma aplicação AIR.

Além de tudo ainda existe um canal na ADC voltado para isso. Até mais!

Tags: , ,
Posted in cookbook | No Comments »

Criando aplicações Flex para o Orkut (e outras redes sociais)

maio 10th, 2010

Há algum tempo me interessei em desenvolver aplicativos para o Orkut de forma experimental utilizando o Flex. Depois de alguma pesquisa e um pouco de tempo perdido cheguei à essa biblioteca. Ela é basicamente uma interface entre actionscript e as funções do OpenSocial.

O que é OpenSocial?

O serviço OpenSocial define uma API comum para desenvolver aplicativos sociais que irão funcionar em diversos sites. Elas possibilitam que os desenvolvedores criem aplicativos utilizando JavaScript e HTML padrão para acessar amigos de uma rede social e atualizar feeds.

Ou seja, você desenvolve um aplicativo utilizando a API e pode rodá-lo em diferentes containers, como: Orkut, MySpace, LinkedIn, IGoogle, Hi5, Ning entre outros. Infelizmente o Facebook não suporta o padrão OpenSocial, mas existem outras bibliotecas que realizam essa comunicação, a mais conhecida é esta.

Bom, vamos no ater à API OpenSocial. Depois de fazer o download do SWC é hora de baixar a aplicação de exemplo, que demonstra algumas das funções básicas da API. Se você preferir pode baixar o projeto dessa aplicação já com o SWC.

Aplicação compilada, agora é hora botá-la pra funcionar. Para que você consiga rodar sua aplicação no Orkut são necessários mais alguns passos:

  1. Disponibilizar publicamente seu SWF, no meu caso a nossa aplicação está em http://www.joaoaugusto.com.br/SampleApp.swf.
  2. Criar um arquivo XML (conforme modelo abaixo) e disponibilizá-lo publicamente. Novamente, no meu caso http://www.joaoaugusto.com.br/SampleApp.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <Module>
    <ModulePrefs title="SampleApp">
      <Require feature="flash"/>
      <Require feature="views"/>
      <Require feature="dynamic-height"/>
      <Require feature="opensocial-0.8"/>
    </ModulePrefs>
    <Content type="html">
    <![CDATA[
      <!-- The flash element -->
      <div id="flashcontainer" style="text-align: center;"></div>
    
      <!-- Embed the swf file -->
      <script type="text/javascript">
        var flashObjId = "flashObj";
        gadgets.flash.embedFlash(
          "http://www.joaoaugusto.com.br/SampleApp.swf",
          "flashcontainer", "9", {
            name: flashObjId,
            id: flashObjId,
            quality: "high",
            wmode: "window",
            allowScriptAccess: "always"
          });
        gadgets.window.adjustHeight();
      </script>
    ]]>
    </Content>
    </Module>
    
  3. Ter acesso ao sandbox.orkut.com, que você consegue em http://sandbox.orkut.com/SandboxSignup.aspx.

Depois de logado dentro de sua conta no sandbox você verá à esquerda da tela uma seção chamada “Apps” e ao lado do título da seção um botão “Editar”:

EditarApp

Após entra na tela de edição das aplicações, aparecerá um campo para que você preencha utilizando o endereço do XML que disponiblizamos em um dos passos acima:

AddApp

Pronto, agora você já pode acessar as funções básicas da API OpenSocial através do seu Orkut.

.SampleApp

Para mais informacões acesse o site oficial da OpenSocial Actionscript Client Library. Até mais!

Tags: , ,
Posted in cookbook | 4 Comments »

Eclipse Plugin para identificar assets não usados

maio 3rd, 2010

Aqui na Informant utilizamos várias imagens para desenvolver um produto em Flex e à medida que vamos fazendo alterações de layout acabamos por deixar de usar algumas até mesmo sem saber. Isso faz com que nosso projeto no Eclipse fique poluído e deixa o tamanho do nosso EAR maior.
Para que nós não precisássemos procurar se a imagem estava sendo usada, uma por uma, criei um plugin para o Eclipse que faz isso. É o Assets Analyzer:

Features:

  • Busca referências a arquivos de assets dentro dos fontes Java, Mxml, ActionScript e Css e mostra os que não estão sendo usados

To-dos:

  • Implementar método para cancelar operação
  • Fazer com que já abra a busca de diretórios dentro da workspace
  • Opção para excluir automaticamente as imagens identificadas como não usadas
  • Criar um update site para o plugin
  • Implementar busca para .html e  .js
  • Melhorar layout

Bugs:

  • Se um arquivo de imagem é usado dentro de um .properties (I18N) o procura não considera e informa que ele não está sendo usado

Screenshot:

plugin

Clique aqui para fazer o download.

Para utilizar o pluign basta jogá-lo na pasta eclipse/plugins, reiniciar o Eclipse e ir em Window > Show View e digitar Assets Analyzer.

Até mais!

Tags: , , ,
Posted in utilidades | No Comments »

Nem só de Flex vive o homem… java.io.IOException: Insufficient system resources exist to complete the requested service

abril 10th, 2010

Um dos clientes que atendemos estava tendo problemas ao fazer upload de arquivos maiores que, segundo ele, 65MB em uma de nossas aplicações Flex. Eu tinha conhecimento das limitações do Flash Player mas isso não fazia sentido, pois segundo a documentação do Flex, o player suporta oficialmente até 100MB de upload através da classe FileReference:

Starts the upload of a file selected by a user to a remote server. Although Flash Player has no restriction on the size of files you can upload or download, the player officially supports uploads or downloads of up to 100 MB. You must call the FileReference.browse() or FileReferenceList.browse() method before you call this method.

Eu tinha certeza que o problema era de infra-estrutura de rede da empresa, que talvez existisse alguma limitação no upload dos usuários ou que a rede apenas não era rápida o suficiente para o usuário não perder a paciência e desistir. Tanto achava que nunca me importei muito e sabia que iria provar por A + B que o problema não era nosso.

Eis então que fui visitar a empresa para realizar uma atualização na versão (não posso fazer isso remotamente, normas do cliente) e acompanhei um pouco o dia-a-dia dos usuários do nosso sistema. Nesse ponto eu não já podia mais escapar e tinha que dar uma resposta definitiva de o quê deveria ser feito e quem deveria fazê-lo.

Porca miseria! Estava estourando um erro no console e meu orgulho nunca tinha me deixado ver. Era um tal de java.io.IOException: Insufficient system resources exist to complete the requested service e, confesso, até fiquei feliz por que descobri a causa e ela aparentemente também não era minha culpa.

Pesquisando um pouquinho aqui, um pouquinho ali, cheguei nesse post. Alguém tinha descoberto que isso acontecia quando o Java tentava escrever mais que 64MB um um diretório remoto do Windows:

I have seen similar when a java application on Windows tries a “write” over a UNC path.

When this is just a “write” there is an application limit of 64MB, “writes” cannot use Windows cache manager if the destination is a remote file systems. If you change this to a “read/write” it will work. The restriction of 64MB is not configurable and is set to prevent Applications starting by issuing a lot of large IO. This issue only happens for remote file systems, local systems will work.

For local cases, MS can cache the data because they can enforce the “write-only” logic in the OS. They don’t allow a “write only” handle to read, so its OK if the cache manager caches the write. They can’t do this for remote files because the server can’t trust the client to enforce that logic.

Agora tudo fazia sentido: os 65MB (que na verdade são 64MB), o servidor Windows e o repositório de arquivos de upload em outra máquina.

Comecei então a procurar uma solução para o problema, meu tempo estava se esgotando e, se eu corrigisse aquele problema que existia há séculos eu seria o Rei do mundo. Achei então outro alguém que tinha o problema, e esse por sua vez, também queria botar a culpa na equipe do suporte. Segundo ele já existiam alguns artigos no site da Microsoft que, ainda não eram a solução, mas podiam resolver o problema:

Unfortunately, there are no articles specific to writing a large file like this, but some articles seem to – possibly – come close. They are Microsoft articles Q304101 and Q317249. You can always see if the information applies. Additionally, you might take the time to check out other articles that come up with searches relating to 1450 and/or contact Microsoft with the sample above.

Munido de termos técnicos e provas concretas fui conversar com a equipe de suporte do cliente. Alguém aqui já tentou fazer com que eles mudem a configuração de um servidor? Not even try it.

Já que eu não podia atacar a causa do problema tive que usar de métodos alternativos. A única solução foi fazer conforme sugerido aqui, e escrever os bytes de 64 em 64MB, ou seja, onde era assim:

	File path = new File(System.getProperty("archives.path"));  //dir remoto z:
	File localPath = new File(path, "/archives/");

	if (!localPath.exists()) {
		localPath.mkdir();
	}

	File file = new File(localPath, fileName);

	FileOutputStream output = new FileOutputStream(file);
	output.write(bytes);

	output.flush();
	output.close();

ficou assim:

	File path = new File(System.getProperty("archives.path")); //dir remoto z:
	File localPath = new File(path, "/archives/");
	File file = new File(localPath, fileName);

	File tempPath = new File(System.getProperty("archives.temppath")); //dir local c:
	File tempFile = new File(tempPath, fileName);

	// escrevendo o arquivo inteiro do diretório temporário
	FileOutputStream output = new FileOutputStream(tempFile);
	output.write(bytes);

	FileOutputStream outputFinal = new FileOutputStream(file);
	FileChannel outputChannel = outputFinal.getChannel();

	FileInputStream input = new FileInputStream(tempFile);
	FileChannel inputChannel = input.getChannel();

	// magic number for Windows, 64Mb - 32Kb)
	int maxCount = (64 * 1024 * 1024) - (32 * 1024);
	long size = inputChannel.size();

	long position = 0;

	// transferindo o arquivo salvo no diretório temporário para o remoto de 64Mb em 64Mb
	while (position < size) {
		position += inputChannel.transferTo(position, maxCount, outputChannel);
	}

	output.flush();
	output.close();

	outputFinal.flush();
	outputFinal.close();

        tempFile.delete();

Deve haver algum jeito de fazer isso sem a necessidade de gravar o arquivo em um diretório temporário, mas ainda não descobri. Além disso já foi aberto um bug na SDN mas foi considerado problemas de configuração de file-server, embora a Microsoft não tenha uma solução que funciona em 100% dos casos.

Até a próxima!

Tags: , ,
Posted in java | No Comments »

Integrando CruiseControl com FlexPMD

março 9th, 2010

Após configurarmbanneros o CruiseControl com o SVN aqui na Informant decidimos que era hora de buscar novas ferramentas para tornar o processo de integração contínua mais completo. Para que pudessemos monitorar a qualidade do código a cada build, assumi a tarefa de integrar o CruiseControl com o FlexPMD, famoso detector de más práticas em código fonte Flex.

Antes de tudo, você precisa baixar a última versão do FlexPMD Ant Task. Descompacte todos os arquivos exceto o jar do Ant dentro da pasta lib de sua instalação do Ant.

Depois de feito isso é hora de adicionar a tarefa do FlexPMD ao build do seu projeto:

<property name="src.dir" value="../../checkout/projeto/flex_src" />
<property name="bin.dir" value="../../projects/projeto/pmd/" />

<taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask"/>

<target name="flex-pmd" depends="mkdir">
	<flexPmd sourceDirectory="${src.dir}"
		outputDirectory="${bin.dir}"/>
</target>

Agora que o FlexPMD já está sendo executado junto ao build do seu projeto Flex é necessário fazer com que o log de saída do CruiseControl incorpore o log do FlexPMD. No arquivo de configurações do seu projeto adicione a tag <merge> dentro de <log>. Repare que o atributo “dir” corresponde ao mesmo caminho informado em “bin.dir” no seu build:

<log dir="logs/${project.name}">
	<merge dir="projects/projeto/pmd/"/>
</log>

Com o log sendo salvo, chegou a hora de mostrá-lo em tela. Dentro de main.jsp crie uma nova aba chamada “pmdResults”:

.
.
.
    <cruisecontrol:tabsheet>
      <tr>
        <td bgcolor="white" >
          <cruisecontrol:tab name="buildResults" label="Build Results" >
            <%@ include file="buildresults.jsp" %>
          </cruisecontrol:tab>

          <cruisecontrol:tab name="pmdResults" label="PMD Results" >
            <%@ include file="pmd.jsp" %>
          </cruisecontrol:tab>
.
.
.

Como você pode ver, essa nova aba chama o arquivo pmd.jsp que também precisa ser criado:

<%@ taglib uri="/WEB-INF/cruisecontrol-jsp11.tld" prefix="cruisecontrol"%>
<cruisecontrol:xsl xslFile="/xsl/pmd.xsl"/>

Para que nosso nova aba possa mostrar resultados mais intuitivos vamos adicionar dentro de cruisecontrol.css o seguinte código:

.pmd-evenrow { font-family:arial,helvetica,sans-serif; font-size:8pt; color:#000000; background-color:#FFFFCC; }
.pmd-oddrow { font-family:arial,helvetica,sans-serif; font-size:8pt; color:#000000; background-color:#CCCCCC; }
.pmd-fileheader { background-color:#FFFFFF; font-family:arial,helvetica,sans-serif; font-size:9pt; color:#000000; }
.pmd-sectionheader { background-color:#000066; font-family:arial,helvetica,sans-serif; font-size:9pt; color:#FFFFFF; }
.pmd-priority-1 { background-color:#FF0000; }
.pmd-priority-2 { background-color:#FF3300; }
.pmd-priority-3 { background-color:#FF9900; }
.pmd-priority-4 { background-color:#FFFF00; }
.pmd-priority-5 { background-color:#0033FF; }

Já temos quase tudo configurado, precisamos “apenas” formatar nossa saída e para isso iremos criar o arquivo pmd.xsl, que já informamos em pmd.jsp. No tutorial da ThoughtWorks de como integrar o CC como o PMD (Java) eles sugerem o seguinte:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" />

  <xsl:template match="/">
    <xsl:apply-templates select="." mode="pmd" />
  </xsl:template>

  <xsl:template match="/" mode="pmd">

    <xsl:variable name="file.count" select="count(cruisecontrol/pmd/file)"/>
    <xsl:variable name="violation.count" select="count(cruisecontrol/pmd/file/violation)"/>
    <xsl:variable name="p1.count" select="count(cruisecontrol/pmd/file/violation[@priority='1'])"/>
    <xsl:variable name="p2.count" select="count(cruisecontrol/pmd/file/violation[@priority='2'])"/>
    <xsl:variable name="p3.count" select="count(cruisecontrol/pmd/file/violation[@priority='3'])"/>
    <xsl:variable name="p4.count" select="count(cruisecontrol/pmd/file/violation[@priority='4'])"/>
    <xsl:variable name="p5.count" select="count(cruisecontrol/pmd/file/violation[@priority='5'])"/>

    <xsl:if test="count(cruisecontrol/pmd) = 0" >
        PMD was not run against this project
    </xsl:if>
    <xsl:if test="count(cruisecontrol/pmd) &gt; 0">
      <h1 align="center">PMD Violation Report</h1>
      <table align="center" cellpadding="8" cellspacing="0" border="0" width="98%">
      <tr>
        <td class="pmd-sectionheader">
          Summary: <xsl:value-of select="$violation.count"/> violation(s) found in
          <xsl:value-of select="$file.count"/> file(s)
        </td>
      </tr>
      <tr>
        <td>
        <table align="right" cellpadding="1" cellspacing="1" border="0" width="95%">
          <tr>
            <td class="changelists-file-header" colspan="3">
              &#160;Violations by Priority&#160;
            </td>
          </tr>
          <tr>
            <td class="changelists-file-header" width="10">Priority</td>
            <td class="changelists-file-header" width="20">Violations</td>
            <td class="changelists-file-header">Percentage</td>
          </tr>
          <tr>
            <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
            <td><xsl:attribute name="class">pmd-priority-1</xsl:attribute>1</td>
            <td><xsl:value-of select="$p1.count"/></td>
            <td><xsl:value-of select="format-number($p1.count div $violation.count, '##%')"/></td>
          </tr>
          <tr>
            <xsl:attribute name="class">pmd-oddrow</xsl:attribute>
            <td><xsl:attribute name="class">pmd-priority-2</xsl:attribute>2</td>
            <td><xsl:value-of select="$p2.count"/></td>
            <td><xsl:value-of select="format-number($p2.count div $violation.count, '##%')"/></td>
          </tr>
          <tr>
            <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
            <td><xsl:attribute name="class">pmd-priority-3</xsl:attribute>3</td>
            <td><xsl:value-of select="$p3.count"/></td>
            <td><xsl:value-of select="format-number($p3.count div $violation.count, '##%')"/></td>
          </tr>
          <tr>
            <xsl:attribute name="class">pmd-oddrow</xsl:attribute>
            <td><xsl:attribute name="class">pmd-priority-4</xsl:attribute>4</td>
            <td><xsl:value-of select="$p4.count"/></td>
            <td><xsl:value-of select="format-number($p4.count div $violation.count, '##%')"/></td>
          </tr>
          <tr>
            <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
            <td><xsl:attribute name="class">pmd-priority-5</xsl:attribute>5</td>
            <td><xsl:value-of select="$p5.count"/></td>
            <td><xsl:value-of select="format-number($p5.count div $violation.count, '##%')"/></td>
          </tr>
        </table>
        </td>
      </tr>
      <tr>
        <td class="pmd-sectionheader">Files: (<xsl:value-of select="$file.count"/>)</td>
      </tr>
      <xsl:apply-templates select="cruisecontrol/pmd/file" mode="pmd" />
      </table>
    </xsl:if>
  </xsl:template>

  <xsl:template match="file" mode="pmd">
    <tr valign="top">
      <xsl:if test="position() mod 2=0">
        <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
      </xsl:if>
      <xsl:if test="position() mod 2!=0">
        <xsl:attribute name="class">pmd-oddrow</xsl:attribute>
      </xsl:if>
      <td class="modifications-data">
        <b><xsl:value-of select="@name"/></b>
      </td>
    </tr>
    <tr valign="top">
      <xsl:if test="position() mod 2=0">
        <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
      </xsl:if>
      <xsl:if test="position() mod 2!=0">
        <xsl:attribute name="class">pmd-oddrow</xsl:attribute>
      </xsl:if>
      <td class="modifications-data" colspan="5">
        <table align="right" cellpadding="1" cellspacing="1" border="0" width="95%">
          <tr>
            <td class="changelists-file-header" colspan="6">
              &#160;Violations associated with this file:&#160;
              (<xsl:value-of select="count(violation)"/>)
            </td>
          </tr>
          <tr>
            <td class="changelists-file-header">Priority</td>
            <td class="changelists-file-header">Line</td>
            <td class="changelists-file-header">Rule</td>
            <td class="changelists-file-header">Ruleset</td>
            <td class="changelists-file-header">Hint</td>
          </tr>
          <xsl:apply-templates select="violation" mode="pmd"/>
        </table>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="violation" mode="pmd">
    <tr valign="top" >
      <xsl:if test="position() mod 2=0">
        <xsl:attribute name="class">pmd-evenrow</xsl:attribute>
      </xsl:if>
      <xsl:if test="position() mod 2!=0">
        <xsl:attribute name="class">pmd-oddrow</xsl:attribute>
      </xsl:if>
      <td width="10">
        <xsl:attribute name="class">pmd-priority-<xsl:value-of select="@priority" /></xsl:attribute>
        <xsl:value-of select="@priority"/>
      </td>
      <td class="modifications-data"><xsl:value-of select="@line"/></td>
      <td class="modifications-data"><xsl:value-of select="@rule"/></td>
      <td class="modifications-data"><xsl:value-of select="@ruleset"/></td>
      <td class="modifications-data"><xsl:value-of select="."/></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

Pronto. Com tudo configurado é hora de dar o build no seu projeto e esperar para ver os resultados:

Capturar2

Fontes:
http://confluence.public.thoughtworks.org/display/CC/CruiseControlWithPMD
http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD

Tags: ,
Posted in cookbook | No Comments »

Configurando HTTPS no BlazeDs utilizando JBoss/Tomcat

fevereiro 19th, 2010

ctrxwt4De pouco adianta uma aplicação com restrições de acesso se o transporte dos dados entre Java e Flex é inseguro. Para fazer com que os dados sejam transportados de forma segura, é necessário configurar o BlazeDS e seu servidor de aplicação/container web para realizar conexões HTTPS, e isso é, com certeza, muita mais simples do que você possa imaginar.

Considerando que sua aplicação já está rodando, vamos pôr a mão na massa.

Primeiro de tudo: services-config.xml. Dentro da tag “channels” você deve definir mais um canal, dessa vez usando as classes responsáveis por transportar dados sobre HTTPS:

<channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
	<endpoint url="https://{server.name}:9100/dev/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
</channel-definition>

Após isso, você deve configurar ambos remoting-config.xml e proxy-config.xml para usar como padrão o novo canal que você acabou de criar, subtituindo a propriedade “ref” de “channel”, que antes era my-amf, por my-secure-amf:

<default-channels>
	<channel ref="my-secure-amf"/>
<default-channels>

Pronto! Na parte Flex as alterações eram essas, agora é a vez de configurar o servidor alterando o arquivo server.xml, que no JBoss fica sob o diretório:

jboss/server/default/deploy/jboss-web.deployer

E no Tomcat, sob:

tomcat/conf

Você irá encontrar duas tags mais ou menos assim:

<Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />

<!--<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
address="${jboss.bind.address}" maxThreads="150" scheme="https"
secure="true" clientAuth="false" sslProtocol="TLS" />-->

Já deu pra entender como funciona, não? Tudo bem, eu explico mesmo assim. A tag descomentada é a que você usa hoje, acessando sua aplicação através de, por exemplo, http://localhost:8080. Descomentando o connector que usa a porte 443 (e descomentando a de cima, claro) você dirá ao servidor “olá! a partir de agora você só vai conversar pela porta 443 para que ninguém entenda o que estamos falando”.

Só tem um problema, o servidor precisa de uma chave pública para criptografar os dados que serão transmitidos. Levando em consideração que você já a tenha, vamos prosseguir, caso contrário leia o artigo Creating a keystore file and keystore password for HTTPS connections, da Sun.

Com a chave em mãos vamos completar nosso connector, do arquivo server.xml, com as propriedades keystoreFile e keystorePass:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
	address="${jboss.bind.address}" maxThreads="150" scheme="https"
	secure="true" clientAuth="false" sslProtocol="TLS"
	keystoreFile="C:/my-key.keystore" keystorePass="my-key-pass"/>

Feito isso, é só reiniciar o servidor, recompilar seu SWF e acessar seu endereço, substituindo http por https. Se você for utilizar a porta 443 não há necessidade de usar “:443″, caso você deseje alterar a porta para, por exemplo “:8443″ deverá deixá-la explícita na URL.

Tags: , , , ,
Posted in cookbook | No Comments »

Página anterior