IBM WebSphere Application Server Community Edition

A IBM aplicou toda sua tecnologia e experiência no desenvolvimento
de um servidor de aplicação que é uma versão extendida do Apache Gerônimo: WebSphere Application Server Community Edition.
Essa versão prima pela simplicidade e eficiência em um ambiente
onde você pode criar, implementar, integrar e hospedar suas
aplicações sem custo algum.

Criado sobre Apache Geronimo, o servidor de aplicação Community Edition da IBM utiliza as últimas inovações da comunidade de código aberto, incluindo Apache Tomcat. Você pode usar o WebSphere Application Server Community Edition para desenvolver e hospedar suas aplicações para fins comerciais e pessoais.

O WebSphere Application Server CE simplifica a criação de aplicativos menos críticos de nível departamental com custo mais baixo, baseado em servidor de Aplicativo Java EE Open Source.

Link download: http://www.servidordeaplicacao.com.br/opensource?d=3

Acesse este link e saiba tudo .

org.apache.myfaces.custom.aliasbean.AliasBean

A Tag aliasBean permite criar um nome temporarário para um Bean existente. Ele se torna visível somente à tags filhas do AliasBean.

É como se fosse uma simulação de um novo escopo interno para o JSP, com ele você consegue fazer com quem um pequeno trecho do seu código se comporte com algumas funcionalidades que você teria costumeiramente apenas em uma página nova. Em alguns casos tu conseguirás substituir trechos que podem ser colocados em subViews. Já falamos aqui de alguns pontos importantes em como as subviews são tratadas pelo framework e da alocação limitada que existe automaticamente dependendo da forma como o viewstate esta configurado para as páginas. Neste caso você tanbém poderá utilizar o AliasBean como forma de delegar funções específicas à ela e contidas no seu ALIAS ou temporário Bean.

Veja um exemplo retirado da especificação do MyFaces Tomahawk for JSF 1.1:


<t:aliasBean alias="#{holder}" value="#{aliasTest1}"" >

    <f:subview id="simulatedIncludedSubform1">

        <h:outputLabel for="name" value="Name:"/>

        <h:inputText id="name" value="#{holder.name}"/>

    </f:subview>  

</t:aliasBean>



Comentários originais desta Tag que citamos aqui:

The aliasBean tag allows you to create a temporary name for a real bean. The temporary name exists (is visible) only to the children of the aliasBean.

One use of this feature is to pass "parameters" from an including page to an included one. The included page can use any name it desires for beans it needs to reference, and the including page can then use aliasBean to make those names refer to the beans it wishes to "pass" as parameters.

Suppose you have a block of components you use often but with different beans. You can create a separate JSP page (or equivalent) containing these beans, where the value-bindings refer to some fictive bean name. Document these names as the required "parameters" for this JSP page. Wherever you wish to use this block you then declare an alias component mapping each of these "parameters" to whatever beans (or literal values) you really want to apply the block to, then use jsp:include (or equivalent) to include the reusable block of components.

Note, however, that AliasBean does not work for component bindings; JSF1.1 just has no mechanism available to set up the alias during the "restore view" phase while the bindings of its children are being re-established, and then remove the alias after the child bindings are done.

As a special case, if this component's direct parent is an AliasBeansScope then the alias (temporary name) is active until the end of the parent component, rather than the end of this component.


FONTE ORIGINAL: http://myfaces.apache.org/tomahawk-project/tomahawk/tagdoc/t_aliasBean.html

JAXB E O MALDITO NS2

Se você precisou atribuir um namespace a um xml sendo que o marshall precisa ser feito sem declaração de "xmlns:ns2" não tem santo que faça o JAXB remover isso, andei pesquisando bastante e devido à pressa para solucionar o problema achei 2 soluções que não são as melhores, porém resolvem o problema.

1: Remover o nodo do XML ns2 no parse:


# NodeList elements = doc.getElementsByTagName("infNFe");
# Element el = (Element) elements.item(i);
# String id = el.getAttribute("Id");
# // aqui ocorre a remoção do atributo...
# doc.getDocumentElement().removeAttribute("xmlns:ns2");
# ((Element)
# doc.getDocumentElement().getElementsByTagName("NFe").item(0))
# .setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
#
# Create a DOM XMLSignatureFactory that will be used to
# generate the enveloped signature.
#
# Reference ref = fac.newReference("#" + id, fac.newDigestMethod(
# DigestMethod.SHA1, null), transformList, null, null);


Um exemplo completo do código em:
http://www.guj.com.br/posts/list/83758.java


Aqui uma gambiarra que foi usada até que se resolvesse da maneira acima:
// passa-se o file a ser re-formatado como string
public void ajustaXml(File file) throws Exception {



FileReader reader = new FileReader(file);
BufferedReader leitor = new BufferedReader(reader);

leitor.read();

String vlr = "";
StringBuffer vlrFile = new StringBuffer();
String line = leitor.readLine();

while(line != null) {
vlrFile.append( line );
line = leitor.readLine();
}

vlr = vlrFile.toString();

if (vlr.indexOf("ns2:") > -1) {
vlr = vlr.replaceAll("ns2:", "");
}

if (vlr.indexOf(":ns2") > -1) {
vlr = vlr.replaceAll(":ns2", "");
}

leitor.close();
reader.close();

FileWriter writer = new FileWriter(file);
PrintWriter saida = new PrintWriter(writer);

saida.print( "<" + vlr);

writer.close();
saida.close();
}


Ambas maneiras acima resolvem o problema do ns2, e servem para remover o ns2 do jaxb, se alguem tiver uma solução melhor favor comentar.

Assim que eu resolver de forma correta esse problema postarei aqui a resposta.

Abraço





Conforme prometido.. segue solução abaixo:


SOLUÇÃO CORRETA, SEM GAMBIARRAS (Setando um name space preferido) :

SIm, há solução de personalizar os namespaces, no link:

http://blogs.sun.com/enterprisetechtips/entry/customizing_jaxb

Você encontra a solução.


Você precisa criar uma classe que estenda NamespacePrefixMapper vide:

[code]NamespacePrefixMapper m = new PreferredMapper();
marshal(jc, e, m);

public static class PreferredMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return "mappedNamespace" + namespaceUri;
}
}[/code]


Depois no seu marshaller voce seta:

[code]final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",
new NamespacePrefixMapperImpl("http://www.isotc211.org/2005/gmd"));[/code]


Abraço

Aprenda a adicionar BIRT Reporting a aplicações usando RichFaces

"Learn how to add BIRT Reporting to JSF Applications using RichFaces"

Pessoal, vai acontecer um webcast ao vivo no dia 9 de fevereiro. Pode ser bem produtivo, é uma iniciativa Exadel.

Confira mais detalhes no link abaixo:

http://www.actuate.com/be/info/techexadelwsem/

Nos "vemos" lá.

Manuseando a propriedade NUMBER_OF_VIEWS_IN_SESSION

Mais um post referente à Java Server Faces e relacionado ao anterior sobre a propriedade javax.faces.STATE_SAVING_METHOD.

É importante saber que existe um limite de Views a serem mantidos em Session, esse número de views, inclui qualquer tela que seja submetida simultâneamente em uma mesma sessão. Importante: Subviews tanbém contam (e como).

Para resolver este problema, em casos onde você precisa que sua sessão dure bastante tempo e com muitas views a serem guardadas, você pode ampliar este número (o padrão é 20), segue um exemplo de configuração que pode ser incorporada no seu web.xml:


<context-param> 

         <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name> 

         <param-value>200</param-value> 

         <description>Only applicable if state saving method is "server" (= default). 

                      Defines the amount (default = 20) of the latest views are stored in session. 

         </description> 

 </context-param>


No exemplo acima foi definido o número de 200 views, porém use com prudência essa propriedade, economize objetos em sessão e ganhe performance em sua aplicação.

javax.faces.STATE_SAVING_METHOD pode resolver problemas

Após algum tempo sem escrever no blog, venho aproveitar a ocasião para descrever uma experiência que tive durante a resolução de um problema.

A maioria dos desenvolvedores que utiliza o framework JavaServerFaces acaba adotando por regra determinar a propriedade STATE_SAVING_METHOD como client, deixando a validação da renderização dos componentes no cliente ( cria-se um input hidden com o nome de ViewState ), é possível também deixar que essa responsabilidade fique no servidor de aplicações, definindo assim a propriedade com o valor "server".

Basta verificar a seguinte configuração em seu web.xml:

<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>


Caso exista algum problema de validação na estrutura do seu código ( jspx, jsp, jsf ), e a propriedade server estiver definida, será possível que a validação ocorra em linha, ou seja, antes de renderizar a página o servidor irá fazer todas as validações necessárias ( se existe tal propriedade ou metodo, se existe mais de 1 componente com mesmo id, se seus conversores estao definidos de maneira correta, etc ), pois bem, muitas dessas validações são feitas indiferentemente do que se define no "saving_method", porém em alguns casos o "client" pode falhar.

Ex: Caso você tenha utilizado jstl para fazer alguma verificação dos componentes, ex:

<c:choose>
<c:when> test="${meuMBean.minhaCondicao}"
<t:inputHidden id="meuHiddenComIdRepetido" forceId="true" value="#{meuFacesMBean.meuValue}" />
</c:when>
</c:otherwise>
<t:inputHidden id="meuHiddenComIdRepetido" forceId="true" value="#{meuFacesMBean.meuValue}" />
</c:otherwise>
</c:choose>



Obs: Veja que o ID é o mesmo, isso não pode.

Nesses casos, a validação client pode falhar. Muitos poderão dizer que o motivo é essa mistura do JSTL com JSF, porém em muitos casos se faz necessária, além de que você nunca sabe o que foi escrito no código antes de dar manutenção no mesmo, e pode ser que pensem diferente de você, portanto é preciso estar preparado para todos os casos. Outro argumento à favor é o fato de ser permitida essa adição, então se é permitida, logo é possível que ocorra e se o código funcionar assim, poderá causar erros inexplicáveis na aplicação, pois no momento em que for para o server, a validação irá falhar (e pode falhar de forma intermitente, digo isso como experiência propria que tive em uma aplicação).

Pois bem, adicionando em sua aplicação a propriedade SERVER, esse trecho de código acima, será rejeitado sempre, não deixando que nenhuma execução problemática ocorra.

Nota: Utilizei neste projeto myfaces1.1.7, tomahawk 1.9 e trinidad-api-1.0.11.jar

ATOM É O MENOR PROCESSADOR FEITO PELA INTEL

Saiu no Informativo Geral: http://www.informativogeral.com.br/?post=ATOM-O-MENOR-PROCESSADOR-DA-INTEL.

Confira esta matéria completa sobre este revolucionário processador. Com palavras dos próprios executivos da intel, responsáveis pela coordenação geral do seu desenvolvimento. Uma tecnologia de várias décadas que vem evoluindo com o passar dos anos.

Apache Trinidad dispensa tutoriais alternativos

Leitores

Gostaria de compartilhar com vocês alguns links que precisam ser visitados para o desenvolvimento Java com JSF. Todos os links foram retirados de http://myfaces.apache.org/trinidad/, tudo sobre o Trinidad está lá no apache.org, não existe tutorial mais completo do que estes:


Sobre o Apache Trinidad: http://myfaces.apache.org/trinidad/index.html#Overview

Lista de componentes: http://www.irian.at/trinidad-demo/faces/componentDemos.jspx

Demonstração de componentes: http://www.irian.at/trinidad-demo/faces/demos/demos.jspx

FAQ: http://myfaces.apache.org/trinidad/FAQ.html


Existe a seção Guia do desenvolvedor com exemplos de código de como implementar, o que implementar e o que o componente faz:
http://myfaces.apache.org/trinidad/devguide/index.html

Exemplo de desenvolvimento de tabela (tr:table):
http://myfaces.apache.org/trinidad/devguide/table.html



Bons estudos.

Thread safety aprenda sua necessidade

É um conceito de programação de sistemas onde o reaproveitamento de instâncias que contenham determinados valores ou lógica é utilizado, deste modo é possível obter maior performance e fazer com que os sistemas possam de forma mais inteligente deixar de alocar recursos desnecessários à aplicação.

Baseando-se no exemplo da linguagem de programação Java, a utilização de classes estáticas e obter uma instância compartilhada na aplicação faz com que um código padrão possa ser reutilizado em demais aplicações, vejamos abaixo um simples Hello World de uma classe onde os conceitos Thead Safe são aplicados:

// MinhaClasse.java
package pacotemeu;

public class MinhaClasse {

public static final MinhaClsse getInstance() {
return FooHolder.INSTANCE;
}

MinhaClasse () {
}
}
// MinhaClasseHello.java

package pacotemeu;

class MinhaClasseHello {

public static final MinhaClasse INSTANCE = new MinhaClasse();

}


outro exemplo de helloworld:

class Classe { private Classe(){}

private static Classe _instance;

static{ _instance = new Classe(); }

}



No desenvolvimento de software, os detalhes sempre fazem a diferença no final do processo. A qualidade de seu software depende da qualidade do código que escreveu-o.

Mais informações. Wiki: http://en.wikipedia.org/wiki/Thread_safety

Persistindo dados com hibernate 3

Saiu no site JavaFree esta matéria que prevê orientá-los na configuração de persistencia de dados com hibernate 3.

Ótima leitura no link abaixo:

FONTE: LER Hibernate-3-com-Spring-e-DAO-Generico

Phpbb configure pacote de linguagem

É muito simples, através do phpBB configurar um pacote de linguagem.

Vejamos em simples passos como fazer.

Exemplo, pacote português:

Com seu phpBB já instalado ( Clique aqui para ver como se faz), execute os passos abaixo.


1) Inicialmente faça o download, você pode utilizar este link:
http://superdownloads.uol.com.br/download/53/phpbb-portugues/

2)descompacte e copie o pacote para a pasta language, com o nome correspondente (no caso pt_br, conforme o zip), dentro do seu diretorio do phpBB, em seu servidor de aplicações.

3) entre no administrador do seu forum (aplicação localizada em /forum/adm/index.php, é claro, voce precisará estar logado como admin).

3) Clique na aba SYSTEM depois language pack.





4) Clique na opção install.





5) Essa mensagem aparecerá.





6) depois disso basta ir nas configurações do blog e definir o idioma principal (se portugues se ingles, criar regras, definições, etc).

No próximo tópico vou ensinar como baixar um layout especial para seu blog e configura-lo, com alguns passos tanbém.

Quer conferir o resultado? Acesse o fórum do Amarelinho:

http://www.informativogeral.com.br/forum/

Gerando jpeg progressivo com imageio

Segue um exemplo de como fazer para gerar Jpeg progressivo com a api imageio:


ImageWriteParam param = writer.getDefaultWriteParam();

param.setCompressionMode( ImageWriteParam.MODE_EXPLICIT );

param.setCompressionQuality( quality );

param.setProgressiveMode( ImageWriteParam.MODE_DEFAULT );

ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("JPEG").next();
writer.setOutput( ImageIO.createImageOutputStream(out) );
writer.write(null, new IIOImage(image, null, null), param);


Para quem não sabe o que é um jpeg progressivo, leia uma explicação mais técnica e exata:

http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html

Para leigos, podemos resumir:

"É aquele 'efeitinho'?|?| que faz com que a imagem seja carregada toda, inicialmente 'sem foco' e depois irá ganhando nitidez", essa é uma explicação bem tosca, na verdade não há efeito nenhum, o que ocorre é que o browser recebe uma informação diferente quando encontra um jpeg progressivo para ser carregado, esse jpeg precisa SER GRAVADO de uma forma diferente, não há nada que Javascript ou css possa fazer (talvez com swf... gif animado..), mas ai ja perdemos o foco (jpeg).

Abraços

Porque Java ME?

Saiu no site Java Móvel:


Java Plataform, Micro Edition, Java ME, ou ainda J2ME, é uma tecnologia que possibilita o desenvolvimento de software para sistemas e aplicações embarcadas, ou seja, toda aquela que roda em um dispositivo de propósito específico, desempenhando alguma tarefa que seja útil para o dispositivo.

Das opções tecnológicas disponíveis no mercado, desde sistemas embarcados aos inúmeros jogos e aplicações de celulares, a plataforma Java ME destaca-se como sendo mais atrativa devido a sua portabilidade e acessibilidade, pois além de suas aplicações rodarem nas plataformas de várias empresas de telemóveis, com o Java ME é mais simples construir aplicações que não exigem alto custo, visto que muitos dispositivos de baixo custo suportam aplicativos desta plataforma, o que não acontece com as demais plataformas, como Symbian, Brew, Android, Iphone OS, que requerem implementações específicas utilizando APIs proprietárias.

Mesmo sendo mais limitada que a plataforma Java SE, a Java Micro Edition possui recursos essenciais para o desenvolvimento de qualquer aplicação móvel e provê um ambiente robusto e flexível para aplicativos portados para dispositivos móveis. Possui uma gama de APIs e frameworks para otimização do desenvolvimento das aplicações, juntamente com ferramentas, emuladores e plug-ins que enriquecem o arsenal do desenvolvedor. A plataforma não para de evoluir desde sua criação e através do Java Community Process, onde diversos fabricantes formam uma comunidade para aprimoramento e definição de novas funcionalidades de forma padronizada, a linguagem se tornou um instrumento importante tanto para desenvolvedores quanto para os fabricantes.


FONTE http://www.javamovel.com/2009/07/por-que-java-me.html

CONFIGURE O JOOMLA NO SEU SITE EM ALGUNS CLIQUES

Um CMS muito bom e completo é o Joomla, um software totalmente livre e com grandes qualidades. Muito divulgado no Fórum Internacional do Software livre em Porto Alegre, ele reúne uma série de benefícios para você desenvolvedor. Você não precisa nem ser um expert em programação, basta ler o manual, como de costume, segue o link do manual, clique aqui.

Se você continua neste post, é porque não tem o costume de ler o manual (muito obrigado pelo seu acesso), para você, vou escrever alguns passos básicos para a configuração:

1 - Preparando o ambiente:

Se você já possui um site com disponibilidade de hospedagem PHP e suporte à algum tipo de banco de dados (vamos supor e propor MySQL), ignore este passo.

- Configure o EasyPHP na sua máquina, nele tudo que você precisa já estará disponível, se você não conhece o EasyPHP ainda não se desespere, ainda lhe resta a opção de ler um outro manual, Clique e leia este, mas vá só até o passo de configuração do EasyPHP, depois volte aqui, não quero perder seu acesso, mesmo sabendo que nesse link tudo esta mastigado, para você iniciante em Joomla.

2 - Configurando o Joomla para trabalhar no seu ambiente:

Hospede o conteudo baixado neste link em alguma pasta no seu servidor.

Depois abra o arquivo de configuração com o nome configuration.php-dist e configure os detalhes nos locais indicados:

var $dbtype = 'mysql'; // Normally mysql
var $host = 'localhost'; // This is normally //(COLOQUE AQUI O ENDEREÇO DA SUA MAQUINA LOCAL NO CASO O LOCALHOST OU 127.0.0.1 ou //então o ip/dns do seu servidor de hospedagem) set to localhost
var $user = ''; // MySQL username
var $password = ''; // MySQL password
var $db = ''; // MySQL database name
var $dbprefix = 'jos_'; // Do not change unless you need to!

/* Server Settings */
var $secret = 'FBVtggIk5lAzEU9H'; //Change this to something more secure
var $gzip = '0';
var $error_reporting = '-1';
var $helpurl = 'http://help.joomla.org';
var $xmlrpc_server = '1';
var $ftp_host = '';
var $ftp_port = '';
var $ftp_user = '';
var $ftp_pass = '';
var $ftp_root = '';
var $ftp_enable = '';
var $tmp_path = '/tmp';
var $log_path = '/var/logs';
var $offset = '0';
var $live_site = ''; // Optional, Full url to Joomla install.
var $force_ssl = 0; //Force areas of the site to be SSL ONLY. 0 = None, 1 = Administrator, 2 = Both Site and Administrator

/* Session settings */
var $lifetime = '15'; // Session time
var $session_handler = 'database';

/* Mail Settings */
var $mailer = 'mail';
var $mailfrom = '';
var $fromname = '';
var $sendmail = '/usr/sbin/sendmail';
var $smtpauth = '0';
var $smtpuser = '';
var $smtppass = '';
var $smtphost = 'localhost';

/* Cache Settings */
var $caching = '0';
var $cachetime = '15';
var $cache_handler = 'file';

/* Debug Settings */
var $debug = '0';
var $debug_db = '0';
var $debug_lang = '0';

/* Meta Settings */
var $MetaDesc = 'Joomla! - the dynamic portal engine and content management system';
var $MetaKeys = 'joomla, Joomla';
var $MetaTitle = '1';
var $MetaAuthor = '1';

/* SEO Settings */
var $sef = '0';
var $sef_rewrite = '0';
var $sef_suffix = '';

/* Feed Settings */
var $feed_limit = 10;
var $feed_email = 'author';



3 - Instalando:

Instale o Joomla à partir do seu arquivo INSTALL.php, siga o passo à passo até o fim.

Pronto, seu site esta preparado para trabalhar com o Joomla em alguns cliques.

Agra sinta-se livre para acessar www.joomla.com.br e descobrir o universo de opções e facilidades que te espera.

Se você é programador Java (Público padrão deste blog), não tenha pré-conceitos com o glorioso PHP, saiba que qualquer linguagem de programação pode se tornar muito poderosa se usada da forma adequada e com padrões bem definidos. E isso não falta ao Joomla.

Seja feliz e faça parte do maravilhoso mundo do software livre. Quem sabe até você consiga parar de perder tempo acessando sites pouco construtivos e comece a ganhar dinheiro com sua excelente capacidade de ser um NERD assumido e interligado ao mundo TI.

Dúvidas sobre o Joomla? Comente aqui ou pergunte para algum rapaz (ou moça) mais capacitado do que quem vos escreve no site recomendado acima.

Um grande abraço.

Construindo vídeos e players de áudio

Vejam este vídeo que propõe-se a construir players tanto de vídeo quanto de audio, esse é mais um tópico referente à benefícios do Html 5. Os argumentos são muitos, cabe à cada um analisar a eficiência e força dos mesmos:

HTML 5 para uma web melhor

Recentemente recebi um email de uma newsletter do site PHP Classes com este título. Achei bem interessante o conteúdo e os argumentos debatidos.

The HTML 5 will definitely contribute to a better Web. Despite its specification is still being drafted, several browsers like Firefox 3.5, Internet Explorer 8, Safari 4, Chrome 2 and Opera 10 already implement a significant part of the current HTML 5 specification.

This article reviews a bit of the history of how we got to HTML 5 and presents an overview of the enhancements that HTML 5 introduces to provide a better Web.

It also presents a reflection about whether HTML 5 will render useless browser extensions like Flash, Silverlight and Java.


Leia mais aqui

OTIMIZANDO TRANSACTIONS LENTAS COM O PATTERN SERVICELOCATOR DE EJBS

Olá, dependendo do caso é preciso que bole-se uma solução para otimizar alguma chamada que possa por ventura estar lenta, gerando um processamento maior que o esperado e conseqüentemente correr-se o risco de receber uma excessão de TimeOut, retornada pelo banco de dados e tratada pelo entityManager. Como sempre recomendo aqui, utilize SessionBeans CMP onde o container controlará sempre a persistência à dados. O rollBack nesse caso será feito automaticamente.

Tem-se no caso um SessionBean Stateless onde um procedimento realmente demorado é executado.

public MyBean implements myLocalInterface {
@PersistenceContext
EntityManager em;

public myMethodWithHardLogic(int myParam) {


// your complex logic here (sua lógica complexa aqui)


// old code (este código antigo passará para a classe listada
//abaixo)
for.... {
MyEntity myEntity = em.find(MyEntity.class, myParam);

if (myEntity.myVariable) {
myEntity.setMyType(1);
} else {

if (myOtherCondition) {
myEntity.setMyType(275);
} else {
myEntity.setMyType(32);
}

}

em.merge(myEntity);

for (MyArray myArray : em.getMyArray ) {

em.persist(em.find((MyClassOfMyArray) myArray.get(0)));
}

//... etc etc etc etc etc etc
}
}
}


Onde o otimizador de lookups de acordo com o Pattern usado (Facade, Business Delegate). No caso, seu delegator


public myClassDelagator {

boolean etc;

MyBean myBean;

public myClassDelagator() {
executeMyLookUp();
}

public myClassDelagator(boolean etc) {
executeMyLookUp();
this.etc = etc;
}

ptivate executeMyLookUp() {
myBean = ServiceLocator.getInstance().... etc.... lookup("my_JNDI_NAME");
}


public delegateToInterface() {

// aqui entra a nova lógica, que antes estava dentro do Bean
if (etc) {
myBean.myMethodWithHardLogic(1);
myBean.myMethodWithHardLogic(2);
myBean.myMethodWithHardLogic(275);
} else {
myBean.myMethodWithHardLogic(7);
myBean.myMethodWithHardLogic(12);
myBean.myMethodWithHardLogic(32);
}

}

}


Veja no exemplo acima, se cada chamada myBean.myMethodWithHardLogic(...) demorava 10 segundos, se multiplicares por 3 teremos uma única transação com 30 segundos (quando maior esse número, mais "atolado" de 1 vez só ficará o Banco de dados), mas se particionares os chamadas em 3 vezes, terás apenas uma transação com 10 segundos sendo executada de cada vez.

Cabe lembrar que EJB veio para facilitar, mas não faz milagre, você precisa saber o que esta fazendo, a execução de um método dentro de um SessionBean (Estamos falando de EJB CMP) onde a instância do PersistenceContext esta definida se equivale à abertura de uma conexão, commit, rollBack (se for o caso), fechamento da conexão. Não é porque o framework faz tudo automático que ele tem a obrigação de saber quanto tempo deve demorar cada processo, ou quanto tempo sua transação deve durar. É isso que nos difere do framework, a nossa capacidade de pensar e planejar de forma eficiente de modo a não onerar o banco de dados. Antes de culpar o framework, pense se esta utilizando-o da melhor maneira, nada é tão bom ao ponto de servir para todos os casos possíveis.

Espero poder ter ajudado a quem me dá a honra de seu acesso.

Lembrando que estes exemplos devem ser usados quando a lógica realmente é muito complexa, em casos simples (apenas um insert, update delete, etc etc etc) deixe tudo à cargo do entityManager, ele se vira, e se vira muito bem.

Dúvidas é só comentar.

Um Abraço

EJB 3 PERSISTENCE NO GLASSFISH

O suporte à JPA no glassfish é muito simples de ser utilizado e muito semelhante à outras arquiteturas. Como qualidades podemos citar o grande suporte de informações que podem ser encontradas no site da Sun MicroSystems.

Vamos descrever em cima do post abaixo:

https://glassfish.dev.java.net/javaee5/persistence/entity-persistence-support.html

No exemplo citamos as formas de utolizar TopLink(TM) Essetials, com contribuições da Oracle.

Gerando um pacote JPA no container JavaEE:

Entity bean classes, like any other POJO classes, can be packaged along with the component classes that use them or separately as a library. They are allowed to be packaged in the following ways:

1. In an ejb-jar file along with other EJB classes.
2. In WEB-INF/classes directory along with other web application classes.
3. In any of the jar files directly located in WEB-INF/lib directory.
4. In any of the utility jar files in an ear file including jar files that belong to lib directory in an ear file
5. In an application client jar file.

Note: a rar file does not contain entity bean classes.

Each of the above jar files or directory needs to contain a META-INF/persistence.xml. The schema which defines the structure of this XML document is available here.


Example of a simple persistence.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name ="pu1">
<jta-data-source>jdbc/DataSource1</jta-data-source>
</persistence-unit>
</persistence>


Criando o pacote na plataforma Java SE:

The following code creates EntityManagerFactory, EntityManager, starts a transaction, persists a new Customer, commits the transaction, and then runs a Java Persistence query:

// Create EntityManagerFactory for a persistence unit called em1.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu1");

// create EntityManager
EntityManager em = emf.createEntityManager();

// Get a transaction instance and start the transaction
EntityTransaction tx = em.getTransaction();
tx.begin();

// Create a new customer and persist it.
Customer c = new Customer();
c.setName("Joe Smith");
em.persist(c);

// Commit the transaction
tx.commit();

// run a Java Persistence query selecting a customer by name
String queryString = "SELECT c FROM Customer c WHERE c.name = :name";
Query query = em.createQuery(queryString);
query.setParameter("name", "Joe Smith");
List result = query.getResultList();
System.out.println("Java Persistence query " + queryString + " returns " + result);

The persistence.xml file should list all persistent classes from the application domain, e.g. entity.Customer, etc. (substitute " <...>" text with your actual values for jdbc properties).
Provider class name can be specified either in the
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="pu1">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider <!-- All persistence classes must be listed -->
<class>entity.Customer</class>
<class>entity.Order</class>
<class>entity.Item</class>
<properties>
<!-- Provider-specific connection properties -->
<property name="toplink.jdbc.driver" value="<database driver>"/>
<property name="toplink.jdbc.url" value="<database url>"/>
<property name="toplink.jdbc.user" value="<user>"/>
<property name="toplink.jdbc.password" value="<password>"/>
<!-- Provider-specific settings -->
<property name="toplink.logging.level" value="INFO"/>
</properties>
</persistence-unit>
</persistence>

Note: If you use build 03/02 or later, you do not need to specify transaction-type="RESOURCE_LOCAL" in Java SE.

To execute the example, add your classes and META-INF/persistence.xml to the classpath. Then run:

java -javaagent:${glassfish.home}/lib/toplink-essentials-agent.jar client.Client

Note: toplink-essentials.jar from {glassfish.home}/lib will be added automatically to the classpath. It contains both, the API and the implementation classes.



Recomenda-se o uso de JPA Tools para auxílio no desenvolvimento das Entidades:

DEFININDO TRANSACTION TYPE NO PERSISTENCE UNIT

Esta pode ser a origem do seu problema:
[TopLink Warning]: 2008.11.04 12:51:11.184--ServerSession(31768270)--PersistenceUnitInfo "NOME_DO_MEU_PERSISTENCE_UNIT" has transactionType RESOURCE_LOCAL and therefore jtaDataSource will be ignored



Um problema muito rotineiro é quando o tipo de transação esta como RESOURCE_LOCAL, mas o que precisamos é outra coisa, como por exemplo JTA, vejamos um exemplo de como alterar o tipo em menos de 10 segundos (ainda sobrará tempo pra um gole de café):

Vá no seu persistence unit e altere a propriedade transaction-type:

Era assim (com transaction-type="RESOURCE_LOCAL" implicitamente):
<persistence-unit name="NOME_DO_MEU_PERSISTENCE_UNIT" > <jta-data-source>definições do meu datasource</jta-data-source>

vai ficar assim:
<persistence-unit name="NOME_DO_MEU_PERSISTENCE_UNIT" transaction-type="JTA" > <jta-data-source>definições do meu datasource</jta-data-source>

AGORA TU ESTARÁ MANDANDO O JTA-DATASOURCE SER EXPLICITAMENTE USADO

Abraços e esperamos ter ajudado você, na solução de algum bug. Lembrem-se, nos detalhes que mora o perigo, essa pequena alteração demonstrada aqui pode fazer grande diferença na maneira como a instância do seu entityManager é montada.

Valeu

Cache de entidades JPA / Providers

Quanto se trabalha com entidades JPA, sabemos que o tempo de sincronização dos dados contidos no EntityManager com os dados armazenados no banco, é pré-definido, então em muitos casos quando uma consulta não traz o resultado esperado no instante em que a query foi executada, pode ser que exista cache agindo sobre essa consulta.

Outros exemplos:

- Quando você faz uma inserção diretamente no banco ( sem a execução de um merge ou persist através do E.M. ).

- Quando existe a execução de uma stored procedure ou package, que faz inserção de dados em banco ( mesmo se esta for chamada como Native Query no E.M. já que o executor será o próprio banco de dados ).


Para solucionar esse problema, utilizamos Hints, esses são propriedades setadas na própria query antes da mesma ser executada no EntityManager, esses hints podem variar de acordo com o provider utilizado.

Esses são detalhes muito importantes que no caso do aprendizado prático, acaba-se deixando de lado, mas é bom sabermos que CACHE faz parte de JPA e precisa ser tratado com determinada importância. Traz grandes benefícios de performance e robustêz à sua aplicação.

Podemos citar os principais providers e seus respectivos hints:

IBM WEBSPHERE:
com.ibm.websphere.jpa.default.provider

ORACLE TOPLINK:
oracle.toplink.essentials.PersistenceProvider

HIBERNATE:
org.hibernate.ejb.HibernatePersistence

Como esse é um vasto assunto e estamos falando de cache, vamos citar os principais Hints para refresh:

************************************
--- Toplink

** Por anotação

Example: JPA Query API

import oracle.toplink.essentials.config.HintValues;
import oracle.toplink.essentials.config.TopLinkQueryHints;
query.setHint(TopLinkQueryHints.REFRESH, HintValues.TRUE);

Example: @QueryHint

import oracle.toplink.essentials.config.HintValues;
import oracle.toplink.essentials.config.TopLinkQueryHints;
@QueryHint(name=TopLinkQueryHints.REFRESH, value=HintValues.TRUE);




** no orm.xml
<entity-mapping<
...
<named-query name="findEmployeesWithName">

<query>SELECT e FROM Employee e WHERE e.name LIKE :empName</query>
<hint name="toplink.refresh" value="true" />
<hint name="toplink.refresh.cascade" value="CascadeAllParts" />
</named-query>
...
<entity-mapping>


** no código
//query ... my query..
query.setHint("toplink.refresh", true);
query.setHint("toplink.refresh.cascade", "CascadeAllParts");




Obs: veja que nesse caso do toplink tanbém existe a propriedade cascade, que faz um refresh tanbém de outros objetos relacionadas com sua Entity.

Leitura:
Mais hints oracle toplink





************************************
---- Eclipselink

*** Anotação
@NamedQuery(name="findEmployeeNoCache",
query="SELECT e FROM Employee e WHERE e.id = :empId",
hints={@QueryHint(name="eclipselink.cache-usage",
value="DoNotCheckCache")})


*** orm.xml
<entity-mapping>
...
<named-query name="findEmployeesWithName">

<query<SELECT e FROM Employee e WHERE e.name LIKE :empName</query>
<hint name="eclipselink.cache-usage" value="DoNotCheckCache"/>
</named-query>
...
<entity-mapping>


Leitura
Documento completo direto do site da IBM

Tudo o que você precisa saber sobre Query Hints






************************************
---Hibernate

***** No código:
query.setHint("org.hibernate.cacheMode", CacheMode.REFRESH)

ex: q.setHint("org.hibernate.cacheable", true);

Assinatura: org.hibernate.cacheable - true/false

Assinatura: org.hibernate.cacheMode - NORMAL / IGNORE / GET / PUT / REFRESH

Assinatura: org.hibernate.cacheRegion - String


Leitura:
Uma discussão muito boa sobre o assunto, site spring framework