Páginas

quinta-feira, 16 de janeiro de 2014

Conectando JVisualVM com JBoss AS 7

Uma das ferramentas disponíveis para análise de memória do Java é o jvisualvm disponibilizado pela própria Oracle no Java JDK.

Aqui utilizei o Java JDK 6u45  e o Jboss AS 7.1.1 Final, vamos a prática:

Vou partir do princípio que você já possui as variáveis de ambiente JBOSS_HOME e JAVA_HOME definidas.

Configurando o Jboss para aceitar a conexão JMX:

  • Abra o CMD.exe
  • Digite: cd %JBOSS_HOME%\bin
  • Adicione um usuário ao Jboss (se já possuir um não precisa): add-user.bat -a usuario senha
  • Abra o client do Jboss: jboss-cli.bat
  • digite para habilitar as configurações JMX:
    • connect --controller
    • /subsystem=jmx :read-resource-description(recursive=true)
    • quit
  • Inicie o Jboss normalmente.

Iniciando o JVisualVM:
  • No CMD digite todas as linhas abaixo:
set JBOSS_MODULEPATH=%JBOSS_HOME%/modules
set CLASSPATH=""

rem lib necessarias
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\remoting3\remoting-jmx\main\remoting-jmx-1.0.2.Final.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\remoting3\main\jboss-remoting-3.2.3.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\remoting3\remoting-jmx\main\remoting-jmx-1.0.2.Final.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\logging\jul-to-slf4j-stub\main\jul-to-slf4j-stub-1.0.0.Final.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\logging\main\jboss-logging-3.1.0.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\xnio\main\xnio-api-3.0.3.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\xnio\nio\main\xnio-nio-3.0.3.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\xnio\nio\main\xnio-nio-3.0.3.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\sasl\main\jboss-sasl-1.0.0.Final.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\marshalling\main\jboss-marshalling-1.3.11.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\marshalling\river\main\jboss-marshalling-river-1.3.11.GA.jar"
set CLASSPATH=%CLASSPATH%;"%JBOSS_MODULEPATH%\org\jboss\marshalling\river\main\jboss-marshalling-river-1.3.11.GA.jar"

jvisualvm -cp:a %CLASSPATH%

  • Irá abrir o Java VisualVM:

  • Clique com o botão direito em Local
  • Depois em Add JMX Connection
  • Insira o seguinte no campo Connection: service:jmx:remoting-jmx://localhost:9999
  • Insira o usuário e senha que você informou la em cima no add-user.bat
  • Vai ficar mais ou menos assim:


Se tudo ocorreu bem, você já pode verificar as configurações do Jboss e também o uso de memória do mesmo.

Dúvidas??




quinta-feira, 20 de junho de 2013

Adobe Flash Builder 4.7 com Apache SDK 4.10

ATUALIZAÇÃO: 16/08/2013 ApacheFlex 4.10


Pequeno tutorial (copiado e traduzido do Apache Flex) para instalar o Adobe Flash Builder 4.7 junto com a ultima versão do SDK o Apache Flex SDK 4.10 que foi lançado dia 06/08/2013.

Então, vamos começar:


  1. Faça download do Adobe Flash Builder 4.7 neste link: https://creative.adobe.com/products/flash-builder com cerca de 1,2Gb (para isso você precisa ter uma conta da adobe), esta versão tem 60 dias de avaliação, após isso, para continuar utilizando você deve comprá-lo, cerca de 250 obamas.
  2. Instale o FlashBuilder normalmente, seguindo as informações da tela.
  3. Faça download da ultima versão do SDK Installer no logo abaixo

    ou pelo link: http://flex.apache.org/installer.html
  4. Após o término do download, instale o Apache SDK 4.10 de acordo com as instruções de tela.
  5. Após a instalação do SDK, abra o FlashBuilder, insira seu login e senha da Adobe para ativar os 60 dias de teste.
  6. Agora vamos configurar o SDK dentro do FlashBuilder. Com o FlashBuilder aberto, vá no menu Windows > Preference, então expanda o item "Flash Builder", vá até o item "Installed Flex SDKs", clique em "ADD" e selecione a pasta de instalação do SDK (passo 4), por padrão está dentro da pasta do FlashBuilder\sdks, ex: "C:\Program Files\Adobe\Adobe Flash Builder 4.7\sdks\4.10\". Automaticamente será preenchido o campo "Flex SDK name" com o seguinte nome "Apache Flex 4.10 FP11.1 en_US", clique em OK e OK novamente.
Pronto, seu FlashBuilder está pronto para utilizar o novo SDK.

Agora basta criar um novo projeto, e selecionar o SDK correto.

Links de interesse:

Vídeo aulas:





Qualquer dúvida postem comentários abaixo.

Divulgue e comente!!


quarta-feira, 19 de junho de 2013

Exportar Tabela Sql para CSV

Método simples e eficaz de exportar uma tabela de algum banco de dados para um arquivo CSV.
Útil para quando não se tem acesso ao editor do banco para exportar os dados.

Precisa apenas do Session com o Hibernate já criado (exemplo) para a função saber em qual banco conectar.

Função:
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;



public class ExportTableToCsv {

 /**
  * @param args
  * @throws Exception 
  */
 public static void main(String[] args) throws Exception {
  exportTableToCsv("CAD_CLIENTE", new File("C:\\temp\\out.csv"), HibernateSessionFactory.getSession());
  
  System.out.println("OK");
 }
 
 /**
  * Export table to CSV file.
  * @param table: name of table
  * @param fileOut: file where you saved the CSV
  * @param em: Input the "org.hibernate.Session", session connection to the database
  * @throws Exception
  */
 private static void exportTableToCsv(String table, File fileOut, Session em) throws Exception{
  Transaction trans = em.beginTransaction();
  try {
   Query query = em.createSQLQuery("SELECT COLUMNS.NAME AS COLUNA "+
     "FROM SYSOBJECTS AS TABLE, "+
     "     SYSCOLUMNS AS COLUMNS "+
     "WHERE TABLE.ID = COLUMNS.ID "+
     "  AND TABLE.NAME = '"+table+"' ");
   @SuppressWarnings("rawtypes")
   List list = query.list();
   if(list.size()==0){
    throw new Exception("Table '"+table+"' does not exist.");
   }
   
   String texto = "";
   for (int i = 0; i < list.size(); i++) {
    texto+= (String) list.get(i) + ";";
   }
   texto+="\n";
   

   query = em.createSQLQuery("SELECT * FROM "+table);
   list = query.list();
   trans.commit();
   
   for (int i = 0; i < list.size(); i++) {
    Object[] object = (Object[]) list.get(i);

    for (Object obj : object) {
     if(obj!=null){
      texto+= obj.toString().replace(";","|") + ";";
     }else{
      texto+= "null;";
     }
    }
    texto+="\n";
   }
   
   FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
   fileOutputStream.write(texto.getBytes());
   
   fileOutputStream.flush();
   fileOutputStream.close();
  } catch (Exception e) {
   e.printStackTrace();
   if (trans!=null&&trans.isActive()) {
    trans.rollback();
   }
   throw e;
  } finally {
   em.close();
  }
 }
}


Por hoje é isso pessoal.
COMPARTILHE, COMENTE, AGRADEÇA.


quarta-feira, 8 de maio de 2013

Copiar, Colar, Selecionar tudo em um DataGrid ou AdvancedDataGrid

Olá pessoal, após muito tempo sumido, por falta de tempo. Voltei para mais um post.
Hoje vou mostrar algo que tive que implementar em um DataGrid ou AdvancedDataGrid.

Necessidade:
Poder copiar os registros selecionados para o clipboard, também poder adicionar registros vindos de uma tabela  no excel, através do CTRL+C e CTRL+V.

Solução:
Implementar as funções de COPY e PASTE em um datagrid, podendo copiar os itens selecionados, e também adicionar novos itens (desde que estejam com a mesma quantidade de colunas).

quinta-feira, 15 de dezembro de 2011

Ajude o Flex - Seja um Committer

Após toda a história da Adobe "doar" o Flex SDK para a Apache Software Foundation  (mais info)...

Você que sempre teve ótimas idéias para o Flex, gosta de desenvolver em Flex, quer ajudar o Flex a se tornar cada vez melhor, agora você pode. Se inscreva para ser um COMMITTER do Flex SDK.

Mais informações aqui.

Abraço!

segunda-feira, 5 de dezembro de 2011

Flex Patch de segurança

Devido a uma vulnerabilidade no SDK do Flex, muitas aplicações estão vulneráveis ​​a cross-site scripting (XSS), e deve ser corrigida, a fim de proteger os dados do usuário.

Os links para download do patch são:


Mais informações aqui.

quarta-feira, 16 de novembro de 2011

quinta-feira, 13 de outubro de 2011

Download FlashBuilder e Flex SDK 4.6

Como falei em outro post meu (http://desenvolvendoemflex.blogspot.com/2011/09/flex-sdk-46-e-flash-builder-46.html) e para quem se inscreveu para o pré-release do flash builder e flex sdk 4.6 , já esta liberado para o download.




https://prerelease.adobe.com/




Já estou baixando o meu...




Divirta-se utilizando as novas funcionalidades :D


quinta-feira, 22 de setembro de 2011

Componente LinkBar decorado

Olá pessoal.

Estava procurando pela internet como deixar o LinkBar mais bonito, e hoje meu amigo @fredy_gadotti encontrou a solução.

Vejam:

Fonte disponível, botão direito do mouse e "View Source"

Achado em http://eaigurus.com/blog/?p=19


Vlw pessoal.

quarta-feira, 21 de setembro de 2011

Flex SDK 4.6 e Flash Builder 4.6

A Adobe lançou o pre-release do Flex SDK 4.6 (aqui) com muitos componentes novos e alguns Bugs corrigidos.

Mais informações aqui.




quarta-feira, 13 de julho de 2011

Adobe lança Beta do AIR 3.0 e do FlashPlayer 11

A Adobe lançou hoje (13/07/2011) o BETA do AIR 3.0 e do FlashPlayer 11, onde foram corrigidas algumas questões de segurança e de performance, também adicionaram suporte a 64bits.

Você poderá fazer o download das versões betas aqui: AIR 3.0 e FlashPlayer11.

Agora é só testar!!!

sexta-feira, 24 de junho de 2011

quinta-feira, 16 de junho de 2011

Flex com Multilinguagem (internacionalização)

Olá!!


Hoje vou mostrar como fazer um sistema Multilinguagem (alterando locales) no Flex. Conforme o exemplo:

*Para ver o fonte, clique com o botão direito do mouse e ViewSource.

Para isso você precisa ter os locales das linguagens. Os locales podem ser baixados nesses links:
Estes locales devem ser colocados no diretório: "{instalaçãodoflex}/sdks/{versaodosdk}/frameworks/locale/".

Configurando o projeto
Clique com o botão direito do mouse no projeto, vá em "properties" depois em "Flex Compiler", em "Additional compiler arguments:" coloque o seguinte:
  -locale en_US pt_BR -source-path+=../locale/{locale}


Ficando assim:


Após configurar o locale do seu projeto, você deve criar as pastas "{projeto}/locale/en_US" e "{projeto}/locale/pt_BR" e adicionar o arquivo "localization.properties" dentro de cada pasta.

en_US
label_selecione_linguagem=Select your language
label_nome=Name
label_sobrenome=Last Name
send_btn=Send

pt_BR
label_selecione_linguagem=Selecione a linguagem
label_nome=Nome
label_sobrenome=Sobrenome
send_btn=Enviar


Para ler estes arquivos faz assim:
<?xml version="1.0" encoding="utf-8"?>
<s:Application viewSourceURL="srcview/index.html"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:s="library://ns.adobe.com/flex/spark">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <fx:Script>
        <![CDATA[
            import mx.resources.ResourceBundle;
            
            [Bindable]
            private var locales:Array = ['pt_BR', 'en_US'];
            
            private static const LOCALIZATION:String = 'localization';
            
            private function changeLanguage():void {
                this.resourceManager.localeChain = [cbxLanguage.selectedItem];
            }
        ]]>
    </fx:Script>

    <fx:Metadata>
  [ResourceBundle('localization')]
 </fx:Metadata>

    <mx:Form>
        <mx:FormItem label="{resourceManager.getString( LOCALIZATION , 'label_selecione_linguagem' )}:">
            <mx:ComboBox id="cbxLanguage"
                         change="changeLanguage()"
                         dataProvider="{locales}"/>
        </mx:FormItem>

        <mx:FormItem label="{resourceManager.getString( LOCALIZATION , 'label_nome' )}:">
            <s:TextInput/>
        </mx:FormItem>

        <mx:FormItem label="{resourceManager.getString( LOCALIZATION , 'label_sobrenome' )}:">
            <s:TextInput/>
        </mx:FormItem>

        <s:Button label="{resourceManager.getString( LOCALIZATION , 'send_btn' )}"/>
    </mx:Form>
</s:Application>


sendo a variável LOCALIZATION o nome do arquivo criado (pode ter vários).
para ler cada linha do arquivo utiliza-se:
resourceManager.getString(LOCALIZATION, 'string')


Por hoje é isso!!

Comente!


sábado, 11 de junho de 2011

#FlexMania 2011

Olá!

Este ano ocorre a 3ª edição do FlexMania. É um evento online e gratuito que junta vários palestrantes falando sobre diversos assuntos.

O evento acontece dias 07, 08, 09 e 10 de Julho de 2011.

Eu e todos aqui da @PontoSistemas vamos participar!!

Para saber mais acesse: http://www.flexmania.com.br/

Até mais!

sexta-feira, 10 de junho de 2011

Variáveis Globais no Flex.

Olá.

Neste post vou mostrar como fazer com que uma (ou várias) variável seja utilizada e compartilhe o mesmo valor em toda a aplicação.

Para isto basta criar uma classe, com o método getInstance() e chamar esta classe em qualquer lugar do sistema através do getInstance(), e pronto você terá a mesma variável com o mesmo valor.


Classe de exemplo:

VariaveisGlobais.as
package com.blogspot.desenvolvendoemflex.utils {
 import mx.collections.ArrayCollection;
    
    [Bindable]
    public class VariaveisGlobais {
        private static var instance:VariaveisGlobais;
        
        public var variavel:ArrayCollection;
  
        public static function getInstance():VariaveisGlobais {
            if (instance==null) {
                instance = new VariaveisGlobais();
            }
            return instance;
        }
    }
}


para utiliza-la basta instanciar desta maneira em qualquer parte de seu programa:
            [Bindable]
            public var varGlobal:VariaveisGlobais = VariaveisGlobais.getInstance();

Tenha cuidado ao utilizar desta forma, pois dependendo da quantidade de variáveis e informações, pode ficar pesado o sistema.

Por hoje é isso!

Até a próxima.

Comentem!!

quarta-feira, 8 de junho de 2011

Java + JPA + Hibernate + DAO Genérico

Olá, hoje vou mostrar como fazer um DAO Genérico no Java (contendo SaveOrUpdate, Remove, FindAll, FindByID) que pode ser usado por todos os DAOs. Facilitando a criação de novos projetos, podendo ser usado com a integração com o Adobe Flex através do RemoteObject.

Isto é para quem não quer usar nenhuma espécie de Framework (ex: Spring, que faz isso de uma forma mais genérica).

Primeiramente criei minha classe contendo todos os métodos (save, update, delete, find), para minha classe ficar "genérica" ao invés de receber as entidades específicas, recebe Object (pode passar as Entidades que o java consegue reconhecer). Após criar esta classe contendo os métodos, é só criar os DAOs extendendo da classe genérica, com isso já terá todos os métodos implementados. Podendo fazer validações específicas para cada DAO.

Vamos a prática:

Este é minha classe genérica contendo todos os métodos.
GenericDAO.java
package com.blogspot.desenvolvendoemflex.util;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;

import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * @author SAMUEL FACCHINELLO
 * @version 1.0
 */
public class GenericDAO {

 /**
  * Salva ou Atualiza dependendo se já existe ou não o objeto no banco de dados. 
  * @param o: Entidade a ser Salva (se ainda não existir) ou a ser Atualizada (se já existir)
  * @return Retorna a Entidade passada como parâmetro.
  * @throws Exception
  */
 public Object saveOrUpdate(Object o) throws Exception {
  Session em = HibernateSessionFactory.getSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   em.merge(o);
   trans.commit();
   return o;
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   e.printStackTrace();
   throw e;
  } finally {
   em.close();
  }
 }

 /**
  * Salva ou Atualiza dependendo se já existe ou não o objeto no banco de dados. 
  * @param list: lista das Entidades a serem Salvas (se ainda não existir) ou a serem Atualizadas (se já existir)
  * @return Retorna a Entidade passada como parâmetro.
  * @throws Exception
  */
 public void saveOrUpdateAll(ArrayList<Object> list) throws Exception {
  Session em = HibernateSessionFactory.getSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   for (Object o : list) {
    em.merge(o);
   }
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   e.printStackTrace();
   throw e;
  } finally {
   em.close();
  }
 }

 /**
  * Remove a Entidade do banco de dados.
  * @param o: Entidade a ser removido do banco de dados.
  * @throws Exception
  */
 public void remove(Object o) throws Exception {
  Session em = HibernateSessionFactory.getSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   em.delete(o);
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   throw e;
  } finally {
   em.close();
  }
 }

 /**
  * Remove a Entidade do banco de dados.
  * @param list: Lista de Entidades a serem removidas do banco de dados.
  * @throws Exception
  */
 public void removeAll(ArrayList<Object> list) throws Exception {
  Session em = HibernateSessionFactory.getSession();
  Transaction trans = em.beginTransaction();
  try {
   trans.begin();
   for (Object o : list) {
    em.delete(o);
   }
   trans.commit();
  } catch (Exception e) {
   if (trans.isActive()) {
    trans.rollback();
   }
   throw e;
  } finally {
   em.close();
  }
 }

 /**
  * Retorna a lista de itens salvo no banco de dados de acordo com a Entidade passada como parâmetro.
  * @param classe : Entidade que deverá buscar no banco de dados.
  * @return List contendo todos os objetos encontrados da entidade passada como parâmetro.
  */
 @SuppressWarnings("unchecked")
 public static List findAll(Class classe) {
  Session em = HibernateSessionFactory.getSession();
  Query query = em.createQuery("Select a from " + classe.getName() + " a");
  return query.list();
 }

 /**
  * Faz a busca no banco pelo ID da entidade
  * @param classe : Entidade a ser buscada
  * @param id : valor a ser procurado
  * @return Objeto encontrado no banco, caso não encontre será retornado NULL
  * @throws Exception
  */
 @SuppressWarnings("unchecked")
 public static Object findById(Class classe, Object id) throws Exception {
  if (classe == null) {
   throw new Exception("classe não pode ser nula.");
  }

  if (id == null) {
   throw new Exception("id não pode ser nulo.");
  }

  Field[] fields = classe.getDeclaredFields();
  String chave = "";
  for (Field field : fields) {
   if (field.getAnnotation(Id.class) != null) {
    chave = field.getName();
    break;
   }
  }

  if (chave.equals("")) {
   throw new Exception("Annotation @Id não encontrada na classe " + classe.getName());
  }

  Session em = HibernateSessionFactory.getSession();
  Query query = em.createQuery("Select a from " + classe.getName() + " a" +
          " where a." + chave + " = :id").setParameter("id", id);
  query.setMaxResults(1);
  return query.uniqueResult();
 }

 /**
  * Retorna objeto de acordo com a UniqueConstraint definida na Entidade
  * @param classe : Entidade a ser buscada
  * @param ids : Array contendo os IDS a serem buscados (na mesma ordem em que a UniqueConstraint foi definido)
  * @return Objeto encontrado no banco, caso não encontre será retornado NULL 
  * @throws Exception
  */
 @SuppressWarnings("unchecked")
 public static Object findByUniqueConstraints(Class classe, ArrayList<Object> ids) throws Exception {
  if (classe == null) {
   throw new Exception("classe não pode ser nula.");
  }

  if (ids == null || ids.size() == 0) {
   throw new Exception("ids não pode ser nulo.");
  }

  ArrayList<String> chaves = new ArrayList<String>();
  ArrayList<Class> tipos = new ArrayList<Class>();
  Annotation annotation = classe.getAnnotation(Table.class);
  if (annotation != null) {
   Table table = (Table) annotation;

   for (UniqueConstraint uniqueConstraint : table.uniqueConstraints()) {
    for (String column : uniqueConstraint.columnNames()) {
     tipos.add(classe.getDeclaredField(column).getType());
     chaves.add(column);
    }
   }
  } else {
   throw new Exception("Annotation @Table não encontrada na classe " + classe.getName());
  }

  if (chaves.size() == 0) {
   throw new Exception("UniqueConstraints não encontrada na annotation @Table da classe " + classe.getName());
  }

  if (chaves.size() != ids.size()) {
   throw new Exception("O número de parâmetros passados não confere com o número de UniqueConstraints encontrados na classe " + classe.getName() + ". " + ids.size() + " foram passados, mas " + chaves.size() + " eram esparados.");
  }

  String str = "";
  for (int i = 0; i < chaves.size(); i++) {
   if (!ids.get(i).getClass().equals(tipos.get(i))) {
    throw new Exception("Tipos de dados incompatíveis. O parâmetro número " + i + " é incompatível, foi passado:" + ids.get(i).getClass().toString() + " e estava esperando: " + tipos.get(i).toString());
   }
   if (str.length() == 0) {
    str = " where a." + chaves.get(i) + " = " + ids.get(i);
   } else {
    str += " and " + chaves.get(i) + " = " + ids.get(i);
   }
  }

  Session em = HibernateSessionFactory.getSession();
  Query query = em.createQuery("Select a from " + classe.getName() + " a " + str);
  query.setMaxResults(1);
  return query.uniqueResult();
 }
}


Aqui esta meu DAO com uma validação:

BancosDAO.java
package com.blogspot.desenvolvendoemflex.dao;

import com.blogspot.desenvolvendoemflex.entity.Bancos;
import com.blogspot.desenvolvendoemflex.util.GenericDAO;

public class BancosDAO extends GenericDAO {
 public Object saveOrUpdate(Bancos o) throws Exception {
  //TODO: aqui é possivel fazer algumas validações
  if (o.getDescricao() == null || o.getDescricao().equals("")) {
   throw new Exception("Descrição é obrigatório.");
  }
  //TODO: chamo a classe genérica passando por parâmetro minha Entidade "Banco".
  return super.saveOrUpdate(o);
 }
}

A Entidade, contendo as Annotations @Entity e @Table (com @UniqueConstraint para teste do findByUniqueConstraints)
Bancos.java
package com.blogspot.desenvolvendoemflex.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
/*TODO: uniqueConstraints usado para exemplo do FIND, neste caso ele não era necessário*/
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = "cod") })
public class Bancos {

 @Id
 private Integer cod;

 private String descricao;

 public Integer getCod() {
  return cod;
 }

 public void setCod(Integer cod) {
  this.cod = cod;
 }

 public String getDescricao() {
  return descricao;
 }

 public void setDescricao(String descricao) {
  this.descricao = descricao;
 }

}


Para testar, basta chamar o DAO de qualquer lugar, passando os parâmetros necessários em qualquer um dos métodos do GenericDao.

Exemplo de utilização:
  BancosDAO bancosDAO = new BancosDAO();
  Bancos bancos = new Bancos();
  bancos.setCod(1);
  bancos.setDescricao("Banco 1");

  bancosDAO.saveOrUpdate(bancos);

  bancos.setCod(2);
  bancos.setDescricao("Banco 2");
  bancosDAO.saveOrUpdate(bancos);

  ArrayList<Bancos> allBancos = (ArrayList<Bancos>) BancosDAO.findAll(Bancos.class);

  for (Bancos banco : allBancos) {
   System.out.println(banco.getDescricao());
  }

  bancosDAO.remove(BancosDAO.findById(Bancos.class, 2));

  BancosDAO.findAll(Bancos.class);
  
  /*TODO: Passando um array contendo a UniqueConstraint para pesquisa no banco */
  ArrayList<Object> ids = new ArrayList<Object>();
  ids.add(1);
  BancosDAO.findByUniqueConstraints(Bancos.class, ids);
  
  /*TODO: tratando o erro, Descrição é obrigatório */
  bancos.setCod(2);
  bancos.setDescricao("");
  bancosDAO.saveOrUpdate(bancos);


Espero que tenha ajudado.

Obrigado.

Deixe um comentário.

sábado, 28 de maio de 2011

TextArea com atalho para Desfazer e Refazer

Por padrão o componente TextArea do Flex não possui função de desfazer e refazer, com isso resolvi implementar estas duas funções.

Para testar é só digitar um texto, e pressionar Ctrl+Z para desfazer e Ctrl+Y para refazer.

*download do fonte: botão direito "View Source"

Código Fonte:
/*############################################################*/
/*                                                            */
/*   Powered by: Samuel Facchinello                           */
/*   http://desenvolvendoemflex.blogspot.com/                 */
/*                                                            */
/*############################################################*/
package com.blogspot.desenvolvendoemflex.utils {
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    
    import mx.collections.ArrayCollection;
    import mx.controls.Alert;
    import mx.controls.TextArea;
    
    /**
     *
     * @author SAMUEL FACCHINELLO
     * @site http://desenvolvendoemflex.blogspot.com/
     */
    public class TextAreaWithUndo extends TextArea {
        
        /**
         * Variable of control position Undo or Redo
         * */
        [Bindable]
        private var _position:int = -1;
        
        public function get position():int {
            return _position;
        }
        
        /**
         * Variable that stores all typed letters
         * */
        [Bindable]
        private var _array:ArrayCollection = new ArrayCollection();
        
        public function get array():ArrayCollection {
            return _array;
        }
        
        /**
         * Constructor
         *
         */
        public function TextAreaWithUndo() {
            super();
            //add value default
            addValue("");
            
            //add Event on KeyDown
            addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
        }
        
        /**
         * Function with KeyDown
         * @param eventObj: KeyboardEvent
         *
         */
        private function myKeyDown(eventObj:KeyboardEvent):void {
            // Was Ctrl key pressed?
            if (eventObj.ctrlKey) {
                var valueReturn:String = null;
                
                switch (eventObj.keyCode) {
                    
                    case 90: // Was Ctrl-Z pressed?  
                        valueReturn = returnPrevisionValue();
                        break;
                    
                    case 89: // Was Ctrl-Y pressed?  
                        valueReturn = returnNextValue();
                        break;
                    
                    default:
                        break;
                }
                
                //if return exist
                if (valueReturn!=null) {
                    //set text with return functions
                    text = valueReturn;
                    
                    //select last _position in TextArea
                    setSelection(text.length, text.length);
                }
            } else {
                //only adds to the list if any of these characters.
                //list from here: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000520.html
                if ((eventObj.keyCode>=65&&eventObj.keyCode<=90)||(eventObj.keyCode>=48&&eventObj.keyCode<=57)||(eventObj.keyCode>=96&&eventObj.keyCode<=111)||(eventObj.keyCode>=186&&eventObj.keyCode<=222)) {
                    addValue(text);
                }
            }
        }
        
        /**
         * Function that adds the letters in the array
         * @param value: propertie "text" of TextArea
         *
         */
        private function addValue(value:String):void {
            //it was press Ctrl + Z ever, and was entered some value, clears the values ​​of the position in which this forward
            if (_array.length>0&&_array.length-1>_position) {
                for (var i:int = _array.length-1; i>_position; i--) {
                    _array.removeItemAt(i);
                }
            }
            
            //if the value is being added is equal to the last added, not added!
            if (_array.length>0) {
                if (value==_array.getItemAt(_array.length-1)) {
                    return;
                }
            }
            
            _array.addItem(value);
            _position++;
        }
        
        /**
         * triggered when press Ctrl + Y
         * @return : Returns the next value from the list according to position
         *
         */
        private function returnNextValue():String {
            if (_position+1>=0&&_position+1<_array.length) {
                _position++;
                return _array.getItemAt(_position) as String;
            }
            
            return null;
        }
        
        /**
         * triggered when press Ctrl + Z
         * @return : Returns the Prevision value from the list according to position
         *
         */
        private function returnPrevisionValue():String {
            if (_position-1>=0) {
                _position--;
                return _array.getItemAt(_position) as String;
            }
            
            return null;
        }
    }
}

Adicionei este componente ao Google Code, pode ser visto aqui: http://code.google.com/p/textarea-with-undo/

Qualquer elogio, dúvida, sugestão ou melhoria para o componente, deixe um comentário!!

Abraço, até a próxima.



*Tradução para o inglês com o Google Translate. :)

quarta-feira, 25 de maio de 2011

Carregando CSS diferentes em runtime

Muitas vezes precisamos que uma mesma aplicação fique com aparências diferentes de acordo com o gosto de cada um, por isso vou mostrar como carregar um ou vários CSS em runtime no Flex.

Procurando na internet sobre isso, me deparei com o blog do Fabio Silva dizendo como fazer, então resolvi implementar e mostrar para vocês como fazer.

Como faz?
O css deve ser compilado, (no FlashBuilder) basta clicar com o botão direito do mouse no arquivo do CSS e marcar a opção "Compile CSS to SWF", com isso o CSS será compilado como um arquivo externo, no formato ".swf", ao rodar sua aplicação basta usar a função:
StyleManager.loadStyleDeclarations("./css/css.swf");

Exemplo:

Para fazer o download do fonte clique com o botão direito e depois em "view source".
ou

Código Fonte:
<?xml version="1.0" encoding="utf-8"?>
<s:Application minHeight="600"
               minWidth="955"
               viewSourceURL="srcview/index.html"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:s="library://ns.adobe.com/flex/spark">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <fx:Script>
        <![CDATA[
            protected function button1_clickHandler(event:MouseEvent):void {
                //função que carrega o CSS
                StyleManager.loadStyleDeclarations("./css/css.swf");
            }
            
            protected function button2_clickHandler(event:MouseEvent):void {
                //função que carrega o CSS
                StyleManager.loadStyleDeclarations("./css/css2.swf");
            }
        ]]>
    </fx:Script>

    <s:Label text="Label Spark"/>

    <mx:Label text="Label MX"/>

    <s:Button label="carregar CSS 1"
              click="button1_clickHandler(event)"/>

    <mx:Button label="carregar CSS 2"
               click="button2_clickHandler(event)"/>
</s:Application>

Por hoje é isso!!!

Sigam o blog e comentem!!

Fontes:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/styles/StyleManager.html
http://fabiophx.blogspot.com/2010/09/carregando-css-em-run-time.html

sexta-feira, 20 de maio de 2011

Salvar tamanho e posição das colunas em um DataGrid

Hoje surgiu um problema aqui na @PontoSistemas, onde teríamos que salvar a posição e o tamanho da coluna de acordo com o que o cliente preferir, como cada pessoa organiza a tela de um jeito diferente. Tudo isso porque toda vez que o DataGrid é construído novamente, ele volta ao estado inicial.

A idéia:
Ao organizar ou alterar os tamanhos das colunas de um DataGrid/AdvancedDataGrid salve as posições e os tamanhos das colunas.

A solução:
Altere o tamanho e/ou a ordem das colunas, e recarregue a página. Elas irão voltar na mesma ordem e tamanho que você as deixou.


Clique com o botão direito em cima do DataGrid, depois em "view source" para visualizar o código fonte.
ou

SalvarColunas.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application viewSourceURL="srcview/index.html"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.controls.DataGrid;
            import mx.events.FlexEvent;
            import mx.utils.ObjectUtil;
            
            /* salvar ordem das colunas */
            public function reordenarColunas(event:Event, nomeSharedObj:String):void {
                var grid:* = event.currentTarget;
                
                if (grid is DataGrid||grid is AdvancedDataGrid) {
                    var colunas:ArrayCollection = null;
                    
                    //le informações salvas
                    var shared:SharedObjectHelper = new SharedObjectHelper(nomeSharedObj);
                    
                    if (shared.getObjects()) {
                        if (shared.getObjects().length>0) {
                            if (shared.getObjects()!=null) {
                                colunas = shared.getObjects();
                            }
                        }
                    }
                    
                    if (colunas==null) { //se nao tiver nada salvo, salva, e nao faz nada.
                        salvarOrdemColunas(event, nomeSharedObj);
                        return;
                    }
                    var colunasAtual:Array = grid.columns.slice(0, grid.columns.length); //pega as colunas atual
                    
                    if (colunasAtual.length!=colunas.length) { //se sao colunas diferentes salva as novas.
                        salvarOrdemColunas(event, nomeSharedObj);
                        return;
                    }
                    
                    var colunasNovo:Array = new Array();
                    var i:int = 0;
                    
                    while (colunas.length>0) { //enquanto tiver colunas a serem alteradas
                        if (colunasAtual[i]!=null) { //se ja foi alterado a coluna é setado como nula.
                            if (colunasAtual[i].dataField.toString()==colunas.getItemAt(0).datafield.toString()) { //verifica se a atual é igual a coluna a ordenada
                                colunasAtual[i].width = colunas.getItemAt(0).width; //seta o tamanho da coluna
                                colunasNovo.push(colunasAtual[i]); //adiciona a coluna na ultima possição (para deixar na ordem)
                                
                                //remove o que ja foi verificado
                                colunas.removeItemAt(0);
                                colunasAtual[i] = null;
                                
                                i = -1; //zera o contador para reavaliar todas as colunas
                            }
                        }
                        i++;
                    }
                    
                    grid.horizontalScrollPolicy = "on"; //atribui o Scroll horizontal por causa dos Widths setados na mao
                    grid.columns = colunasNovo; //seta as novas colunas no grid
                    grid.validateProperties(); //atualiza o grid para aparecer as novas colunas
                }
            }
            
            public function salvarOrdemColunas(event:Event, nomeSharedObj:String):void {
                var grid:* = event.currentTarget;
                
                if (grid is DataGrid||grid is AdvancedDataGrid) {
                    
                    var shared:SharedObjectHelper = new SharedObjectHelper(nomeSharedObj);
                    shared.clear();
                    
                    var obj:Object = null;
                    
                    for each (var i:Object in grid.columns) {
                        obj = new Object();
                        obj.datafield = i.dataField;
                        obj.width = i.width;
                        shared.addObject(obj);
                    }
                }
            }
        ]]>
    </fx:Script>

    <!--
        columnStretch = ao redimencionar as colunas.
        headerShift = ao trocar as colunas de posição.
    -->
    <mx:AdvancedDataGrid columnStretch="salvarOrdemColunas(event,'nomeDoObjetoSalvo')"
                         creationComplete="reordenarColunas(event,'nomeDoObjetoSalvo')"
                         headerShift="salvarOrdemColunas(event,'nomeDoObjetoSalvo')">
        <mx:columns>
            <mx:AdvancedDataGridColumn dataField="a"/>

            <mx:AdvancedDataGridColumn dataField="b"/>

            <mx:AdvancedDataGridColumn dataField="c"/>

            <mx:AdvancedDataGridColumn dataField="d"/>

            <mx:AdvancedDataGridColumn dataField="e"/>
        </mx:columns>
    </mx:AdvancedDataGrid>
</s:Application>

SharedObjectHelper.as
package {
    import flash.net.SharedObject;
    
    import mx.collections.ArrayCollection;
    
    public class SharedObjectHelper {
        private var _sharedObject:SharedObject;
        
        private var _dadosSharedObject:ArrayCollection;
        
        private var _nomeArquivoSharedObject:String;
        
        /**
         * Construtor
         */
        public function SharedObjectHelper(valor:String) {
            inicializaHelper(valor);
        }
        
        /**
         * Limpa objeto dentro do SharedObject
         */
        public function clear():void {
            _dadosSharedObject.removeAll();
            _sharedObject.flush();
        }
        
        /**
         * @private
         * Responsavel por recuperar a instancia do SharedObject baseado no
         * parametro.
         *
         */
        private function inicializaHelper(valor:String):void {
            _dadosSharedObject = new ArrayCollection();
            _nomeArquivoSharedObject = valor;
            _sharedObject = SharedObject.getLocal(_nomeArquivoSharedObject);
            
            if (getObjects()) {
                _dadosSharedObject = getObjects();
            }
        }
        
        /**
         * Retorna todos um array de dados que está armazendo no SharedObject
         * @return ArrayCollection
         */
        public function getObjects():ArrayCollection {
            return _sharedObject.data[_nomeArquivoSharedObject];
        }
        
        /**
         * Adiciona um dado ao array de dados.
         * @param Object
         */
        public function addObject(o:Object):void {
            _dadosSharedObject.addItem(o);
            updateSharedObjects();
        }
        
        /**
         * @private
         * Vincula o array de dados a um SharedObject.
         */
        private function updateSharedObjects():void {
            _sharedObject.data[_nomeArquivoSharedObject] = _dadosSharedObject;
            _sharedObject.flush();
        }
    }
}

Da maneira que foi implementado, as definições da posição e do tamanho das colunas são salvas na memória do FlashPlayer (como se fosse os cookies das páginas web), ao limpar esse "cookie" as configurações voltam ao estado original.

Por hoje é isso. Em breve novas dicas.

Comentem!!!

10 coisas que um bom programador flex deve saber

Olá!!! Li no blog do Daniel Schmitz e achei muito interessante compartilhar.

Vale a pena ler.

Link: http://www.flex.etc.br/traducoes/10-coisas-que-um-bom-programador-flex-deve-saber/

Até a próxima.