Home

Relatório e Apêndices em PDF

image

Contents

1. 1S2 new JPanel new Flow font new F lSolucaol se lSolucao2 se lSolucaol lSolucao2 painelS1 add painelS1 add setForeground setForeground Layout Flow ont Tahoma Font PLAIN 14 tFont font tFont font Color black Color black 1Solucaol 1Solucao2 DH painelS2 add bOutraS new JButton Outra Solu o bConfirmar new JButton Confirmar Marca o JButton bCancelar new JButton Cancelar bOutraS setEnabled false bConfirmar setEnabled false painelS2 add bOutraS bConfirmar Layout RIGHT 10 10 57 painelS2 add bCancelar painelS add painelS1 painelS add painelS2 disposig o dos objectos JPanel painelPrincipal new JPanel new BorderLayout painelPrincipal add painelN BorderLayout NORTH painelPrincipal add painelC BorderLayout CENTER painelPrincipal add new JPanel BorderLayout EAS painelPrincipal add new JPanel BorderLayout WEST painelPrincipal add painelS BorderLayout SOUTH Mo setContentPane painelPrincipal Acc es dos but es e campos de texto bOutraS addActionListener new ActionListener public void actionPerformed ActionEvent e bOutraS setEnabled false bConfirmar setEnabled false 1Solucao2 setText Pesquisando Outra Solu o AgendaC cliente msgKOML ask AgendaC cliente idC
2. if AlgS fim 1 amp amp novaHora 1 AgendaS router msgKQML ask AgendaS router idS AlgS nomeR j meeting novaHora msgKOML perform idS idC stdoutl AlgS nomeR j meeting novaHora else if novaHora 1 AlgS auxFim if AlgS auxFim AlgS nomeR length System out println ESGOTEI AS SOLUCOES msgKQML perform idS idC solution 1 public void confirmarSolucao String conteudo for int i 0 i lt AlgS nomeR length i 73 AgendaS router msgKOML perform AgendaS router idS AlgS nomeR i confirmedMe eting AlgS solucao 7 conteudo int hora AlgS solucao 7 String desc AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo Integer chave new Integer AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo conteudo AlgS retiraValor conteudo int duracao Integer parseInt AlgS proximoValor conteudo Ocup ocupacao new Ocup desc hora hora duracao 3 AlgS insereReuniao chave ocupacao public void cancelarReuniao AlgS fim 1 AgenteR java import Abstract import KOMLLayer import RouterLayer AgentClient import java io import java util import java net public class AgenteR extends RouterClientAction public public public public public tatic String idS tatic String
3. System out println command args 0 else if command equals InitializeFailed System out println command args 0 endAction protected boolean Act Object o System out printin String o try KOMLmessage mKQML new KQMLmessage String o String tipo mKQML getValue performative String emissor mKOML getValue sender String conteudo mKOML getValue content if tipo equals reply amp amp conteudo startsWith week introduzirSemana conteudo substring 6 else if tipo equals reply amp amp conteudo startsWith connectedUsers utilizadores conteudo substring 16 AlgC resposta 0 else if tipo equals perform amp amp conteudo startsWith stdoutl imprimeEmJComunicl conteudo substring 9 else if tipo equals perform amp amp conteudo startsWith stdout2 imprimeEmJComunic2 conteudo substring 9 else if tipo equals reply amp amp conteudo startsWith login trataRespLogin conteudo substring 7 else if tipo equals perform amp amp conteudo startsWith solution trataSolucao conteudo substring 10 return true catch KOMLLayer ParseException e 27 System out println e toString return false public boolean msgKOML String tipo String emissor String receptor String msg criac o de uma mensagem KQML KOMLmessage mKO
4. catch Exception e System out println e toString public boolean ligaAoServidor String local String porto try InetAddress localhost InetAddress getLocalHost System out println Localizag o actual localhost getHostName idS Servidor localS local portoS porto tipoS AgenteS idC Cliente localC localhost getHostName tipoC AgenteC catch Exception e System out println e toString return false try como o id igual nas v rias tentativas o address escrito sempre por cima System out println Servidor idS localS portos tipoS Address addr new Address idS localS portoS tipoS addresses addAddress addr idS addr getID como o id igual nas v rias tentativas o address escrito sempre por cima System out println Cliente idC localC portoC tipoC addr new Address idC localC portoC tipoC addresses addAddress addr idC addr getID setName idC 26 catch Exception e System out println e toString return false if msgKQML perform idC idS newConnection idC tlocalC portoC tipoC return false return true public void processMessage String command Object obj String args String obj if command equals UnsupportedType
5. return dados row col public void setValueAt Object value int row int col dados row col value JAgenda java import java util import java awt import java awt event import javax swing import javax swing table A janela principal da aplicacao cliente class JAgenda extends JFrame nome da janela principal private static final String Titulo Agenda 2000 pr pria janela para ser usado nas inner classes private JFrame eu margens das toolbar s private Insets margemToolBar new Insets 5 5 5 5 menu principal de topo JMenuBar menu toolbar da parte norte da janela private JToolBar toolBarNorte toolbar da parte oeste da janela private JToolBar toolBarOeste tabela e respectivo scroll do centro da janela private TAgenda tabela public static JScrollPane scrollpane bot es private JButton butao Label da semana da parte de cima da janela private JLabel labelSemana resolucao do bug de clearSelection private boolean flag true definig o das acc es private Action novaLigacao private Action sair private Action abreJOcupacao private Action apagaOcupacao private Action abreJReuniao 38 private Action semanaSeguinte private Action semanaAnterior private Action acerca construtor public JAgenda String login super Titulo Bemvindo login eu this constroi accoes con
6. Fim Solu o hora cuja m dia foi calculada Comunica es Como atr s descrito para implementar a interacg o entre os processos usou se o JATLite Usaram se dois tipos de comunicac o a intra agente entre o processo gestor do interface e o gestor da agenda e as inter agente entre os processos gestores da agenda atrav s do router A primeira realizou se atrav s da extens o do KQMLActionAgent enquanto a segunda do RouterClientAction Como se pode verificar pela figura a interac o intra agente tem menos funcionalidades pois de uma camada inferior ch inter agente Esta 11 escolha foi propositada pois os di logos internos ao agente n o necessitam de um intermedi rio router tornado a sua execu o menos pesada User Access yor ProtocolLayer RouterLayer Base Layer Abstract Layer JATLite Layers Na aplica o que gere a agenda existe uma classe que trata cada tipo de comunicac o Logo este necessita de pelo menos um porto para transmitir e receber mensagens do processo que trata do interface e de outro para o fazer com o router Na criag o das comunicag es intra agente que seguir um conjunto de passos Para come ar temos que inicializar um conjunto de vari veis tais como a tabela de endere os a das conec es e o buffer das mensagens Al m disso deve se inicializar a classe security que nos ir testar o protocolo de ligac o e actualizar as vari veis atr s descritas sempre que
7. bgGrupo add rbPref 0 bgGrupo add bgGrupo add bgGrupo add bgGrupo add new JLabel Prioridade 7 da janela JPanel painelS new JPanel bot es ok e cancelar JButton bOK new JButton OK constroiAccao bOK addActionListener bOKAccao JButton bCancelar new JButton Cancelar painelS add bOK painel LS add bCancelar disposig o dos objectos JPanel painelPrincipal painelPrincipal lPrincipal painelPrincipal paine painelPrincipal new JPanel painelPrincipal painelPrincipal setLayout new BorderLayout 15 1 add new JPanel BorderLayout 5 EAS add new JPanel BorderLayout add painelN BorderLayout NORTH add painelC BorderLayout CEN add painelS BorderLayout SOUTH this setContentPane painelPrincipal Acc es dos but es e campos de texto bCancelar addActionListener new ActionListener ER WES DH MM ne 48 public void actionPerformed ActionEvent e eu dispose tDescricao addActionListener new ActionListener public void actionPerformed ActionEvent e tDescricao transferFocus Hi para fechar o program ao carregar na cruz addWindowListener new WindowAdapter public void windowClosing WindowEvent e eu dispose y private void constroiAccao bOKA
8. dia Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo mes Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo ano Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo desc AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo horai Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo horaf Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo prior Integer parseInt AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo Ocup ocupacao new Ocup desc horai horaf prior AlgC insereOcupacao dia mes ano ocupacao AlgC resposta 0 JAgenda scrollpane repaint public String pedeListaUtil msgKQML ask idC idS connectedUsers AlgC esperaResposta return utilizadores public void marcaReuniao String reuniao msgKQML ask idC idS newMeeting reuniao public void imprimeEmJComunicl String conteudo String r AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo String f conteudo substring 0 conteudo indexOf if f equals meeting AlgC comunic tEnviadas append Para r Qual a tua disponibilidade s 29 AlgC comunic tEnvia
9. menu add mHorario menu add mSemana menu add mAcerca setJMenuBar menu private void constroiNorte n o se pode fazer drag and drop toolBarNorte setFloatable false para centrar toolBarNorte addSeparator new Dimension 100 1 int diaSemana AlgC agora get Calendar DAY OF WEEK if diaSemana 1 diaSemana 8 AlgC agora add AlgC agora DATE diaSemana 2 int diai AlgC agora get AlgC agora DAY OF MONTH int mesi AlgC agora get AlgC agora MONTH 1 43 int anoi AlgC agora get AlgC agora YEAR AlgC agora add AlgC agora DATE 6 int diaf AlgC agora get Calendar DAY OF MONTH int mesf AlgC agora get Calendar MONTH 1 int anof AlgC agora get Calendar YEAR label da semana actual com letra realcada labelSemana new JLabel Hor rio da Semana diai mesi anoi a diaf mesf anof labelSemana setForeground Color black Font font new Font Tahoma Font BOLD 22 labelSemana setFont font labelSemana setAlignmentY CENTER ALIGNMENT toolBarNorte add labelSemana JPanel painel new JPanel new FlowLayout FlowLayout RIGHT botao semana anterior butao new JButton new ImageIcon imagens anterior gif butao setToolTipText Semana Anterior butao setAlignmentY CENTER ALIGNMENT butao addActionListener semanaAnterior painel
10. null if readline startsWith portoS readline break InetAddress localhost InetAddress getLocalHost System out println Localizag o actual localhost getHostName idS Servidor localS localhost getHostName tipoS AgenteS System out println Servidor T idS localS portos tipoS Address addr new Address idS localS portoS tipoS _addresses addAddress addr idS addr getID input close deve ser instanciado depois da tabela ter sido criada security new KQMLSecurity addresses ServerThread server createServerThread idS Thread NORM PRIORITY if server null String args new String 1 args 0 idS processMessage InitializeFailed args catch Exception e System out println e toString 67 public void processMessage String command Object obj String args String obj if command equals UnsupportedType System out println command args 0 else if command equals InitializeFailed System out println command args 0 endAction protected boolean Act Object o System out println String o try KOMLmessage mKQML new KQMLmessage String o String tipo mKQML getValue performative String emissor mKQML getValue sender String conteudo mKOML getValu
11. return false public boolean horalnicial int hi if hi lt horaf horai hi return true return false public boolean horaFinal int hf if hf horai horaf hf return true return false public boolean novaPrioridade int p if p gt 1 amp amp p lt 6 prior p return true return false public int devolveLinhaInicial return horai AlgC HoraInicial public int devolveLinhaFinal return horaf AlgC HoraInicial JPass java import javax swing JDialog import javax swing JOptionPane import javax swing JLabel import javax swing JTextFielg import javax swing JPasswordField import javax swing JButton import javax swing JPanel import java beans Property change stuff import java awt import java awt event class JPass extends JDialog pr pria janela para ser usado nas inner classes 32 private JDialog eu private JTextField tLogin private JTextField tLocal private JTextField tPorto private JPasswordField tPass public JPass super eu this this setResizable false setTitle Seguranga o acesso interdito punido por lei criac o e inicializag o dos labels da janela inicializag o dos campos de introdug o dos dados tLogin new JTextField 10 tLocal new JTextField 15 tPorto new JTextField 4 tPass new JPasswordField 10 tPass setEc
12. set CLASSPATH CLASSPATH Ap s isto preciso p r a correr o router atrav s do seguinte comando executado no direct rio deste java RouterLayer Router RouterAction RouterLayer Resource routerscript 19 De seguida necess rio executar os processos gestores dos hor rios com o seguinte comando para cada um deles java Agendas Para podermos comegar a interagir com o programa preciso criar pelo menos um interface java AgendaC Manual de Utiliza o Agora que inicializamos a nossa aplica o temos que introduzir um login e uma password especificados anteriormente no ficheiro AgenteS do processo gestor da agenda correspondente Al m disso temos que indicar a localiza o do host deste ltimo pelo meio do nome do computador e respectivo porto Ao entrar no programa propriamente dito se quisermos adicionar uma nova ocupa o basta seleccionar na tabela as horas e depois carregar sobre o bot o cujo icon um pato Existe ainda outra maneira de realizar esta opera o que carregar logo no icon sem seleccionar nada contudo preciso introduzir mais informa o pelo teclado Para remover uma ocupa o basta selecciona la e carregar no bot o de apagar indicado por uma cruz Quanto marca o de reuni es pode ser feita atrav s do bot o com o icon do mundo Depois necess rio introduzir os dados relativos a esta indicando o grau m dio m ximo de indisponibilidade pretendida Os utilizado
13. Seria de corrigir certos bugs como por exemplo a da selec o na tabela do hor rio atrav s do rato que deixa seleccionar linhas e colunas em vez de deixar seleccionar apenas uma coluna de cada vez Existe ainda um pequeno pormenor que seria de corrigir que era n o deixar efectuar marca es em simult neo Ou seja quando uma marca o estivesse em curso n o deixar que outro utilizador pudesse fazer outra se um ou mais dos intervenientes entrasse em ambas Manual do Utilizador Manual de Instalac o Para a correr o programa n o necess rio instalar previamente o JATLite visto que as classes usadas deste j est o inclu das no programa Antes de iniciar a execu o do programa pode ser necess rio configurar os ficheiros AgenteC para os gestores do interface e AgenteS para os gestores da agenda Cada gestor da agenda conv m ter pelo menos um nome diferente Em principio s ser necess rio configurar a m quina onde corre o router o login e password Para isso altera se os campos a bold do ficheiro AgenteS do gestor da agenda AgenteS nome do gestor da agenda Antonio password spr porto da agenda para o interfac Agentes 6666 porto da agenda para o router AgenteS 6667 password agent info password a dados do router AgenteR Router coyote ugly 6663 RouterServerThread agent info agent name AMR RouterRegistrar coyote ugly 6664 RegistrarServerThread Registrar 18
14. import java awt event import java util class JOcup extends JDialog pr pria janela para ser usado nas inner classes private JDialog eu TextField tDescricao private JTextField tDia privat TextField tMes private J J J private JTextField tAno J J J private JComboBox cHoralnicio private JComboBox cHoraFim private JRadioButton rbPref new JRadioButton 5 private ButtonGroup bgGrupo private Action bOKAccao public JOcup Frame janela super janela true eu this constroiJanela public JOcup Frame janela int dia int mes int ano int horai int horaf super janela true eu this constroiJanela tDia setText new Integer dia toString tMes setText new Integer mes toString tAno setText new Integer ano toString cHoralInicio setSelectedIndex horai AlgC HoraInicial cHoraFim setSelectedIndex horaf AlgC Horalnicial 1 public JOcup Frame janela int dia int mes int ano Ocup ocupacao super janela true eu this constroiJanela tDia setText new Integer dia toString tMes setText new Integer mes toString 46 tAno setText new Integer ano toString tDescricao setText ocupacao devolveDescricao cHoraInicio setSelectedIndex ocupacao devolveHInicial AlgC Horalnicial cHoraFim setSelectedIndex ocupacao devolveHFinal Al
15. ocupacaoAux Ocup iLista next hiAux ocupacaoAux devolveHInicial if hi lt hiAux iLista previous iLista add ocupacao flag false break if flag iLista add ocupacao horario put chave lista 82 public synchronized static void insereOcupacao Integer chave Ocup ocupacao boolean flag true int hi hiAux List lista ListIterator iLista Ocup ocupacaoAux hi ocupacao devolveHInicial lista List horario get chave if lista null lista Collections synchronizedList new LinkedList lista add ocupacao else synchronized lista iLista lista listIterator 0 for int j 0 j lt lista size j ocupacaoAux Ocup iLista next hiAux ocupacaoAux devolveHInicial if hi lt hiAux iLista previous iLista add ocupacao flag false break if flag iLista add ocupacao horario put chave lista public synchronized static void apagaOcupacao int dia int mes int ano int horai List lista ListIterator iList Ocup ocup Integer chave determinaChave dia mes ano lista List horario get chave if lista size lt 1 horario remove chave else synchronized lista iList lista listIterator while iList hasNext ocup Ocup iList next if horai ocup devolveHInicial lista remove ocup break horario put chave lista publi
16. Soluc o lSolucao2 new JLabel Pesquisando Solug o inicializac o dos campos de introdug o dos dados tEnviadas tRecebidas new JTextArea new JTextArea n o edit veis tEnviadas se tRecebidas s t e Editable false Editable false parte norte da janela JPanel painelN new JPanel new FlowLayout FlowLayout CENTER 15 15 JLabel lComunic new JLabel Comunica es lComunic setForeground Color black Font font new Font Tahoma Font BOLD 15 lComunic setFont font painelN add lComunic parte centro da janela JPanel JPanel JPanel L pain L pain 1C1 new JPanel new Borderl 1C2 new JPanel new Borderl sEnviadas sRecebidas LCl LCL painel painel LC2 LC2 painel painel LC add LC add painel painel parte sul JPanel pain add 1 add s add add Enviadas tRecebidas new JScrollPane tl new JScrollPane Enviadas Borderl Enviadas Borderl Layout NORT Layout CENTFE A s Recebidas Border Recebidas Borderl Layout NORTH Layout CENTER painelC1 painelC2 da janela painelC new JPanel new GridLayout 2 1 20 20 Layout Layout lS new JPanel new GridLayout 2 1 10 10 JPan pain JPan pain 151 new JPanel new FlowLayout Flow ayout LEFT 10 10
17. 1f i 12 i2 12 itt iteml String 11 il item2 String 12 i2 dif iteml compareTolgnoreCase item2 if dif 0 lf i 11 iteml else lf i item2 12 return 1f public static Object subtraiListas Object 11 Object 12 int i j k 20 boolean n true int tam String iteml item2 Object 1f if tam 11 length 12 length lt 0 tam tam lf new Object tam for i 0 i lt 11 length i iteml String ll i for 3 0 3 lt 12 length j item2 String 12 3 if iteml equals item2 n false break if n lf k 11 i k n true return lf public static boolean verificaData int dia int mes int ano if dia 1 dia gt 31 return false if mes lt 1 mes gt 12 return false if ano lt 1999 ano gt 2010 61 return false return true public static boolean verificaDatas int diai int mesi int anoi int diaf int mesf int anof if anoi gt anof return false if anoi anof amp amp mesi gt mesf return false if anoi anof amp amp mesi mesf amp amp diai gt diaf return false return true public static int passaParaHoras int linha return linha Horalnicial public static void inicializaHorario horario new Hashtable AgendaC cliente pedeSemana 0 public static Integer determinaChave int dia int me
18. Neste caso as m dias das horas 7 12 e 16 j foram testadas e n o s o inferiores m dia m xima de indisponibilidades logo a marca o ainda n o terminou Se o ltimo valor a ser acrescentado fosse o das 8 horas da Gena seria pedida a esta a hora 9 pois uma das que tem menor m dia e ainda n o foi pedida Ent o a matriz ap s a chegada dessa resposta seria a seguinte Hors 7 8 9 10 11 12 13 14 is 16 17 fis 19 20 C sar O 1 O a 5 2 J Ja E 3 fa 4 fi fa M dia 2 2 033 0 2 33 2 33 1 33 1 66 1 66 2 66 0 O 1 66 1 33 Ao chegarmos a este ponto o processo terminaria pois a coluna das 9 horas encontra se toda preenchida e o valor da m dia inferior ao especificado Seria enviada para o ecr a resposta devida 10 Fluxograma Inicialmente pergunta se a todas as agendas quais as indisponibilidades hora pretendia pela agenda marcadora Por cada resposta Espera uma resposta Chegada de resposta Para a hora pedida e depois para a hora alternativa Pede prioridade agenda que deu a resposta da hora calculada Calculo da m dia das indisponibilidades da hora Descobre qual a hora com menor m dia de indisponibilidades cuja O n de respostas j obtidas aquela agenda que deu a resposta ainda hora igual ao r de intrevinientes n o respondeu m dia calculada menor que a m dia m xima de indisponibilidades indicada pelo utilizador
19. Se a semana actual se encontrar entre o intervalo definido por estes dois valores as ocupa es desta semana n o necessitam de ser carregadas do processo gestor da agenda pois j est o na cache do 15 processo do interface Para n o haver inconsist ncias todas as altera es realizadas sobre ocupa es neste ltimo s o prontamente notificadas ao processo gestor da agenda No arranque do interface o hor rio encontra se vazio existindo um pedido aplica o que gere a agenda para enviar as ocupa es da semana actual Quando a interface desligada a cache esquecida n o havendo possibilidade de terceiros a visualizarem Todos os campos introduzidos na interac o atrav s da interface s o testados pois podem conter valores inv lidos Caso isso acontega sempre enviado para o ecr uma janela de erro An lise da complexidade do algoritmo Achamos que se trata de um algoritmo suficiente que tenta reduzir o n mero de mensagens enviadas pelo processo marcador Chegamos conclusio que por dia por cada processo gestor da agenda na pior das hip teses s o enviadas horas do dia 2 mensagens Mesmo com muitos agentes o c lculo das m dias nunca ser muito trabalhoso visto que o n mero deste tamb m nunca dever ultrapassar as centenas Como estamos a receber mensagens pelo meio da rede estas v o chegando mais ou menos aleatoriamente e como temos threads a tratar de cada uma podemos dizer que o nosso algoritmo
20. de certo modo multiprogramado Por isso tamb m houve a necessidade de declarar alguns procedimentos como synchronized para que n o houvesse problemas relacionados com a multiprogramac o Um algoritmo que apenas calculasse a solug o ptima n o teria gra a pois o n mero de mensagens seria sempre o mesmo ou seja o processo gestor do hor rio teria sempre que saber quais as indisponibilidades a todas as horas de todas as outras agendas Recursos Bibliografia gt Artificial Intelligence a modern aproach Stuart Russel e Peter Norvig 1995 Prentice Hall gt Acetatos fornecidos pelos docentes da cadeira de Sistemas Periciais e Rob tica gt Documenta o fornecida conjuntamente com as ferramentas utilizadas no desenvolvimento desta aplica o www java stanford edu gt Apie tutorial do Java Ferramentas de desenvolvimento gt JDK 1 2 gt JATLite gt Windows 98 NT 16 Especificac o do sucesso Um programa deste tipo dever satisfazer os seguinte itens Interface amig vel O interface dever ser o mais intuitivo poss vel de modo a que o utilizador se sinta o mais vontade a trabalhar no sistema Robustez O programa dever ser o mais robusto poss vel isto dever detectar o maior n mero de situa es de erro prevenindo os ou recuperando os Rapidez O sistema ter de produzir uma resposta dentro de um tempo aceit vel gt Qualidade T o importante como a rapidez de re
21. new JTextField 2 tAno new JTextField 4 cHoraInicio new JComboBox horasI cHoraFim new JComboBox horasF localizag o dos componentes painelCl add lDescricao painelC1l add tDescricao painelC2 add lData painelC2 add tDia painelC2 add new JLabel painelC2 add tMes painelC2 add new JLabel painelC2 add tAno painelC3 add lHoraInicio painelC3 add cHoraInicio painelC3 add lHoraFim painelC3 add cHoraFim 47 criag o rbPre rbPre rbPre rbPre rbPre val rbPre rbPre rbPre rbPre rbPre val Fh H H H H O 0 new new new new new Fh Fh Fh H H Ss LU NH LU K LA OO SetActionCommand SetActionCommand dos radio buttons JRadioButton E JRadioButton u JRadioButton M dia JRadioButton JRadioButton s dos radio buttons setActionCommand SetActionCommand SetActionCommand r por defeito rbPr grupo paine paine parte sul H O JLabel lPrior painelC4 add lPrior painel painelC4 painelC4 painelC4 painelC4 painelC add lC add painelC add lC add C4 Di d d ooo d d Di rbPref 1 rbPref 2 rbPref 3 rbPref 4 d rbPref 0 d rbPref 1 dd rbPref 2 d rbPref 3 d rbPref 4 painelC1 painelC2 painelC3 painelC4 2 setSelected true de radio buttons bgGrupo new ButtonGroup
22. um mundo aparecendo a seguinte janela que precisa de ser preenchida Hc Nova Reuni o Horas _ 7tt 00 Dascricha Reuni o de SPR Dura o toa A gon 2 fron II l x M dia minima da indispoeiilidades 1 00 Marca o de Nova Reuni o pata prevista 0 01 2001 Mora presta wm e f How Outras Agendas Marcar Rount o com E zm emm EN Casar 13 00 PS 15 00 4 Ao carregar sobre o bot o Marcar uma nova janela aberta mostrado as comunica es e a solu o obtida para a marca o anterior quando encontrada in 2000 Bonivinda Antonia Comunica es Mensagens en ndan Para Cesar Marca o de reuni o para o dis 01 01 2001 com a dura o de 1 hora A Para Gana Marca o de reuni o para n dia 01 01 2001 com a dura o de 1 hora Para Cesar Qual atua disponibilidade s 107 Para Cera Qual a lua disponiblidade s 107 x Para Casar Qual a tua disponibilidade s 8 7 e Mensagens recebidas Da Casar s 10 tenho a disponibilidade de O Como altamalrea zc 7 tenho a disponibilidade de De Gana As 10 tenho a disponibilidade de D Como allernafva s 7 tenho a disponibilidade de O De Casar As 8 tenho s disponibilidade da U Como alternativa s 9 fanho a diasponibilidada de D Solu o Reuni o s 10 com um crau medio de indisponibildades de D O Aqui podemos pedir uma nova solu
23. 2 hora Integer parseInt AlgS proximoValor conteudo 7 conteudo AlgS retiraValor conteudo prior Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo simNao AlgS proximoValor conteudo decobre qual o indice do utilizador que enviou a resposta for int i20 i AlgS nomeR length i if AlgS nomeR i equals emissor nUtil i calcula a m dia AlgS solucaoR nUtil hora new Integer prior if AlgS fim 1 amp amp AlgS calculaMedia hora AlgS nomeR length 1 AlgS fim 0 if simNao equals yes conteudo AlgS retiraValor conteudo altHora Integer parseInt AlgS proximoValor conteudo 7 conteudo AlgS retiraValor conteudo altPrior Integer parseInt AlgS proximoValor conteudo calcula m dia para a hora alternativa AlgS solucaoR nUtil altHora new Integer altPrior if AlgS fim 1 amp amp AlgS calculaMedia altHora AlgS nomeR length 1 AlgS fim 0 if AlgS fim 1 acha o valor n o ocupado com a menor m dia for int i20 i 14 i if AlgS solucaoR nUtil i intValue 1 if AlgS mediaR i floatValue lt x floatValue x AlgS mediaR il novaHora i 7 System out println Nova Hora novaHora if AlgS fim 1 amp amp novaHora 1 msgKQML ask idS AlgS nomeR nUtil meeting novaHora AgendaS servidor msgKOML perform AgendaS se
24. 9 super paintComponent g d AlgC agora get AlgC agora DAY OF MONTH m AlgC agora get AlgC agora MONTH a AlgC agora get AlgC agora YEAR Calendar cal new GregorianCalendar a m d cal add cal DATE 7 for int i 1 i lt 7 i Ccal add cal DATE 1 dia cal get cal DAY_OF_MONTH mes Cal get cal MONTH 1 ano cal get cal YEAR chave AlgC determinaChave dia mes ano lista LinkedList AlgC horario get chave if lista null iLista lista listIterator 0 while iLista hasNext ocupacao Ocup iLista next System out println ocupacao devolveDescricao pintaOcupacao ocupacao devolveDescricao ocupacao devolveLinhaInicial ocupac ao devolveLinhaFinal i 9 if AlgC seleccao null pintaSeleccao AlgC seleccao devolveLinhaInicial AlgC seleccao devolveLinhaFin al AlgC colunaSeleccao g private void pintaOcupacao String descricao int linhaInicial linhaFinal int coluna Graphics g Rectangle rect getCellRect linhaInicial coluna true dif linhaFinal linhaInicial largura int rect getWidth altura dif int rect getHeight nletras largura npixeis 1 if nletras lt descricao length descricao descricao substring 0 nletras int 36 pinta rectangulo da ocupac o g setColor Color black g fillRect int rect getX int rect getY largura altura g
25. AlgC retiraValor utilAux ntt listal new Object n 1 n 0 while util indexOf 1 listal n AlgC proximoValor util util AlgC retiraValor util ntt listal n AlgC proximoValor util public static void main String argv JReuniao agenda new JReuniao new JFrame agenda setSize 870 575 agenda setLocation 70 66 agenda show JComunic java import javax swing JDialog import javax swing JOptionPane import javax swing JLabel import javax swing JTextArea import javax swing JButton import javax swing JPanel import javax swing JScrollPane import java beans Property change stuff import java awt import java awt event class JComunic extends JDialog pr pria janela para ser usado nas inner classes private JDialog eu public JTextArea tEnviadas public JTextArea tRecebidas public JScrollPane sEnviadas public JScrollPane sRecebidas public JLabel 1Solucao2 public JButton bOutraS public JButton bConfirmar public String mensagem public String d public JComunic String msg String data Object lista super eu this mensagem msg float c 56 d data setTitle Comunica es criag o e inicializac o dos labels da janela nviadas JLabel lEnviadas new JLabel Mensagens JLabel lRecebidas new JLabel Mensagens recebidas JLabel lSolucaol new JLabel
26. Login e password do processo interface correspondente indicado no ficheiro Porto para comunicar com o processo gestor da interface indicado no ficheiro Porto do processo gestor da agenda indicado no ficheiro Localiza o do processo gestor da agenda gt obtida atrav s da classe InetAddress Endere o do Router e RouterRegistar gt indicado no ficheiro ainda necess rio controlar um conjunto de ficheiros para o correcto funcionamento do router do JATLite Estes s o inicializados na instala o do JATLite podendo ser posteriormente modificados Quanto ao processo que gere o hor rio utilizar comunicag es diferentes com portos diferentes para comunicar com o processo respons vel pelo interface e para comunicar com o router Implementa o A descri o da implementa o ser dividida nos quatro m dulos principais atr s explicados Manipula o da agenda As opera es poss veis sobre os hor rios s o as de inser o remo o e altera o de ocupa es Existe ainda a opera o de gravar contudo esta feita sobre a tabela de dispers o que cont m listas constitu das por ocupa es Na introdu o de ocupa es come amos por verificar se o elemento da hashtable indicado pela chave data da ocupa o j possui alguma ocupa o Se n o possuir nenhuma apenas necess rio criar uma lista com a nova ocupa o e introduzi la na tabela de dispers o Caso contr rio temos que pesquisar na
27. add butao botao semana seguint butao new JButton new ImageIcon imagens seguinte gif butao setToolTipText Semana Seguinte butao setAlignmentY CENTER ALIGNMENT butao addActionListener semanaSeguinte painel add butao toolBarNorte add painel private void constroiOeste n o se pode fazer drag and drop toolBarOeste setFloatable false toolBarOeste setOrientation JToolBar VERTICAL separador toolBarOeste addSeparator new Dimension 1 30 but o nova ocupac o butao new JButton new ImageIcon imagens novo bloco gif butao setToolTipText Introduzir nova ocupag o butao addActionListener abreJOcupacao toolBarOeste add butao separador toolBarOeste addSeparator but o apagar ocupac o butao new JButton new ImageIcon imagens apagar bloco gif butao setToolTipText Apagar ocupa o butao addActionListener apagaOcupacao toolBarOeste add butao separador toolBarOeste addSeparator new Dimension 1 30 but o marcar reuni o butao new JButton new ImageIcon imagens reuniao gif butao setToolTipText Marcar nova reuni o butao addActionListener abreJReuniao toolBarOeste add butao private void constroiCentro TModelo modelo new TModelo tabela new TAgenda modelo tamanho das colunas tabela setRowHeight AlgC TamLinhas AlgC HoraFinal AlgC HoraInicia
28. ainda n o tiver sido requerida Assim cria se uma esp cie de mem ria cache Esta sempre tida em conta de modo a n o existirem inconsist ncias entre a representac o dos hor rios nos dois processos A escolha da estrutura adoptada deveu se em grande parte ao facto do utilizador poder ter dias em que n o existem actividades marcadas Logo se por exemplo estiv ssemos a usar uma matriz com as horas nas linhas e os dias nas colunas esta iria desperdi ar grandes quantidades de mem ria Por outro lado as caracter sticas da hashtable minimizam esse desperd cio Para que o n mero de entradas na tabela de dispers o n o fosse extremamente elevado originando mais colis es decidiu se organizar cada entrada por dia Esta op o torna a determina o da chave muito simples que a utiliza o da data do dia Outra hip tese seria usar apenas listas para a representa o dos hor rios mas estas tornariam se extremamente extensas o que levaria a uma grande inefici ncia na sua pesquisa Quanto ao conhecimento nas comunica es utilizam se dois ficheiros um para cada processo que ir o gerir a informa o relativa a esse dom nio Resumidamente as aplica es criadas precisar o da seguinte informa o que se encontra nos locais indicados Processo gestor do interface Nome login introduzido Localiza o gt obtida pelo processo com ajuda da classe InetAddress Porto indicado no ficheiro Processo gestor da agenda
29. gestor da agenda Confirma a marcag o da solug o perform confirmMeeting descric o data dura o obtida com OS outros intervenientes CancelMeeting Cancela a busca de solu o Procura outra solu o Pede ao processo gestor da agenda as ocupa es da semana correspondente Como o n mero ask week n mero relativo da semana relativo se este for O a semana actual lt O semanas anteriores actual e gt O semanas posteriores actual ConnectedUsers Pede ao processo gestor da 13 agenda o nome das agendas dos E itis een edo Pede ao processo gestor da agenda para marcar uma nova reuni o com os utilizadores especificados Perguntar ao processo gestor da login login password agenda se o login e password est o correctos Indica ao processo gestor da agenda que foi criada uma nova ocupa o Indica ao processo gestor da agenda que foi apagada uma ocupa o Indicar ao processo gestor da agenda que o processo do interface vai se desligar newMeeting data dura o utilizadores newOcupation data descri o hora inicial hora final prioridade deleteOcupation data descri o hora inicial hora final prioridade Agenda Interface Pede ao processo gestor da interface para indicar na caixa de perform stdout emissor msg texto de mensagens enviadas da janela de comunica es a mensagem indicada por msg Pede ao processo gestor da interface para indicar na caix
30. i20 i util length i AgendaS router msgKOML ask AgendaS router ids util i newMeetingDate data duracao msgKOML perform idS idC stdoutl util i newMeetingDate data duracao for int i20 i util length i AgendaS router msgKOML ask AgendaS router idS util i meeting hora YI msgKOML perform idS idC stdoutl util i meeting hora yy public void outraSolucao int novaHora n Float x boolean flag true AlgS mediaR AlgS solucao new Float 6 for int i 0 i lt AlgS mediaR length i 72 n 0 for int j 0 j AlgS nomeR length 1 j if AlgS solucaoR j i intValue 1 ntt if AlgS nomeR length 1 n amp amp AlgS mediaS AlgS mediaR i floatValue AlgS media AlgS solucao i System out println CHEGUEI AO FIM AgendaS servidor msgKOML perform AgendaS servidor idS AgendaS servidor idC solution AlgS solucao 7 AlgS mediaS flag false break if flag AlgS fim 1 AlgS auxSol 0 acha o valor n o ocupado com a menor m dia for int j 0 j AlgS nomeR length j x new Float 6 novaHora 1 for int i20 i 14 i if AlgS solucaoR 5 i intValue 1 if AlgS mediaR i floatValue lt x floatValue x AlgS mediaR i novaHora i47 System out print Nova Hora novaHora
31. if c 0 c gt 5 erro Erro na introdu o da m dia m xima de indisponibilidades o valor tem de estar compreendido entre 0 S DX else if lista2 length 0 erro necess rio indicar as pessoas com quem ser feita a marcac o else String data new String Integer chave AlgC determinaChave diai mesi anoi int hora cHoraInicio getSelectedIndex AlgC HoraInicial int duracao cDuracao getSelectedIndex 1 data chave toString hora duracao AlgC comunic new JComunic tDescricao getText data lista2 comunic pack AlgC comunic setResizable false AlgC comunic setSize 700 500 AlgC comunic setLocationRelativeTo eu AlgC comunic show eu dispose catch NumberFormatException 1 erro Data inicial ou m dia m xima de indisponibilidades mal introduzida A data deve ter o formato dd mm yyyy bCancelar addActionListener new ActionListener public void actionPerformed ActionEvent e eu dispose bAdic addActionListener new ActionListener public void actionPerformed ActionEvent e Object selec listaOutrosl getSelectedValues listal AlgC subtraiListas listal selec listaOutrosl setListData listal lista2 AlgC ordenaListas selec lista2 listaOutros2 setListData lista2 bSub addActionListener new ActionListener public void actionPerformed Act
32. lista de ocupa es existente o local de introdu o da nova ocupa o visto que estas encontram se ordenadas pelas horas Exemplo de inserir ocupa o ir piscina das 7 s 8 no dia 11 12 2000 que ainda n o tem nenhuma ocupa o e outra no dia 12 12 2000 que j tem ocupa es Estado incial Hashtable Ocupa o Descri o Estudar 12122000 Hora inicial 9 Hora final 13 Prioridade 2 Estado final Ocupa o Descri o Piscina Ap ontador Hora inicial 7 1112200 Hora final 8 Prioridade 1 12122000 Ocupa o Ocupa o Descri o Piscina Descri o Estudar Hora inicial 7 Hora inicial 9 Hora final 8 Hora final 13 Prioridade 1 Prioridade 2 Quanto remog o se existir apenas um elemento na lista apaga se a lista da hashtable Se por outro lado existirem v rios elementos na lista apenas se retira a ocupac o pretendida Assim se apagasse mos as ocupa es a vermelho do estado final inseridas no exemplo anterior volt vamos ao estado inicial Esquema de negociac o O esquema de negocia o desenvolvido baseia se na m dia das indisponbilidades dos utilizadores Comega se por pedir ao utilizador que quer marcar a reunido o dia a dura o a hora pretendida O algoritmo ir pedir a todos os intervenientes a prioridade das suas ocupa es a essa hora que v o de 1 a 5 Caso estes n o tenham ocupa es ser indicada uma prioridade de O Se houver out
33. necess rio De seguida h que ler os ficheiros que cont m os dados acerca das liga es e com a ajuda da classe netAddress reconhecer qual o host em que nos encontramos Esta informa o tem que ser introduzida na tabela de endere os para que se possa estabelecer uma ligac o O procedimento descrito realizado tanto no processo gestor da interface como da agenda Como o gestor da agenda que tem que estar espera que o do interface se ligue este tem que abrir um thread de escuta O denominado ServerThread quando recebe uma mensagem cria de imediato um ReceiverThread para a tratar ficando espera de novas mensagens Focando agora a nossa aten o no di logo inter agente tamb m temos que seguir uma sequ ncia de operag es Primeiro insere se os seguintes enderegos na respectiva tabela o do pr prio gestor do hor rio o do router e do router registrar respons vel por registar as agendas Depois tamb m preciso criar um ServerThread para escutar a rede registar os processos no router e ligar ao router com a ajuda do procedimento connect Para enviar as mensagens KQML n o existem diferen as nestes dois tipos de interacc o Ent o criou se em cada classe um procedimento gen rico que recebe como argumentos o tipo de mensagem ask if reply tell etc o emissor o receptor e o conte do da mensagem O retorno desta fung o verdadeiro ou falso conforme o sucesso do envio da mensagem 12 public boolean msgKOML Stri
34. o confirmarmos a solu o obtida ou ainda cancelarmos a marca o da reuni o 23 Listagem do C digo Ficheiros de configurac o AgenteC porto do client AgenteC 6665 AgenteS nome do servidor Antonio password Spr porto do servidor para o client Agentes 6666 porto do servidor para o router Agentes 6667 password agent info password a dados do router AgenteR Router coyote ugly 6663 RouterServerThread agent info agent name AMR RouterRegistrar coyote ugly 6664 RegistrarServerThread Registrar RouterScript Router Name The address file should have the Router address with the Router name Router Address file include Router RotuerRegistrar and other path D jatlite RouterLayer Resource AddressFil Incoming mail box directory should ended with D jatlite RouterLayer Resource incoming password file path D jatlite RouterLayer registry file path D jatlite RouterLayer Resource Registry axiumum duration time for the Router Receiver Thread 1000 aximum trial time for reconnecting to the stand alone off line agent Sy D source Password TO Reconnection trial time period in minutes here 1 hr aximum trial time to send reserved messag Sending reserved message time period 60 Router agent action sleep time in milliseconds 5000 24 C digo criado Cliente AgendaC java A classe principal da apli
35. ou encontros com outros utilizadores que se encontrem ligados mesma Motivac o Na exposig o dos diversos trabalhos propostos para esta cadeira este em particular despertou desde logo o nosso interesse por v rias raz es Do ponto de vista acad mico a implementa o de um sistema multi agente permite nos ter uma percepc o das dificuldades que existe em transpor um programa deste tipo da teoria para a pr tica Espera se que a maior ou menor facilidade com que estes obst culos s o ultrapassados nos d uma boa percep o da din mica de um sistema desta natureza Por outro lado ficaremos a conhecer o processo de comunica o inter agentes atrav s de linguagens como o KQML Fora do mbito meramente acad mico as motiva es deste trabalho aumentam A marca o autom tica de reuni es um campo ainda pouco desenvolvido podendo se assim ter uma boa margem de manobra Com o crescimento das organiza es torna se cada vez mais dif cil conciliar a marca o de reuni es com todos os intervenientes nestas minimizando as desmarca es de outros eventos Al m disso o aumento da planifica o do trabalho nas empresas verificado actualmente exige um aumento do n mero de reuni es Se n o nos restringirmos o dom nio desta aplica o a uma rede local poss vel que este seja alargado Intemet Com a facilidade que hoje em dia existe em obter uma liga o PDA WAP telem veis de 3 gera o poder se em qualquer luga
36. raz o resolvemos implementar o esquema de liga o com a ajuda de um router Com este esquema o processo gestor da agenda pode estar a correr num local diferente do processo que gere a interface estando sempre acess vel para marca o de reuni es Por outro lado se desenvolvessemos um processo para cada agente n o ter amos dispon vel a funcionalidade de poder marcar reuni es com a interface desligada Para as mensagens processadas nas comunica es utilizou se a linguagem KQML O tipo de mensagens enviadas ser explicado com mais detalhe na implementa o Por ltimo a interface gr fica composta por um hor rio que poder ser actualizado semanalmente com a ajuda do rato pelo meio desta que se v o dar as ordens de marca o de reuni es Pretende se que a interface seja de utiliza o simples e r pida Depois de passar a seguran a mostrado o hor rio correspondente semana corrente ainda de salientar que o mesmo processo gestor de interface tem a possibilidade de ligar a processos gestores de agendas diferentes Com a funcionalidade de estabelecer uma nova liga o o hor rio actual fechado e s o pedidos novos dados login password localiza o do processo gestor da agenda e porto correspondente Esquemas de representa o de conhecimento Para guardarmos a informa o relativa a um hor rio no processo que gere a agenda utilizamos o conceito de ocupa es Estas t m como informa o a descri o
37. setColor Color white g drawRect int rect pinta descricao da getX int rect getY largura altura ocupac o g drawString descricao int rect getX nletras 2 int rect getY altura 2 private void pintaSeleccao int linhalnicial int linhaFinal int coluna Graphics g Rectangle rect getCellRect linhaInicial coluna true dif linhaFinal linhalnicial largura int rect getWidth altura dif int rect getHeight pinta rectangulo exterior da seleccao setColor Color red fillRect int rect fillRect int rect fillRect int rect fillRect int rect QUO OO vu TModelo java import javax swing table modelo da tabela class TModelo extends AbstractTableModel nomes das colunas final String final Object dados r getX int rect getY largura 4 getX 1argura 4 int rect getY 4 altura getX int rect getY 4 altura getX int rect getY taltura 4 largura 4 AbstractTableModel nomeColuna Horas Segunda Ter a Quarta Quinta Sexta S bado Domingo new Object AlgC HoraFinal AlgC HoraInicial 1 8 public int getColumnCount return nomeColuna length public int getRowCount return dados length public String getColumnName int col return nomeColuna col 37 public Object getValueAt int row int col
38. ActionListener public void actionPerformed ActionEvent e System exit 0 D tLogin addActionListener new ActionListener public void actionPerformed ActionEvent e tLogin transferFocus tPass addActionListener new ActionListener public void actionPerformed ActionEvent e Dm tPass transferFocus tLocal addActionListener new ActionListener public void actionPerformed ActionEvent e tLocal transferFocus tPorto addActionListener new ActionListener public void actionPerformed ActionEvent e D I tPorto transferFocus para fechar o program ao carregar na cruz addWindowListener new WindowAdapter public void windowClosing WindowEvent e System exit 0 public void erro String msg String titulo JOptionPane showMessageDialog eu msg titulo JOptionPane ERROR MESSAGE TAgenda java import import import import javax swing JTable javax swing table AbstractTableModel java awt java util A classe principal da aplicac o cliente class TAgenda extends JTable int dia mes ano d m a dif largura altura nletras int npixeis 8 35 LinkedList lista ListIterator iLista Ocup ocupacao Integer chave public TAgenda AbstractTableModel modelo super modelo public void paint Graphics
39. AgendaC cliente idS other bConfirmar addActionListener new ActionListener public void actionPerformed ActionEvent e AgendaC cliente msgKQML perform AgendaC cliente idC AgendaC cliente idS con firmMeeting mensagem d eu dispose I bCancelar addActionListener new ActionListener public void actionPerformed ActionEvent e AgendaC cliente msgKQML perform AgendaC cliente idC AgendaC cliente idS can celMeeting eu dispose para fechar o program ao carregar na cruz addWindowListener new WindowAdapter public void windowClosing WindowEvent e System exit 0 D marcacao data lista c public void marcacao String data Object lista float c String util new String for int i 0 i lt lista length i util util lista i AgendaC cliente marcaReuniao data c util JAcerca java import java awt import java awt event import javax swing A janela acerca class JAcerca extends JDialog nome da janela principal private static final String titulo Acerca da Agenda 2000 construtor public JAcerca JFrame janela super janela true setTitle titulo setResizable false saida addWindowListener new WindowAdapter public void windowClosing WindowEvent e dispose setSize 750 525 getCo
40. Field tMesInicio TextField tAnoInicio ComboBox cHoraInicio TextField tCriterio ComboBox cDuracao List listaOutrosl List listaOutros2 bject listal bject lista2 privat private privat private private private private private private private private O OO D C4 C4 DD C4 C C Cj public JReuniao Frame janela super janela eu this true setTitle Nova Reuni o setResizable false parte norte da janela msg Erro JOptionPane ERROR MESSAGE classes JPanel painelN new JPanel JLabel lOcup new JLabel Marca o de Nova Reuni o lOcup setForeground Color black Font font new Font Tahoma Font BOLD 15 lOcup setFont font painelN add 10cup parte centro da janela JPanel painelC new JPanel new GridLayout 2 1 JPanel painelCl new JPanel new GridLayout 4 1 JPanel painelC11 new JPanel new FlowLayout FlowLayout LEF JPanel painelC12 new JPanel new FlowLayout FlowLayout LEF JPanel painelC13 new JPanel new FlowLayout FlowLayout LEF JPanel painelC14 new JPanel new GridLayout 1 3 JPanel painelC2 new JPanel new GridLayout 1 3 JPanel painelC21 new JPanel new GridLayout 2 1 JPanel painelC211 new JPanel JPanel painelC212 new JPanel criac o e inicializac o dos labels da janela JLabel lDe
41. ML new KOMLmessage mKOML addFieldValuePair performative tipo mKOML addFieldValuePair sender emissor mKOML addFieldValuePair receiver receptor mKOML addFieldValuePair content msg envio da mensagem try sendMessage mKQML return true catch ConnectionException e System out println e toString return false public boolean login String login String pass if msgKQML ask if idC idS login login pass return true else return false public boolean logout if msgKQML tell idC ids bye connections getConnection idS endConn return true else _addresses removeAddress idS return false public void trataRespLogin String conteudo if AlgC proximoValor conteudo equals true AlgC resposta 1 else AlgC resposta 0 public boolean novaOcupacao String conteudo if msgKOML tell idC idS newOcupation conteudot return true else return false 28 public boolean apagaOcupacao String conteudo if msgKOML tell idC idS deleteOcupation conteudo return true else return false public boolean pedeSemana int s if msgKOML ask idC ids week s return true else return false public void introduzirSemana String conteudo int dia mes ano horai horaf prior String desc while conteudo indexOf 1
42. Marcar painelS add bCancelar disposig o dos objectos JPanel painel painel painel painel painel painel setCon pa Pri Pri Pri Pri Pri Pri inelPrincipal new JPanel ncipal setLayout new BorderLayout 15 15 ncipal add new JPanel BorderLayout EAS ER ncipal add new JPanel BorderLayout WEST ncipal add painelN BorderLayout NORTH 7 ncipal add painelC BorderLayout CENTER ncipal add painelS BorderLayout SOUTH cen tPane painelPrincipal Acc es dos but es e campos de texto bMarcar addActionListener new ActionListener public void actionPerformed ActionEvent e int diai mesi anoi float c CE y dia i Integer parseInt tDiaInicio get mes ano E LEX e i Integer parseInt tMesInicio get1 i Integer parseInt tAnoInicio get Float parseFloat tCriterio getText tDescricao getText equals rro Erro na introdu o da Desci o preenchida else if AlgC verificaData diai mesi anoi els erro A data deve ter o formato rext rext rext 0 dd mm yyyy e Lem de ser compreendida entr 1999 2010 e if tCriterio getText equals ECTION a Descri o tem que ser 53 erro Erro na introdug o da m dia m xima de indisponibilidades esta tem que ser preenchida else
43. Sistemas Periciais e Rob tica RELAT RIO DO TRABALHO E SOBRE A AGENDA ELECTR N ICA gt gt gt E d gt we e o 7 gt E Y a gt a gt gt E d gt REALIZADO POR Ant nio Pedro Almeida Viegas Alves C sar Francisco Gon alves Rodrigues Objectivos Com este trabalho pretende se criar um programa que facilite os seus futuros utilizadores na dif cil tarefa de marca o de reuni es Ir ser necess rio coordenar as v rias agendas correspondentes a cada um dos utilizadores de modo a que se possa marcar uma data para uma reuni o Esta data dever satisfazer a totalidade ou a maioria dos intervenientes na mesma Um utilizador representado por um agente estando este respons vel por comunicar com os restantes agentes que personificam cada um dos utilizadores intervenientes na reuni o a marcar Assim poss vel obter as suas disponibilidades e a partir destes dados marcar a reuni o pedida A comunica o entre os v rios agentes ser desenvolvida usando as funcionalidades de uma ferramenta JATLite http java stanford edu que facilita a implementa o das mesmas Pretende se que esta aplicag o possa ser usada por v rios utilizadores que partilhem uma rede poder ser uma LAN de uma empresa mas tamb m poder ser de um modo mais global a pr pria Internet Isto permite a qualquer utilizador que tenha acesso rede global marcar reuni es
44. Todos os processos atr s referidos encontram se ou em direct rios diferentes do mesmo computador ou em computadores diferentes Caso estejam no mesmo os seus portos n o podem ser iguais para que se possa facilmente distinguir os destinat rios das mensagens Para uma modificag o dos portos pode se alterar o ficheiro anterior o do AgenteC do interface e do router De seguida s o mostrados esses ficheiros com a bold os portos que podem ser alterados AgenteS nome do gestor da agenda Antonio password spr porto da agenda para o interfac Agentes 6666 porto da agenda para o router AgenteS 6667 password agent info password a dados do router AgenteR Router coyote ugly 6663 RouterServerThread agent info agent name AMR RouterRegistrar coyote ugly 6664 RegistrarServerThread Registrar AgenteC porto do gestor do interfac AgenteC 6665 Para alterar os portos do router preciso configurar o ficheiro AddressFile que se encontram no direct rio RouterLayer Resource do router AddressFile This is an example file for the static Agent Addresses AgentID Host InetAddress Port no Type Description Since this is ServerThread you do not need to specify InetAddress Router null 6663 RouterServerThread agent info agent name AMR RouterRegistrar null 6664 RegistrarServerThread Registrar N o esquecer ainda de colocar na classpath o direct rio corrente atrav s do comando
45. a Sn altPrior else msgKQML reply idS receptor meetingAnswer hora prior no iLista lista listIterator 0 while iLista hasNext ocupacao Ocup iLista next hi ocupacao devolveHInicial 7 hf ocupacao devolveHFinal 7 prioridade ocupacao devolvePrioridade while hi hf AlgS historialR hi new Integer prioridade hi sincro 0 public synchronized void devolvePreferencia String receptor String conteudo String prior int altHora 1 altPrior 1 br 1 int hora Integer parseInt AlgS proximoValor conteudo prior AlgS historialR hora 7 toString AlgS historialR hora 7 new Integer 1 for int 3 0 j lt 6 j for int i20 i 14 i if AlgS historialR i intValue j altHora 1 7 altPrior AlgS historialR i intValue AlgS historialR i new Integer 1 br 0 break if br 0 break while sincro 1 try Thread sleep 200 catch InterruptedException i System err println i if altHora 1 public synchronized void processaPreferencia String emissor String conteudo 79 int hora prior altHora altPrior nUtil 1 novaHora 1 String simNao Float x new Float 6 AgendaS servidor msgKOML perform AgendaS servidor idS AgendaS servidor idC stdout2 emissor conteudo substring 0 conteudo length
46. a de perform stdout2 emissor msg texto de mensagens recebidas da janela de comunica es a mensagem indicada por msg Pede ao processo gestor da perform solution hora grau de indisponibilidade interface para colocar a solu o encontrada no ecr Responde ao processo gestor da reply login valor booleano agenda se o login e password ES est o correctos Responde ao pedido do processo week ocupa es gestor da agenda de saber quais as ocupa es numa determinada semana Responde ao pedido do processo reply connectedUsers utilizadores gestor da agenda de saber quais os utilizadores ligados no momento Agenda Router Agenda ConfirmedMeeting hora descrig o data Confirma a marca o da reuni o perform E See dura o na hora indicada Indica ao outro processo gestor da agenda que ir come ar uma negocia o para marcar uma reuni o no dia indicado Pede ao outro processo gestor da agenda para lhe enviar a prioridade na hora indicada e respectiva alternativa se existir Resposta do processo gestor da agenda hora com a prioridade da newMeetingDate data dura o meeting hora meetingAnswer hora prioridade no hora pedida n o existindo uma alternativa a dar ao outro processo gestor da agenda Resposta do processo gestor da meeting Answer hora prioridade yes hora agenda hora com a prioridade da alternativa prioridade hora alternativa hora pedida dando uma alte
47. a hora inicial a hora final e a sua prioridade Cada ocupa o ser um elemento de uma lista lista esta que representa um dia As ocupa es s o inseridas na lista ordenadas pelas horas As listas s o colocadas numa hashtable cuja chave a data do dia em causa como se pode ver na figura Hashtable Ocupa o Ocupa o 31122000 Descri o Teste Descri o Jantar Hora inicial 9 Hora inicial 20 Hora final 10 Hora final 21 12122000 ME Prioridade 2 Prioridade 5 Ocupac o Descrig o Estudar Hora inicial 9 Hora final 13 13112000 Prioridade 2 Ocupac o Ocupac o Descrig o Aula Descrig o Cinema Hora inicial 12 Hora inicial 16 Hora final 14 Hora final 18 Prioridade 1 Prioridade 3 Esta hashtable sempre que o processo de interface se desliga guardada num ficheiro que lido pelo processo gestor de hor rios sempre que inicializado O processo gestor do interface cont m uma base de conhecimento id ntica do gestor da agenda No entanto n o possui o ficheiro para guardar os dados pois estariam acess veis a toda a gente Sendo assim o processo gestor do interface come a sempre com uma hashtable vazia Como s poss vel ao utilizador ver o hor rio semanalmente o processo respons vel pelo interface vai pedindo ao processo respons vel pelo hor rio as ocupa es em cada semana medida das suas necessidades Este ltimo s pede as ocupag es de uma semana se esta
48. a que marca a reunido guarda uma m dia que no in cio corresponde s prioridades desta a dividir pelo n mero de pessoas intervenientes Al m disso feito um historial das respostas recebidas para nunca pedir a mesma hora aos outros processos O historial gerido atrav s de uma matriz inicializada da seguinte forma se tivermos tr s elementos intervenientes uma agenda marcadora mais duas agendas Horas 7 8 9 fio 11 12 13 14 is 16 17 18 19 20 M dia 0 33 1 66Jo o 0 66 0 66 1 33 0 33 0 33 0 33 0 o 1 66 1 33 Consideremos no exemplo que a m dia m xima de indisponibilidades de 1 Quando chega uma resposta esta colocada no seu devido local e a nova m dia actualizada No fim deste c lculo verifica se se toda a coluna correspondente a essa hora j foi preenchida Em caso afirmativo testa se se a m dia obtida inferior indicada pelo utilizador Se este teste for verdadeiro o algoritmo acaba Se n o requerida agenda que enviou a resposta a prioridade da hora cuja a m dia a mais baixa e ainda n o tenha sido pedia Para saber se uma hora j foi ou n o pedida a uma determinada agenda basta verificar se o valor correspondente na matriz 1 Ap s algumas itera es do algoritmo chegou se seguinte matriz 9 IO 11 12 13 14 15 16 17 fis 19 20 ES C jo ajo as or pajas jajaa Em H err aug g4 w rir IST M dia 2 2 o JO 233 233 133 1 66 1 66 2 66 0 JO Leila
49. aAux public synchronized static int calculaMedia int hora int nUtil int soma 0 n 0 for int i20 i nUtil i if solucaoR i hora intValue 1 soma soma solucaoR i hora intValue ntt soma soma solucaoR nUtil hora intValue ntt mediaR hora new Float float soma float n System out println Hora hora 7 M dia mediaR hora if nUtil 1 n amp amp mediaS mediaR hora floatValue lt media solucao hora return 1 else return 0 public synchronized static void insereReuniao Integer chave Ocup int hi hf hiAux hfAux List lista ListIterator iLista Ocup ocupacaoAux hi ocupacao devolveHInicial hf ocupacao devolveHFinal lista List horario get chave if lista null synchronized lista iLista lista listIterator 0 for int j 0 j lt lista size j ocupacaoAux Ocup iLista next hiAux ocupacaoAux devolveHInicial hfAux ocupacaoAux devolveHFinal if hfAux gt hi amp amp hfAux hf hiAux hi amp amp hiAux lt hf lista remove ocupacaoAux horario put chave lista insereOcupacao chave ocupacao public synchronized static String proximoValor String str if str indexOf 1 return str substring 0 str indexOf else return str substring 0 str length 2 public synchronized static String r
50. add agora data 0 agora data 1 agora data 2 agora agora add agora return data public static int DATI get get Get DATI E 6 coluna agora DAY OF MONTH agora MONTH 1 agora YEAR 6 coluna horasLinha int linhas int linhai linhaf int hora 0 0 if linhas 0 linhas linhas length 1 linhai linhas 0 linhaf linhas linhas length 1 1 else linhaf linhas 0 1 linhai linhas linhas length 1 hora 0 passaParaHoras linhai hora 1 passaParaHoras linhaf return hora public static int esperaResposta while resposta 1 try Thread sleep 200 catch InterruptedException i System err println i int respostaAux resposta resposta 1 return respostaAux public static String proximoValor String str if str indexOf 1 return str substring 0 str index0f else return str substring 0 str length 2 public static String retiraValor String str return str substring str indexOf 41 str length Servidor AgendaS java public class AgendaS public static AgenteS servidor public static AgenteR router public static void main String args servidor new Agentes servidor start router new Agent router start R public class AgenteS extends KOMLAgentAction A
51. c synchronized static String semanaHorario int dem a dia mes ano Integer chave List lista ListIterator iLista Ocup ocupacao String semana new String d agora get agora DAY OF MONTH m agora get agora MONTH a agora get agora YEAR Calendar cal new GregorianCalendar a m d cal add cal DATE 7 for int i 1 i lt 7 1 4 cal add cal DATE 1 dia cal get cal DAY_OF_MONTH mes Cal get cal MONTH 1 ano cal get cal YEAR chave determinaChave dia mes ano lista List horario get chave if lista null synchronized lista iLista lista listIterator 0 while iLista hasNext ocupacao Ocup iLista next semana semana dia mes ano semana semana ocupacao devolveDescricao ocupacao devolveHInicial ocupacao devolveHFinal ti ocupacao devolvePrioridade if semana length gt 0 semana semana substring 0 semana length 1 return semana public static void gravar 84 try Serializa os objectos para o ficheiro FileOutputStream out new FileOutputStream nomeFicheiro ObjectOutputStream s new ObjectOutputStream out s writeObject horario s flush s close out close catch Exception e System out println e toString public static boolean ler try FileInputStream in new Fi
52. cag o cliente class AgendaC public static JPass janelaPass public static AgenteC cliente public static void main String argv client cliente start new AgenteC janela para a password que depois abre a principal new JPass janelaPass janelaPass setSize 420 240 janelaPass pack janelaPass setLocation 280 200 janelaPass show AgenteC java import BaseLayer import Abstract import KOMLLayer import java io import java net public class Agen public static String public static String public static String public static String public static String public static String public static String public static String public static String public AgenteC super String readline try teC extends KOMLAgentAction ids localS portos tipos JC E localC portoC tipoC utilizadores procedimentos de arranque addresses new BAddressTable connections new BConnectionTable queue new BMessageBuffer 25 18 o ficheiro d ndereco coloca os seu dados numa tabela BufferedReader input new BufferedReader new FileReader new File AgenteC dados deste servidor while readline input readLine null if readline startsWith portoC readline break input close deve ser instanciado depois da tabela ter sido criada _security new KQMLSecurity _addresses
53. ccao new AbstractAction OK public void actionPerformed ActionEvent e int dia mes ano horai horaf prior 0 String descricao try for int 1 0 i lt 5 1 if rbPref i isSelected prior itl break descricao tDescricao getText dia Integer parseInt tDia getText mes Integer parseInt tMes getText ano Integer parseInt tAno getText horai cHoraInicio getSelectedIndex AlgC HoraInicial horaf cHoraFim getSelectedIndex AlgC HoraInicial 1 if descricao equals erro Erro na introdu o da Desci o a Descri o tem que ser preenchida else if AlgC verificaData dia mes ano erro A data deve ter o formato dd mm yyyy e Lem de ser compreendida entre 1990 2010 else if horaf lt horai erro A hora inicial n o pode ser maior que a hora final else if AlgC seleccao null int data AlgC dataColuna AlgC colunaSeleccao 49 String d AlgC seleccao devolveDescricao int hi AlgC seleccao devolveHInicial int hf AlgC seleccao devolveHFinal int p AlgC seleccao devolvePrioridade if AgendaC cliente apagaOcupacao data 0 data 1 data 2 d chic npe DEE AlgC apagaOcupacao data 0 data 1 data 2 AlgC seleccao else erro N o possivel estabelecer a ligac o com o programa servidor P F Tente ligar o programa de novo Syste
54. das append conteudo substring 8 conteudo length 3 An else conteudo conteudo substring conteudo indexOf 1 conteudo length 1 String dia AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo String duracao AlgC proximoValor conteudo if dia length 7 dia 0 dia substring 0 1 dia substring 1 3 dia substring 3 7 else dia dia substring 0 2 dia substring 2 4 dia substring 4 8 AlgC comunic tEnviadas append Para r Marca o de reuni o para o dia dia if Integer parseInt duracao 1 AlgC comunic tEnviadas append com a durag o de duracao hora n else AlgC comunic tEnviadas append com a durag o de duracao horas n public void imprimeEmJComunic2 String conteudo String r AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo tring hora AlgC proximoValor conteudo onteudo AlgC retiraValor conteudo tring disp AlgC proximoValor conteudo onteudo AlgC retiraValor conteudo String simNao AlgC proximoValor conteudo AlgC comunic tRecebidas append De r As hora tenho a disponibilidade de disp S c S c if simNao equals yes conteudo AlgC retiraValor conteudo String altHora AlgC proximoValor conteudo conteudo AlgC retiraValor conteudo String altD
55. dicando a sua localiza o gt No fim informa o router que se ir desligar gt Comunica com o processo respons vel pelo interface respondendo a este directamente gt Comunica com os outros processos que gerem agendas enviando as respostas atrav s do router Guarda e gere o hor rio Router gt Respons vel por gerir as localiza es dos processos gestores das agendas gt Satisfaz pedidos dos processos nele registados sendo o elo de liga o entre eles Programa gestor do interface 1 Programa gestor do interface 2 Programa gestor da agenda 1 Programa gestor da agenda 2 guarda o hor rio 1 guarda o hor rio 2 Vantagens gt O router sabe facilmente a localiza o de todos os processos que t m acesso ao hor rio gt O processo que gere o interface s tem de saber onde se encontra o respectivo processo gestor da agenda onde se pretende ligar gt O processo da interface destinado para a interac o com o utilizador n o necessita de estar ligado no momento das marca es de reuni es Desvantagens gt Aumento da complexidade estrutural da aplica o gt Aumento do n mero de comunica es devido exist ncia de comunica es dentro do pr prio agente e de comunica es entre processos gestores de hor rios e router Inicialmente optamos por ligar os processos gestores de hor rios directamente uns aos outros no entanto a gest o das localiza es destes torna se muito complexa Por esta
56. dos but es e campos de texto Entrar addActionListener new ActionListener ao public void actionPerformed ActionEvent e tring pass new String tPass getPassword tring login tLogin getText tring local tLocal getText tring porto tPorto getText S S S S if login equals erro necess rio introduzir o login Erro else if pass equals erro necess rio introduzir a password Erro else if local equals erro necess rio introduzir o local do programa servidor Erro else if porto equals erro necess rio introduzir o porto do programa servidor Erro else if AgendaC cliente ligaAoServidor local porto erro N o possivel estabelecer a ligac o com o programa servidor Erro else if AgendaC cliente login login pass erro N o possivel enviar mensagem KQML ao programa servidor Erro else int resp AlgC esperaResposta if resp 0 AgendaC cliente logout erro Login ou Password Incorrectos O acesso nao autorizado e punido por lei else password correcta avan a para a janela principal JAgenda agenda new JAgenda tLogin getText agenda setSize 870 575 agenda setLocation 70 66 tPass setText inicializa o hor rio AlgC inicializaHorario AlgC esperaResposta agenda show eu dispose bCancelar addActionListener new
57. e content if tipo equals perform amp amp conteudo startsWith newConnection novaLigacaoCliente conteudo substring 15 else if emissor equals idC conteudo conteudo conteudo conteudo conteudo if tipo equals ask amp amp conteudo startsWith week devolveSemana conteudo substring 6 else if tipo equals ask amp amp conteudo startsWith newMeeting novaMarcacao conteudo substring 12 else if tipo equals tell amp amp startsWith newOcupation novaOcupacao conteudo substring 14 else if tipo equals tell amp amp startsWith deleteOcupation apagaOcupacao conteudo substring 17 else if tipo equals ask amp amp conteudo startsWith other outraSolucao else if tipo equals perform amp amp startsWith confirmMeeting confirmarSolucao conteudo substring 16 else if tipo equals perform amp amp startsWith cancelMeeting cancelarReuniao else if tipo equals ask amp amp startsWith connectedUsers devolveUtilizadores else if tipo equals ask if amp amp conteudo startsWith login verificaLogin conteudo substring 7 else if tipo equals tell amp amp conteudo startsWith bye logoutCliente return true catch KOMLLayer ParseException e 68 System out println e toString return false public boolean m
58. e carregar no bot o cujo o icon um pato quer dizer que queremos introduzir uma nova ocupa o Os campos de hora in cio e hora fin j se encontram preenchidos bastando digitar a descrig o e indicar a prioridade dessa ocupa o Ben Kean an TD ioj Agenda Horario Semana Acerca Hor rio da Semana 11 12 2000 a 17 12 2000 Horas Se da Ter a Quarta Quinta Seda 7 00 ml Ocupa o son Ocupa o Descher Piscina Data In S tz Hora Inicio ene gt Hora Fim 1900 SC mia CO Man poxa CO bs O Multa gt Max oK Cancelar Ao carregar sobre o bot o OK a nova ocupac o aparece Se pressionarmos sobre esta seleccionamo la aparecendo um risco vermelho volta e ao invocarmos de novo o pato podemos alterar as suas defini es Por outro lado se a quisermos apagar basta carregar sobre o bot o que cont m um cruz que a selecc o removida do hor rio Ea jenda 2080 Bemvindo Amonio Senda horario Sarana Acerca Hor rio da Semana 11 12 2000 a 17 12 2000 4 b Horas Segunda Tesa ows Quinta seda Estado Domingo 700 2 A 00 d a 360 H t Es 1000 d 1 00 e 1700 E 1300 1400 1500 4 TEA 1600 i mo 1700 1 u Uu l 4 1800 d 19 00 d EE mnm 2000 22 Para criar uma reuni o pressiona se sobre o bot o cujo icon
59. elC13 add lCriterio painelC13 add tCriterio painelC14 add lOutros painelC14 add new JPanel painelCl4 add lMarcarCom painelCl add painelC11 painelCl add painelC12 painelCl add painelC13 painelCl add painelC14 JButton bAdic new JButton new ImageIcon imagens seguinte gif bAdic setToolTipText Adicionar bAdic addActionListener new semanaAnterior JButton bSub new JButton new ImageIcon imagens anterior gif bSub setToolTipText Remover bSub addActionListener new semanaAnterior painelC211 add bAdic painelC212 add bSub painelC21 add painelC211 painelC21 add painelC212 pedeLista 52 lista2 new Object 0 listaOutrosl new JList listal listaOutrosl setSelectionMode ListSelectionModel MULTIPLE INTERVAL S JScrollPane listaOutrosScrolll new JScrollPane listaOutros1 listaOutros2 new JList EL ECTION EL listaOutros2 setSelectionMode ListSelectionModel MULTIPLE INTERVAL S JScrollPane listaOutrosScroll2 new JScrollPane listaOutros2 painelC2 add listaOutrosScrolll painelC2 add painelC21 painelC2 add listaOutrosScroll2 painelC add painelC1 painelC add painelC2 parte sul da janela JPanel inelS new JPanel pa bot es marcar e cancelar JButton bMarcar new JButton Marcar JButton bCancelar new JButton Cancelar painelS add b
60. envolvimento n o se revelou de modo algum um obst culo A leitura pr via da documenta o existente e alguns esclarecimentos por parte dos docentes da cadeira foram suficientes para um bom conhecimento das ferramentas A incorpora o de m dulos de comunica o com o JATLite abriu nos um vasto leque de possibilidades para a elabora o do trabalho Com o evoluir do trabalho foram surgindo pequenos contratempos cuja sua resolu o foi gratificante para o grupo na medida em que se aprenderam e aplicaram novas solu es Para finalizar de referir que o trabalho foi sempre seguido com alguma expectativa pois medida que o amos realizando amos tendo uma no o da interac o criada entre os agentes A visualiza o desta foi fundamental para a percep o de certos problemas criados num sistema deste g nero 17 Melhoramentos Como melhoramentos temos a sugerir implementar outro tipo de algoritmos que melhorem a estrat gia de negociac o que sejam mais eficazes e que possuam algumas condi es de paragem diferentes como o n mero de mensagens enviadas ou o tempo de espera m ximo Estes dois par metros referidos at seriam de f cil implementag o no nosso algoritmo por m o tempo este ano foi mais limitado o que n o nos proporcionou esse desenvolvimento Tamb m seria interessante colocar um intervalo de datas de pesquisa da solug o de modo a que o utilizador pudesse escolher entre que datas queria marcar a reuni o
61. es Existe a op o de escolher o dia a dura o a hora pretendida e as pessoas com quem se quer marcar a reuni o A hora da marca o s ser a pretendida se satisfizer a m dia m xima de indisponibilidade A m dia m xima de indisponibilidade a m dia das prioridades das ocupa es de todos os utilizadores intervenientes na reuni o a uma determinada hora Este valor indicado pelo utilizador Quando uma marca o feita todos os utilizadores que entram na reuni o s o notificados Cr ditos E poss vel consultar os nomes dos autores do programa respectiva data de cria o e vers o Estrutura do programa Para este trabalho consideramos quatro m dulos principais a manipula o do hor rio o esquema de negocia o as comunica es e a interface gr fica A manipulac o do hor rio est directamente relacionada com a gest o da agenda electr nica Este m dulo ser respons vel pela opera es de inser o remo o actualiza o e grava o das ocupa es no hor rio Com o m dulo da negocia o pretende se estabelecer um conjunto de regras que permitam determinar qual o melhor hor rio para um determinado n mero de pessoas Uma ocupa o poder encontrar se em v rios estados de acordo com o hor rio estabelecido pelo utilizador Estes estados poder o classificar se de 1 a 5 conforme o grau de prioridade Para que o algoritmo implementado funcione necess rio especificar o valor m dio m
62. etiraValor String str return str substring str indexOf 1 str length public synchronized static String proximoValorEspaco String str if str indexOf 1 return str substring 0 str indexOf else return str substring 0 str length public synchronized static String retiraValorEspaco String str return str substring str indexOf 1 str length public synchronized static String proximoArgumento String str ocupacao 87 return str substring 0 str index0f public synchronized static String retiraArgumento String str return str substring str indexo0f 1 str length 88
63. gC Horalnicial 1 rbPref ocupacao devolvePrioridade 1 setSelected true private void constroiJanela setTitle Ocupa o setResizable false parte norte da janela JPanel painelN new JPanel JLabel lOcup new JLabel Ocupa o lOcup setForeground Color black Font font new Font Tahoma Font BOLD 15 lOcup setFont font painelN add 10cup parte centro da janela JPanel painelC new JPanel new GridLayout 4 1 JPanel painelCl new JPanel new FlowLayout FlowLayout LEFT JPanel painelC2 new JPanel new FlowLayout FlowLayout LEFT JPanel painelC3 new JPanel new FlowLayout FlowLayout LEFT JPanel painelC4 new JPanel new FlowLayout FlowLayout LEFT criac o e inicializac o dos labels da janela JLabel lDescricao new JLabel Descri o ap DE JLabel lData new JLabel Data JLabel lHoralnicio new JLabel Hora In cio JLabel lHoraFim new JLabel Hora Fim ys inicializag o dos campos de introdug o dos dados String horasI new String AlgC HoraFinal AlgC HoraInicial 1 String horasF new String AlgC HoraFinal AlgC HoraInicial 1 for int i AlgC HoraInicial i AlgC HoraFinal i horasI i AlgC HoraInicial i 00 horasF i AlgC HoraInicial itl 00 tDescricao new JTextField 20 tDia new JTextField 2 tMes
64. genteS java import BaseLayer import Abstract import KOMLLayer import java lang import java net import java util import java net import java io public static String public static String public static String public static String public static String public static String public static String public static String private String login private String passwo public Agentes super String readline inicializa semana idC localC portoC tipoC Ades localS portos tipoS rd int diaSemana AlgS agora get Calendar DAY OF WEEK if diaSemana 1 diaSemana 8 AlgS agora add AlgS agora DATE 8 diaSemana inicializa hor ri o if AlgS ler AlgS horario null AlgS inicializaHorario ficheiro try inicializa o hor rio se n o conseguir ler o procedimentos de arranque addresses new BAddressTable connections new BConnectionTable queue new BMessageBuffer 66 18 o ficheiro d ndereco coloca os seu dados numa tabela BufferedReader input new BufferedReader new FileReader new File AgenteS dados deste servidor while readline input readLine null if readline startsWith login readline break while readline input readLine null if readline startsWith password readline break while readline input readLine
65. hoChar parte norte da janela JPanel painelN new JPanel JLabel lPass new JLabel Autentica o lPass setForeground Color black Font font new Font Tahoma Font BOLD 15 lPass setFont font painelN add lPass parte centro da janela JPanel painelC new JPanel painelC setLayout new GridLayout 4 2 0 5 painelC add mLogin painelC add tLogin painelC add mPass painelC add tPass painelC add mLocal painelC add tLocal painelC add mPorto painelC add tPorto parte sul da janela JButton bEntrar new JButton Entrar JButton bCancelar new JButton Cancelar JPanel painelS new JPanel painelS add bEntrar painelS add bCancelar disposig o dos objectos JPanel painelPrincipal new JPanel JLabel mLogin new JLabel Login JLabel mPass new JLabel Password JLabel mLocal new JLabel Localiza o do Servidor JLabel mPorto new JLabel Porto painelPrincipal painelPrincipal painelPrincipal painelPrincipal painelPrincipal painelPrincipal setLayout new BorderLayout 15 15 add new JPanel BorderLayout EAS add new JPanel BorderLayout WES ER add painelN BorderLayout NORTH add painelC BorderLayout CENTE add painelS BorderLayout SOUTH DH R 33 setContentPane painelPrincipal Acc es
66. ic static int auxFim 0 public static int auxSol 0 variaveis usadas por v rias classes public static Hashtable horario public static Ocup conflito calend rio para saber qual a semana em causa public static Calendar agora new GregorianCalendar vari vel para esperar pela resposta do router public static int respostaRouter 1 81 pu A pu pu pu pu pu pu pu pu pu Ocup dura o da reuni o blic static int duracaoR historiais blic static Integer historialR new Integer 14 blic static String nomeR blic static Float mediaR new Float 14 blic static Integer solucaoR blic static int solucao blic static float mediaS 0 blic static void inicializaHorario horario new Hashtable blic synchronized static Integer determinaChave int dia int mes int ano return new Integer dia 1000000 mes 10000 ano blic synchronized static void insereOcupacao int dia int mes int ano ocupacao boolean flag true int hi hiAux List lista ListIterator iLista Ocup ocupacaoAux Integer chave determinaChave dia mes ano hi ocupacao devolveHInicial lista List horario get chave if lista null lista Collections synchronizedList new LinkedList lista add ocupacao else synchronized lista iLista lista listIterator 0 for int j 0 j lt lista size j
67. ionEvent e Object selec listaOutros2 getSelectedValues lista2 AlgC subtraiListas lista2 selec listaOutros2 setListData lista2 listal AlgC ordenaListas selec listal listaOutrosl setListData listal tDescricao addActionListener new ActionListener public void actionPerformed ActionEvent e tDescricao transferFocus Hi tDiaInicio addActionListener new ActionListener public void actionPerformed ActionEvent e tDiaInicio transferFocus D I tMesInicio addActionListener new ActionListener public void actionPerformed ActionEvent e tMesInicio transferFocus tAnoInicio addActionListener new ActionListener public void actionPerformed ActionEvent e tAnoInicio transferFocus tCriterio addActionListener new ActionListener public void actionPerformed ActionEvent e tCriterio transferFocus Dm para fechar o program ao carregar na cruz addWindowListener new WindowAdapter public void windowClosing WindowEvent e eu dispose public void erro String msg JOptionPane showMessageDialog eu msg Erro JOptionPane ERROR MESSAGE public void pedeLista int n 0 55 String utilAux String util AgendaC cliente pedeListaUtil utilAux util while utilAux indexOf 1 utilAux
68. isp AlgC proximoValor conteudo AlgC comunic tRecebidas append Como alternativa as altHora tenho a disponibilidade de altDisp AlgC comunic tRecebidas append An public void trataSolucao String conteudo int solucao Integer parseInt AlgC proximoValor conteudo if solucao 1 conteudo AlgC retiraValor conteudo float media Float parseFloat AlgC proximoValor conteudo 30 AlgC comunic lSolucao2 setText Reuni o s solucao com um grau m dio de indisponibilidades de media AlgC comunic bOutraS setEnabled true AlgC comunic bConfirmar setEnabled true else AlgC comunic 1Solucao2 setText Esgotaram se todas as hip teses dentro dos crit rios pedidos Ocup java import java io class Ocup implements Serializable String descricao int horai int horaf int prior public Ocup String desc int hi int hf int p descricao desc toUpperCase horai hi horaf hf prior p public String devolveDescricao return descricao public int devolveHInicial return horai public int devolveHFinal return horaf public int devolvePrioridade return prior public int devolveIntervalo return horaf horai public boolean novaDescricao String desc if desc equals descricao desc 31 return true
69. l tabela setGridColor Color black tabela setSelectionForeground Color red tabela setSelectionBackground new Color 198 39 39 tabela setRowSelectionAllowed false tabela setCellSelectionEnabled true tabela setLayout new FlowLayout FlowLayout CENTER TableColumn column tabela getColumnModel getColumn 0 column setPreferredWidth 25 coloca as horas for int i AlgC HoraInicial i lt AlgC HoraFinal i tabela setValueAt i 00 i AlgC HoraInicial 0 public void erro String msg JOptionPane showMessageDialog eu msg Erro JOptionPane ERROR MESSAGE public static void main String argv JAgenda agenda new JAgenda ei97007 agenda setSize 870 575 agenda setLocation 70 66 agenda show class rato extends MouseAdapter public void mousePressed MouseEvent e AlgC seleccao null flag true public void mouseReleased MouseEvent e int coluna int linhas data if coluna tabela getSelectedColumn gt 0 data AlgC dataColuna coluna linhas AlgC horasLinha tabela getSelectedRows if AlgC testaSeleccao data 0 data 1 data 2 linhas 0 linhas 1 AlgC seleccao AlgC conflito AlgC colunaSeleccao coluna 45 tabela clearSelection JOcup java import javax swing import java beans Property change stuff import java awt
70. leInputStream nomeFicheiro ObjectInputStream s new ObjectInputStream in horario Hashtable s readObject in close return true catch Exception e System out println e toString return false public synchronized static void mostra int d m a dia mes ano List lista ListIterator iLista Ocup ocupacao Integer chave d agora get agora DAY OF MONTH m agora get agora MONTH a agora get agora YEAR Calendar cal new GregorianCalendar a m d cal add cal DATE 7 for int i 1 i lt 7 i cal add cal DATE 1 dia cal get cal DAY OF MONTH mes Cal get cal MONTH 1 ano Cal get cal YEAR chave determinaChave dia mes ano 85 lista List horario get chave if lista null synchronized lista iLista lista listIterator 0 while iLista hasNext ocupacao Ocup iLista next System out println Descricao ocupacao devolveDescricao System out println Horal ocupacao devolveHInicial System out printin HoraF ocupacao devolveHFinal System out println Prior ocupacao devolvePrioridade System out println public static int esperaRespostaRouter while respostaRouter 1 try Thread sleep 200 catch InterruptedException i System err println i int respostaAux respostaRouter respostaRouter 1 return respost
71. lgC agora get AlgC agora MONTH 1 int anoi AlgC agora get AlgC agora YEAR AlgC agora add AlgC agora DATE 6 int diaf AlgC agora get AlgC agora DAY_OF_MONTH int mesf AlgC agora get AlgC agora MONTH 1 int anof AlgC agora get AlgC agora YEAR labelSemana setText Hor rio da Semana dial mesi anoi a diaf mesf anof tabela clearSelection flag false AlgC seleccao null scrollpane repaint 42 y acerca new AbstractAction Acerca da Agenda 2000 ImageIcon imagens acerca gif public void actionPerformed ActionEvent e JAcerca acerca new JAcerca eu acerca setLocationRelativeTo eu acerca show y private void constroiMenu Constroi o menu de topo menu new JMenuBar Menu Agenda JMenu mAgenda new JMenu Agenda mAgenda setMnemonic KeyEvent VK A mAgenda add novaLigacao mAgenda addSeparator mAgenda add sair JMenu mHorario new JMenu Hor rio mHorario setMnemonic KeyEvent VK H mHorario add abreJOcupacao m m m Horario add apagaOcupacao Horario addSeparator Horario add abreJReuniao JMenu mSemana new JMenu Semana mSemana setMnemonic KeyEvent VK S mSemana add semanaSeguinte mSemana add semanaAnterior JMenu mAcerca new JMenu Acerca mAcerca setMnemonic KeyEvent VK C mAcerca add acerca menu add mAgenda
72. locals tatic String portoS tatic String tipoS tatic String descricaoS ID Dm o DN public static int sincro 0 Wd tatic int listaResp 0 tatic String utilizadores public public Wd Wd public AgenteR super Address myAddress router registrar String readline try 18 o ficheiro d nderecos coloca os seu dados numa tabela BufferedReader input new BufferedReader new FileReader new File AgenteS dados deste servidor while readline input readLine null if readline startsWith H idS readline while readline input readLine null if readline startsWith break while readline input readLine null if readline startsWith break while readline input readLine null if readline startsWith portoS readline break while readline input readLine null if readline startsWith amp descricaoS readline break InetAddress localhost InetAddress getLocalHost System out println Localizag o actual localhost getHostName localS localhost getHostName tipoS AgenteS System out println Servidor idS localS portoS VV tipoS descricaoS myAddress new Address idS localS portos tipoS descricaoS setMyAddress myAddress idS
73. m exit 0 if AgendaC cliente novaOcupacao dia mes ano descricao horai horaf prior Ocup ocupacao new Ocup descricao horai horaf prior AlgC insereOcupacao dia mes ano ocupacao JAgenda scrollpane repaint eu dispose else erro N o possivel estabelecer a ligac o com o programa servidor P F Tente ligar o programa de novo System exit 0 else if AlgC testaSeleccao dia mes ano horai horaf erro O intervalo escolhido entra em conflito com outra ocupac o else if AgendaC cliente novaOcupacao dia mes ano descricao horai horaf prior Ocup ocupacao new Ocup descricao horai horaf prior AlgC insereOcupacao dia mes ano ocupacao JAgenda scrollpane repaint eu dispose else erro N o possivel estabelecer a ligac o com o programa servidor P F Tente ligar o programa de novo System exit 0 catch NumberFormatException 1 erro Data mal introduzida Esta deve ter o formato dd mm yyyy Il 50 public void erro String msg JOptionPane showMessageDialog eu JReuniao java import import import import javax swing java beans java awt java awt event Property change stuff class JReuniao extends JDialog pr pria janela para ser usado nas inner private JDialog eu TextField tDescricao TextField tDiaInicio Text
74. myAddress getID break while readline input readLine null if readline startsWith System out println Router readline router new Address readline 75 setRouterAddress router break while readline input readLine null if readline startsWith System out println Registrar readline registrar new Address readline setRegistrarAddress registrar break catch Exception e System out println e toString System exit 1 try createServerThread idS Thread NORM PRIORITY register connect catch ConnectionException e System out println e toString System exit 1 public boolean Act Object o try KOMLmail mail new KQMLmail String o 0 _mailQueue addElement mail addToDeleteBuffer 0 System out println String o KOMLmessage mKQML mail getKOMLmessage String tipo mKOML getValue performative String emissor mKOML getValue sender String conteudo mKOML getValue content if emissor equals Router amp amp tipo equals registered agent utilizadores conteudo substring 1 AlgS respostaRouter 1 else if tipo equals ask amp amp conteudo startsWith meeting devolvePreferencia emissor conteudo substring 9 else if tipo equals reply amp amp conteudo startsWith meetingAnswer processaP
75. ng tipo String emissor String receptor String msg criac o de uma mensagem KQML KOMLmessage mKOML new KOMLmessage mKOML addFieldValuePair performative tipo mKOML addFieldValuePair sender emissor mKQML addFieldValuePair receiver receptor mKQML addFieldValuePair content msg envio da mensagem try sendMessage mKQML return true catch ConnectionException e System out println e toString return false Quanto recepg o das mensagens quando uma mensagem nova chega o procedimento act imediatamente executado Este cont m um conjunto de clausulas if que interpretam o pedido ou a informag o da mensagem encaminhando a para um procedimento Cada procedimento escolhido para tratar a informa o ir satisfazer um pedido guardar informa o ou ainda utiliza la em algoritmos de salientar que as mensagens KQML via inter agentes s o encapsuladas sobre um KQMLmail logo para extrair os dados da mensagem procede se de uma forma ligeiramente diferente A diferen a consiste no desembrulhar do KQML mail transformando o numa mensagem KQML Al m disso necess rio pedir ao router para apagar a mensagem no seu buffer atrav s do procedimento addToDeleteBuffer As mensagens usadas para pedir servi os ou retribuir respostas s o as seguintes Interface Agenda Cria um novo endere o na perform newConnection nome host porto tipo respectiva tabela do processo
76. nt dia Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int mes Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int ano Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo String desc AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int horai Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int horaf Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int prior Integer parseInt AlgS proximoValor conteudo Ocup ocupacao new Ocup desc horai horaf prior AlgS insereOcupacao dia mes ano ocupacao public void apagaOcupacao String conteudo int dia Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int mes Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int ano Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo String desc AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo int horai Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteud int horaf Integer parseInt AlgS p conteudo AlgS retiraValor conteud int prior Integer parseInt AlgS proximoValor conteudo 7 oximoValor con
77. ntentPane add Center new imagem class imagem extends Canvas Image img public void paint Graphics g img Toolkit getDefaultToolkit getImage imagens acerca jpg Desenha a imagem com escalamento g drawImage img 0 0 750 525 this AlgC java 59 import java util import java io Classe de Algoritmos class AlgC t constantes public static int Horalnicial 7 public static int HoraFinal 20 public static int TamLinhas 390 variaveis usadas por v rias classes public static Hashtable horario public static Ocup conflito public static Ocup seleccao null public static int colunaSeleccao calend rio para saber qual a semana em causa public static Calendar agora new GregorianCalendar variaveis para saber se a semana necessita de ser carregada do servidor public static int maxCache 0 public static int minCache 0 public static int semCache 0 vari vel para esperar pela resposta public static int resposta 1 janela das comunica es public static JComunic comunic public static Object ordenaListas Object 11 Object 12 int i i120 i2 20 dif int tam ll length 12 1ength Object 1f new Object tam String iteml item2 for i 0 i lt tam i if 12 12 length while il 11 length lf i 11 1i1 EM ey itt break else if il 11 length while i2 12 length
78. onteudo AlgS retiraValor conteudo AlgS media Float parseFloat AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo aux conteudo while aux indexo0f 1 aux AlgS retiraValor aux LI S Z String util new String n 1 n 0 while conteudo indexOf 1 util n AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo n util n AlgS proximoValor conteudo AlgS nomeR new String util length AlgS nomeR util AlgS solucaoR new Integer util length 1 14 for int i20 i util length i for int 3 0 j 14 j AlgS solucaoR i j new Integer 1 71 chave new Integer data inicializa o meu array for int i20 i 14 i AlgS solucaoR util length i new Integer 0 List lista List AlgS horario get chave if lista null synchronized lista iLista lista listIterator 0 while iLista hasNext ocupacao Ocup iLista next hi ocupacao devolveHInicial 7 hf ocupacao devolveHFinal 7 prioridade ocupacao devolvePrioridade while hi hf AlgS solucaoR util length hi new Integer prioridade hi inicializa m dia for int i20 i 14 i AlgS mediaR i new Float AlgS solucaoR util length i floatValue float util length 1 System out print AlgS mediaR i floatValue for int
79. ows janela com dados ocup new JOcup eu data 0 data 1 data 2 linhas 0 linhas 1 40 else janela com dados da seleccao ocup new JOcup eu data 0 data 1 data 2 AlgC seleccao else janela sem dados ocup new JOcup eu ocup pack ocup setSize 430 290 ocup setLocationRelativeTo eu ocup show y apagaOcupacao new AbstractAction Apaga Ocupac o new Imagelcon imagens apagar_blocol gif public void actionPerformed ActionEvent e if AlgC seleccao null int data AlgC dataColuna AlgC colunaSeleccao String descricao AlgC seleccao devolveDescricao int horai AlgC seleccao devolveHInicial int horaf AlgC seleccao volveHFinal int prior AlgC seleccao volvePrioridade d d if AgendaC cliente apagaOcupacao data 0 data 1 data 2 descricao horai horaf prior AlgC apagaOcupacao data 0 data 1 data 2 AlgC seleccao AlgC seleccao null else erro N o possivel estabelecer a ligac o com o programa servidor P F Tente ligar o programa de novo System exit 0 y abreJReuniao new AbstractAction Marcar Nova Reuni o new Imagelcon imagens reuniaol gif public void actionPerformed ActionEvent e JReuniao reuniao new JReuniao eu reuniao pack reuniao setSize 600 450 reuniao setLocationRelativeTo eu reuniao sho
80. r e em qualquer altura consultar a agenda pessoal e marcar novas reuni es Al m disso tamb m poss vel avisar os utilizadores de novas marca es em tempo real atrav s da utiliza o do mail e SMS Ainda de referir que em certos trabalhos noutras disciplinas j existe a necessidade de marcarmos hor rios para reuni es com os nossos colegas Esta tarefa toma se um pouco complexa pois muitas vezes imposs vel satisfazer todos os intervenientes Descric o Funcionalidades O trabalho realizado apresenta as seguintes funcionalidades Sistema de seguran a A aplica o criada cont m um sistema de seguran a que permite identificar o utilizador em causa evitando abusos de privacidade Assim para entrar no programa necess ria a introdu o de um login e de uma password gt Gest o de Agendas Cada utilizador pode fazer a gest o da sua agenda atrav s de opera es de inser o remo o e altera o de ocupa es Uma ocupa o um intervalo de tempo em que o utilizador tem algo programado associado a um n vel de prioridade As agendas s o persistentes estando gravadas num ficheiro e s o visualizadas por semana A interac o com a agenda feita pelo meio de uma janela Com a ajuda do rato pode se realizar todas as opera es atr s descritas atrav s de selec es directas no hor rio gt Marca o de Reuni es Com a ajuda da aplica o poss vel marcar reuni es com os outros utilizador
81. ras horas poss veis as respostas s o acompanhadas por uma hora alternativa e respectiva prioridade As horas alternativas s o aquelas que ainda n o foram enviadas e cujo valor de indisponibilidade m nimo Ou seja as agendas que respondem durante uma marcag o guardam um historial das horas que j foram enviadas para a agenda marcadora Para isso no inicio da negociac o criado um array com as prioridades de cada hora do dia a marcar Quando a prioridade de uma hora enviada o seu valor no array passa a 1 Assim torna se f cil de saber quando se tem que escolher uma hora alternativa qual a que tem menor prioridade Array inicial com as prioridades da agenda num determinado dia Horas 7 8 9 10 11 12 13 14 15 16 I7 18 19 20 prose p qx cg s 5 5 59 5 15 156102 pedida a hora 10 pela agenda marcadora A resposta enviada com uma alternativa que neste caso ser o as 19 horas Ent o o historial fica alterado da seguinte forma Horas 7 8 9 io 11 12 55 i s r v i 99 o Prior ds Ue J3 Ja 17 po Bop 12 158215 asso Para saber qual a hora com menor prioridade acha se o m nimo do array sem contar com as horas cuja prioridade 1 Consideremos agora a t tulo de exemplo que a agenda marcadora possui o seguinte hor rio Horas 7 8 9 fio 11 12 13 14 fis 16 I7 18 19 20 Prior 1 5 fo jo 2 J 2 4 i i fji jo jo 5 l4 Para auxiliar nos c lculos a agend
82. referencia emissor conteudo substring 15 else if tipo equals ask amp amp conteudo startsWith newMeetingDate carregaLista conteudo substring 16 else if tipo equals perform amp amp conteudo startsWith confirmedMeeting 76 public void processMessage String command Object obj public boolean msgKOML String tipo String emissor String receptor String msg confirmaReuniao conteudo substring 18 catch Exception e System out println e toString return false return true criac o de uma mensagem KQML KOMLmessage mKOML new KOMLmessage mKOML addFieldValuePair performative tipo mKOML addFieldValuePair sender emissor mKQML addFieldValuePair receiver receptor mKQML addFieldValuePair content msg envio da mensagem try sendMessage mKQML return true catch ConnectionException e System out println e toString return false public String listaUtilizadores String arg id estado String util new String try listUsers AlgS esperaRespostaRouter do utilizadores AlgS retiraArgumento utilizadores arg AlgS proximoArgumento utilizadores id AlgS proximoValorEspaco arg arg AlgS retiraValorEspaco arg arg AlgS retiraValorEspaco arg arg AlgS retiraValorEspaco arg estado AlgS proximoValorEspaco arg if es
83. res com quem queremos marcar as reuni es podem ser seleccionados com a ajuda das setas que se encontram no ecr Finalmente ao carregarmos no bot o marcar aparece uma nova janela que mostra as comunica es efectuadas entre as agendas Ao ser encontrada uma solu o poss vel pedir outra ou confirma la Neste ltimo caso as reuni es ser o automaticamente marcadas nas agendas dos intervenientes Se quisermos visualizar os nomes dos autores do programa podemos faze lo atrav s do menu carregando sobre as palavras acerca de 20 Exemplo de uma Execu o Janela inicial de seguran a e identifica o do utilizador Como j foi dito nesta introduz se o login password localiza o do processo que gere a agenda e seu porto Seguran a o acesso interdito punido por lei x Autentica o Login Antonio Password ES Localizac o do Servidor coyote ugly Porto 6666 Entrar Cancelar A imagem seguinte mostra a janela principal do programa havendo uma selecg o efectuada pelo rato na segunda feira das 9 s 13 Agenda 2000 Bermindo Antonio lol x Agenda Hor rio Semana Acerca Hor rio da Semana 11 12 2000 a 17 12 2000 4 K Horas Segunda Ter a Quarta Quinta 1 1 S bado Dominga ESTUDAR DEELER AAA ERAS CINEMA EELER lt y 19 00 za Tr 20 00 4 21 Se no momento da figura anterior s
84. rnativa Mensagem auxiliar enviada ao outro processo gestor da agenda atrav s do router que apenas verifica se este ainda se encontra ligado N o se pretende obter resposta Para o processamento do conte do das mensagens elaboraram se duas fun es Uma que retoma o primeiro argumento da mensagem e outra que o retira Assim poss vel aceder a todos os argumentos facilmente Interface A implementa o da interface teve v rios pontos essenciais Foram criadas v rias janelas de interac o com o utilizador que tentam dar ao programa uma simples utiliza o Antes de criar a tabela que representa o hor rio semanal teve se que elaborar um modelo desta AbstractTableModel que ir inicializar a primeira coluna com as horas do dia e a primeira linha com os dias da semana Sobre a tabela poss vel fazer selec es de modo a facilitar a inser o altera o e remo o de ocupa es Foram desenvolvidos dois array s para as agendas ligadas que aparecem na janela de marca o de reuni es Estes s o os respons veis pela visualiza o correcta dos utilizadores seleccionados para a marca o de uma reuni o Uma funcionalidade muito interessante a cria o de um sistema tipo cache para a visualiza o das ocupa es nas diversas semanas Este sistema implementado gra as a duas vari veis Estas indicam o intervalo de semanas que j foram pedidas ao processo gestor da agenda visto que o hor rio localiza se neste
85. rvidor idS AgendaS servidor idC stdoutl AlgS nomeR nUtil meeting novaHora else if AlgS fim 0 AlgS auxSol if AlgS auxSol AlgS auxFim AlgS nomeR length System out println CHEGUEI AO FIM 80 AgendaS servidor msgKOML perform AgendaS servidor idS AgendaS servidor idC solution AlgS solucao 7 AlgS mediaS if AlgS fim 1 amp amp novaHora 1 AlgS auxFim if AlgS auxFim AlgS nomeR length System out println ESGOTEI AS SOLUCOES AgendaS servidor msgKOML perform AgendaS servidor idS AgendaS servidor idC solution 1 public void confirmaReuniao String conteudo int hora Integer parseInt AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo String desc AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo Integer chave new Integer AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo conteudo AlgS retiraValor conteudo int duracao Integer parseInt AlgS proximoValor conteudo Ocup ocupacao new Ocup desc hora hora duracao 3 AlgS insereReuniao chave ocupacao AlgS java import java util import java io Classe de Algoritmos class AlgS constantes public static String nomeFicheiro horario hor public static float media 1 public static int fim 1 publ
86. s int ano return new Integer dia 1000000 mes 10000 ano public static void insereOcupacao int dia int mes int ano Ocup ocupacao boolean flag true int hi hiAux LinkedList lista ListIterator iLista Ocup ocupacaoAux Integer chave determinaChave dia mes ano hi ocupacao devolveHInicial lista LinkedList horario get chave if lista null lista new LinkedList lista add ocupacao else iLista lista listIterator 0 for int j 0 j lt lista size j ocupacaoAux Ocup iLista next hiAux ocupacaoAux devolveHInicial if hi lt hiAux iLista previous 62 iLista add ocupacao flag false break if flag iLista add ocupacao horario put chave lista public static void apagaOcupacao int dia int mes int ano Ocup ocupacao LinkedList lista Integer chave determinaChave dia mes ano lista LinkedList horario get chave if lista size lt 1 horario remove chave else lista remove ocupacao horario put chave lista seleccao null JAgenda scrollpane repaint public static boolean testaSeleccao int dia int mes int ano int hi int hf int hiAux hfAux LinkedList lista ListIterator iLista Ocup ocupacaoAux Integer chave determinaChave dia mes ano lista LinkedList horario get chave if lista null iLis
87. scricao new JLabel Descri o ys JLabel lDataInicio new JLabel Data Prevista JLabel lHoraInicio new JLabel Hora Prevista 8 0 8 0 8 0 51 JLabel lCriterio new JLabel M dia m xima de Indisponibilidades JLabel lDuracao new JLabel Dura o Wyre J J Label lOutros new JLabel Outras Agendas Label lMarcarCom new JLabel Marcar Reuni o com inicializag o dos campos de introdug o dos dados String horas new String AlgC HoraFinal AlgC Horalnicial 1 String horasd new String AlgC HoraFinal AlgC HoraInicial 1 for int i AlgC HoraInicial i AlgC HoraFinal i horas i AlgC HoraInicial i 00 for int i 1 i lt AlgC HoraFinal AlgC Horalnicial 1 i horasd i 1 i 00 tDescricao new JTextField 25 tDiaInicio new JTextField 2 tMesInicio new JTextField 2 tAnoInicio new JTextField 4 cHoraInicio new JComboBox horas tCriterio new JTextField 1 00 3 cDuracao new JComboBox horasd localizag o dos componentes painelCll add lDescricao painelC11 add tDescricao painelCll add lDuracao painelCll add cDuracao painelC12 add lDataInicio painelC12 add tDialnicio painelC12 add new JLabel painelC12 add tMesInicio painelC12 add new JLabel painelC12 add tAnoInicio painelC12 add lHoraInicio painelC12 add cHoraInicio pain
88. semCache 0 AlgC minCache 0 AlgC maxCache 0 AlgC agora new GregorianCalendar int diaSemana AlgC agora get Calendar DAY_OF_WEEK if diaSemana 1 diaSemana 8 AlgC agora add AlgC agora DATE diaSemana 2 int diai AlgC agora get AlgC agora DAY OF MONTH int mesi AlgC agora get AlgC agora MONTH 1 int anoi AlgC agora get AlgC agora YEAR AlgC agora add AlgC agora DATE 6 int diaf AlgC agora get Calendar DAY_OF_MONTH int mesf AlgC agora get Calendar MONTH 1 int anof AlgC agora get Calendar YEAR label da semana actual com letra real ada labelSemana setText Hor rio da Semana diai mesi anoi a diaf mesf anof AgendaC cliente logout AgendaC janelaPass show eu dispose y sair new AbstractAction Sair new ImageIcon imagens sair gif public void actionPerformed ActionEvent e AgendaC cliente logout System exit 0 y abreJOcupacao new AbstractAction Nova Ocupa o new public void actionPerformed ActionEvent e int coluna int linhas data JOcup ocup if coluna tabela getSelectedColumn gt 0 amp amp flag calculo do dia seleccionado data AlgC dataColuna coluna if AlgC seleccao null janela com dados das horas calculo das horas seleccionadas linhas AlgC horasLinha tabela getSelectedR
89. sgKOML String tipo String emissor String receptor String msg criac o de uma mensagem KQML KOMLmessage mKQML new KOMLmessage mKOML addFieldValuePair performative tipo mKOML addFieldValuePair sender emissor mKQML addFieldValuePair receiver receptor mKQML addFieldValuePair content msg envio da mensagem try sendMessage mKQML return true catch ConnectionException e System out println e toString return false public void novaLigacaoCliente String conteudo idC AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo localC AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo portoC AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo tipoC AlgS proximoValor conteudo try Address addr new Address idC localC portoC tipoC addresses addAddress addr catch Exception e System out println e toString public boolean verificaLogin String conteudo String 1 AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo String p AlgS proximoValor conteudo if l equals login amp amp p equals password if msgKOML reply idS idC login true return true else if msgKOML reply idS idC login false reburn true return false 69 public void novaOcupacao String conteudo i
90. sposta que essa mesma resposta satisfaga a totalidade dos agentes nela presentes ou na impossibilidade desta situac o que satisfaga o maior n mero de utilizadores poss vel gt Portabilidade Ser do interesse para futuros utilizadores que possam recorrer aplica o a partir de v rios locais acedidos por variadas plataformas Como existe um trabalho que foi realizado sem a utiliza o do JATLite seria interessante compar los Alguns dos testes a realizar seriam comparar o tempo de resposta o n mero de mensagens m dio por resposta o grau de satisfa o das respostas e os interfaces Al m disso tamb m seria de verificar as grandes vantagens de poder ter um processo gestor do hor rio tal como o que foi implementado a correr em background num sistema permanentemente ligado internet Conclus o Conclu mos que esta arquitectura de negocia es e coopera es entre agentes tem muita aplicabilidade pr tica principalmente agora que a internet est cada vez mais acess vel Como exemplo de um sistema deste tipo temos os leil es virtuais Por outro lado a comunica o entre agentes pode ser aplicada noutras reas como a rob tica que leva a solug es muito interessantes Ao optarmos pelo esquema de liga o com a ajuda de um router deparamo nos com um esquema de comunica es bastante complexo o que nos trouxe alguns problemas que foram prontamente estudados e resolvidos O recurso a novas ferramentas de des
91. stroiAccoes constroi menu constroiMenu constroi parte norte da janela toolBarNorte new JToolBar toolBarNorte setMargin margemToolBar constroiNorte constroi parte oeste da janela toolBarOeste new JToolBar toolBarOeste setMargin margemToolBar constroiOeste constroi parte centro da janela constroiCentro scrollpane new JScrollPane tabela Selec es feitas pelo rato tabela addMouseListener new rato painel principal JPanel painelPrincipal new JPanel painelPrincipal setLayout new BorderLayout painelPrincipal add toolBarNorte BorderLayout NORTH painelPrincipal add toolBarOeste BorderLayout WEST painelPrincipal add scrollpane BorderLayout CENTER painelPrincipal add new JPanel BorderLayout EAST painelPrincipal add new JPanel BorderLayout SOUTH setContentPane painelPrincipal para fechar o program ao carregar na cruz this addWindowListener new WindowAdapter public void windowClosing WindowEvent e AgendaC cliente logout System exit 0 Hi private void constroiAccoes novaLigacao new AbstractAction Ligar como Outro Utilizador ImageIcon imagens liga gif public void actionPerformed ActionEvent e reinicializacao das variaveis AlgC inicializaHorario AlgC seleccao null new 39 ImageIcon imagens novo blocol gif AlgC
92. ta lista listIterator 0 for int j 0 j lt lista size j ocupacaoAux Ocup iLista next hiAux ocupacaoAux devolveHInicial hfAux ocupacaoAux devolveHFinal if hf hiAux hi gt hfAux conflito ocupacaoAux return false return true public synchronized static void mostra int d m a dia mes ano List lista Ocup ocupacao Integer chave ListIterator iLista d agora get agora DAY OF MONTH m agora get agora MONTH a agora get agora YEAR Calendar cal new GregorianCalendar a m d cal add cal DAT for int i 1 i lt 7 i cal add cal DAT E 7 E 1 dia cal get cal DAY OF MONTH mes Cal get cal MONTH 1 ano Cal get cal YEAR chave determinaChave dia mes ano lista LinkedList horario get chave if lista null synchronized lista iLista lista listIterator 0 while iLista hasNext ocupacao System out System out System out System out System out public static int Ocup iLista next println Descricao ocupacao devolveDescricao println HoraI ocupacao devolveHInicial println HoraF ocupacao devolveHFinal println Prior ocupacao devolvePrioridade println dataColuna int coluna int data 0 0 0 retira a coluna das horas coluna calculo do dia seleccionado agora
93. tado equals connected amp amp id equals ids 1 msgKOML tel1 idS id Hello while utilizadores indexOf 1 TI x try Thread sleep 500 catch InterruptedException f System err printin f listUsers AlgS esperaRespostaRouter do utilizadores AlgS retiraArgumento utilizadores arg AlgS proximoArgumento utilizadores id AlgS proximoValorEspaco arg arg AlgS retiraValorEspaco arg arg AlgS retiraValorEspaco arg arg AlgS retiraValorEspaco arg estado AlgS proximoValorEspaco arg if estado equals connected amp amp id equals ids util util id TERN E ConnectionException e System out println e toString if util length gt 0 return util substring 1 else return public synchronized void carregaLista String conteudo Ocup ocupacao Integer chave ListIterator iLista int prioridade hi hf sincro 1 chave new Integer AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo AlgS duracaoR Integer parseInt AlgS proximoValor conteudo inicializa historial for int i 0 i lt 14 i AlgS historialR i new Integer 0 List lista List AlgS horario get chave if lista null synchronized lista 78 msgKOML reply idS receptor meetingAnswer hora prior E yes 1 1 altHor
94. teudo o E O AlgS apagaOcupacao dia mes ano horai AlgS gravar public boolean devolveSemana String conteudo int sem Integer parseInt AlgS proximoValor conteudo AlgS agora new GregorianCalendar inicializa semana int diaSemana AlgS agora get Calendar DAY OF WEEK if diaSemana 1 diaSemana 8 AlgS agora add AlgS agora DATE 8 diaSemana E AlgS agora add AlgS agora DATE sem 7 E int d AlgS agora get AlgS agora DAY OF MONTH int m AlgS agora get AlgS agora MONTH 1 int a AlgS agora get AlgS agora YEAR if msgKOML reply idS idC week AlgS semanaHorario return true else return false 70 public void logoutCliente AlgS gravar connections removeConnection idC public void devolveUtilizadores 1 String util util AgendaS router listaUtilizadores msgKQML reply idS idC connectedUsers util public synchronized void novaMarcacao String conteudo String data hora duracao aux Ocup ocupacao Integer chave ListIterator iLista int prioridade hi hf n 0 AlgS fim 1 AlgS auxFim 0 AlgS auxSol 0 data AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo hora AlgS proximoValor conteudo conteudo AlgS retiraValor conteudo duracao AlgS proximoValor conteudo c
95. w y semanaAnterior new AbstractAction Semana Anterior new ImageIcon imagens anterior gif 41 public void actionPerformed Action AlgC semCache s pede semana ao servidor se if AlgC semCache lt AlgC minCache Event e for necessario AgendaC cliente pedeSemana AlgC semCache AlgC minCache AlgC esperaResposta AlgC agora add AlgC agora DATE 13 int diai AlgC agora get AlgC agora DAY OF MONTH int mesi AlgC agora get AlgC agora MONTH 1 int anoi AlgC agora get AlgC agora YEAR AlgC agora add AlgC agora DATE 6 int diaf AlgC agora get AlgC agora DAY OF MONTH int mesf AlgC agora get AlgC agora MONTH 1 int anof AlgC agora get AlgC agora YEAR labelSemana setText Hor rio da Semana diai mesi anoi a diaf mesf anof tabela clearSelection flag false AlgC seleccao null scrollpane repaint y semanaSeguinte new AbstractAction SemanaSeguinte new Imagelcon imagens seguinte gif public void actionPerformed ActionEvent e AlgC semCache s pede semana ao servidor se for necess rio if AlgC semCache gt AlgC maxCache AgendaC cliente pedeSemana AlgC semCache AlgC maxCache AlgC esperaResposta AlgC agora add AlgC agora DATE 1 int diai AlgC agora get AlgC agora DAY OF MONTH int mesi A
96. ximo de indisponibilidade total Como j foi referido anteriormente este a m dia das prioridades dos utilizadores a uma determinada hora este valor que vai ser a condi o de paragem do algoritmo Se a hora a examinar tiver uma indisponibilidade m dia total inferior ao especificado encontrada uma solu o Quanto parte das comunicag es pensou se em v rios tipos de implementac o acabando se por implementar um esquema de ligag o com a ajuda de um router No esquema escolhido sobressai o facto de por cada agenda existirem dois processos independentes que interagem de modo a formar um agente Um trata do interface e em princ pio n o ir estar a correr na maior parte do tempo Serve para interagir com o utilizador e tem como vantagens poder encontrar se em qualquer local e poder aceder a hor rios de pessoas diferentes a partir do mesmo programa tendo o login e password dessas pessoas O outro um processo mais fixo que em geral destina se a correr em background numa m quina que esteja sempre ligada internet exemplo na m quina TOM da faculdade de engenharia Todo o processo de gest o de altera es ro ficheiro que guarda o hor rio feito neste Processo gestor do interface gt Faz a interac o com o utilizador atrav s de uma interface gr fica Faz pedidos ao processo gestor da agenda correspondente e recebe as respectivas respostas Processo gestor da agenda gt Inicialmente regista se no router in

Download Pdf Manuals

image

Related Search

Related Contents

  User's Guide - BubbleBead Filters  sciences agronomiques résumé des recherches  Lenco 2.1 home cinema set MDV-6  菅原研究所  User Manual  CAMEO® - DISASTER info DESASTRES  Ouvrages phares de la Réforme et de la Contre-Réforme  Gebrauchsanleitungen Operating Instructions Mode d  VIEW™ DV C - Touchboards  

Copyright © All rights reserved.
Failed to retrieve file