Instalando o Nota Fiscal de Serviços Eletrônica (NFS-e) a partir dos fontes no Linux

 

A Nota Fiscal de Serviços Eletrônica possui integração com entes públicos que utilizam o sistema e-Cidade, gerando cobranças automáticas no momento da emissão de guias e facilitando o processo de fiscalização. Além disso, o produto permite a integração com outros sistemas de gestão pública, visando sempre atender às necessidades dos nossos clientes.

1. Instalação do Ubuntu Server 16.04.x LTS

O Ubuntu Server é a versão do sistema operacional da Canonical voltada para servidores. Como o uso em servidores exige um tempo maior de suporte, a versão indicada para o uso com esta documentação é a Ubuntu Server 16.04.x LTS.

1.1 Obtendo a mídia de instalação

A mídia de instalação pode ser obtida diretamente do site da Canonical e gravada em CD, DVD ou pendrive. No site http://www.ubuntu.com/download/server esta disponível a versão mais recente, mas utilizaremos a versão 16.04.x LTS disponível em http://releases.ubuntu.com/xenial/ (ubuntu-16.04.2-server-amd64.iso) por questões de compatibilidade com o produto.

1.2 Instalando o Ubuntu Server 16.04.x LTS

O processo de instalação do sistema operacional não é coberto por esta documentação, mas recomendamos a instalação mínima padrão, em “pt_BR” Português do Brasil, somente com os softwares “standard system utilities” e “OpenSSH server”.

Dica: Maiores informações sobre a instalação e personalização do sistema operacional podem ser obtidas em:
https://help.ubuntu.com/16.04/serverguide/

1.3 Editando os arquivos de configuração

Durante o processo de configuração descrito nesta documentação, é necessário editar e modificar diversos arquivos de texto. Para realizar estas modificações, sugerimos a utilização do editor “nano”, mas você pode usar qualquer outro editor de texto de sua preferência.

Dica: Mais informações sobre o editor de textos “nano” podem ser obtidas em:
http://www.nano-editor.org/.

2. Instalação do PostgreSQL 9.5.x

PostgreSQL é um sistema gerenciador de banco de dados objeto relacional (SGBDOR), desenvolvido como projeto de código aberto sem custo de licença. Este é o programa que vai gerenciar e armazenar o banco de dados relacional utilizado pelo NFS-e.

Dica: Mais informações sobre o PostgreSQL podem ser obtidas em:
http://www.postgresql.org/.

2.1 Configurando o repositório

Para instalar o PostgreSQL 9.5.x e suas dependências, utilizaremos o gerenciador de pacotes apt, que nos prove as últimas atualizações dos pacotes requeridos através de um canal seguro e confiável.

2.1.1 Crie o arquivo pgdg.list através dos comandos abaixo.
[linux]$ sudo touch /etc/apt/sources.list.d/pgdg.list
[linux]$ echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

Dica: Mais informações sobre a configuração do repositório podem ser obtidas em:
https://www.postgresql.org/download/linux/ubuntu/

2.1.2 Baixe e importe a chave de assinatura do repositório através do comando:
[linux]$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv ACCC4CF8

Dica: Mais informações sobre o gerenciador de pacotes “apt” podem ser obtidas em:
https://help.ubuntu.com/16.04/serverguide/package-management.html

2.2 Ajustando o idioma

Atenção: Este procedimento só é necessário se você não instalou o sistema operacional em “pt_BR” – Português do Brasil.

[linux]$ sudo apt -y install language-pack-gnome-pt language-pack-pt-base myspell-pt myspell-pt-br wbrazilian wportuguese

2.3 Instalando o PostgreSQL 9.5.x

Para realizar a instalação do PostgreSQL 9.5.x através do gerenciador de pacotes execute os comandos:

[linux]$ sudo apt update
[linux]$ sudo apt -y install postgresql-9.5 postgresql-client-9.5 postgresql-contrib-9.5

2.4 Criando e configurando o cluster

O NFS-e utiliza encoding UTF-8 no cluster do PostgreSQL 9.5.x. Por isso vamos parar, remover e recriar o cluster quer será utilizado pela aplicação.

Atenção: O NFS-e não pode ser instalado no mesmo cluster dos demais produtos como: e-cidade, e-cidadeonline, etc. A codificação utilizada pelo NFS-e é UTF-8, enquanto que nos outros produtos é LATIN1!

Dica: Mais informações sobre a configuração do cluster:
http://www.postgresql.org/docs/9.5/static/sql-cluster.html

2.4.1 Vamos parar o cluster criado pelo processo de instalação do PostgreSQL através do comando:
[linux]$ sudo pg_dropcluster --stop 9.5 main
2.4.2 Vamos criar o novo cluster do banco de dados como LATIN1 usando o comando:
[linux]$ sudo pg_createcluster -u postgres -g postgres -e UTF8 --locale="pt_BR.UTF-8" --lc-collate="pt_BR.UTF-8" 9.5 nfse
2.4.3 Para permitir o acesso de qualquer local ao banco de dados é necessário modificar o arquivo /etc/postgresql/9.5/nfse/pg_hba.conf usando o comando:
[linux]$ sudo nano /etc/postgresql/9.5/nfse/pg_hba.conf

Localize e altere as linhas do arquivo do arquivo de configuração que não estão comentadas (# na frente da linha), substituindo os valores correspondentes por trust, conforme a tabela abaixo.

local all postgres
local all all
host all all 127.0.0.1/32
host all all ::1/128
2.4.4 Para a correta integração com o NFS-e, é necessário alterar algumas configurações do cluster criado através do comando:
[linux]$ sudo nano /etc/postgresql/9.5/nfse/postgresql.conf

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere # do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

listen_addresses = '*'
max_connections = 20
2.4.5 Inicie o servidor PostgreSQL através do comando:
[linux]$ sudo systemctl start postgresql.service
2.4.6 Verifique o resultado da configuração usando o comando:
[linux]$ psql -U postgres -h localhost -l

A saída do comando deve ser parecida com os valores abaixo.

   Nome    |   Dono   | Codificação |     Collate      |      Ctype       | Privilégios de acesso
-----------+----------+-------------+------------------+------------------+-----------------------
 postgres  | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      |
 template0 | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres
 template1 | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres

2.5 Criando a estrutura de banco de dados para o NFS-e

Vamos criar os usuários necessários para o funcionamento do NFS-e através dos comandos:

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em:
http://cartilha.cert.br/senhas/.

psql -U postgres -c "CREATE ROLE nfse WITH SUPERUSER LOGIN PASSWORD 'nfse';"

Em seguida, utilize o comando abaixo para criar o banco de dados:

psql -U postgres -c "CREATE DATABASE nfse OWNER nfse;"

3. Instalação do Apache

Apache é o servidor web mais usado em sistemas Linux. Servidores web são usados para servir páginas Web que, normalmente, são solicitadas pelos computadores clientes através de navegador, como o Firefox, Chromium, etc.

Dica: Mais informações sobre o Apache podem ser obtidas em:
http://www.apache.org/.

3.1 Instalando o Apache

Para realizar a instalação do servidor web Apache através do gerenciador de pacotes, execute o comando:

[linux]$ sudo apt -y install apache2

3.2 Configurando a diretiva VirtualHost

3.2.1 Faça uma cópia de segurança do arquivo de configuração padrão, que é criado pelo Apache durante o processo de instalação através do comando:
[linux]$ sudo cp -a /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.dist
3.2.2 Para a correta integração com o NFS-e, é necessário adicionar alguns parâmetros ao arquivo de configuração do VirtualHost através do comando:
[linux]$ sudo nano /etc/apache2/sites-available/000-default.conf

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Adicione as linhas que não existirem e edite as existentes dentro do bloco VirtualHost, conforme é exibido abaixo.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/nfse/public

  SetEnv APPLICATION_ENV "production"
  SetEnv no-gzip 1

    <Directory /var/www/html/nfse/public>
        DirectoryIndex index.php
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error-nfse.log
    CustomLog ${APACHE_LOG_DIR}/access-nfse.log combined

</VirtualHost>

Dica: Mais informações sobre o VirtualHost podem ser obtidas em:
http://httpd.apache.org/docs/current/vhosts/examples.html.

4. Instalação do PHP 5.6 e PHP-FPM

PHP é uma linguagem interpretada livre, usada originalmente apenas para o desenvolvimento de aplicações presentes e atuantes no lado do servidor, capazes de gerar conteúdo dinâmico na World Wide Web.

O PHP-FPM é uma alternativa ao PHP FastCGI com muitas funcionalidades voltadas a sites com grande número de acessos e carga.

Dica: Mais informações sobre o PHP e PHP-FPM podem ser obtidas em:
http://www.php.net/ e http://php-fpm.org/

4.1 Configurando o repositório

Para instalar o PHP 5.6 e suas dependências, utilizaremos o gerenciador de pacotes apt, que nos prove as últimas atualizações dos pacotes requeridos através de um canal seguro e confiável.

4.1.1 Instale o repositório PPA através dos comandos abaixo.
[linux]$ sudo apt-add-repository -y ppa:ondrej/php
[linux]$ sudo apt update

4.2 Instalando o PHP 5.6 e o PHP-FPM

Para realizar a instalação do PHP 5.6 através do gerenciador de pacotes, execute o comando:

[linux]$ sudo apt -y install php5.6 php5.6-bcmath php5.6-bz2 php5.6-cli php5.6-common php5.6-curl php5.6-gd php5.6-interbase php5.6-json php5.6-mbstring php5.6-mcrypt php5.6-pgsql php5.6-soap php5.6-sqlite3 php5.6-xml php5.6-xmlrpc php5.6-zip php5.6-fpm

4.3 Configurando o PHP 5.6 e o PHP-FPM

4.3.1 Habilitar as dependências de módulos através do comando:
[linux]$ sudo a2enmod proxy_fcgi setenvif rewrite
4.3.2 Habilitar as dependências de configuração através do comando:
[linux]$ sudo a2enconf php5.6-fpm
4.3.3 Configurar o arquivo de log do PHP-FPM através dos comandos:
[linux]$ sudo touch /var/log/php_errors.log
[linux]$ sudo chown www-data.www-data /var/log/php_errors.log
4.3.4 Para a correta integração com o NFS-e, é necessário alterar algumas configurações do PHP através do comando:
[linux]$ sudo nano /etc/php/5.6/fpm/php.ini

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere ; do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

short_open_tag = On
session.gc_maxlifetime = 7200
date.timezone = "America/Sao_Paulo"

Também é necessário alterar o arquivo de configuração utilizado pelo php-cli através do comando:

[linux]$ sudo nano /etc/php/5.6/cli/php.ini

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere ; do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

short_open_tag = On
date.timezone = "America/Sao_Paulo"
4.3.5 Reinicie o serviço do PHP-FPM usando o comando:
[linux]$ sudo systemctl restart php5.6-fpm.service

5. Instalação do NFS-e

5.1 Obtendo o pacote de instalação

O pacote de instalação pode ser obtido diretamente do site do Portal do Software Público. No endereço da comunidade do e-cidade (https://softwarepublico.gov.br/social/e-cidade) estão disponíveis as últimas versões e suas atualizações. Como estamos realizando uma nova instalação, você deve baixar o pacote completo, um exemplo de nome do pacote seria: e-cidadeonline2.completo.Vxxxxxx.tar.bz2.

5.2 Configurando o servidor

5.2.1 Vamos criar um usuário administrativo para o NFS-e, neste exemplo criaremos o usuário dbseller através do comando:
[linux]$ sudo useradd -d /home/dbseller -g www-data -G sudo,adm,cdrom,dip,plugdev -k /etc/skel -m -s /bin/bash dbseller
5.2.2 Em seguida, vamos definir uma senha para este novo usuário usando o comando:
[linux]$ sudo passwd dbseller

Dica: Neste exemplo, defina a senha como o mesmo nome de usuário, como “dbseller”.

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em:
http://cartilha.cert.br/senhas/.

5.2.3 Também devemos corrigir a máscara de criação de arquivos modificando os arquivos através dos comandos:
[linux]$ sudo nano /etc/login.defs

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere a linha do arquivo do arquivo de configuração, descomentando-a se necessário (remover o caractere # do início da linha), substituindo o valor correspondente conforme a indicação abaixo.

UMASK           002

Em seguida, edite o arquivo de configuração de variáveis do apache com o comando abaixo:

[linux]$ sudo nano /etc/apache2/envvars

Adicione a linha abaixo no final do arquivo.

umask 002

5.3 Configurando o acesso do webservice no e-cidade

O NFS-e se comunica com o e-cidade através de um webservice, para que essa comunicação seja possível, é necessário liberar o acesso no e-cidade.

5.3.1 Liberando o acesso ao webservice do e-cidade

Após realizar o login no e-cidade, acesse:

  1. Selecione a instituição da prefeitura;
  2. Selecione o módulo DB:Configuração;
  3. Selecione o módulo Configuração;
  4. Selecione o menu Cadastros;
  5. Selecione o menu Cadastro de Acessos ao Sistema;
  6. Selecione o menu Inclusão;

Em seguida, preencha os campos conforme as instruções abaixo:

  1. No campo Data Início, selecione a data de hoje;
  2. No campo Hora Início, informe o valor 08:00;
  3. No campo Data Final, selecione uma data no futuro, como o valor 31/12/2099;
  4. No campo Hora Final, informe o valor 08:00;
  5. No campo Observação, informe o valor Acesso ao webservice pelo NFS-e;
  6. Clique no botão Incluir.

Após incluir o acesso, clique na aba Usuário e selecione no campo Cod. Usuário o usuário que será utilizado para comunicação com o webservice, em seguida, clique no botão Alterar.

Após incluir o usuário, clique na aba IP/Máscara e informe o valor no campo Máscara do IP o endereço IP do servidor do NFS-e que será utilizado para comunicação com o webservice do e-cidade, em seguida, clique no botão Alterar.

5.4 Instalando o NFS-e

5.4.1 Descompacte o pacote do NFS-e através do comando:
[linux]$ tar xjf e-cidadeonline2.completo.Vxxxxxx.tar.bz2
5.4.2 Copie o diretório do NFS-e para o diretório raiz do Apache usando o comando:
[linux]$ sudo cp -r e-cidadeonline2.completo.Vxxxxxx /var/www/html/nfse

5.5 Configurando o NFS-e

5.5.1 Crie o arquivo de configuração da aplicação através do comando:
[linux]$ sudo cp /var/www/html/nfse/application/configs/application.ini.dist /var/www/html/nfse/application/configs/application.ini

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/application/configs/application.ini

Em seguida, atualize as configurações conforme o exemplo abaixo.

...
doctrine.connectionParameters.dbname                    = "nfse"
doctrine.connectionParameters.host                      = "localhost"
doctrine.connectionParameters.password                  = "nfse"
doctrine.connectionParameters.port                      = "5432"
doctrine.connectionParameters.user                      = "nfse"
// Verifique a versão do sistema em /var/www/html/nfse/versao.txt
ecidadeonline2.versao                                   = "V011114"
resources.mail.transport.host                           = "smtp.exemplo.com"
resources.mail.transport.password                       = "nfse@exemplo.com"
resources.mail.transport.port                           = "587"
resources.mail.transport.username                       = "nfse@exemplo.com"
resources.mail.defaultFrom.email                        = "nfse@exemplo.com"
resources.mail.defaultFrom.name                         = "NFS-e Nome da Prefeitura"
settings.application.cache                              = "011114"
webservice.client.uri                                   = "http://url_acesso_ecidade/e-cidade/"
webservice.client.url                                   = "http://url_acesso_ecidade/e-cidade/"
webservice.client.location                              = "http://url_acesso_ecidade/e-cidade/webservices/requisicao.webservice.php"
// md5 do ID do usuário selecionado na regra de acesso do e-cidade
webservice.cliente.user                                 = "c4ca4238a0b923820dcc509a6f75849b"
...
5.5.2 Crie os arquivos de configuração do webservice através dos comandos:
[linux]$ sudo cp /var/www/html/nfse/application/configs/webservice-ecidade.ini.dist /var/www/html/nfse/application/configs/webservice-ecidade.ini

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/application/configs/webservice-ecidade.ini

Em seguida, atualize as configurações conforme o exemplo abaixo.

...
DB_id_usuario          = 'Id do usuário que criou a regra de acesso';
DB_login               = 'Login o usuário que criou a regra de acesso';
DB_ip                  = 'IP de acesso ao servidor do E-cidade';
SERVER_ADDR            = 'IP local do servidor do E-cidade';
SERVER_PORT            = 'Porta local do servidor do E-cidade';
DOCUMENT_ROOT          = 'Diretório raiz do E-cidade ex: /var/wwww';
SERVER_ADMIN           = 'e-mail do administrador do servidor web';
PHP_SELF               = 'webservices/requisicao.webservice.php';
HTTP_HOST              = 'Nome do host do E-cidade ex localhost';
...
[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/producao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/producao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/homologacao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/homologacao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/integracao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/integracao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

5.5.3 Ajuste as permissões dos diretórios através dos comandos:
[linux]$ sudo chown -R dbseller.www-data /var/www/html/nfse
[linux]$ sudo chmod -R 775 /var/www/html/nfse

Em seguida, limpe qualquer cache existente através do comando:

[linux]$ sudo rm -rf /var/www/html/nfse/application/data/Proxy/*
5.5.4 Faça a carga do schema do NFS-e através do comando:
[linux]$ cd /var/www/html/nfse
[linux]$ php bin/ruckus.php db:migrate
5.5.5 Reinicie o serviço do Apache usando o comando:
[linux]$ sudo systemctl restart apache2.service

5.6 Acessando o NFS-e

Após finalizar os procedimentos de instalação e configuração, abra um navegador e acesse o NFS-e através do endereço IP ou nome do servidor. EX: http://nfse.prefeitura.gov.br/, utilize como nome de usuário admin, e e como senha 123456.

Atenção: Altere a senha ao realizar o primeiro acesso. Mais informações sobre segurança de senhas podem ser obtidas em: http://cartilha.cert.br/senhas/.

Glossário

Termo Significado
encoding http://en.wikipedia.org/wiki/Character_encoding
cluster http://www.postgresql.org/docs/8.2/interactive/creating-cluster.html
apt-get http://www.debian.org/doc/manuals/apt-howto
apt-get http://pt.wikipedia.org/wiki/Advanced_Packaging_Tool
nano http://www.nano-editor.org
Firefox http://www.mozilla.org/firefox
DBSeller Sistemas http://www.dbseller.com.br
proxy http://pt.wikipedia.org/wiki/Proxy
squid http://pt.wikipedia.org/wiki/Squid

Anúncios

Introdução sobre HTML5 Web Workers e multi threads com javascript

Trabalhar de forma assíncrona e paralela nos demanda cada dia mais na construção de aplicativos web com maior facilidade e performance. A especificação de Web Workers (link em inglês) define uma API para geração de scripts de segundo plano no seu aplicativo da web. O Web Workers permite executar tarefas como disparar scripts de longa…

via Introdução sobre HTML5 Web Workers e multi threads com javascript — Código Simples .NET

Padrão de Projeto Factory Method em Java

Veja neste artigo os principais conceitos, funcionamento e implementação prática, na linguagem Java, do Padrão de Projeto Factory Method.

Introdução

Os Design Patterns (Padrões de Projetos) têm sua origem no trabalho de um arquiteto chamado Christopher Alexander em meados da década de 70. Ele escreveu dois livros de bastante sucesso que exemplificava o uso e descrevia seu raciocínio para documentar os padrões para a arquitetura. Em 1995, um grupo de quatro profissionais (que ficou conhecido como Group Of Four ou Grupo dos Quatro) escreveu e lançou o livro “Design Patterns: Elements of Reusable Object-Oriented Software” [Gamma95] que continha um catálogo com 23 padrões de projetos (Design Patterns) orientados a software. A ideia de documentar problemas recorrentes que acontecia nos softwares surgiu através da ideia de Christopher Alexander que também percebeu essa necessidade na sua área.

Os Design Patterns são uma coleção de padrões de projeto de software que contém soluções para problemas conhecidos e recorrentes no desenvolvimento de software descrevendo uma solução comprovada para um problema de projeto recorrente. A Documentação desses padrões permite o reuso e o compartilhamento dessas informações sobre a melhor maneira de se resolver um problema de projeto de software.

Neste artigo descreveremos um dos Padrões de projetos mais utilizados pelos desenvolvedores de software, sendo bastante recorrente ,que é o Factory Method que será detalhado nas seções subsequentes do artigo.

Funcionamento

De forma geral todos os padrões Factory (Simple Factory, Factory Method, Abstract Factory) encapsulam a criação de objetos. O padrão Factory Method por sua vez encapsula a criação de objetos, no entanto, a diferença é que neste padrão encapsula-se a criação de objetos deixando as subclasses decidirem quais objetos criar.

O Diagrama de classe abaixo mostra mais detalhes sobre o funcionamento do padrão Factory Method.

Diagrama de classe do Padrão Factory Method

Figura 1: Diagrama de classe do Padrão Factory Method

No diagrama de classe acima temos a classe de criador abstrata que é a Creator que define um método fábrica abstrata que as subclasses implementam para criar um produto (factoryMethod) e pode possuir um ou mais métodos com seus devidos comportamentos que chamarão o factoryMethod. Normalmente o método factoryMethod do Creator também possui um Product abstrato que é produzido por uma subclasse (ConcreteCreator). Nota-se que cada ConcreteCreator produzirá seu próprio método de criação.

Segundo o GOF (Group Of Four) o padrão Factory Method é: “Um padrão que define uma interface para criar um objeto, mas permite às classes decidirem qual classe instanciar. O Factory Method permite a uma classe deferir a instanciação para subclasses”.

Exemplo de Implementação

Segue abaixo um exemplo de implementação em Java utilizando o Padrão Factory Method. Inicialmente define-se abaixo os produtos abstratos e concretos que serão usados pela factory.

Listagem 1: Exemplo de implementação dos produtos

public abstract class Pessoa {

	public String nome;
	public String sexo;

}

class Homem extends Pessoa {
	
	public Homem(String nome) {
		this.nome = nome;
		System.out.println(“Olá Senhor ” + this.nome);
	}
}

class Mulher extends Pessoa {
	
	public Mulher(String nome) {
		this.nome = nome;
		System.out.println(“Olá Senhora ” + this.nome);
	}

}

Acima temos a implementação da primeira parte do padrão Factory Method. Nesse exemplo criou-se os Produtos (abstratos e concretos) que executam a decisão tomada na factory.

Em tempo de execução não sabemos quem será chamado, ao invés de termos if’s e else’s no cliente, temos toda a lógica de decisão na factory que é mostrada abaixo.

Listagem 2: Exemplo de implementação do Method Factory

class FactoryPessoa {

	public Pessoa getPessoa(String nome, String sexo) {
		if (sexo.equals(“M”))
			return new Homem(nome);
		if (sexo.equals(“F”))
			return new Mulher(nome);
	}

}

Abaixo segue um exemplo de execução desse padrão descrito acima:

Listagem 3: Exemplo de implementação do Factory Method em Java

public class TesteApp {
	
	public static void main(String args[]) {
		FactoryPessoa factory = new FactoryPessoa();
		String nome = “Carlos”;
		String sexo = “M”;
		factory.getPessoa(nome, sexo);
	}
}

Acima criou-se uma factory com os dados acima. Baseado na condição “sexo” temos a criação do objeto Homem que faz a saudação correta. Veja que toda a parte de decisão, ou a sujeira, fica tudo na fábrica para que ela possa decidir o que fazer.

Vantagens do Padrão Factory Method

O Factory Method é bastante utilizado em diversos projetos, até mesmo nos casos em que temos apenas um Creator (diagrama acima), pois mesmo nessas condições o padrão nos oferece um meio de desligar a implementação de um Product. Adicionando ou alterando Products isso não irá afetar o Creator, pois eles não estão fortemente ligados.

Com o padrão Factory Method podemos encapsular o código que cria objetos. É muito comum termos classes que instanciam classes concretas e essa parte do código normalmente sofre diversas modificações, portanto nesses casos usamos um Factory Method que encapsula esse comportamento de instanciação.

Usando o Factory Method temos o nosso código de criação em um objeto ou método, evitando assim a duplicação e além disso temos um local único para fazer manutenção. O padrão também nos dá um código flexível e extensível para o futuro.

Conclusão

Como foi possível estudar neste artigo, o padrão Factory Method oferece um modo de encapsular as instanciações de tipos concretos. O Creator nos oferece um método para criação de objetos, os demais métodos operam em cima das subclasses de Creator, ou seja, os ConcreteCreator, fabricados pelo factoryMethod. Além disso apenas os ConcreteCreator implementam o método de fábrica e criam Products como pode-se observar no diagrama de classe do padrão.

Bibliografia

  • Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra. Head First Design Patterns. O’Reilly Media, 2004.
  • Gamma, E., Helm, R., Johnson, R., Vlissides, J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley, 2010.

 

Fonte: http://www.devmedia.com.br/padrao-de-projeto-factory-method-em-java/26348

JAVA Agent Development Framework

JADE (Java Agent DEvelopment Framework) é um software Framework totalmente implementado na linguagem Java. Ele simplifica a implementação de sistemas multi-agente através de um meio-ware que está em conformidade com as especificações do FIPA e através de um conjunto de ferramentas gráficas que suportam as fases de depuração e implantação. Um sistema baseado em JADE podem ser distribuídos em máquinas (que nem sequer precisam compartilhar o mesmo sistema operacional) ea configuração pode ser controlada através de uma GUI remoto . A configuração pode ser alterada mesmo em tempo de execução movendo agentes de uma máquina para outra, como e quando necessário. JADE é completamente implementado em linguagem Java eo requisito de sistema mínimo é a versão 5 do JAVA (o ambiente de tempo de execução ou o JDK).

Além da abstração agente, JADE fornece uma simples, mas poderosa execução de tarefas e modelo de composição, peer to peer comunicação do agente com base na mensagem assíncrona passando paradigma, um serviço de páginas amarelas de apoio publicar inscrever mecanismo de descoberta e muitas outras características avançadas que facilita o desenvolvimento de uma Sistema distribuído.

Graças à contribuição do projecto LEAP, versões ad hoc de JADE existem projetado para implantar agentes JADE transparente em diferentes ambientes orientados para Java, como dispositivos Android e J2ME-CLDC MIDP 1.0 dispositivos.
Além disso, podem ser especificadas configurações adequadas para executar agentes JADE em redes caracterizadas por conectividade parcial incluindo NAT e firewalls, bem como cobertura intermitente e alterações de endereço IP.

JADE é um software livre e é distribuído pela Telecom Italia , titular dos direitos de autor, em código aberto sob os termos e condições da licença LGPL (Lesser General Public License versão 2). Além da equipe JADE, no entanto, uma comunidade bastante grande de desenvolvedores se reuniram em torno da JADE Framework nestes anos. Qualquer pessoa que esteja disposta a contribuir para esta comunidade, relatando bugs, fornecendo correções e contribuições ou simplesmente comentários e sugestões, é mais que bem-vinda.

Telecom Italia reconhece que este projecto é parcialmente suportado pelo MIUR italiana através do Te.SCHe.T. Projeto.

returnAddress, Tipos e Valores – Java

O returnAddress

O tipo returnAddress é utilizado por JSR Java Virtual Machine, ret e instruções jsr_w ( § JSR , § ret , § jsr_w ).

Os valores do tipo returnAddress são ponteiros para os opcodes de instruções da Java Virtual Machine. Ao contrário dos tipos primitivos numéricos, o tipo returnAddress não corresponde a qualquer tipo de linguagem de programação Java e não pode ser modificado pelo programa em funcionamento.

returnaddress

Fonte: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html&usg=ALkJrhg8w6cE0du9mHggeVmudnvQ-7N9wg#jvms-2.5.1