Projeto para um Sistema de Informações Geográficas e Simulação de Tráfego Luiz Claudio Duarte Dalmolin Disciplina: Eng. De Sistemas Operacionais Prof. Dr. Antônio Augusto Fröhlich Apresentação • • • • • • • • • • • • • • • • O Domínio As Features Modelo de Componentes Demonstração do Sistema Design Patterns – Adapter Códigos do Adapter Os Aspectos Implementação em AspectJ Resultados da Aplicação de Aspectos Metaprogramação Generics in JAVA Limitações da linguagem JAVA e comparações com o C++. Reflexion in JAVA. Solução para o sceneryadapter Conclusões Bibliografia O Domínio • É um sistema computacional composto de softwares e hardwares, que permite a integração entre bancos de dados alfanuméricos (tabelas) e gráficos (mapas), para o processamento, análise e saída de dados georreferenciados.[1] • SIG podem ser úteis na visualização de problemas relacionados a transporte e logística. • Entidades governamentais podem usar estas ferramentas no planejamento de investimento em infraestrutura de transportes. • Empresas podem diminui seus custos com logística e distribuição. As Features Componentes cm p C o m p o n en t M o d el C am in h o s M ín im o s G is T o o ls R o t eirizad o r Pat h F in d er - D es tino: int O r ig em: int + C r iar ( ) : void São des enhadas «tr ac e» M ap B o x C u st o L o g íst ico C ons tr ói G erad o r d e Alt ern at iv as L o g íst icas G eren ciad o r d e C am ad as L eg en d as o o D raw G isO b ject s o o D rawL ayer «tr ac e» Parser Im ag em Alt a R eso lu ção An alisad o r d e R ed es «impor t» o o A llo cat io n Alo cad o r W ard ro p Alo cad o r T u d o o u N ad a Pode T er «impor t» Ap licação G is An alisad o r d e L in h as d e T ran p o rt e C o let iv o An alisad o r d e L in h as U rb an as o o L in eA n alizer Pode T er Pode T er «impor t» An alisad o r d e L in h as In t erest ad u ais «tr ace» G erad o r d e L o g d e Ev en t o s «tr ac e» «tr ac e» T im e C o u n t er Pode T er «tr ace» «impor t» Pode T«tr er ac e» Pode T«tr er ac e» Pode T er «tr ac e» G erad o r d e C en ário s F u t u ro s Alo cad o r d e Pro d u t o s M o n o p ro d u t o o o Pro d A llo cat io n M u lt ip ro d u t o C o n v erso r d e M at riz es Parser d e B an co d e D ad o s G IS C lu st eriz ad o r d e Pro cesso s O protótipo do sistema • O sistema foi desenvolvido em JAVA. • O sistema consiste numa série de Frames que mostram os campos necessários para a execução de um tipo de simulação. • Os Frames representam os componentes definidos no modelo. • É possível simular algumas funcionalidades de um SIG. Frames Implementados Design Pattern - Adapter • Transforma uma classe reusável com uma interface incompatível em uma nova classe com interface compatível. O problema • Tenho uma classe que implementa um método capaz de desenhar objetos (ponto, linha, área) no canvas. • Preciso Incluir/editar atributos neste desenho (Rótulos/Alterar cor) class Class Model Layers EA 6.5LineUnregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste ~ ~ ~ ~ ~ ~ coordX1: int coordX2: int coordY1: int coordY2: int count: int = 0 idObject: int # # # # # atributes: Atributes gisobjects: Vector<GisObject> kind: int name: String rotulado: boolean = false Atributes color: String EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial~~ Version EA 6.5 Unregiste «interface» font: String GisObject #atributes ~ sizefont: String Atributes(String, String, EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial++ Version EAString) 6.5 Unregiste getColor() : String + + + + + + + + + + + + + + + + + ~ + ~ getCoordX1() : int getCoordX2() : int getCoordY1() : int getCoordY2() : int getIdObject() : int Line(int, int, int, int) setCoordX1(int) : void setCoordX2(int) : void setCoordY1(int) : void setCoordY2(int) : void addObject(GisObject) : void getAtributes() : Atributes getGisobjects() : Vector<GisObject> getKind() : int getName() : String isRotulado() : boolean Layers(String, int) setDefaultAtributes(int) : void setName(String) : void setRotulado(boolean) : void + + + + + getFont() : String getSizefont() : String setColor(String) : void setFont(String) : void setSizefont(String) : void EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste Point int AreaVersion EA 6.5 Adapter EA~~ coordX: 6.5 Unregistered Trial Unregistered Trial Version Legado EA 6.5 Unregiste coordY: int ~ count: int = 0 ~ idObject: int ~points ~ count: int = 0 ~ idObject: int ~ points: Point ([]) ~ adaptee: Legado + + + + ~ printGisObject(int) : void ~adaptee # kind: int # name: String + Adapter(String, int) EA+ getCoordX() 6.5 Unregistered Trial Version EA Unregistered Trial Version EA 6.5 Unregiste + 6.5 draw(int) : void : int ~ draw(int) : void + + + + + getCoordY() : int getIdObject() : int Point(int, int) setCoordX(int) : void setCoordY(int) : void Area(Point[]) getIdObject() : int getPoints() : Point[] setPoints(Point[]) : void ~ getGisObject(Vector<GisObject>, int, int) : GisObject EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste EA 6.5 Unregistered Trial Version EA 6.5 Unregistered Trial Version EA 6.5 Unregiste Draw legado • • • • • • • • • • • void draw(int kind) { System.out.println("----------------------"); System.out.println("-----drawLegado-------"); switch (kind) { case 1:System.out.println(" Camada de Pontos Desenhada.");break; case 2:System.out.println(" Camada de Linhas Desenhada.");break; case 3:System.out.println(" Camada de Áreas Desenhada.");break; default:System.out.println(" Tipo de Camada Inválido."); break; } } Draw Adapter • • • • • • • • public void draw(int kind) { System.out.println("----------------------"); System.out.println("-----drawAdapter------"); System.out.println(" Camada.....:" + getName()); System.out.println(" Formato....:" + getKind()); System.out.println(" Cor........:" + getAtributes().color); System.out.println(" Fonte......:" + getAtributes().font); System.out.println(" Size Fonte.:" + getAtributes().sizefont); • System.out.println(" Rotulado...:" + isRotulado()); • printGisObject(kind); • } Print GisObject • • • • • • • • • • • • • void printGisObject(int kind) { for (int i = 0; i < gisobjects.size(); i++) { GisObject ob = (GisObject) adaptee .getGisObject(gisobjects, kind, i); switch (kind) { case 1: { Point obj = (Point) ob; System.out.println("---------------------------"); System.out.println(" id: " + obj.getIdObject()); System.out.println(" X: " + obj.coordX); System.out.println(" Y: " + obj.coordY); } (...) Construtor do adapter • • • • • • • class Adapter extends Layers; public Adapter(String name, int kind) { super(name, kind); adaptee = new Legado(); setDefaultAtributes(kind); adaptee.draw(kind); } Void Main Adapter cities = new Adapter("Cidades", 1); cities.gisobjects.add(new Point(1, 1)); cities.gisobjects.add(new Point(2, 2)); cities.gisobjects.add(new Point(3, 3)); cities.draw(1); Adapter states = new Adapter("Estados", 3); states.gisobjects.add(new Area(new Point[] { new Point(1, 1), new Point(2, 2), new Point(3, 3), new Point(1, 1) })); states.draw(3); Adapter municipios = new Adapter("Municipios", 3); municipios.gisobjects.add(new Area(new Point[] { new Point(1, 1), new Point(2, 1), new Point(2, 2), new Point(2, 1), new Point(1, 1) })); municipios.draw(3); Adapter rodovia = new Adapter("Rodovias", 2); rodovia.gisobjects.add(new Line(1, 1, 5, 2)); rodovia.atributes.setColor("Azul"); rodovia.draw(2); } Resultado --------------------------drawLegado------Camada de Pontos Desenhada. --------------------------drawAdapter-----Camada.....:Cidades Formato....:1 Cor........:Preto Fonte......:Arial Size Fonte.:8 Rotulado...:true --------------------------id: 0 X: 1 Y: 1 --------------------------id: 1 X: 2 Y: 2 --------------------------Ponto1 - Y: 1 id: 2 Ponto2 - X: 3 Ponto2 - Y: 3 X: 3 Ponto3 - X: 1 Y: 3 Ponto3 - Y: 1 --------------------------drawLegado-----------drawLegado------Camada de Linhas Camada de Áreas Desenhada. Desenhada. -----------------------------------------------drawAdapter----------drawAdapter-----Camada.....:Estados Camada.....:Rodovias Formato....:2 Formato....:3 Cor........:Azul Cor........:Azul Fonte......:Times Fonte......:Arial Size Fonte.:6 Size Fonte.:10 Rotulado...:false Rotulado...:false ----------------------------------------------------id: 0 id: 0 X1: 1 Ponto0 - X: 1 Y1: 1 Ponto0 - Y: 1 X2: 5 Y2: 5 Ponto1 - X: 2 Aspectos • Aspectos Implementados. • Gerador de Log de Eventos. • Time Counter de Uso. Código em AspectJ aspect RegistraModulo { LogManager lm = new LogManager("log.txt"); pointcut abreModulo(JFrame f) : args(f) && (execution(void openModule(JFrame))); void around(JFrame f) : abreModulo(f) { proceed(f); Date now = new Date(); try {lm.registraLog(now.toLocaleString() + "- Módulo " + f.getTitle() + " iniciado."); } catch (IOException e) { e.printStackTrace();} } pointcut fimMod() : (call (void finalize())); after() returning: fimMod() { LogManager lm = new LogManager("log.txt"); Date now = new Date(); try { lm.registraLog(now.toLocaleString() + "- Módulo Encerrado."); } catch (IOException e) { e.printStackTrace();}} } Código em AspectJ aspect Counter { long startTime; pointcut inicio() : (call (void openModule(JFrame))); after() returning: inicio() { startTime = System.currentTimeMillis();} pointcut fim() : (call (void finalize())); after() returning: fim() { Long now = System.currentTimeMillis() - startTime; Long mseg = now % 1000; Long seg = now / 1000; LogManager lm = new LogManager("log.txt"); try {lm.registraLog("Tempo em que o Módulo ficou ativo: " + seg + "," + mseg + "seg."); } catch (IOException e) { e.printStackTrace();}} } TXT gerado pelos Aspectos 16/05/2007 00:21:18- Módulo GIS TOOLBOX iniciado. 16/05/2007 00:21:18- A camada Estados foi criada. 16/05/2007 00:21:18- A camada Rodovias foi criada. 16/05/2007 00:21:21- Módulo Caminho Mínimo iniciado. 16/05/2007 00:21:22- Módulo Encerrado. Tempo em que o Módulo ficou ativo: 1,359seg. 16/05/2007 00:51:04- A camada Estados foi criada. 16/05/2007 00:51:04- A camada Rodovias foi criada. 16/05/2007 00:51:04- Módulo GIS TOOLBOX iniciado. 16/05/2007 00:51:06- Módulo Caminho Mínimo iniciado. 16/05/2007 00:51:08- Módulo Encerrado. Metaprogramação • Em java não existe meta programação. • Existem alguns trabalhos que buscam otimizar o código gerado pelo compilador mas ainda não estão consolidados. • JAVA aceita Manipulação em Tempo de Carga. Exemplo class SRLoader extends ClassLoader { public Class loadClass(String name) { byte[] bytecode = readClassFile(name); <mexa no bytecode o quanto quiser> return resolveClass(defineClass(bytecode)); } } Prova JAVA class Listaa<T1, T2, T3, T4, T5, T6> { Topo<T1> t; Cauda<T2, T3, T4, T5, T6> c; static int count = 1; static int polimorfic = 0; public Listaa(T1 ob1, T2 ob2, T3 ob3, T4 ob4, T5 ob5, T6 ob6) { this.t = new Topo<T1>(ob1); this.c = new Cauda<T2, T3, T4, T5, T6>(ob2, ob3, ob4, ob5, ob6); count = c.countItems(); } C++ // LIST metaprogram template <typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void> class LIST { private: typedef T1 Head; typedef LIST<T2, T3, T4, T5, T6> Tail; } Dificuldades • • • • Não se pode usar templates como no C. Não existe algo semelhante ao typedef. Não se pode redefinir o operador (new). Não conta com uma arquitetura reflexiva porque busca desempenho, type-safety. • Existe Reflexão em Java mas não em tempo de Compilação. Reflexion in Java • Reflexão ou introspecção é a capacidade de um programa de investigar fatos sobre si próprio. Por exemplo, um objeto pode "perguntar" a outro quais os métodos que ele possui. static public void executaMetodoPrintDaClasse(String s) { try { Class c = Class.forName(s); Method m = c.getMethod("print", null); Object o = c.newInstance(); m.invoke(o, null); } catch (Exception e) { System.out.println("Deu errado."); } } Generics • Java a partir da versão 5. permite o uso de programação genérica. • Disponbiliza um forma de comunicar o tipo de uma collection para o compilador poder fazer consistência. • Habilita um estilo de static factories. Ex.: AnnotatedElement interface: <T extends Annotation> T getAnnotation(Class<T> annotationType); É possível retornar uma instância adequada de <T>. Author a = Othello.class.getAnnotation(Author.class); Solução para SceneryAdapter Comentários • Ao usar uma collection poderia ser usado uma lista generica assim como foi proposto. • Cria-se uma classe Void, para simular posições vazias. • Nota-se que é necessário passar todos os parametros no construtor. • public static Listaa<ACounter, ALog, Void, Void, Void, Void> ls = • new Listaa<ACounter, ALog, Void, Void, Void, Void> • (new ACounter(), new ALog(), Null Null, Null, Null); O aspecto usado de maneira Genérica • • • • • • • • • • • • • • No momento em que um aspecto é adicionado a lista o seu construtor registra o log. class ALog extends Aspect { public ALog() { LogManager lm = new LogManager("log.txt"); Date now = new Date(); String strMsg = now.toLocaleString() + "- Log gerado "; try { System.out.println(strMsg); lm.registraLog(strMsg); } catch (IOException e) { e.printStackTrace(); } } } Classes da Lista • • • • • • • • • • • • • • class Cauda<T2, T3, T4, T5, T6> { T2 o2; T3 o3; T4 o4; T5 o5; T6 o6; public Cauda(T2 ob2, T3 ob3, T4 ob4, T5 ob5, T6 ob6) { this.o2 = ob2; this.o3 = ob3; this.o4 = ob4; this.o5 = ob5; this.o6 = ob6; countItems(); } class Topo<T> { T ob; public Topo(T o) { ob = o; } T getob() { return ob; } } Bibliografia S. Liang and G. Bracha. Dynamic Class Loading in the Java Virtual Machine. In Proceedings of the OOPSLA’98. pages 36-44. Vancouver, Canada. Apud in (http://gsd.ime.usp.br/seminars/2005/seminario.ppt) www.sun.com www.gisbrasil.com.br/ http://www.inf.pucminas.br/professores/torsten/aulas/