Software Reuse: Theory and Practice http://wp.me/pmzba-6b OSGi - Open Services Gateway Initiative Também conhecido como Dynamic Module System for Java Slide 1 de
Introdução O caso Eclipse Programação OSGi Exercícios práticos Conclusões Slide 2 de
A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações Java Dificuldade de gerenciamento de arquivos JAR Não há representação em tempo de execução Slide 3 de
Problemas com aplicações Java Camadas com fronteiras mal definidas Slide 4 de
Outros problemas com aplicações Java, especificamente com arquivos JAR Nome significativo Versões Dependências Necessidade um gráfico de dependências Necessidade de desacoplar Necessidade de Late Biding Slide 5 de
Pré-OSGi Eclipse < 3.0 Metadados em plugin.xml Plugins com nome significativo Versionamento no plugin.xml Dependências através de plugin.xml O que faltava? DINAMICAMENTE... Instalar Bundles Atualizar Bundles Remover Bundles Tudo on-the-fly Uma cirurgia no coração do eclipse para adicionar Equinox 3.0 (OSGi) Slide 6 de
Execution Environment Ambiente padronizado para aplicações chamadas de bundles Modules Políticas de carregamento de classes Classes privadas para módulos, bem como links controlados entre módulos Life Cycle Estados para os bundles - installed, started, stopped, updated and uninstalled Service Registry Provê cooperação entre os bundles Compartilhamento de objetos entre bundles Slide 7 de
Equinox Implementação de referência para o OSGi R4. Previamente instalada no coração do Eclipse. Apache Felix Implementação open source da Apache Software Foundation. Ainda não está completamente compatível com OSGi R4 knopflerfish Implementação open source para OSGi R3 and OSGi R4 Informações interessantes - Hello, OSGi, Part 1: Bundles for beginners http://www.javaworld.com/javaworld/jw-03-2008/jw-03- osgi1.html?page=1 Slide 8 de
Todo o acesso é feito através de BundleContext O mesmo é fornecido por um BundleActivator public class Activator implements BundleActivator { public void start(bundlecontext context) throws Exception { System.out.println("Starting..."); } } public void stop(bundlecontext context) throws Exception { System.out.println("Stopping..."); } Slide 9 de
MANIFEST.MF Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Osgiservice Plug-in Bundle-SymbolicName: edu.cesar.osgiservice Bundle-Version: 1.0.0 Bundle-Activator: edu.cesar.osgiservice.activator Slide 10 de
Exercício 1 Criar um Bundle que imprima Hello World a cada 2 segundos no console. Criar um build (.JAR) Instalar e executar o Bundle usando o Knopflerfish Slide 11 de
Criando seu primeiro serviço. Passo-a-passo: Crie a interface do Serviço Crie a implementaçao do serviço Crie um Bundle para registrar o serviço public void start(bundlecontext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get (Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; FirstService service = new FirstServiceImpl(); ServiceRegistration registration = bc.registerservice( FirstService.class.getName(), service, new Hashtable()); System.out.println("Service registered: FirstService"); } public void stop(bundlecontext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get (Constants.BUNDLE_NAME) + " stopping..."); Activator.bc = null; } Slide 12 de
Exercício 2 Criar a interface de um serviço Criar a implementação do serviço Criar um Activator para o serviço Registrar o serviço Fazer build e instalar Slide 13 de
Usando o serviço registrado public void start(bundlecontext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get( } Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; ServiceReference reference = bc.getservicereference (FirstService.class.getName()); FirstService service = FirstService)bc.getService(reference); System.out.println("Using FirstService: formatting date: " + service.getformatteddate(new Date())); bc.ungetservice(reference); Slide 14 de
Exercício 3 Criar um Bundle que registre um serviço Fazer build e instalar Criar Bundle que use um serviço Fazer build e instalar Atenção a ordem deve ser seguida Slide 15 de
Da forma que foi implementado, o que acontece se tentarmos usar o serviço que não foi registrado? ERR... Solução seria simplesmente testar se é nulo o serviço recuperado? O que aconteceria com serviços que fossem registrados depois da verificação do Activator para encontrar serviços? Solução: ServiceListener public void start(bundlecontext bc) throws Exception { } System.out.println("start " + getclass().getname()); Activator.bc = bc; String filter = "(objectclass=" + FirstService.class.getName() + ")"; bc.addservicelistener(this, filter); ServiceReference references[] = bc.getservicereferences(null, filter); for (int i = 0; references!= null && i < references.length; i++) { } this.servicechanged(new ServiceEvent(ServiceEvent.REGISTERED, references[i])); Slide 16 de
Exercício 4 Adaptar a solução encontrada no exercício 3 de tal forma a permitir a instalação de bundles fora de ordem (pesquisa dinâmica de serviços) Slide 17 de
Solução alternativa para o ServiceListener: ServiceTrackerCustomizer public void start(bundlecontext bc) throws Exception { } System.out.println(bc.getBundle().getHeaders().get( Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; customizer = new MyServiceTrackerCustomizer(bc); tracker = new ServiceTracker(bc, FirstService.class.getName(), customizer); tracker.open(); Slide 18 de
Exercício 5 Adaptar a solução encontrada no exercício 4 usando ServiceTrackerCustomizer e ServiceTracker Slide 19 de
Exercício final Implemente uma solução usando a tecnologia OSGi para implementar o componente MapLoader indentificado na aplicação Push to Map The application must be implemented for the JME platform and have to enable a user to locate contacts, displaying the contacts location in a map providing distance information. The maps used to draw the locations can be preloaded or retrieved from a remote server according to a predefined configuration. The application must support different map servers in order to expand the map coverage (Yahoo! maps, Google maps e Map24). The application allows the user to find his/her own GPS location and plots it in a map. Slide 20 de
Exercício final Slide 21 de
Exercício Final Implemente três bundles Bundle com o serviço de recuperação de Mapas considerando o componente que discutimos Bundle com o serviço de GPS Bundle usuário dos serviços que apresenta o mapa recuperado baseado na posição GPS passada como parâmetro através do objeto Coordinate Utilize a descoberta dinâmica de serviços Slide 22 de
O que vocês acharam? É útil? Grande interesse da indústria Diferentes containers Diferentes projetos explorando arquitetura baseada em OSGi Projetos apoiando o desenvolvimento em OSGi Projeto experimentando OSGi Mais informações em: http://www.pierocampanelli.info/articles/2006/11/15/osgiand-open-source-ecosystem/ Linha de pesquisa na área mobile JSR 232: Mobile Operational Management http://jcp.org/en/jsr/detail?id=232 JSR 249: Mobile Service Architecture 2 http://www.jcp.org/en/jsr/detail?id=249 Slide 23 de
OSGi Alliance http://www.osgi.org/ Equinox http://www.eclipse.org/equinox/ Knopflerfish http://www.knopflerfish.org/ Apache FELIX http://cwiki.apache.org/felix/index.html A Step by Step Introduction to OSGi Programming www.knopflerfish.org/tutorials/osgi_tutorial.pdf 5-minute guide to start developing with OSGi in Eclipse http://www.pierocampanelli.info/tutorials/2008/01/02/5- minute-guide-to-start-developing-with-osgi-in-eclipse/ Getting Started with OSGi http://live.eclipse.org/node/407 Slide 24 de
Tutorial OSGi Java World http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html http://www.javaworld.com/javaworld/jw-04-2008/jw-04-osgi2.html http://www.javaworld.com/javaworld/jw-06-2008/jw-06-osgi3.html OSGi on the Web: Here s How http://www.slideshare.net/mrdon/the-web-on-osgi-heres-how Spring Source OSGi Bundle Repository http://www.springsource.com/repository/app/ Andre L.C. Tavares, Marco Tulio Valente, "A gentle introduction to OSGi", SIGSOFT Software Engineering Notes, Volume 33, Issue 5, August 2008 Kiev Gama, Didier Donsez, "A survey on approaches for addressing dependability attributes in the OSGi service platform", SIGSOFT Software Engineering Notes, Volume 35, Issue 3, May 2010 (Almeida, 2007) E. S. Almeida, RiDE: The RiSE Process for Domain Engineering, Ph.D. Thesis, Federal University of Pernambuco, Informatics Center, Brazil, March, 2007, pp. 276. Slide 25 de