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/
Download

Projeto para um Sist..