Começei a desenvolver um framework para sistemas com módulos…
E agora me veio uma duvida.
Até onde criei…
Uma classe le um arquivo xml que tem a seguinte estrutura
<?xml version="1.0" encoding="UTF-8"?>
<module>
<libs>
<lib>Cotacao.jar</lib>
</libs>
<mainmenu>
<menu name="Servicos" type="menu">
<menu name="Cotacao" type="menu">
<menu name="Cadastrar" type="item" class="br.cotacao.CotacaoGUI"
actionId="cad" />
<menu name="Consultar" type="item" class="br.cotacao.CotacaoGUI"
actionId="con" />
</menu>
</menu>
<menu name="Sair" type="item" />
</mainmenu>
</module>
Com esse xml o programa pega as libs que devem estar a partir de user.dir e as carrega (URLClassLoader)… e na parte dos menus ele recursivamente cria um menu e seus submenus e coloca ações para que quando clicados enviem um ActionEvent para a classe defenido no class do atributo do menu.
Mas…
Essa seria a parte mais interessante a ser explorada em um framework de módulos?
Eu estava pensando em criar um JDesktopPane que fora esse menu quando acionado o menu ele carrega a classe que devera extender JInternalFrame a ele mesmo… assim fica com uma cara mais legal… ou não?
Dai para adicionar mais módulos seria necessario apenas mudar o xml e colocar o .jar junto.
Mais pra frente pretendo fazer um controle de versão dos módulos e baixar novos também.
Se alguem quiser ajudar no projeto é bem vindo também.
Aqui esta o que fiz.
Sources do Main dentro do jar
O código da classe br.cotacao.CotacaoGUI é só isso…
package br.cotacao;
import javax.swing.JOptionPane;
import br.mf.action.ActionEvent;
import br.mf.action.ActionListener;
public class CotacaoGUI implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, arg0.getId());
}
}
Mark_Ameba,
Eu acho mais interessante um framework genérico para modularizar aplicações e não um que seja apenas para trabalhar com Swing/Awt.
Um xml para configurações do núcleo da aplicação é necessário tb para especificar variáveis globais da aplicação, mas acho interessante cada módulo ser um jar com um xml próprio do módulo para especificar suas funcionalidades. Assim ficaria bem dinâmico incluir um novo módulo já que não seria necessário mexer no xml da aplicação.
O que acha?
Abraço,
A minha ideia de ter apenas um arquivo de configuração era por que dai teriamos um sistema principal que carregava tudo a partir dali… e eu nunca gostei de muitos xmls…
Eu odiei muito ter que criar aqueles .hbm.xml files pra cada entidade do hibernate e fui direto para o Annotations.
A ideia de ter um xml pra cada módulo eu não achei legal… a não ser que tenhamos bem mais informações nos arquivos…
E a parte para modularizar qualquer aplicação é interessante eu só tava pensando como… pelo menos já temos um começo.
Esqueci de colocar um link… criei o projeto no source-forge
Só falta ser aprovado…
É… talvez não seja uma boa idéia ter um xml em cada módulo pq as informações do módulo não irão alterar muito. Poderíamos usar uma Enum em cada módulo para isso.
Eu estou pensando num jeito para tentar modularizar qualquer aplicação. Estou codificando alguma coisa e depois eu lhe passo.
Obs.: Não consigo ler as msgs privadas agora, só vou conseguir à noite.
Eu só tinha perguntado se voce sabia usar o Java Web Start.
Uma questão é… alguem que quer usar um sistema modular espera o que?
Se eu fosse usar eu iria ser no sentido que estava fazendo teria links de uma pagina que chamaria metodos dos módulos.
E ainda controla-se a versão… que é pra isso o JWS… mas podemos generalizar mais para usar em qualquer sistema.
Eu não tava usando o SAX no parser, tava usando o DOM.
Mas toda ajuda é bem vinda.
Eu to mais preocupado agora em o que um framework para sistemas modulares deveria fazer. =/
A minha ideia é distribuir os jars de cada modulo e ter uma tela que os enchergue e as encaixe.
Mudei o sistema e tirei o vinculo dele com o Swing… e praticamente o que restou é um Parser pro xml de configuração e um ClassLoader.
To postando um exemplo com os JavaSources dentro.
O main é praticamente…
File file = new File(System.getProperty("user.dir") + "/cfg.xml");
ConfigParser cfg = new ConfigParser(file);
ModuleLoader loader = cfg.createModuleLoader();
Class<?> clazz = loader.loadModule("Authenticator");
Authenticator auth = (Authenticator) clazz.newInstance();
System.out.println(auth.canLogin("Marky", "Marky"));
System.out.println(auth.canLogin("Marky", "ykraM"));
E o modulo Authenticator é um outro jar que esta junto que implementa essa classe.