No link: http://www.forbes.com/2007/03/27/07forbes2000_map.html

Você pode ver as 2000 maiores empresas do mundo, entre elas algumas brasileiras, no caso a mais bem colocada é a Petrobrás ocupando o número 50 no ranking do Forbes, ainda atrás de até várias empresas de tecnologias norte-americanas.

A lista das brasileira é a seguinte:

Rank Company Country Industry Sales ($bil) Profits ($bil) Assets ($bil) Market Vaue ($bil)
50 Petrobras-Petróleo Brasil Brazil Oil & Gas Operations

74.12

12.14 95.61 99.29
130 Vale do Rio Doce Brazil Materials 20.82

6.17

57.60 77.38
147 Banco Bradesco

Brazil

Banking 29.84 2.37 124.38

37.21

166 Banco do Brasil Brazil

Banking

22.15 2.78 138.68 26.78
330 Itaúsa Brazil Banking

13.87

0.98 66.36 17.18
411 Unibanco Group Brazil Banking 9.88

0.80

48.56 16.49
572 Eletrobrás

Brazil

Utilities 8.89 0.42 51.09

12.02

763 Usiminas Brazil

Materials

5.58 1.68 7.43 10.19
846 CSN-Cia Siderurgica Brazil Materials

4.29

0.86 10.27 9.02
863 Tele Norte Leste Brazil Telecommunications Services 7.16

0.48

11.20 6.61
887 Metalurgica Gerdau

Brazil

Materials 11.03 0.63 12.39

3.90

963 Cemig Brazil

Utilities

3.52 0.86 8.12 8.01
1082 CPFL Energia Brazil Utilities

4.18

0.66 6.15 6.41
1173 Embraer Brazil Aerospace & Defense

3.91

0.30 7.13 8.36
1396 Banco Nossa Caixa Brazil Banking 3.12

0.33

14.29 2.02
1606 Aracruz Celulose

Brazil

Materials 1.68 0.46 4.49

5.51

1674 Sabesp-Saneamento Basico Brazil

Utilities

2.12 0.37 7.33 3.82
1680 Braskem Brazil Chemicals

5.43

0.05 7.52 2.37
1685 Ipiranga Brazil Oil & Gas Operations

12.04

0.08 1.69 0.49
1690 Brasil Telecom Brazil Telecommunications Services 4.34

-0.01

7.37 4.12
1779 GOL Linhas Aéreas

Brazil

Transportation 1.78 0.32 1.76

5.63

1840 CBD-Brasil Distribuição Brazil

Food Markets

5.74 0.11 4.51 4.19

Fonte: Forbes

Neste artigo   o autor mostra vários pontos importantes sobre como balancear carga de processamento entre tomcats, o que pode valer para JBoss também. O interessante que há uma tabela comparativa sobre “Balanceamento de Dados” e “Clustering”, que esclarece alguns conceitos triviais sobre estes conceitos. Boa leiutra.

Em Delphi(TM) havia alguns truques via RTTI(Run Time Type Information) que sem ser programadores paranormais com truques do tipo “limpe 50 TEdits com 3 linhas de código” animavamos todo o time de desenvolvimento. Com Java, RTTI tem um nome mais bonito Reflection.

O saudosismo deste post, deve-se a lembrança de práticas similares, no caso, eu precisava criar uma classe BeanToProperties e PropertiesToBean, para que fosse possível ler um properties e todas sua chaves fossem passadas para atributos de um bean, claro com atributos com memso nome (já que não há um decoador “de para”), e vice-versa. Acho que até pode existir isso num Apache Commons da vida, mas como eu estou passando grande parte dos meus dias em aeroportos e apertado nos assentos da Tam e Grande Onibus Lotado, onde há pouca internet disponível, então resolvi criar um recurso destes para finalizar uma atividade no projeto, veja então o resultado.

Primeiro, eu preciso saber se o atributo da Classe em questão é equivalente a uma chave do Properties que tenho carregado, veja então:


public static java.util.List getFieldsFromClass(
Properties props) {

java.lang.reflect.Field[] methods = new ClientProperties()
.getClass().getDeclaredFields();

ArrayList< ?> a = Collections.list(props.propertyNames());

java.util.ArrayList fieldList = new java.util.ArrayList();

for (java.lang.reflect.Field m : methods) {
if (a.contains(m.getName())) {
fieldList.add(m);
}
}

return fieldList;
}


Em seguida, preciso obter os dados das chaves e atribuir aos atributos usando os métodos gets, para isso, veja o método:


ClientProperties bean = new ClientProperties();

List fields = getFieldsFromClass(props);
for (Field f : fields) {
try {
String methodName = “set”
+ f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1, f.getName().length());

Class[] params = new Class[] { String.class };

Method method = bean.getClass().getDeclaredMethod(methodName,
params);

method.invoke(bean, props.getProperty(f.getName()));


Com isso, o objeto “bean” irá executar para a propriedade core o mesmo que: bean.setCore(prop.getValue(”core”)); , só que se eu tiver 58 propriedades, este método me economiza um super tempo!

Espero que esta dica ajude, ela está aqui com certeza para me ajudar, caso amanha eu esqueça como já fiz isto, mais ou menos como quase tudo que há em nível de códigos nesse blog. Até a próxima.

[]

Edgar

JMX é de fato uma das APIs mais notáveis presentes em Java, alguns servidores de Aplicações comerciais só vieram a implementar tais recursos somente a poucas anos atrás. No caso do JBoss, todo o MicroKernel foi concebido em torno desta tecnologia, o que torna mais simples a criação de ferramentas de monitoração, controle, monitores transacionais e até os profilers.
Como exemplo de invocação de chamadas JMX diretamente via código Java, veja a seguinte porção de código:


Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, “org.jnp.interfaces.NamingContextFactory”);
environment.put(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
environment.put(Context.PROVIDER_URL, “jnp://127.0.0.1:1099″); // remote machine IP
InitialContext ic = new InitialContext(environment);
RMIAdaptor server = (RMIAdaptor) ic.lookup(”jmx/invoker/RMIAdaptor”);
ObjectName name = new ObjectName(”jboss.system:type=ServerConfig”);
System.out.println(”ServerTempDir=”+server.getAttribute(name, “ServerTempDir”));


O código imprime o valor da propriedade ServerTemp que pode ser obtida facilmente através do JMX-Console num browser qualquer, qualquer outra propriedade do ServerConfig que está dentro do domínio jboss.system poderia ser obtida através do contexto JMX obtido via JNDI (RMIAdaptor) .

Alterações podem ser solicitadas também, isto também é possível também de forma programática.

Aguardem o que está por vim de interessante o novo JBoss Micro-Container.

Aqui os primeiros screenshots do JBoss Profiler 2.0, em breve o time deverá publicar o download do primeiro release do JBoss Profiler2.0, mas vejam aqui os screenshots:

screenshot-jboss-profiler-20.png
screenshot-jboss-profiler-20-clientproperties.png
FISL9

Recebi um email com a confirmação que a palestra:

JBoss 5 - As novidades da versão penta para a Comunidade Livre!

Foi aprovada! Então vejo vocês no dia 17, 18 e 19 de Abril na PUC em Porto Alegre, vai ser minha terceira vez neste evento, desde que eu fui na primeira vez, deixaram de fazer na PUC, e este ano está de volta, o que significará mais pessoas. O FISL é considerado como um dos maiores e mais importantes eventos de Software Livre do mundo, sendo assim, se você puder: Prestigi-o!

Nesta palestra vamos abordar as novidades do JBoss5, assim como as questoes de Micro-Container, novo Console, Plugins, e o JBoss Profiler 2.0.

Vejo vocês em Porto Alegre, e de noite no restaurante Mercado Del Puerto, comendo um Entrecot ao molho de vinho :)

JBossWorld

Minha correria de final quarter e ano fiscal na empresa, o meu provedor que dificulta manter meu site no ar, me impediram de blogar sobre o JBossWorld, evento que estive último fevereiro, mas há blogueiros como o Guilherme da Globo.COM, que fizeram uma cobertura fantástica em seu Blog, recomendo que todos leiam.

Bom, meu ano começa para valer agora, como alguns dos focos deste ano é consolidar as duas plataformas novas da JBoss: O SOA Platform, que está a um tempo sendo bastante divulgada aqui e em vários outros blogs, e o JBoss Communications Platform, este último deve dar o que falar para o nosso mercado que pede e exige bastante interatividade nas aplicações voltadas para o mercado de voz sobre IP e Telecom de modo geral. Logo, alguns posts sobre estas tecnologia que acima de qualquer outra coisas é: 100% Opensource, e claro, sua contribuição seria extremamente bem-vinda, veja mais em: http://labs.jboss.org/mobicents ou no site do projeto MobiCents, projeto adquirido ano passado pela Red Hat para fazer parte do leque de soluções JBoss.

Voltando a vida normal após o susto, e ter perdido várias implementações de ESB e de Seam, resolvi concentrar em algo novo para distrair, o esbgen module.

Quando você baixa o JBoss ESB, talvez pelos conceitos, ou por certa complexidade nas inúmeras possibilidades de protocolos, ações e etc, nos perdemos por onde começar quando queremos criar um projeto ESB. Sendo assim, inspirado em várias ferramentas similares, criei um módulo para o ESB que é um assistente para criação de projetos usando um utilitário de linha de comando. Veja os exemplos aqui:

esb1.png

Figura 1- Criando o Projeto inicial.

esb2.png

Projeto ESB com todos os arquivos necessários criados. Se você trabalhar com os QuickStarts, você terá toda a estrutura para deploy e testes de seus projetos.

Se você ficou curioso, veja o design e estágio atual da ferramenta clicando aqui.

Para ver em resoluções menores, clique aqui.

Abraços

Edgar

Desculpem os RSS Readers! Desculpem a revolta, mas é revoltante algumas coisas em nossas vidas. Vocês que estudaram como desgraçados, comeram em bandeijão, pegaram onibus lotados, daqueles que é tanta gente que você pode dormir em pé que as Leis de Newton não farão efeito!

Você orgulha seus pais e a si mesmo, vai, estuda engenharia, estuda seja lá o que ou até onde for, e nesse caso, não adianta nada, você ainda vai ganhar mal, e você sabe o por quê? Porque você é um burro e honesto, que ao invés de roubar, você resolveu estudar…. Você é um burro!

Quanto é sua hora de trabalho? 100, 200, 300 reais? E você se acha o cara?! Você é um bosta, assim como eu, pois veja: Em 1 minuto eu fui assaltado, e me levaram:

  • Meu laptop (DELL, Duo Core 2 GB , 15.5 wide): 6.500
  • Nextel Motorola: 550,00
  • TIM Motorola : 650,00
  • IPod: 500,00
  • Pen-Drive: 100,00
  • Mochila com vários acessórios(do JavaOne para os nerds de plantão): 200,00

Isto totaliza cerca de 8.500 Reais, em cerca de 1 minuto de trabalho por parte dos grandes profissionais de mercado de São Paulo, se você multiplicar por 60(1 hora), a hora deles então custa: 510.000 Reais. E você se achando seu bosta!

O pior, é você ir fazer um BO (Boletim de Otário), e os servidores públicos no momento da sua descrição do fato, vê a funcionária fumar a merda de um FREE vagabundo, e entre uma pergunta e outra, baforar uma nuvem de fumaça na sua cara! E no final, depois de várias piadinhas, do tipo: “Os caras fizeram a feira com você”, tu pegas seus míseros papéis e começa a rezar para o próximo dia no PoupaTempo, onde 2 horas na fila consegue-se apenas comprando lugares na mesma…

Este é um desabafo de um otário como eu, que ama a merda desse país, que desde 1999 morando em São Paulo, nunca havia presenciado nada de violento, e eis que tudo veio num pacote único, o que nos deixa apenas revoltados, frustrados, sem ação….

E ai como descedente de Judeus que droga eu fui fazer na vida… Estudar, os caras ganham mais que os bostas da TV Brasileira! Tá vendo? Somos uns bostas! E eles são os Mickeys, só nos resta ser os “patetas”.

Desculpem o desabafo!

Edgar

ps- Local do Assalto: Vila Olimpia, em frente ao Ceasar Park. Atenção: Roubos na Berrini são frequentes em São Paulo, como as empresas de TI ficam grande parte nessa região cuidado nunca é pouco.

Calma, isso nada tem a ver com a linguagem Ruby, uma linguagem que respeito, mas que pouco usei na vida, e sim apenas fazer uma pequena homenagem a este rítimo que quem vai a Belém e não faz questão de ser fechado e se permite apreciar o que é local acaba no mínimo respeitando. Eu como um paraense apaixonado e saudoso da minha terra, tinha que aproveitar esse tema da minha área para fazer essa “brincadeira”. Ora, o Rio tem funk, vários lugares do interior de SP, Goiás, Minas tem o Sertanejo, o sul tem o vanerão, o nordeste tem o forró, o Amazonas tem o Boi, o Maranhão tem Reggae da jamaica brasileira, o Pará tem o que é conhecido como Techno brega, um ritimo engraçado, mas que mobiliza pessoas humildes, de posses, cultas outras sem tantas oportunidades, mas que se tornam comum numa festa onde o rítimo seja este, apenas uma homenagem, fruto das mini-férias que tive passando com a minha familia e mulher em Belém :) .



Lyoto Machida, filho do lendário e respeitado mundialmente professor de Karatê Machida de Belém, é um paraense que vai longe veja a última luta dele no UFC.

Quando ele fala de Belém, claro que o orgulho vem todo a tona. Parabéns Lyoto!


O JBoss Seam de fato é um framework que enche os olhos de qualquer um, mesmo tendo trabalhando em geradores de códigos/aplicações, me rendi ao JBoss Seam desde a primeira vez que o vi, mais precisamente no final de 2006, de lá pra cá, os projetos que trabalhei usavam muito mais questões de integrações do que aplicações de usuários finais. Porém, desde que comecei a avaliar o Seam com um maior cuidado para utilizá-lo como framework JSF por trás do Console do novo JBoss Profiler, percebi que realmente o framework vale muito a pena.Não é pra menos, um time de talentosos desenvolvedores está por trás do Seam, logo, tal resultado já era esperado. Mas chega de papo, e vamos a algumas dicas interessantes:

Forçando o Login para Determinadas Páginas JSF

Muitas vezes você quer que determinadas Páginas sejam protegidas por Login, para resolver isso, o Seam possui todo um framework de segurança baseado em JAAS, e para ativar tal requisito para uma determinada página, basta adicionar a seguinte string no arquivo pages.xml :

XML:
  1. <page view-id="/travel*" login-required="true"/>

Adicionando novas Consultas baseadas na Extensão do EntityQuery

Quando você extende a classe EntityQuery você tem acesso a vários componentens que o Seam injeta dinamicamente para nós, entre eles o EntityManager do JPA, que pemite que criemos Queries dinamicas, veja no exemplo o método que adicionei em uma das classes que extende o EntityQuery:

JAVA:
  1. public Employee getUserByEmail(String email) {
  2.        
  3.         return (Employee) this.getEntityManager().createQuery
  4.         ("from Employee where email=:email")
  5.         .setParameter("email", email)
  6.         .getSingleResult();
  7.        
  8.     }

Implementando uma Autenticação no Seam e salvando dados no Contexto

Imagine que seus dados de usuários serão buscados via JPA, o exemplo a seguir mostra o Autenticator em ação, que é um SessionBean que o Seam executa toda a vez que a Aplicação precisa autenticar alguém. O Autenticator é um recurso que também faz parte do Seam. (No exemplo abaixo não há encriptação de senha, por favor leve isso em consideração no mundo real):

JAVA:
  1. @Name("authenticator")
  2. public class Authenticator
  3. {
  4.     @Logger Log log;
  5.    
  6.     @In Identity identity;
  7.    
  8.     @In FacesMessages facesMessages;
  9.    
  10.     public boolean authenticate()
  11.     {
  12.         log.info("authenticating #0", identity.getUsername());
  13.  
  14.         identity.addRole("admin");
  15.        
  16.         Employee employee = new
  17.         EmployeeList().getUserByEmail
  18.         (identity.getUsername());
  19.        
  20.        
  21.         boolean ok = employee.getPassword().
  22.         equalsIgnoreCase(identity.getPassword());
  23.  
  24.         if (ok) {
  25.            
  26.             Contexts.getSessionContext().set("employee",
  27.                                              employee);
  28.            
  29.             identity.addRole(employee.getPositionEmployee());
  30.            
  31.             facesMessages.add
  32.             (String.format("We allow the user %s request a Travel",
  33.                     employee.getName()));
  34.         }
  35.        
  36.         return ok;
  37.  
  38.     }
  39. }

EntityListeners nossos! E por que não?

Mesmo com o suporte a Inteceptors do Seam, não faz mal criarmos os nossos algumas vezes, eis então um exemplo de inteceptação de eventos
na EntityClass: TravelRequest, onde antes de persistirmos uma informação, podemos promover uma avaliação e tomar alguma ação antes da ação ser executada,
os famosos Eventos, presentes em frameworks de persistências muito antigos como o TFieldDataLink no Borland Delphi desde 1995. Veja o exemplo:

EntityListener:

JAVA:
  1. import javax.persistence.PrePersist;
  2.  
  3. public class TravelRequestListener {
  4.    
  5.     @PrePersist
  6.     public void beforePost(TravelRequest request) {
  7.        
  8.         if (request.getStatus()!=null &&
  9.                 request.getStatus().equalsIgnoreCase("")) {
  10.            
  11.             request.setStatus("NEW");
  12.            
  13.         }
  14.     }
  15.  
  16. }

Registro do EntityListener:

JAVA:
  1. @EntityListeners({TravelRequestListener.class})
  2. public class TravelRequest implements Serializable {
  3. ...

Neste site de TopLink da Oracle há uma ótima documentação de referencia para as anotações do JPA (Java Persistence API).

Recomendo ainda fortemente a leitura também deste artigo do TheServerSide, com eles algumas dúvidas de JPA tornam-se bem mais bobas.

Bons Estudos!

O Eclipse em termos de mercado ainda é a  IDE Java mais usada

Esse foi um dos argumentos para o JBoss Studio ser baseado nele. Não cabe a mim maiores argumentações, até porque ainda uso NetBeans, e para quem pretende extender uma IDE, (in)felizmente o NetBeans ainda é extremamente mais simples.

Perdendo algum tempo tentando fazer as coisas de forma "correta", usando as Interfaces: ICompilationUnit, IType, IJavaModel, IJavaElement e todos os "I's" que você puder imaginar, resolvi usar a famosa POW (Programação Orientada a Workarouds). Workaround é uma forma bonita que foi cirada para camuflar o que conhecemos como : Gambiarra!

No JBoss Studio, para quem desenvolve com o JBoss Seam, quando você gera um Entity, o SeamGen gera uma página JSP com tags JSF para Listagem e Edição, a itenção desta extensão que estou trabalhando nas horas vagas (pouquissimas recentemente), visa atualizar via o DiffEditor do eclipse os campos do formulário e da listagem com base em novos atributos da sua Entity Class. Sendo assim, você irá clicar com o botão direita no Package Explorer e ai você terá a opção "Update JSPs based on this Entity...".

Basicamente este plugin é um PopupAction que trata as invocação do popup sobre um .java da seguinte forma:

Método run:

JAVA:
  1. public void run(IAction action) {
  2.  
  3. ISelection sel = targetPart.getSite().getSelectionProvider()
  4. .getSelection();
  5.  
  6. if (sel instanceof IStructuredSelection) {
  7.  
  8. IProject project = getProject((IStructuredSelection) sel);
  9. if (project != null) {
  10. IJavaProject java = JavaCore.create(project);
  11.  
  12. try {
  13. System.out.println("Project Path: "
  14. + project.getLocationURI().toURL().toString());
  15.  
  16. msgBox(this.getClassFileName(project.getLocationURI()
  17. .toURL().toString(), project.getName(),
  18. fullJavaSourcePath, java.getOutputLocation()
  19. .toOSString()));
  20.  
  21. } catch (MalformedURLException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. } catch (JavaModelException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28.  
  29. }
  30. }

Método getProject():

JAVA:
  1. private IProject getProject(final IStructuredSelection selection) {
  2. IProject project = null;
  3. Object object = selection.getFirstElement();
  4.  
  5. if ((object != null) && (object instanceof IAdaptable)) {
  6. IResource resource = (IResource) ((IAdaptable) object)
  7. .getAdapter(IResource.class);
  8.  
  9. if (resource != null) {
  10.  
  11. fullJavaSourcePath = resource.getFullPath().toOSString();
  12. project = resource.getProject();
  13. javaSourceSelected = resource.getName();
  14.  
  15. }
  16. }
  17.  
  18. return project;
  19. }

E eu confesso que tentei usar vários recursos, entre eles: IType para capturar o IClassFile , para saber qual o .class respectivo daquele respectivo .java...E desisti de tanto NPEs (NullPointerExceptions) que levei na cara, e ai veio o seguinte "gambiarratico", todavia funcional método tabajara:

JAVA:
  1. protected String getClassFileName(String projectHome, String projectName,
  2. String javaSource, String output) {
  3.  
  4. String fullOutputFolder = projectHome.substring(0, projectHome
  5. .lastIndexOf('/'))
  6. + output;
  7.  
  8. String newSource = javaSource.substring(projectName.length() + 2,
  9. javaSource.length());
  10.  
  11. return fullOutputFolder
  12. + newSource.substring(newSource.indexOf('/'),
  13. newSource.length()).replaceAll(".java", ".class");
  14. }

Eu tenho certeza que isso é quase um assassinato ao modelo RCP, JDT do Eclipse, porém, para o que eu precisava, que é a droga do .class, isso funcionou bem mais simples e melhor que as tão belas e "fundamentadas" classes do Eclipse. É por essas e outras, que ainda tenho falta do NetBeans.

Abraços e aproveitando: Feliz 2008 :D , Saúde! O resto é todo lucro.

Edgar

Bom, desenvolvendo com JBoss Studio e JBoss Seam, ainda me faz muita falta as mágicas que o Greenbox nos dava na palma da mão, por isso, estou estruturando algumas extensões para proporcionar maior produtividade agora criando agora plugins para Eclipse.

O exemplo a seguir me ajuda a ler qualquer .class Java para poder usar Reflection, obrigado Edson Tirelli, pela dica simplificada de capturar isto, segue aqui a dica:

JAVA:
  1. URL url = null;
  2. try {
  3. File dir = new File("/opt/java/redhat/jboss-studio/workspace/travelweb/build/classes/");
  4.  
  5. url = dir.toURL();
  6.  
  7. } catch (MalformedURLException e) {
  8. e.printStackTrace();
  9. }
  10. URL[] urls = {url};
  11. ClassLoader spec = new URLClassLoader(urls);
  12.  
  13. Class c = null;
  14. try {
  15. c = spec.loadClass("travelweb.entity.TravelRequest");
  16. e.printStackTrace();
  17. }
  18.  
  19. System.out.printf("On class %s I found the following fields",c.getName());

Estes dias tivemos que realizar uma prova de conceito se o DWR rodava no JBoss Portal. A minha primeira impressão era que seria possível, mas em primeira instância a referência aos JavaScripts deveria ser feita nos templates, porém devido a flexibilidade no JBP toda referência fica nas próprias Páginas enviadas para o cliente pelo o Portlet.

Veja o exemplo da chamada no Html:

HTML:
  1. <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
  2.  
  3. <% String contextPath = renderResponse.encodeURL(renderRequest.getContextPath()); %>
  4.  
  5. script type="text/javascript">
  6.  
  7. script type="text/javascript"><%=contextPath%>/dwr/util.js

Sendo assim, a referência é buscada pelo objeto renderResponse, retornando assim o local de execução do contexto http do jboss portal.

O código do Portlet é mais ou menos assim:

JAVA:
  1. package org.jboss.portal.samples.dwr;
  2.  
  3. import java.io.IOException;
  4. import javax.portlet.GenericPortlet;
  5. import javax.portlet.PortletException;
  6. import javax.portlet.PortletRequestDispatcher;
  7. import javax.portlet.RenderRequest;
  8. import javax.portlet.RenderResponse;
  9. public class DWRPortlet