Desmistificando a Certificação SCJD

Tamanho: px
Começar a partir da página:

Download "Desmistificando a Certificação SCJD"

Transcrição

1 a r t i g o Desmistificando a Certificação SCJD Roberto Perillo é bacharel em Ciência da Computação e está atualmente concluindo o curso de especialização em Engenharia de Software do ITA. Trabalha com Java há quase 5 anos, possui as certificações SCJP, SCWCD e SCJD, e é moderador no JavaRanch, onde participa ativamente dos fóruns. Já trabalhou com JEE em grandes empresas, como Avaya e IBM, onde, nesta última, foi co-fundador do time de inovação de ibm.com GWPS LA. A certificação que merece mais atenção da comunidade Java De todas as certificações Java disponíveis atualmente, a SCJD é a única que efetivamente exige que o candidato mostre na prática que sabe utilizar a linguagem Java para resolver problemas do mundo real através do desenvolvimento de uma aplicação. Esta certificação exige que o candidato mostre certo nível de proficiência em alguns tópicos que não são contemplados em outras certificações, como RMI/Sockets ou Swing. Este artigo mostra o que os candidatos devem esperar ao optar por esta certificação, todos os passos que devem ser seguidos para obtê-la, as armadilhas que se escondem por trás dos requisitos e como seria a resolução de um exemplo fictício de atribuição. Atualmente, a linguagem Java possui oito certificações, sendo que apenas duas delas são baseadas em desempenho prático, ou seja, o candidato é submetido a uma tarefa e só consegue êxito se desenvolvê-la e atingir um número mínimo de pontos após avaliação. Uma destas certificações é a SCJD (Sun Certified Java Developer), na qual o candidato precisa desenvolver uma atribuição de programação e um exame de redação referente ao programa desenvolvido. Na atribuição, o candidato deve construir um programa cliente/servidor que precisa seguir algumas regras e também deve preparar documentos referentes à própria atribuição. No exame de redação, o candidato deve responder a quatro perguntas genéricas (ou que se aplicam a qualquer um dos modelos de atribuição). Embora as perguntas sejam referentes a pontos específicos do projeto, o real objetivo deste exame é verificar se o projeto foi realmente desenvolvido pelo candidato que solicitou a certificação, e não por outra pessoa. Vale lembrar que tudo, desde comentários JavaDoc à prova de redação, deve ser escrito em inglês. 62 om.br

2 Para obter esta certificação, o candidato deve obrigatoriamente ter qualquer versão da certificação SCJP, e como ela é composta de duas fases, são necessários dois vouchers para concluí-la. Ao solicitar a certificação, o candidato recebe um arquivo.jar que contém um arquivo chamado instructions.html e um arquivo.db, que representa um banco de dados não-relacional. O arquivo instructions.html contém todas as instruções e regras necessárias para o desenvolvimento do projeto, e contém também o código de uma interface Java que deve ser implementada por uma classe que deve ter um nome específico, indicado nas instruções. Esta classe será responsável pelo acesso ao arquivo.db recebido no arquivo.jar. Após desenvolver o projeto e todos os documentos solicitados, o candidato deve fazer o upload do projeto resolvido e fazer o exame de redação. O resultado é disponibilizado ao candidato entre 4 a 6 semanas. O prazo máximo para o candidato fazer o upload do projeto resolvido é de um ano a partir da data do download da atribuição, e a pontuação Este artigo está organizado da seguinte forma: primeiramente, é feita uma análise sobre como é a atribuição real. Em seguida, são mostradas técnicas e padrões que podem ser aplicados na resolução da atribuição, e também as etapas que podem ser seguidas durante a resolução, com exemplos de como cada componente pode ser desenvolvido. Em seguida, para reforçar o entendimento, são abordados os modos como a aplicação deve ser executada. Em seguida, é dada a visão final do projeto, detalhando todos os artefatos que devem ser entregues ao final da resolução do projeto. O mecanismo de bloqueio, que é o item mais complexo desta certificação, é abordado em seguida. E, finalmente, são feitas as considerações finais, finalizando o artigo. A atribuição Scarper, sendo que a essência de cada projeto é sempre a mesma, apenas com algumas pequenas variações entre suas versões. Basicamente, o desenvolvimento consiste na construção de um sistema cliente/servidor que acessa um arquivo binário (o formato do arquivo é fornecido junto com as instruções). Este sistema deve permitir que o usuário reserve recursos disponíveis, além de permitir que o usuário faça buscas de acordo com determinados critérios. A atribuição não possui regras de negócio muito complexas, mas o candidato deverá construir tanto o servidor (utilizando RMI ou Sockets) quanto o cliente que acessa esse servidor. O servidor deve ser capaz de lidar com múltiplas requisições simultâneas, e deve gerenciar o acesso ao arquivo binário através de um mecanismo de bloqueio, de forma a proteger a integridade do arquivo, para que um cliente não sobrescreva inapropriadamente os dados providos por outro cliente. Além disso, a aplicação também deve ser executada em modo standalone, o que significa que a aplicação deve disponibilizar as telas ao usuário e acessar o arquivo binário localmente sem utilizar o código do servidor. Em relação às telas, devem ser construídas utilizando-se Swing, e podem utilizar AWT somente quando não houver componentes Swing correspondentes. Por exemplo, o candidato deve utilizar javax.swing.jbutton ao invés de java.awt.button, e pode também utilizar java.awt.event.actionlistener. As telas que o candidato deve construir não são complexas, devendo apenas permitir que o usuário proveja dados de configuração, visualize os registros do arquivo binário e efetue buscas e reservas. Assim, o candidato deve construir telas Swing simples, criar um servidor capaz de lidar com requisições simultâneas e gerenciar o acesso ao arquivo binário através de um mecanismo de bloqueio e deve também criar o cliente que conecta a este servidor. O que define se os dados devem ser buscados local ou remotamente é um parâmetro passado na linha de comando quando a aplicação é executada. Durante o desenvolvimento, o candidato se depara com várias perguntas, pelo fato de que as instruções fornecidas pela Sun possuem alguns pontos ambíguos. Embora possa parecer ao candidato que esteja faltando alguma informação, a Sun deixa algumas questões em aberto propositalmente. No final do documento de instruções, consta uma frase que diz que as instruções deliberadamente deixam algumas questões não-especificadas, e alguns problemas escondidos. A habilidade que o candidato tem de tomar decisões perante estas dúvidas, lidar com requisitos mal especificados e definir soluções com as opções disponíveis é parte da avaliação. O candidato deve também ser capaz de filtrar o que deve ser feito e o que não precisa ser feito. Por exemplo, o candidato pode se perguntar se é necessário utilizar o padrão Observer, para que quando a aplicação seja executada em modo cliente (conectada ao servidor) e um registro seja modificado, todos os clientes sejam notificados. Este é um exemplo de um requisito que não é preciso implementar. Assim, o principal critério de avaliação é verificar se o candidato é capaz de fazer o que se pede de forma simples, sendo que o candidato não ganha pontos extras ao implementar até perder pontos. Vale lembrar que é preferível que o candidato utilize implementações da API Java ao invés de suas próprias implementações. Uma das primeiras coisas especificadas no documento de instruções é o texto que identifica o que seria a necessidade do usuário. O exemplo a seguir, apesar de fictício, mostra o que o candidato pode esperar na atribuição real: território nacional. Uma de suas áreas organiza excursões de ônibus por cidades em todo o Brasil. Uma nova lei do governo demandou um cadastro único de excursões no país e, dessa forma, todas as companhias que organizam excursões deverão obrigatoriamente registrá-las nesse cadastro. A criar esse cadastro. Na primeira fase, a ideia é que o sistema seja executado somente na rede da empresa, onde os representantes de venda o acessarão em um servidor local e, dessa forma, as empresas terão que entrar em contato para registrar suas excursões por telefone, mas em um prazo a ser definido, o sistema será migrado para web, onde as próprias empresas poderão acessá-lo e registrar suas excursões. Para isso, o CIO da empresa decidiu contratar o desenvolvimento de um novo sistema em Java. Neste momento, a ideia é fazer algo somente para a primeira fase, pois a migração para web ainda não tem previsão. Dessa forma, não é previsto se os componentes desenvolvidos serão reutilizados no sistema web, mas talvez o sejam. Um dos requisitos do novo cadastro é que os dados sejam armazenados em um arquivo.txt, cujo formato foi fornecido pelo próprio governo. Dessa forma, não é possível utilizar um SGBD, como MySQL, por exemplo. Assim, terá que ser desenvolvido também um componente que acesse esse arquivo, respeitando o formato criado pelo governo. A nova aplicação, utilizando o formato de arquivo existente, deve permitir que os representantes de vendas criem dados de novas excursões, efetuem exclusões e exibam os dados de uma determinada viagem. Este é o projeto cujo desenvolvimento lhe foi atribuído. 63

3 Além da construção do sistema, o candidato deve listar em arquivo chamado choices.txt todas as escolhas de arquitetura e projeto feitas durante o desenvolvimento. Neste arquivo, o candidato deve também listar pontos ambíguos encontrados nos requisitos, as escolhas correspondentes e os motivos pelos quais o candidato tomou as respectivas decisões. Embora a Sun recomende que se utilize um conjunto de convenções de código durante todo o projeto, o candidato deve preferivelmente utilizar as convenções de código da própria Sun, e todos os elementos (pelo menos da interface pública) devem obrigatoriamente possuir comentários JavaDoc. Uma boa dica é fornecer comentários JavaDoc para todos os elementos de cada classe. Com JavaDoc comentando corretamente os elementos das classes, o candidato deve utilizar a ferramenta javadoc para gerar a documentação Java- Doc, que também deve obrigatoriamente ser entregue. O candidato deve também criar um guia do usuário para o projeto, que deve ser fornecido em um arquivo.txt, em formato HTML ou dentro da própria aplicação. O conteúdo deste guia deve conter as informações suficientes para que uma pessoa familiarizada com o propósito do projeto possa utilizar o sistema. Outro documento que deve ser entregue também é um arquivo chamado version.txt, no qual o candidato simplesmente indica a versão da JDK utilizada e o sistema operacional em que a aplicação foi construída. Resolvendo a atribuição Existem alguns padrões de arquitetura que podem ser seguidos para que a atribuição possa ser resolvida. Uma boa ideia é manter as coisas o mais simples possível, pois a arquitetura definida e o quão fácil é utilizar e manter o código desenvolvido também é parte da avaliação. No excelente livro EJB 3 In Action, os autores abordam um estilo de arquitetura chamado arquitetura tradicional de quatro camadas, que é bastante conhecido entre designers de aplicações enterprise. Embora a aplicação a ser desenvolvida seja cliente/servidor, esse padrão pode ser seguido para a resolução da atribuição. As quatro camadas que compõem este estilo de arquitetura são: camada de apresentação, camada de negócios, camada de persistência e camada de ban- por lidar com interesses de UI (User Interface), como exibir mensagens visuais para o usuário, habilitar ou desativar campos-texto, lidar com botões do tipo radio etc. Esta camada deve conter somente lógica de UI, e não propriamente de negócios, que deve se concentrar somente na camada de negócios. A camada de negócios representa o coração deste estilo de arquitetura e é responsável por concentrar todas as regras de negócio implementadas pela aplicação. Esta disso, todas as operações de banco de dados são intermediadas pela camada de persistência, que é uma abstração orientada a objetos sobre a camada de banco de dados. Esta camada não deve conter regras de negócio, e deve burramente obedecer a todas as requisições da camada de negócio. Apresentação Negócios Persistência Base de Dados Figura 1. Organização da arquitetura tradicional de quatro camadas. As camadas da arquitetura apresentada são lógicas, o que significa que elas podem estar fisicamente agrupadas (no mesmo.jar ou projeto, por exemplo). O grande benefício da separação da aplicação em camadas é que cada camada cuida apenas de um aspecto específico, promovendo reúso, flexibilidade e facilidade na manutenção. Ao optar pela arquitetura em camadas, deve-se ter em mente que os componentes de uma camada precisam somente trocar mensagens entre si ou com as camadas abaixo (caso uma camada abaixo precise se comunicar com uma camada acima, pode-se utilizar mecanismos de callback ou o padrão Observer). Projetar e definir a API de uma camada de forma isolada ajuda a mantê-la simples e flexível. Por exemplo, pode-se definir os componentes da camada de negócios sem se preocupar se estes componentes serão utilizados em uma aplicação web ou desktop. O quão fácil o código produzido é de evoluir e manter é um aspecto importante da avaliação. No excelente livro Patterns of Enterprise Application Architecture, Martin Fowler aborda um padrão de organização de lógica de domínio chamado Transaction Script, cuja chave é a simplicidade. Este padrão organiza a lógica de negócios através de um conjunto de transaction scripts, sendo que transaction script é um método que trata de uma requisição da camada de apresentação e organiza a lógica de negócios, efetuando computações e podendo até acessar o banco de dados através de DAOs. Este padrão promove uma estrutura um pouco mais procedural, porque normalmente as classes tendem a ter uma granularidade mais grossa e os dados ficam separados do comportamento. Um exemplo da aplicação do padrão Transaction Script é a própria estrutura proposta pela plataforma EJB (embora seja possível utilizar outros padrões de organização de lógica de domínio, o mais natural é que a implementação seja através de transaction scripts), onde os comportamentos são implementados nos métodos de negócios dos session beans, que utilizam objetos que são na maioria das vezes burros para se comunicar com o banco de dados e com a camada de apresentação (os chamados Transfer Objects, ou Data Transfer Objects). Embora possa parecer ruim, a atribuição proposta pela certificação pode ser resolvida utilizando este padrão. No documento de instruções, consta uma frase que diz que um design claro, que pode ser entendido facilmente por programadores juniores, será preferido a um design complexo, mesmo que este seja um pouco mais eficiente. Em outro excelente livro, chamado POJOs In Action, Chris Richardson mostra como aplicar na prática o padrão Domain Model, que é outro padrão de organização de lógica de domínio. O Domain Model é o maior produto do Domain-Driven Design e, ao contrário do padrão Transaction Script, propõe implementar um modelo de domínio através de um modelo de objetos rico que utiliza plenamente todos os benefícios que a orientação a objetos oferece. A maioria das classes que compõe este modelo de objetos possui tanto dados quanto comportamentos que implementam as regras de negócio. Outras classes (chamadas de serviços neste padrão) oferecem em suas APIs os serviços que devem ser realizados pela aplicação, e estes delegam a realização das tarefas para as entidades. Este modelo de domínio pode ser envolvido por Façades, que encapsulam a camada de domínio e lidam com tarefas de infraestrutura, como delimitar as transações ou desanexar os objetos de domínio dos frameworks de persistência. Aparentemente, utilizar o padrão Domain Model pode ser melhor do que utilizar o padrão Transaction Script para organizar a lógica de domínio da atribuição. Mas Chris Richardson também faz considerações sobre onde faz sentido utilizar o padrão Transaction Script, como quando o time de desenvolvimento não possuir as habilidades de projeto OO necessárias para desenvolver um modelo de domínio, ou a lógica de negócios for muito simples. Também não faz sentido usar um modelo de domínio quando não for possível utilizar um 64

4 framework de persistência. Analisando tanto o texto das instruções quanto as considerações de Chris Richardson, pode-se perceber que pode ser mais adequado utilizar o padrão Transaction Script para resolver a atribuição. Dessa forma, pode-se utilizar a arquitetura tradicional em quatro camadas e construir a camada de negócios com Transaction Scripts, para que cada transaction script lide com uma requisição da camada de apresentação. Primeiro passo: implementação da classe de acesso a dados Definidos os padrões de arquitetura a serem seguidos, podemos começar a pensar efetivamente na implementação. Embora em uma arquitetura bem definida não faça diferença por qual das camadas a aplicação comece a ser implementada, um bom lugar para iniciar o desenvolvimento do projeto é a classe que deve implementar a interface provida pela Sun no documento de instruções. Importante: esta classe deve obrigatoriamente possuir um nome específico (indicado no documento de instruções) e deve também obrigatoriamente estar dentro de um pacote específico (também indicado no documento de instruções), ou o candidato será reprovado automaticamente caso não obedeça a estas regras. Esta classe é responsável pelo acesso ao arquivo.db fornecido pela Sun. A interface fornecida pela Sun é limitada em alguns aspectos, porém como o candidato lida com estas limitações também é parte da avaliação. A Listagem no documento de instruções. public interface DB { // Creates a new record in the database. public void createexcursion(excursion excursion) throws DuplicateExcursionException; // Updates the fields of a given excursion. public void updateexcursion(long recordnumber, Excursion excursion) throws ExcursionNotFoundException; // Deletes a particular record. public void deleteexcursion(long recordnumber) throws ExcursionNotFoundException; // Reads a record from the database. public Excursion readexcursion(long recordnumber) throws ExcursionNotFoundException; // Locks a particular record, so that it can only be // updated or deleted by this client. public void lock(long recordnumber) throws ExcursionNotFoundException; // Unlocks a particular record. public void unlock(long recordnumber) throws ExcursionNotFoundException; é a interface fornecida pela Sun. A interface real não utiliza coleções como List, ou algo como a classe Excursion, por exemplo. Na atribuição real, os dados de um registro são representados por vetores de String. Esta interface reflete dois aspectos importantes: o gerenciamento dos dados e o gerenciamento do mecanismo de bloqueio. É importante que todos os métodos sejam corretamente implementados (mesmo se não forem ser utilizados em nenhuma regra de negócio implementada na atribuição). Além de ser mandatório, trata-se de uma questão de reusabilidade. Levando em consideração o exemplo da Listagem reutilizar a implementação criada aqui. Neste exemplo, um dos requisitos é que o arquivo de dados seja um arquivo-texto com um formato fornecido pelo governo. Na atribuição real, o arquivo de dados é um arquivo binário, que pode ser lido utilizando-se java.io.randomaccessfile. No FAQ do fórum da certificação SCJD do JavaRanch pode-se encontrar um código feito pelo autor deste artigo que lê e exibe no console o conteúdo do arquivo binário. Os candidatos podem então utilizá-lo e entender como o arquivo pode ser lido e criar suas próprias implementações. Na atribuição real, alguns métodos da interface provida pela Sun recebem vetores de String, onde cada valor do vetor representa um campo do registro no banco de dados. O formato do arquivo também é fornecido no documento de instruções, e contém informações como um valor que indica se o arquivo é válido ou não, tamanho em bytes de cada registro, número de campos em cada registro etc. O esquema do banco de dados também é fornecido, e contém informações como o nome e o tamanho em bytes de cada campo. Neste exemplo, a classe Excursion reflete exatamente o formato de um registro do banco de dados. package certification.domain; import java.util.date; public class Excursion implements Serializable { // Número do ônibus private int busnumber; // Nome da empresa private String companyname; // Data de saída da cidade de origem private Date departure; // Data da volta à cidade de origem private Date arrival; // Nome da cidade de origem private String origin; // Nome da cidade de destino private String destiny; // Preço da excursão private String price; // Capacidade de passageiros no ônibus private byte capacity; // Other methods... // Getters e Setters omitidos... 65

5 No caso do método de criação de registro, o candidato terá que avaliar se no esquema fornecido é possível criar um registro com chave duplicada. Para isso, terá que verificar se algum campo ou combinação de campos podem ser considerados únicos. Em caso afirmativo, o método lançará essa exceção, mas, na maioria das atribuições, nenhum campo ou combinação de campos pode ser considerado único. Neste exemplo, a combinação dos campos bus- Number, company e departure pode ser considerada única (considerando que existe uma remota possibilidade de duas empresas terem dois ônibus com o mesmo número), então pode-se extrair esses campos da classe Excursion e movê-los para uma classe chamada ExcursionPrimaryKey, e se já existir outro registro com esses dados, o método de criação de registros lançará DuplicateExcursionException. Outro detalhe importante é que todas as exceções que podem ser lançadas pelos métodos da interface devem ser criadas com os construtores indicados na atribuição. Pode-se criar uma hierarquia de exceções, onde as exceções a serem criadas estendem outra exceção de mais alto nível. Pode-se criar uma exceção chamada DatabaseException, por exemplo, que estende diretamente a classe java.lang.exception, e tornar as exceções lançadas pelos métodos da interface subclasses da classe DatabaseException. Isso facilita o tratamento de exceções, pois, se um método precisar lançar várias exceções que sejam subclasses de DatabaseException, este método pode declarar na cláusula throws somente a exceção DatabaseException. Listagem 3. Definição das exceções. public class DatabaseException extends Exception { public class ExcursionNotFoundException extends DatabaseException { public class DuplicateExcursionException extends DatabaseException { Pode-se criar um Façade que implemente a interface provida pela Sun e delegue as tarefas de gerenciamento de dados e gerenciamento do mecanismo de bloqueio para outras classes. Para manter as coisas simples, a implementação da interface DB neste artigo será um Singleton que cuidará destes dois aspectos. O acesso aos dados pode ser feito de duas formas: lendo o arquivo em disco a cada requisição ou acessando os dados em um cache de registros em memória. Caso o candidato opte por ler o arquivo a cada requisição, terá que assegurar que o arquivo não perca sua integridade a cada requisição, e que os dados não fiquem bagunçados. A abordagem mais fácil é ler todo o arquivo no momento em que a aplicação é executada e colocar todos os registros em um cache em memória. Alguns candidatos dizem que isso pode consumir muita memória caso o banco de dados cresça. Mas o candidato pode argumentar que, além de ser a opção mais fácil, o banco de dados não é grande, e também não é informado se o banco de dados pode crescer, então o candidato pode assumir com tranquilidade que essa escolha não será um problema. Ao optar por armazenar os registros em cache, deve-se decidir quando os registros serão colocados em memória e quando serão escritos de volta ao arquivo em disco. Como o objeto de acesso ao banco é um Singleton, uma opção é ler os dados na primeira chamada ao método estático getinstance() e colocálos em uma estrutura de dados, como Map<Long, Excursion>, por exemplo. Embora fora definida nesse exemplo uma chave primária, a própria interface fornecida pela Sun utiliza nos métodos o número de cada registro, então se torna mais fácil recuperar registros por seus respectivos números. Assim, dado um número, é fácil obter o registro correspondente, através do método get() da interface Map. Pode-se também definir um novo método na classe que implementa a interface fornecida pela Sun para a escrita dos dados de volta ao arquivo, no momento em que a aplicação é encerrada. O problema é que esse método não faz parte da interface fornecida pela Sun (que não deve ser alterada), então não é possível acessá-lo utilizando a interface como referência. É possível acessar os métodos utilizando a própria classe de implementação como referência, porém deve-se programar para interfaces sempre que possível. A solução é criar uma interface que estenda a interface fornecida pela Sun e colocar o novo método (e também outros métodos que o candidato julgue necessário). Dessa forma, a interface fornecida pela Sun é implementada e o candidato consegue driblar parte de suas limitações. A Listagem 4 mostra como a interface fornecida pela Sun pode ser estendida, e a Listagem 5 mostra como a nova interface pode ser implementada. Uma boa dica é começar a escrever os comentários JavaDoc logo no início da construção da aplicação, para facilitar o entendimento do próprio candidato e para não deixar todo este trabalho para o final. Listagem 4. Extensão da interface de acesso a dados. public interface LocalDB extends DB { public void savedata() throws DatabaseException; Listagem 5. Implementação da interface de acesso a dados. public class Database implements LocalDB { private static final LocalDB INSTANCE = new Database(); // Cache de registros em memória private static final Map<Long, Excursion> data = new HashMap<Long, Excursion>(); // Caminho do banco, utilizado para reescrever os // registros quando a aplicação é encerrada private static String databasepath; private Database() { super(); public static synchronized LocalDB getinstance(string dbpath) throws DatabaseException { // Lê os dados do arquivo informado e os coloca no objeto // data, podendo lançar DatabaseException readdata(dbpath); databasepath = dbpath; return INSTANCE; public synchronized void createexcursion(excursion excursion) throws DuplicateExcursionException { // Implementação dos outros métodos omitida 66

6 A classe de implementação da interface fornecida pela Sun deve obrigatoriamente ser Thread-safe, então, uma opção é definir todos os métodos como synchronized. No exemplo da Listagem 5, esta classe é um Singleton, portanto, somente um método poderá ser acessado por vez, e não existirão outras classes lidando com os dados do banco de dados. Como alguns problemas poderão ocorrer ao gravar os dados (por exemplo, o arquivo indicado no momento que a aplicação foi executada pode ter sido deletado ou substituído), então o método pode lançar a exceção DatabaseException (a classe-mãe da hierarquia de exceções, como mostrado na Listagem 3). Segundo passo: definição e implementação dos métodos de negócios Para a próxima etapa, pode-se definir os métodos de negócios que serão utilizados pela interface gráfica. A aplicação deve ser executada tanto em modo cliente (ou seja, conectada a um servidor, de onde as informações são obtidas e para onde são enviadas) quanto em modo standalone (ou seja, as informações são obtidas do banco de dados local, sem utilizar o código do servidor). Para promover abstração e flexibilidade, pode-se definir uma interface, na qual uma implementação busca as informações do servidor, e outra implementação busca as informações localmente. Importante: em modo standalone, o código do servidor não deve ser utilizado, caso contrário, o candidato será reprovado automaticamente. Neste ponto, é importante definir se queremos implementar um thick client ou um thin client. A diferença entre esses dois conceitos é bem simples. No caso do thick client, a lógica de negócios é implementada no lado do cliente, e no caso do thin client, a lógica de negócios é implementada no lado do servidor. O código do servidor pode utilizar RMI ou Sockets. Importante: caso o candidato opte por RMI, deverá utilizar somente RMI, ou se optar por Sockets, deverá utilizar somente Sockets. Além disso, caso o candidato opte por RMI, deverá atentar a algumas restrições da utilização de RMI descritas nas instruções. Caso o candidato não siga essas regras, será reprovado automaticamente. Para manter as coisas simples, o exemplo deste artigo utiliza código RMI. Uma vantagem do thin client é que a API utilizada no lado cliente fica mais simples, assim como o código do próprio servidor. No caso do thick client, para que as regras de negócio sejam corretamente implementadas no lado do cliente, a API do servidor normalmente possui mais métodos do que no caso do thin client. Além disso, no caso do thick client, as transações também precisam ser controladas no lado do cliente, pois a transação é iniciada e finalizada no lado do cliente. Isso quer dizer que, se o cliente travar entre o início e o fim da transação, a transação nunca é finalizada. No caso do thin client, a implementação do mecanismo de bloqueio também se torna mais fácil. Para manter as coisas simples, o exemplo será implementado utilizando thin client. Como a camada de negócios será organizada através de um conjunto de transaction scripts, nesta etapa é importante identificá-los. Existem algumas técnicas que podem ser utilizadas para identificá-los em um cenário real. Uma forma é analisar os casos de uso, pois transaction scripts geralmente correspondem aos passos de um caso de uso. Outra forma é analisar as funcionalidades oferecidas pela UI e definir um transaction script para cada tipo de requisição. A atribuição em si não contempla casos de uso, porém fornece todas as funcionalidades que deverão ser oferecidas na tela principal do projeto. Dessa forma, o candidato pode analisar essas funcionalidades e definir um método na camada de negócios para cada funcionalidade. Por exemplo, consideremos que os requisitos e as funcionalidades que deverão ser disponibilizados na UI são: bus, o nome de uma empresa e uma data de saída. Na atribuição real, não é necessário criar ou excluir registros, e nem criar uma funcionalidade que especificamente exiba os dados de um registro (sendo assim exemplos de funcionalidades que não precisam ser implementadas), mas como este artigo busca apenas instruir os leitores a resolverem com sucesso a atribuição, justamente estas funcionalidades serão construídas. Analisando as funcionalidades a serem oferecidas pela camada de apresentação, podemos identificar um método para a criação de registros, outro para a exclusão de registros, outro para ler os dados de uma excursão específica e outro para recuperar os registros do banco de dados, para exibi-los na JTable. Além disso, como os dados do arquivo que representa o banco de dados serão armazenados em memória, também é preciso definir um método que escreva os registros de volta ao arquivo físico quando a aplicação for finalizada. Estes métodos também deverão estar disponíveis remotamente (neste exemplo, através de um servidor RMI), então também deverão incluir em suas cláusulas throws a exceção java.rmi.remoteexception para que isso seja possível. Assim, pode-se definir a API do componente de negócios da seguinte forma: Listagem 6. API do componente de negócios. package certification.business; // imports omitidos public interface ExcursionServices { public void createexcursion(excursion excursion) throws RemoteException, ServicesException; public void deleteexcursion(long recordnumber) throws RemoteException, ServicesException; public Excursion readexcursion(excursionprimarykey key) throws RemoteException, ServicesException; public Map<Long, Excursion> getallrecords() throws RemoteException; public void savedata() throws RemoteException, ServicesException; A interface da Listagem 6 possuirá duas implementações: uma para o modo cliente e outra para o modo standalone. No caso do modo standalone, a camada de apresentação acessará a implementação desta interface, e esta implementação acessará diretamente a classe de acesso a dados e, no modo cliente, a camada de apresentação acessará o servidor (a implementação desta interface será o servidor propriamente dito), e o servidor acessará a classe de acesso a dados. Como os objetos de domínio transitarão de uma VM para outra 67

7 através da rede, é importante que estes objetos implementem a interface java. io.serializable. No caso da interface definida na Listagem 6, as classes Excursion e ExcursionPrimaryKey deverão implementar a interface java.io.serializable. Quanto mais abstração, mais fácil se torna manter e evoluir um sistema orientado a objetos. Definir as APIs de forma independente (sem se preocupar com quem os utilizará e de quais APIs o componente dependerá) também ção acessará a camada de negócios através da interface definida na Listagem 6. Dessa forma, a camada de apresentação não saberá se os dados são locais ou remotos. Para que tudo funcione corretamente, é necessário construir o código que arranje estes objetos e os conecte. Por exemplo, pode-se construir um código que inicialize a implementação da camada de negócios e a forneça para a camada de apresentação. Como foi mencionado anteriormente, o que define se os dados devem ser obtidos local ou remotamente é um parâmetro na linha de comando quando a aplicação é executada. Assim, pode-se verificar esse parâmetro ao iniciar a aplicação, instanciar o componente de negócios e fornecê-lo à camada de apresentação. Listagem 7. Implementação padrão do componente de negócios. package certification.business; public class DefaultExcursionServices implements ExcursionServices { private LocalDB dbmanager; public DefaultExcursionServices(LocalDB dbmanager) { super(); this.dbmanager = dbmanager; public void savedata() throws ServicesException { try { dbmanager.savedata(); catch (DatabaseException exception) { String message = It was not possible to save the data + back to the file due to the following reason: + exception.getmessage(); throw new ServicesException(message, exception); public void createexcursion(excursion excursion) throws ServicesException {... // Implementação dos outros métodos omitida... A disponibilização dos serviços remotos será implementada utilizando RMI, portanto, deve-se definir uma interface que estenda java.rmi.remote, pois esta implementação será o servidor propriamente dito. Neste caso, é preciso que todos os métodos da interface declarem que podem lançar java.rmi.remoteexception. Como os métodos da interface ExcursionServices já incluem em suas cláusulas throws essa exceção, pode-se definir uma nova interface que estenda tanto certification.business.excursionservices quanto java.rmi. Remote. Pode-se também definir um método que seja responsável por iniciar o servidor, que será invocado quando a aplicação for inicializada em modo servidor. Este método pode receber um int, que corresponderá à porta onde o serviço será disponibilizado no servidor. Para manter as coisas simples, este exemplo também utiliza um shutdown hook, que é uma Thread disparada no Listagem 8. Definição da API do servidor. package certification.business; // Imports omitidos... public interface RemoteExcursionServices extends Remote, ExcursionServices { public static final String SERVER_NAME = ExcursionServer ; public abstract void startserver(int port) throws RemoteException; Listagem 9. Implementação do servidor RMI. package certification.business; public class RMIRemoteExcursionServices extends DefaultExcursionServices implements RemoteExcursionServices { public RMIRemoteExcursionServices(LocalDB dbmanager) { super(dbmanager); public void startserver(int port) throws RemoteException { RemoteExcursionServices server = (RemoteExcursionServices) UnicastRemoteObject.exportObject(this, 0); Registry registry = LocateRegistry.createRegistry(port); registry.rebind(server_name, server); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { final String message = Saving database changes, please + wait... ; System.out.println(message); try { savedata(); catch (ServicesException exception) { String message = The database file could not be updated + with the latest changes due to the following reason: + exception.getmessage() +. Please contact the system administrator for + assistence. ; System.err.println(message); ); String message = Server running on port # + port + \npress Ctrl + C to exit... ; System.out.println(message); 68

8 Um detalhe a ser observado na implementação proposta para os com- negócios intermedeia a comunicação da camada de apresentação com a camada de persistência. Assim, os construtores dos componentes de negócio recebem como parâmetro a interface definida na Listagem 4, que é uma forma de injeção de dependência que promove acoplamento fraco. Como neste caso os componentes de negócio dependem somente de um objeto, definir estes construtores facilita a utilização destes componentes, pois assim que forem construídos, estarão prontos para serem utilizados sem a necessidade de chamar métodos setter extras. Além disso, torna-se fácil utilizá-los em frameworks que oferecem injeção de dependência, como o Spring, por exemplo. No caso da atribuição real, o arranjo destes objetos pode ser feito no momento em que a aplicação é inicializada, dado o modo em que a aplicação está sendo executada. Com o componente da camada de persistência implementado e os componentes da camada de negócios implementados, podemos passar para o terceiro passo: a implementação das telas propriamente ditas. Terceiro passo: implementação das telas Depois de ter os outros componentes implementados, podemos agora desenvolver o código referente às telas. Na atribuição real, são fornecidas todas as funcionalidades e componentes que devem obrigatoriamente estar presentes na tela principal. No momento em que a aplicação é executada, deve ser exibida uma tela onde o usuário possa informar as propriedades da aplicação de acordo com o modo em execução. Por exemplo, ao executar a aplicação em modo servidor, o usuário pode informar o caminho do arquivo que representa o banco de dados e em qual porta o servidor deve ser iniciado. Em modo standalone, o usuário pode informar o caminho do arquivo que representa o banco de dados e, em modo cliente, o usuário pode informar o IP do servidor e em qual porta no servidor os serviços estão disponíveis. Os dados informados na tela de propriedades deverão obrigatoriamente ser salvos em um arquivo.properties, que deverá ser criado com um nome específico e em um local específico indicados nas instruções. Na primeira vez que a aplicação for executada, o arquivo naturalmente não existirá e, dessa forma, o arquivo deverá ser criado e os dados fornecidos pelo usuário deverão ser salvos nesse arquivo. A partir da segunda vez que a aplicação for executada em um determinado modo, os campos da tela de propriedades deverão ser populados com os dados previamente informados pelo usuário, caso a aplicação já tenha sido executada neste modo. Importante: caso os campos das telas de propriedades não sejam persistidos entre as execuções da aplicação, o candidato será reprovado automaticamente. A única coisa que varia entre os modos de execução cliente e standalone é a fonte dos dados. Executando a aplicação em modo cliente, os dados serão fornecidos pelo servidor (neste exemplo, implementado pela classe servidor deve, obviamente, estar em execução para que os dados possam ser recuperados. Em modo standalone, os dados serão recuperados localmente, e pode-se assim utilizar a classe DefaultExcursionServices, mostrada na Listagem 7. Os componentes utilizados nas telas de propriedades serão responsáveis por injetar uma instância da classe de negócios no objeto da tela principal, para que tudo funcione corretamente. Em ambos os casos, os componentes de negócios a serem instanciados obedecem a API da interface ExcursionServices. Pode-se assim criar uma classe abstrata que implemente java.awt.event.actionlistener e que tenha um método abstrato getservice(), que retorna uma implementação de ExcursionServices. Essa classe abstrata possuirá uma implementação que instanciará RMIRemoteExcursionServices, que escutará o botão OK da tela de propriedades do modo cliente, e outra implementação que instanciará DefaultExcursionServices, que escutará o botão OK da tela de propriedades do modo standalone, caracterizando assim o padrão Factory Method. Como os dados das telas também precisam ser validados e salvos em um arquivo.properties, pode-se também definir métodos abstratos que executem essas funções, caracterizando assim o padrão Template Method. Como pode haver problemas, os métodos podem lançar exceções (que devem ser criadas). É ideal que as mensagens sejam internacionalizadas, através de um bundle de mensagens, mas, para facilitar este exemplo, as mensagens estão hardcoded. Listagem 10. Listener do botão OK das telas de propriedades dos modos cliente e standalone. package certification.ui.launch; public abstract class OKButtonListener implements ActionListener { protected abstract void verifydata() throws ValidationException; protected abstract ExcursionServices getservice() throws LaunchException; protected abstract void saveproperties() throws IOException; public void actionperformed(actionevent event) { try { verifydata(); saveproperties(); new MainWindow(getService()); catch (ValidationException exception) { String message = exception.getmessage(); JOptionPane.showMessageDialog(null, message, Excursions System, JOptionPane.ERROR_MESSAGE); catch (IOException exception) { String message = The properties could not be saved. ; JOptionPane.showMessageDialog(null, message, Excursions System, JOptionPane.ERROR_MESSAGE); catch (LaunchException exception) { String message = A problem occurred. Please verify the parameters + provided and try again. ; JOptionPane.showMessageDialog(null, message, Excursions System, JOptionPane.ERROR_MESSAGE); Pode-se definir uma interface para cada tela de inserção de propriedades e fornecer as implementações para os listeners que escutam o botão OK de cada tela. Através das interfaces, os listeners têm acesso aos dados providos pelo usuário e podem assim instanciar corretamente a classe de negócios adequada e fornecê-la à tela principal. 69

9 Listagem 11. Listener do botão OK da tela de propriedades do modo standalone. package certification.ui.launch; public class StandaloneOKButtonListener extends OKButtonListener { // A interface que é implementada pela tela onde o usuário // informa as propriedades de inicialização em modo Standalone private StandaloneLaunchManager manager; { public StandaloneOKButtonListener(StandaloneLaunchManager manager) super(); this.manager = protected ExcursionServices getservice() throws LaunchException { String dblocation = manager.getdblocation(); try { LocalDB db = Database.getInstance(dbLocation); return new DefaultExcursionServices(db); catch (DatabaseException exception) { throw new protected void saveproperties() throws IOException protected void verifydata() throws ValidationException {... Na atribuição real, a tela principal deve exibir os dados do arquivo binário em JTable, deve permitir que os usuários busquem por todos os registros ou por registros onde alguns dados sejam iguais a valores fornecidos pelo usuário e deve também permitir que o usuário reserve um determinado registro, atualizando assim o banco de dados apropriadamente. Para o requisito de reserva, o mecanismo de bloqueio deve obrigatoriamente ser utilizado, de forma a garantir que os dados fornecidos por um usuário não sobrescrevam inapropriadamente os dados fornecidos por outro. A tela a ser construída deve ser a mais amigável e de fácil utilização possível. Por exemplo, pode-se definir teclas de atalho para itens de menu ou botões. Além disso, na Seção de User Interface no documento de instruções, consta uma frase que diz que a UI deve ser preparada para futuras melhorias. Isso é uma dica de que gerenciadores de layout que facilitem a inserção de novos componentes, como BorderLayout, FlowLayout ou GridBagLayout, devem ser utilizados. Caso o candidato julgue necessário, pode bloquear a inserção de caracteres inválidos em determinados campos (como letras em um campo numérico), utilizar máscaras em campos de texto ou desabilitar botões caso a tela esteja em um determinado estado (por exemplo, desabilitar o botão de busca enquanto o critério de busca não tenha sido preenchido). No exemplo proposto por este artigo, a aplicação deve permitir criar e excluir registros, e ler um registro, dado um número de ônibus, o nome de uma empresa e uma data de saída. Assim, a tela principal pode ter o seguinte layout: Figura 2. Layout da tela principal da aplicação. No topo da página, é oferecida a funcionalidade de exibição dos dados de uma determinada excursão, que utiliza o método readexcursion() do componente de negócios. Os dados do banco de dados são exibidos na JTable, cujo TableModel utiliza o método getallrecords() do componente de negócios, e as funções de inclusão e exclusão de registros estão disponíveis abaixo da JTable, através dos botões New Excursion e Delete Excursion, que utilizam os métodos createexcursion() e deleteexcursion() do componente de negócios, respectivamente. package certification.ui; // A interface MainWindowManager define métodos que recuperam dados // informados na tela principal, como número do ônibus ou nome da empresa // para a exibição dos dados de uma determinada excursão. public class MainWindow implements MainWindowManager { // O JTextField onde o usuário informa o número do ônibus private JTextField busnumber; public MainWindow(ExcursionServices services) { // A construção da tela é feita dentro deste construtor super();... JButton showexcursion = new JButton( Show Excursion ); ActionListener showexcursionlistener = new ShowExcursionListener(this, services); showexcursion.addactionlistener(showexcursionlistener); public String getbusnumber() { return busnumber.gettext(); Na implementação da classe que representa a tela principal deste exemplo, deve-se definir um construtor que receba a interface ExcursionServices, de forma a promover polimorfismo. Dessa forma, a camada de apresentação executará suas funções, porém sem saber se os dados sendo manipulados são locais ou remotos. Assim, se no futuro houver outras fontes de dados, basta criar novas implementações da interface ExcursionServices, mostrada na Listagem 6, e fornecê-las à tela principal. A implementação dos serviços fornecida para a tela 70

10 é repassada para os ActionListeners que escutam os botões New Excursion e Delete Excursion, para que os métodos de serviços possam ser consumidos dentro destes listeners. Além disso, a implementação dos serviços também pode ser repassada para o TableModel que controla o estado da tabela, para que fique mais fácil organizar os registros sendo exibidos. No caso do listener do botão Show Excursion, é necessário passar também uma referência ao objeto da tela, para que ele possa recuperar os dados inseridos pelo usuário e chamar o método readexcursion() do serviço. Pode-se definir os construtores dos listeners de cada botão da tela principal de acordo com a função que cada um deve desempenhar. package certification.ui; public class ShowExcursionListener implements ActionListener { private MainWindowManager manager; private ExcursionServices services; public ShowExcursionListener(MainWindowManager manager, ExcursionServices services) { super(); this.manager = manager; this.services = services; public void actionperformed(actionevent event) { String busnumber = manager.getbusnumber(); String companyname = manager.getcompanyname(); String departurestring = manager.getdeparture(); Date departure = converttodate(departurestring); ble, pode-se criar uma classe que estenda a classe javax.swing.table.abstracttablemodel e definir métodos que facilitem o controle do estado da tabela e recuperação de registros sendo exibidos. Pode-se, por exemplo, definir um método que recupere um objeto Excursion, dado o número da linha selecionada na tabela. Este TableModel pode também ter uma referência ao objeto de negócios para, por exemplo, recuperar todos os registros e construir o estado inicial da tabela. Quarto passo: empacotando a aplicação Depois de finalizar a implementação do projeto, deve-se empacotar a aplicação em um único arquivo.jar. Embora cada modo de execução utilize somente determinadas classes, todas as classes devem ser empacotadas dentro do mesmo arquivo.jar. Por exemplo, neste exemplo, em modo servidor, somente as interfaces e a classe de persistência, e as interfaces e o componente remoto de negócios são utilizados, então, somente essas classes seriam necessárias para que esse modo pudesse ser executado. Normalmente, esse arquivo deve se chamar runme.jar. Além disso, o candidato deve criar um arquivo MANIFEST.MF e colocá-lo dentro da pasta META-INF, na raiz do arquivo.jar, indicando a classe que possui o método main(), chamado quando a aplicação é executada. O método main() deve verificar o argumento que indica como a aplicação deve ser executada, passado na linha de comando, e chamar a tela de propriedades correspondente. Importante: o único argumento permitido na linha de comando é o modo como a aplicação deve ser executada. Caso a aplicação exija a utilização de outros argumentos, o candidato será reprovado automaticamente. Nesta etapa, todos os componentes já estão construídos. A figura 3 mostra um diagrama de classes em alto nível, que mostra a organização dos principais componentes desenvolvidos neste artigo. Obviamente, a aplicação construída na atribuição real conterá outras classes, mas a arquitetura base da aplicação poderá se parecer com a arquitetura mostrada na figura 3. ExcursionPrimaryKey key = new ExcursionPrimaryKey(); key.setbusnumber(integer.parseint(busnumber)); key.setcompany(companyname); key.setdeparture(departure); try { Excursion excursion = services.readexcursion(key); showexcursion(excursion); catch (ServicesException exception) { String message = No excursions could be found. ; JOptionPane.showMessageDialog(null, message, Excursions System, JOptionPane.ERROR_MESSAGE); catch (RemoteException exception) { String message = A problem occurred with the server. ; JOptionPane.showMessageDialog(null, message, Excursions System, JOptionPane.ERROR_MESSAGE); private Date converttodate(string departurestring) { private void showexcursion(excursion excursion) {... Assim, o objeto de negócios é fornecido aos listeners que escutam os botões, para que estes executem suas funções corretamente. Para a JTa- Figura 3. Diagrama de classes dos principais componentes da aplicação. Modos de execução da aplicação A aplicação deve ser executada em três modos: mente, para que a comunicação possa ser estabelecida, o servidor deve estar em execução no momento que o cliente tentar se conectar. Este 71

11 modo não requer que nenhum argumento seja passado na linha de comando, e pode ser executado da seguinte forma: java jar runme.jar do, de forma a oferecer os serviços aos clientes que se conectarem. Caso o cliente seja um thin client, o servidor será responsável por implementar e oferecer os métodos de negócio a serem consumi- ou será responsável por oferecer uma API parecida com a interface provida pela Sun, para que as regras de negócio sejam implementadas no lado cliente (no caso do thick client). Este modo requer que o argumento server seja passado na linha de comando, e pode ser executado da seguinte forma: java jar runme.jar server utilizar o código do servidor. No caso deste exemplo, a camada de apresentação utiliza diretamente a classe DefaultExcursionServices, fornecida quando a aplicação é iniciada neste modo. Este modo requer que o argumento alone seja passado na linha de comando, e pode ser executado da seguinte forma: java jar runme.jar alone Levando em consideração o exemplo proposto por este artigo, os modos de execução da aplicação podem ser representados como mostra a figura 4. Figura 4. Comunicação dos componentes em cada modo de execução da aplicação. Visão final do projeto Após empacotar o projeto, gerar os JavaDocs de todas as classes, gerar o user guide, criar o arquivo version.txt, gerar o arquivo choices.txt, listando todos os problemas encontrados e decisões tomadas, deve-se reunir todos fundamental que o candidato atente para o formato e conteúdo do arquivo. O arquivo final deverá ter o seguinte formato: modificações). (respeitando a hierarquia de pacotes criada). o sistema operacional utilizado para o desenvolvimento. o O arquivo instructions.html, fornecido pela Sun. o Um subdiretório chamado javadoc, contendo a documentação JavaDoc gerada pelo candidato. o Um arquivo chamado choices.txt, contendo as decisões de projeto tomadas pelo candidato. o Guia de usuário. Caso a documentação esteja dentro da aplicação, este arquivo poderá ser omitido. Caso contrário, deverá se chamar userguide.txt ou poderão ser múltiplos arquivos.html, sendo que página inicial deverá se chamar userguide.html. O mecanismo de bloqueio Cada aspecto desta certificação possui uma quantidade de pontos que pode ser atingida pelo candidato. O aspecto mais difícil e de maior quantidade de pontos é o mecanismo de bloqueio, que deve garantir que um cliente não sobrescreva inapropriadamente os dados fornecidos por outro cliente. Por exemplo, na atribuição real, um determinado registro deve ser atualizado com os dados de um consumidor caso o campo customer do registro esteja em branco. No caso de dois clientes tentarem reservar o mesmo registro ao mesmo tempo, somente um deve obter sucesso, e o outro deve receber uma mensagem informando que o registro não está mais disponível. Assim, o mecanismo de bloqueio deve garantir que quando um cliente bloqueia um registro, somente ele pode atualizar ou excluir esse registro, de forma a evitar a seguinte situação: - Com o mecanismo de bloqueio, um determinado registro fica protegido quando dois clientes tentam atualizá-lo ou excluí-lo ao mesmo tempo: aguarda. queia e notifica os clientes em espera. atualização, o desbloqueia e notifica eventuais clientes em espera. Este mecanismo também pode ser implementado utilizando-se as classes de bloqueio da API de concorrência (localizadas em java.util.concurrent.locks). Como foi dito anteriormente, não é necessário disponibilizar na camada de negócios um método que exclua registros, porém o método de exclusão de registros fornecido na interface da Sun deve ser implementado e deve verificar se o cliente efetuando a exclusão de um registro é o mesmo que o bloqueou. Além disso, esse mecanismo também deve ser utilizado em modo standalone, mesmo que teoricamente só haja uma Thread em execução. O mecanismo também deve garantir que, se um determinado recurso já estiver bloqueado, as outras Threads não deverão consumir ciclos de CPU e deverão esperar até que o recurso seja liberado. Para esse requisito, pode-se chamar o método wait() dentro de uma instrução while. Na classe que implementa a interface fornecida pela Sun, pode-se definir uma estrutura do tipo Map<Long, Long> para controlar os registros bloqueados, em que a chave é o número do registro e o valor é um código que identifica o cliente que efetuou o bloqueio. implementado. 72

12 bloqueio. public class Database implements LocalDB { private Map<Long, Long> lockedrecords = new HashMap<Long, Long>(); public synchronized void lock(long recordnumber) throws ExcursionNotFoundException { long clientid = Thread.currentThread().getId(); // Enquanto o registro a ser bloqueado estiver // no Map lockedrecords, a Thread corrente // deve esperar... a notificação para que as // Threads que esperam por registros bloqueados // acordem deve ser feita no método unlock(), e // uma boa dica é que todas as Threads sejam notificadas. // Após a notificação, deve-se verificar se o registro // a ser bloqueado ainda existe, pois o método de // exclusão de registros também exige que o // mecanismo de bloqueio seja utilizado. // Nos métodos de atualização e exclusão, deve-se // verificar se o cliente requisitando a operação é o // mesmo que bloqueou o registro, e somente o cliente // que o bloqueou poderá desbloqueá-lo. lockedrecords.put(recordnumber, clientid); package certification.business; public class DefaultExcursionServices implements ExcursionServices { private LocalDB dbmanager; public DefaultExcursionServices(LocalDB dbmanager) { super(); this.dbmanager = dbmanager; public void deleteexcursion(long recordnumber) throws ServicesException { try { dbmanager.lock(recordnumber); dbmanager.deleteexcursion(recordnumber); dbmanager.unlock(recordnumber); catch (ExcursionNotFoundException exception) { // Caso ocorra, a ExcursionNotFoundException // só poderá ter sido lançada pelo método // lock() throw new ServicesException(exception); Na atribuição real, deve-se bloquear um registro antes de reservá-lo. Dessa forma, no método de negócios que atualiza o registro, pode-se bloquear o registro e verificar se ele ainda está disponível para a atualização (ou se o campo customer ainda está em branco). Em caso afirmativo, efetua-se a atualização e desbloqueia-se o registro. Em caso negativo, pode-se lançar uma exceção negócios que pode estender a exceção ServicesException e se chamar RoomAlreadyBookedException. É fundamental que em ambos os casos o registro seja desbloqueado após a operação, caso contrário, as Threads aguardando por registros jamais serão notificadas e ocorrerá o deadlock. Dessa forma, a sequência de métodos a ser chamada é lock() update() unlock(). Importante: caso possa ocorrer deadlock na aplicação, o candidato será reprovado automaticamente. No FAQ do fórum da certificação SCJD do JavaRanch pode-se encontrar um código feito pelo autor deste artigo que testa o mecanismo de bloqueio do projeto. Dessa forma, o candidato pode utilizá-lo e evitar a reprovação por existência de possível ocorrência de deadlock na aplicação (que é a maior causa de reprovação nesta certificação). Considerações finais Este artigo mostra o que os candidatos podem esperar ao optar pela certificação SCJD. O objetivo não é mostrar uma atribuição resolvida (o que seria contra as regras da própria certificação), mas sim como o candidato pode abordar o problema, modelar o sistema e resolver todas as etapas, através de um exemplo fictício. Embora trabalhosa, essa certificação é um ótimo exercício no que diz respeito à modelagem de sistemas e resolução de problemas do mundo real, além de ser uma ótima oportunidade para se aprofundar em aspectos como programação multithreaded, Swing, design patterns e programação distribuída, e até mesmo aprender as convenções de código da Sun e como escrever corretamente comentários JavaDoc (onde algumas regras de escrita e utilização de tags devem ser seguidas). Uma boa dica é procurar resolver o que se pede da forma mais simples possível, e não fazer nada a mais. Além disso, o candidato deve estar atento a todos os musts do documento de instruções, que são as regras que devem obrigatoriamente ser seguidas. Como este artigo mostra, caso uma dessas regras não seja seguida, o candidato será reprovado automaticamente. Em caso de dúvidas, o candidato pode procurar pelas respostas no fórum SCJD do JavaRanch, onde eu e outros desenvolvedores estaremos prontos para ajudar. Esta certificação é um ótimo preparatório para a segunda fase da certificação SCEA, que requer que um sistema seja modelado e exige certo nível de experiência com modelagem de sistemas. Ao final da resolução da atribuição, o candidato perceberá que evoluiu como desenvolvedor e que todo o esforço valeu a pena! Referências sun.com/docs/codeconv/>. Acesso em: 23 jan son-wesley Professional, sional, Addison-Wesley Professional, j2se/javadoc/writingdoccomments/>. Acesso em: 23 jan Developer-Certification-SCJD>. Acesso em: 23 jan Richards, Chris. POJOs In Action. Manning Publications,

Transaction Scripts: Uma Forma mais Simples de Organizar Lógica de Domínio

Transaction Scripts: Uma Forma mais Simples de Organizar Lógica de Domínio Roberto Perillo (jrcperillo@yahoo.com.br) é bacharel em Ciência da Computação e está atualmente cursando mestrado no ITA, onde já concluiu o curso de especialização em Engenharia de Software. Trabalha

Leia mais

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos Descrição Implemente nesta atividade de laboratório um programa em Java utilizando threads

Leia mais

EMENTA DO CURSO. Tópicos:

EMENTA DO CURSO. Tópicos: EMENTA DO CURSO O Curso Preparatório para a Certificação Oracle Certified Professional, Java SE 6 Programmer (Java Básico) será dividido em 2 módulos e deverá ter os seguintes objetivos e conter os seguintes

Leia mais

Manual de Instalação. SafeNet Authentication Client 8.2 SP1. (Para MAC OS 10.7)

Manual de Instalação. SafeNet Authentication Client 8.2 SP1. (Para MAC OS 10.7) SafeNet Authentication Client 8.2 SP1 (Para MAC OS 10.7) 2/28 Sumário 1 Introdução... 3 2 Pré-Requisitos Para Instalação... 3 3 Ambientes Homologados... 4 4 Tokens Homologados... 4 5 Instruções de Instalação...

Leia mais

Noções de. Microsoft SQL Server. Microsoft SQL Server

Noções de. Microsoft SQL Server. Microsoft SQL Server Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados

Leia mais

SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1

SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1 SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1 A Origem... 2 O Caminho Para a Aprendizagem... 4 Java Como Plataforma... 6 Finalidade... 9 Características... 11 Perspectivas... 13 Exercícios... 14 CAPÍTULO

Leia mais

Boas Práticas de Desenvolvimento Seguro

Boas Práticas de Desenvolvimento Seguro Boas Práticas de Desenvolvimento Seguro Julho / 2.012 Histórico de Revisões Data Versão Descrição Autor 29/07/2012 1.0 Versão inicial Ricardo Kiyoshi Página 2 de 11 Conteúdo 1. SEGURANÇA DA INFORMAÇÃO

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 10 Persistência de Dados

Leia mais

RUI ROSSI DOS SANTOS PROGRAMAÇÃO DE COMPUTADORES EM. Java

RUI ROSSI DOS SANTOS PROGRAMAÇÃO DE COMPUTADORES EM. Java RUI ROSSI DOS SANTOS PROGRAMAÇÃO DE COMPUTADORES EM Java 2ª Edição n Sumário VII Sumário CAPÍTULO 1 Introdução ao Java... 1 A Origem... 2 O Caminho Para a Aprendizagem... 4 Java como Plataforma... 6 Finalidade...

Leia mais

Índice. Para encerrar um atendimento (suporte)... 17. Conversa... 17. Adicionar Pessoa (na mesma conversa)... 20

Índice. Para encerrar um atendimento (suporte)... 17. Conversa... 17. Adicionar Pessoa (na mesma conversa)... 20 Guia de utilização Índice Introdução... 3 O que é o sistema BlueTalk... 3 Quem vai utilizar?... 3 A utilização do BlueTalk pelo estagiário do Programa Acessa Escola... 5 A arquitetura do sistema BlueTalk...

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Marcelo Lobosco DCC/UFJF Comunicação em Sistemas Distribuídos Aula 06 Agenda Modelo Cliente-Servidor (cont.) Invocação Remota de Método (Remote Method Invocation RMI) Visão Geral

Leia mais

Invocação de Métodos Remotos

Invocação de Métodos Remotos Invocação de Métodos Remotos Java RMI (Remote Method Invocation) Tópicos Tecnologia RMI Introdução Modelo de camadas do RMI Arquitetura Fluxo de operação do RMI Passos para implementação Estudo de caso

Leia mais

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo Universidade Federal do Espírito Santo Centro Tecnológico Departamento de Informática Disciplina: INF 02810 Prof.: (monalessa@inf.ufes.br) Conteúdo 1. Introdução 2. Processo de Software 3. Gerência de

Leia mais

5 Framework para coordenação e mediação de Web Services para ambientes de aprendizado à distância

5 Framework para coordenação e mediação de Web Services para ambientes de aprendizado à distância 5 Framework para coordenação e mediação de Web Services para ambientes de aprendizado à distância O capítulo anterior apresentou uma discussão sobre a inclusão dos chamados learning services no processo

Leia mais

Programação de Computadores - I. Profª Beatriz Profº Israel

Programação de Computadores - I. Profª Beatriz Profº Israel Programação de Computadores - I Profª Beatriz Profº Israel Ambiente de Desenvolvimento Orientação a Objetos É uma técnica de desenvolvimento de softwares que consiste em representar os elementos do mundo

Leia mais

Exemplos práticos do uso de RMI em sistemas distribuídos

Exemplos práticos do uso de RMI em sistemas distribuídos Exemplos práticos do uso de RMI em sistemas distribuídos Elder de Macedo Rodrigues, Guilherme Montez Guindani, Leonardo Albernaz Amaral 1 Fábio Delamare 2 Pontifícia Universidade Católica do Rio Grande

Leia mais

Guia de Fatores de Qualidade de OO e Java

Guia de Fatores de Qualidade de OO e Java Qualiti Software Processes Guia de Fatores de Qualidade de OO e Java Versã o 1.0 Este documento só pode ser utilizado para fins educacionais, no Centro de Informática da Universidade Federal de Pernambuco.

Leia mais

MANUAL DO USUÁRIO SUMÁRIO

MANUAL DO USUÁRIO SUMÁRIO SUMÁRIO 1. Home -------------------------------------------------------------------------------------------------------- 7 2. Cadastros -------------------------------------------------------------------------------------------------

Leia mais

AULA 3 FERRAMENTAS E APLICATIVOS DE NAVEGAÇÃO, DE CORREIO ELETRÔNICO, DE GRUPOS DE DISCUSSÃO, DE BUSCA E PESQUISA (PARTE II)

AULA 3 FERRAMENTAS E APLICATIVOS DE NAVEGAÇÃO, DE CORREIO ELETRÔNICO, DE GRUPOS DE DISCUSSÃO, DE BUSCA E PESQUISA (PARTE II) AULA 3 FERRAMENTAS E APLICATIVOS DE NAVEGAÇÃO, DE CORREIO ELETRÔNICO, DE GRUPOS DE DISCUSSÃO, DE BUSCA E PESQUISA (PARTE II) A seguir vamos ao estudo das ferramentas e aplicativos para utilização do correio

Leia mais

NOVIDADES DO JAVA PARA PROGRAMADORES C

NOVIDADES DO JAVA PARA PROGRAMADORES C PROGRAMAÇÃO SERVIDOR EM SISTEMAS WEB NOVIDADES DO JAVA PARA PROGRAMADORES C Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar o Conceito de Classes e Objetos Capacitar para a criação de objetos simples

Leia mais

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução Chamadas Remotas de Chamada Remota de Procedimento (RPC) ou Chamada de Função ou Chamada de Subrotina Método de transferência de controle de parte de um processo para outra parte Procedimentos => permite

Leia mais

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP 1) Introdução Programação Orientada a Objetos é um paradigma de programação bastante antigo. Entretanto somente nos últimos anos foi aceito realmente

Leia mais

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC Arquitetura de Aplicações JSP/Web Padrão Arquitetural MVC Arquitetura de Aplicações JSP/Web Ao projetar uma aplicação Web, é importante considerála como sendo formada por três componentes lógicos: camada

Leia mais

Curso de Aprendizado Industrial Desenvolvedor WEB

Curso de Aprendizado Industrial Desenvolvedor WEB Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos II Professor: Cheli dos S. Mendes da Costa Servidor de Aplicações WEB Tomcat Servidor Tomcat Foi desenvolvido

Leia mais

Lidando de Forma Eficiente com Validações Locais de Objetos

Lidando de Forma Eficiente com Validações Locais de Objetos Lidando de Forma Eficiente com Validações Locais de Objetos Aprenda a construir um mini-framework para validar objetos locais sem afetar a complexidade do código. Autor Paulo César M. N. A. Coutinho (pcmnac@gmail.com):

Leia mais

SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl

SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE Aluno: Roberto Reinert Orientador: Everaldo A. Grahl Roteiro de apresentação Introdução Objetivos Fundamentação Teórica Workflow Processo

Leia mais

Manual do Usuário. Sistema/Ferramenta: Spider-ACQ. Versão do Sistema/Ferramenta: 1.0. www.spider.ufpa.br

Manual do Usuário. Sistema/Ferramenta: Spider-ACQ. Versão do Sistema/Ferramenta: 1.0. www.spider.ufpa.br Manual do Usuário Sistema/Ferramenta: Spider-ACQ Versão do Sistema/Ferramenta: 1.0 www.spider.ufpa.br Histórico de Revisões Data Versão Descrição Autor 27/05/2011 1.0 Criação da seção de instalação/configuração

Leia mais

Instalação do IBM SPSS Modeler Server Adapter

Instalação do IBM SPSS Modeler Server Adapter Instalação do IBM SPSS Modeler Server Adapter Índice Instalação do IBM SPSS Modeler Server Adapter............... 1 Sobre a Instalação do IBM SPSS Modeler Server Adapter................ 1 Requisitos de

Leia mais

Cartilha da Nota Fiscal Eletrônica 2.0 Hábil Empresarial PROFISSIONAL & Hábil Enterprise

Cartilha da Nota Fiscal Eletrônica 2.0 Hábil Empresarial PROFISSIONAL & Hábil Enterprise Cartilha da Nota Fiscal Eletrônica 2.0 Hábil Empresarial PROFISSIONAL & Hábil Enterprise Koinonia Software Ltda (0xx46) 3225-6234 Índice I Índice Cap. I Introdução 1 1 Orientações... Iniciais 1 Cap. II

Leia mais

02 - Usando o SiteMaster - Informações importantes

02 - Usando o SiteMaster - Informações importantes 01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,

Leia mais

Guia de Atualização PROJURIS WEB 4.5. Manual do Técnico Atualização - ProJuris Web 4.5. Manual do Técnico Atualização - ProJuris Web 4.

Guia de Atualização PROJURIS WEB 4.5. Manual do Técnico Atualização - ProJuris Web 4.5. Manual do Técnico Atualização - ProJuris Web 4. Guia de Atualização PROJURIS WEB 4.5 Por: Fabio Pozzebon Soares Página 1 de 11 Sistema ProJuris é um conjunto de componentes 100% Web, nativamente integrados, e que possuem interface com vários idiomas,

Leia mais

7 Utilização do Mobile Social Gateway

7 Utilização do Mobile Social Gateway 7 Utilização do Mobile Social Gateway Existem três atores envolvidos na arquitetura do Mobile Social Gateway: desenvolvedor do framework MoSoGw: é o responsável pelo desenvolvimento de novas features,

Leia mais

MANUAL DO ADMINISTRADOR

MANUAL DO ADMINISTRADOR WinShare Proxy admin MANUAL DO ADMINISTRADOR Instalação do WinShare Índice 1. Instalação 2. Licenciamento 3. Atribuindo uma senha de acesso ao sistema. 4. Configurações de rede 5. Configurações do SMTP

Leia mais

Atualizaça o do Playlist Digital

Atualizaça o do Playlist Digital Atualizaça o do Playlist Digital Prezados Clientes, Nós da Playlist Software Solutions empresa líder de mercado no desenvolvimento de software para automação de rádios - primamos pela qualidade de nossos

Leia mais

3.5. Cuidado com o modelo anêmico

3.5. Cuidado com o modelo anêmico 3.5. Cuidado com o modelo anêmico public Periodo adiaumasemana() { Calendar novofim = (Calendar) this.fim.clone(); novofim.add(calendar.day_of_month, 7); return new Periodo(inicio, novofim); E, com uma

Leia mais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais Notas da Aula 15 - Fundamentos de Sistemas Operacionais 1. Software de Entrada e Saída: Visão Geral Uma das tarefas do Sistema Operacional é simplificar o acesso aos dispositivos de hardware pelos processos

Leia mais

Padrão Arquitetura em Camadas

Padrão Arquitetura em Camadas Padrão Arquitetura em Camadas Universidade Católica de Pernambuco Ciência da Computação Prof. Márcio Bueno poonoite@marciobueno.com Fonte: Material da Profª Karina Oliveira Definição Estimula a organização

Leia mais

Aplicativo da Manifestação do Destinatário. Manual

Aplicativo da Manifestação do Destinatário. Manual Aplicativo da Manifestação do Destinatário Manual Novembro de 2012 1 Sumário 1 Aplicativo de Manifestação do Destinatário...4 2 Iniciando o aplicativo...4 3 Menus...5 3.1 Manifestação Destinatário...5

Leia mais

Manual de Utilização

Manual de Utilização Universidade Regional Integrada do Alto Uruguai e das Missões URI Pró-Reitoria de Pesquisa, Extensão e Pós-Graduação PROPEPG Manual de Utilização Sistema de Projetos URI Módulo Projetos Versão 1 - Revisão

Leia mais

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando

Leia mais

2. INSTALAÇÃO E CONFIGURAÇÃO

2. INSTALAÇÃO E CONFIGURAÇÃO INDICE 1. INTRODUÇÃO 2. INSTALAÇÃO E CONFIGURAÇÃO 2.1. COMPARTILHANDO O DIRETÓRIO DO APLICATIVO 3. INTERFACE DO APLICATIVO 3.1. ÁREA DO MENU 3.1.2. APLICANDO A CHAVE DE LICENÇA AO APLICATIVO 3.1.3 EFETUANDO

Leia mais

SSE 3.0. Guia Rápido. Módulo Secretaria. Nesta Edição

SSE 3.0. Guia Rápido. Módulo Secretaria. Nesta Edição SSE 3.0 Guia Rápido Módulo Secretaria Nesta Edição 1 Acessando o Módulo Secretaria 2 Cadastros Auxiliares 3 Criação de Modelos Definindo o Layout do Modelo Alterando o Layout do Cabeçalho 4 Parametrização

Leia mais

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Tutorial RMI (Remote Method Invocation) por Alabê Duarte Tutorial RMI (Remote Method Invocation) por Alabê Duarte Este tutorial explica basicamente como se implementa a API chamada RMI (Remote Method Invocation). O RMI nada mais é que a Invocação de Métodos

Leia mais

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE Amarildo Aparecido Ferreira Junior 1, Ricardo Ribeiro Rufino 1 ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil aapfjr@gmail.com

Leia mais

Universidade Federal Rural de Pernambuco. Bacharelado em Sistemas de Informação. Disciplina: Análise e Projeto de Sistemas de Informação

Universidade Federal Rural de Pernambuco. Bacharelado em Sistemas de Informação. Disciplina: Análise e Projeto de Sistemas de Informação Universidade Federal Rural de Pernambuco Bacharelado em Sistemas de Informação Disciplina: Análise e Projeto de Sistemas de Informação Docente: Rodrigo Aluna: Thays Melo de Moraes Diagramas do Projeto

Leia mais

Portal Contador Parceiro

Portal Contador Parceiro Portal Contador Parceiro Manual do Usuário Produzido por: Informática Educativa 1. Portal Contador Parceiro... 03 2. Acesso ao Portal... 04 3. Profissionais...11 4. Restrito...16 4.1 Perfil... 18 4.2 Artigos...

Leia mais

ENTERPRISE JAVABEANS 3. Msc. Daniele Carvalho Oliveira

ENTERPRISE JAVABEANS 3. Msc. Daniele Carvalho Oliveira ENTERPRISE JAVABEANS 3 Msc. Daniele Carvalho Oliveira Apostila Servlets e JSP www.argonavis.com.br/cursos/java/j550/index.html INTRODUÇÃO Introdução Enterprise JavaBeans é um padrão de modelo de componentes

Leia mais

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser A1Criando um módulo de negócio Capítulo 27 Aplicação dividida em módulos - Introdução Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser compreendido como uma solução de

Leia mais

Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado)

Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado) Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado) Índice Instruções de Instalação....... 1 Requisitos do sistema........... 1 Código de autorização.......... 1 Instalando...............

Leia mais

Guia de Atualização TOTVS Segurança e Acesso 12.1

Guia de Atualização TOTVS Segurança e Acesso 12.1 06/2015 Sumário 1 Prefácio... 3 1.2 Finalidade... 3 1.3 Público Alvo... 3 1.4 Organização deste Guia... 3 1.5 Documentações Importantes... 3 2 Atualização... 4 2.1 Executando o Updater de Atualização...

Leia mais

A CMNet disponibilizou no dia 24 de junho para download no Mensageiro a nova versão do Padrão dos Sistemas CMNet.

A CMNet disponibilizou no dia 24 de junho para download no Mensageiro a nova versão do Padrão dos Sistemas CMNet. Prezado Cliente, A CMNet disponibilizou no dia 24 de junho para download no Mensageiro a nova versão do Padrão dos Sistemas CMNet. No Padrão 9 você encontrará novas funcionalidades, além de alterações

Leia mais

Cadastramento de Computadores. Manual do Usuário

Cadastramento de Computadores. Manual do Usuário Cadastramento de Computadores Manual do Usuário Agosto 2006 ÍNDICE 1. APRESENTAÇÃO 1.1 Conhecendo a solução...03 Segurança pela identificação da máquina...03 2. ADERINDO À SOLUÇÃO e CADASTRANDO COMPUTADORES

Leia mais

Resumo: Perguntas a fazer ao elaborar um projeto arquitetural

Resumo: Perguntas a fazer ao elaborar um projeto arquitetural Resumo: Perguntas a fazer ao elaborar um projeto arquitetural Sobre entidades externas ao sistema Quais sistemas externos devem ser acessados? Como serão acessados? Há integração com o legado a ser feita?

Leia mais

Sistemas Paralelos e Distribuídos - 2003/2004 Curso: Matemática /Informática Sistemas Distribuídos - 2003/2004 Curso: Ensino da Informática

Sistemas Paralelos e Distribuídos - 2003/2004 Curso: Matemática /Informática Sistemas Distribuídos - 2003/2004 Curso: Ensino da Informática Java RMI - Remote Method Invocation Folha 5-1 No modelo de programação orientada a objectos, vimos que um programa consiste numa colecção de objectos que comunicam entre si através da invocação dos seus

Leia mais

Ferramenta: Spider-CL. Manual do Usuário. Versão da Ferramenta: 1.1. www.ufpa.br/spider

Ferramenta: Spider-CL. Manual do Usuário. Versão da Ferramenta: 1.1. www.ufpa.br/spider Ferramenta: Spider-CL Manual do Usuário Versão da Ferramenta: 1.1 www.ufpa.br/spider Histórico de Revisões Data Versão Descrição Autor 14/07/2009 1.0 15/07/2009 1.1 16/07/2009 1.2 20/05/2010 1.3 Preenchimento

Leia mais

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Num sistema de objectos distribuídos, dois conceitos são fundamentais. Folha 10-1 Java RMI - Remote Method Invocation No modelo de programação orientada a objectos, vimos que um programa consiste numa colecção de objectos que comunicam entre si através da invocação dos seus

Leia mais

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA FERRAMENTAS DE COLABORAÇÃO CORPORATIVA Manual de Utilização Google Grupos Sumário (Clique sobre a opção desejada para ir direto à página correspondente) Utilização do Google Grupos Introdução... 3 Página

Leia mais

JavaScript 2.0X 1.0 3.0X 1.1 4.0 4.05 1.2 4.06 4.61 1.3 5.0 1.4 6.0 1.5

JavaScript 2.0X 1.0 3.0X 1.1 4.0 4.05 1.2 4.06 4.61 1.3 5.0 1.4 6.0 1.5 JavaScript Diego R. Frank, Leonardo Seibt FIT Faculdades de Informática de Taquara Fundação Educacional Encosta Inferior do Nordeste Av. Oscar Martins Rangel, 4500 Taquara RS Brasil difrank@terra.com.br,

Leia mais

Manual do Usuário Cyber Square

Manual do Usuário Cyber Square Manual do Usuário Cyber Square Criado dia 27 de março de 2015 as 12:14 Página 1 de 48 Bem-vindo ao Cyber Square Parabéns! Você está utilizando o Cyber Square, o mais avançado sistema para gerenciamento

Leia mais

Programação Orientada a Objetos em java. Polimorfismo

Programação Orientada a Objetos em java. Polimorfismo Programação Orientada a Objetos em java Polimorfismo Polimorfismo Uma característica muito importante em sistemas orientados a objetos Termo proveniente do grego, e significa muitas formas Em POO, significa

Leia mais

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5. Desenvolvendo aplicações em camadas com PHP 5. Talvez a primeira vista você ache estranha a palavra Camada em programação, mas o que vem a ser Camada? Segundo o dicionário: Camada 1 - Qualquer matéria

Leia mais

Procedimentos para Reinstalação do Sisloc

Procedimentos para Reinstalação do Sisloc Procedimentos para Reinstalação do Sisloc Sumário: 1. Informações Gerais... 3 2. Criação de backups importantes... 3 3. Reinstalação do Sisloc... 4 Passo a passo... 4 4. Instalação da base de dados Sisloc...

Leia mais

Programação de Computadores - I. Profª Beatriz Profº Israel

Programação de Computadores - I. Profª Beatriz Profº Israel Programação de Computadores - I Profª Beatriz Profº Israel As 52 Palavras Reservadas O que são palavras reservadas São palavras que já existem na linguagem Java, e tem sua função já definida. NÃO podem

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 6 EJB Enterprise Java

Leia mais

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando

Leia mais

Criando documentação com javadoc

Criando documentação com javadoc H Criando documentação com javadoc H.1 Introdução Neste apêndice, fornecemos uma introdução a javadoc ferramenta utilizada para criar arquivos HTML que documentam o código Java. Essa ferramenta é usada

Leia mais

Persistência de Dados

Persistência de Dados Persistência de s Universidade do Estado de Santa Catarina - Udesc Centro de Ciências Tecnológicas - CCT Departamento de Ciência da Computação Tecnologia de Sistemas de Informação Estrutura de s II - DAD

Leia mais

4 O Workflow e a Máquina de Regras

4 O Workflow e a Máquina de Regras 4 O Workflow e a Máquina de Regras O objetivo do workflow e da máquina de regras é definir um conjunto de passos e regras configuráveis. Ao longo de sua execução, um usuário consegue simplificar o seu

Leia mais

Programação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes

Programação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes Pág 50 Programação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes 10 CORREÇÃO DE QUESTÕES DE AVALIAÇÃO 1 PARTE I - AVALIAÇÃO TEÓRICA 11 RESPONDA AS QUESTÕES ABAIXO: A) Qual a diferença entre

Leia mais

Manual de utilização do. sistema integrado de controle médico WWW.ISA.NET.BR

Manual de utilização do. sistema integrado de controle médico WWW.ISA.NET.BR Manual de utilização do sistema integrado de controle médico WWW.ISA.NET.BR Sistema integrado de controle médico Acesso... 3 Menu principal... 4 Cadastrar... 6 Cadastro de pacientes... 6 Convênios... 10

Leia mais

INTRODUÇÃO AO AMBIENTE MOODLE DA UFPA. Guia rápido

INTRODUÇÃO AO AMBIENTE MOODLE DA UFPA. Guia rápido INTRODUÇÃO AO AMBIENTE MOODLE DA UFPA Guia rápido A PLATAFORMA MOODLE Moodle (Modular Object Oriented Distance LEarning) é um Sistema para Gerenciamento de Cursos (SGC). Trata-se de um programa para computador

Leia mais

Software de gerenciamento do sistema Intel. Guia do usuário do Pacote de gerenciamento do servidor modular Intel

Software de gerenciamento do sistema Intel. Guia do usuário do Pacote de gerenciamento do servidor modular Intel Software de gerenciamento do sistema Intel do servidor modular Intel Declarações de Caráter Legal AS INFORMAÇÕES CONTIDAS NESTE DOCUMENTO SÃO RELACIONADAS AOS PRODUTOS INTEL, PARA FINS DE SUPORTE ÀS PLACAS

Leia mais

Domain Model: Uma Forma Mais Eficiente de Construir Aplicações Enterprise

Domain Model: Uma Forma Mais Eficiente de Construir Aplicações Enterprise Roberto Perillo (jrcperillo@yahoo.com.br) é bacharel em Ciência da Computação e está atualmente cursando mestrado no ITA, onde já concluiu o curso de especialização em Engenharia de Software. Trabalha

Leia mais

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse Como criar um EJB Criando um projeto EJB com um cliente WEB no Eclipse Gabriel Novais Amorim Abril/2014 Este tutorial apresenta o passo a passo para se criar um projeto EJB no Eclipse com um cliente web

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 02 Análise e Projeto OO Edirlei Soares de Lima Análise A análise modela o problema e consiste das atividades necessárias para entender

Leia mais

Universidade Federal do Vale do São Francisco Programa de Assistência Estudantil

Universidade Federal do Vale do São Francisco Programa de Assistência Estudantil 1 - Introdução O sistema PAE da UNIVASF é uma ferramenta desenvolvida pelo Núcleo de Tecnologia da Informação (NTI) que auxilia o processo seletivo de estudantes de graduação para o, que serão selecionados

Leia mais

Curso - Padrões de Projeto Módulo 2: Padrões de Criação

Curso - Padrões de Projeto Módulo 2: Padrões de Criação Curso - Padrões de Projeto Módulo 2: Padrões de Criação Vítor E. Silva Souza vitorsouza@gmail.com http://www.javablogs.com.br/page/engenho http://esjug.dev.java.net Sobre o Instrutor Formação: Java: Graduação

Leia mais

Associação Carioca de Ensino Superior Centro Universitário Carioca

Associação Carioca de Ensino Superior Centro Universitário Carioca Desenvolvimento de Aplicações Web Lista de Exercícios Métodos HTTP 1. No tocante ao protocolo de transferência de hipertexto (HTTP), esse protocolo da categoria "solicitação e resposta" possui três métodos

Leia mais

Manual do Aplicativo - Rastreamento Veicular

Manual do Aplicativo - Rastreamento Veicular Manual do Aplicativo - Rastreamento Veicular Sumário Apresentação... 2 Instalação do Aplicativo... 2 Localizando o aplicativo no smartphone... 5 Inserindo o link da aplicação... 6 Acessando o sistema...

Leia mais

Índice Apresentação... 3 Mensagens... 4 Tickets... 6 Cadastro de Tickets... 6 Acompanhamento de Tickets:...9 Entregas... 11 Storage...

Índice Apresentação... 3 Mensagens... 4 Tickets... 6 Cadastro de Tickets... 6 Acompanhamento de Tickets:...9 Entregas... 11 Storage... Índice Apresentação... 3 Mensagens... 4 Tickets... 6 Cadastro de Tickets... 6 Acompanhamento de Tickets:...9 Entregas... 11 Storage... 12 Apresentação O Pitstop foi desenvolvido pela Interact com o objetivo

Leia mais

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.

Leia mais

MVC e Camadas - Fragmental Bliki

MVC e Camadas - Fragmental Bliki 1 de 5 20-03-2012 18:32 MVC e Camadas From Fragmental Bliki Conteúdo 1 Introdução 2 Camadas: Separação Entre Componentes 3 MVC: Interação Entre Componentes 4 Conclusão 5 Referências Introdução A Arquitetura

Leia mais

Procedimentos para Instalação do SISLOC

Procedimentos para Instalação do SISLOC Procedimentos para Instalação do SISLOC Sumário 1. Informações Gerais...3 2. Instalação do SISLOC...3 Passo a passo...3 3. Instalação da Base de Dados SISLOC... 11 Passo a passo... 11 4. Instalação de

Leia mais

Certificado Digital A1

Certificado Digital A1 Certificado Digital A1 Geração Todos os direitos reservados. Imprensa Oficial do Estado S.A. - 2012 Página 1 de 41 Pré-requisitos para a geração Dispositivos de Certificação Digital Para que o processo

Leia mais

[MANUAL DE INTEGRAÇÃO PARA SITES DE MEMBROS]

[MANUAL DE INTEGRAÇÃO PARA SITES DE MEMBROS] 2011 [MANUAL DE INTEGRAÇÃO PARA SITES DE MEMBROS] Destinado a usuários que desejam vender conteúdo premium, disponível em sites de membros, através da plataforma Hotmart. Versão do documento: 1.0, 11/04/2011.

Leia mais

Manual de Instalação do Agente Citsmart

Manual de Instalação do Agente Citsmart 16/08/2013 Manual de Instalação do Agente Citsmart Fornece orientações necessárias para efetuar a instalação do Agente Citsmart. Versão 1.9 21/11/2014 Visão Resumida Data Criação 21/11/2014 Versão Documento

Leia mais

Etc & Tal. Volume 2 - Número 1 - Abril 2009 SBC HORIZONTES 44

Etc & Tal. Volume 2 - Número 1 - Abril 2009 SBC HORIZONTES 44 Armazenando Dados em Aplicações Java Parte 2 de 3: Apresentando as opções Hua Lin Chang Costa, hualin@cos.ufrj.br, COPPE/UFRJ. Leonardo Gresta Paulino Murta, leomurta@ic.uff.br, IC/UFF. Vanessa Braganholo,

Leia mais

Manual de Configuração e Utilização TabFisc Versão Mobile 09/2013 Pag. 1 MANUAL DE UTILIZAÇÃO TABLET VERSÃO MOBILE

Manual de Configuração e Utilização TabFisc Versão Mobile 09/2013 Pag. 1 MANUAL DE UTILIZAÇÃO TABLET VERSÃO MOBILE Pag. 1 MANUAL DE UTILIZAÇÃO TABLET VERSÃO MOBILE Pag. 2 INTRODUÇÃO Esse documento contém as instruções básicas para a utilização do TabFisc Versão Mobile (que permite ao fiscal a realização do seu trabalho

Leia mais

Eduardo Bezerra. Editora Campus/Elsevier

Eduardo Bezerra. Editora Campus/Elsevier Princípios de Análise e Projeto de Sistemas com UML 2ª edição Eduardo Bezerra Editora Campus/Elsevier Capítulo 11 Arquitetura do sistema Nada que é visto, é visto de uma vez e por completo. --EUCLIDES

Leia mais

O Patch 11.82.36 [BIBLIOTECA RM e TOTVS RM PORTAL] e 11.82.36 [TOTVS Gestão Hospitalar], disponíveis na Central de Download do Portal do Client.

O Patch 11.82.36 [BIBLIOTECA RM e TOTVS RM PORTAL] e 11.82.36 [TOTVS Gestão Hospitalar], disponíveis na Central de Download do Portal do Client. Prescrição de Soroterapia Produto : CorporeRM - TOTVS Hospitalar (Prontuário) Chamado : R_SAU003/SOC121 Data da publicação : 16/07/15 País(es) : Brasil Banco(s) de Dados : SQL Server Oracle Implementada

Leia mais

Índice. Atualizado em: 01/04/2015 Página: 1

Índice. Atualizado em: 01/04/2015 Página: 1 MANUAL DO USUÁRIO Índice 1. Introdução... 3 2. Acesso ao Sistema... 4 2.1. Instalação... 4 2.1.1. Servidor - Computador Principal... 4 2.1.2. Estação - Computador na Rede... 6 2.1.3. Estação - Mapeamento

Leia mais

Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4.

Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4. 1 Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4. Interface do sistema... 4 1.4.1. Janela Principal... 4 1.5.

Leia mais

PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB)

PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB) RELATÓRIO DE ENTREGA DO PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB) PARA A ELABORAÇÃO DOS PLANOS MUNICIPAIS DE GESTÃO INTEGRADA DE RESÍDUOS SÓLIDOS PMGIRS PARA OS MUNICÍPIOS DE NOVO HORIZONTE, JUPIÁ, GALVÃO,

Leia mais

Manual de utilização sistema Comtele SMS

Manual de utilização sistema Comtele SMS Manual de utilização sistema Comtele SMS Login... 3 Dashboard... 4 Envio instantâneo de mensagens SMS... 5 Requisições de envio instantâneo para contatos ou grupos.... 5 Agendamento de envio d e SMS...7

Leia mais

Manual de Utilização

Manual de Utilização Manual de Utilização Versão 1.0 18/01/2013 Sempre consulte por atualizações deste manual em nossa página. O Cotação Web está em constante desenvolvimento, podendo ter novas funcionalidades adicionadas

Leia mais

Documento de Análise e Projeto VideoSystem

Documento de Análise e Projeto VideoSystem Documento de Análise e Projeto VideoSystem Versão Data Versão Descrição Autor 20/10/2009 1.0 21/10/2009 1.0 05/11/2009 1.1 Definição inicial do documento de análise e projeto Revisão do documento

Leia mais

Cetac - Centro de Ensino e Treinamento em Anatomia e Cirurgia Veterinária Manual Técnico do Sistema Administrativo do site Cetacvet.com.

Cetac - Centro de Ensino e Treinamento em Anatomia e Cirurgia Veterinária Manual Técnico do Sistema Administrativo do site Cetacvet.com. Manual Técnico do Sistema Administrativo do site Cetacvet.com.br SÃO PAULO - SP SUMÁRIO Introdução... 3 Autenticação no sistema administrativo... 4 Apresentação do sistema administrativo... 5 Gerenciamento

Leia mais

5 Mecanismo de seleção de componentes

5 Mecanismo de seleção de componentes Mecanismo de seleção de componentes 50 5 Mecanismo de seleção de componentes O Kaluana Original, apresentado em detalhes no capítulo 3 deste trabalho, é um middleware que facilita a construção de aplicações

Leia mais

Millennium ECO 2.0 (beta)

Millennium ECO 2.0 (beta) MILLENNIUM NETWORK Millennium ECO 2.0 (beta) Documentação Técnica (draft) 10/2013 Este documento contém as instruções para a utilização da biblioteca Millenium_Eco que se presta à comunicação de aplicativos

Leia mais

Curso de Capacitação ao Sistema CDV. - GID Desmanches -

Curso de Capacitação ao Sistema CDV. - GID Desmanches - Curso de Capacitação ao Sistema CDV - GID Desmanches - Coordenadoria de Gestão de Desmanches Divisão de Desmanches Conteúdo Módulo 1 Como utilizar o Moodle... 4 Módulo 2 - Acessando o GID CDV... 4 Aula

Leia mais