UNIVERSIDADE REGIONAL DO NOROESTE DO ESTADO DO RIO GRANDE DO SUL - UNIJUÍ ROMILDO JUNIOR BESSEGATO DISTRIBUIÇÃO DE SERVIÇOS DA ARQUITETURA AGROMOBILE UTILIZANDO WEBSERVICES Santa Rosa 2014 2 ROMILDO JUNIOR BESSEGATO DISTRIBUIÇÃO DE SERVIÇOS DA ARQUITETURA AGROMOBILE UTILIZANDO WEBSERVICES Trabalho de Conclusão de Curso do Curso de Ciência da Computação da Universidade Regional do Noroeste do Estado do Rio Grande do Sul. Orientador: Dr. Gerson Battisti Santa Rosa 2014 3 Dedico este trabalho aos meus familiares, que sempre estiveram ao meu lado, me apoiando, me incentivando e ajudando em todos os momentos e tanto contribuíram para minha formação. Dedico também a minha esposa que foi amiga, conselheira e sempre me encorajou a seguir em frente. 4 AGRADECIMENTOS Primeiramente agradeço a Deus por estar sempre iluminando os meus caminhos. Aos meus pais e irmãs, pelas palavras de incentivo e por estarem comigo em todos os momentos. Ao meu orientador Gerson Battisti por sempre estar à disposição para tirar minhas dúvidas, pelo apoio durante o trabalho e por aprimorar os meus conhecimentos com desenvolvimento de WebServices. Agradeço aos meus colegas que estiveram comigo durante estes anos e pelas amizades que conquistamos. Á todos os professores do curso de Ciência da Computação, pelos conhecimentos sabiamente transmitidos e pelas informações passadas que foram adquiridas através de suas experiências, especialmente ao Vinicius Maran mentor do projeto AgroMobile. 5 RESUMO A partir de um projeto em desenvolvimento na Universidade Regional do Noroeste do Estado do Rio Grande do Sul (UNIJUI), o qual visa uma arquitetura de software para auxílio na agricultura de precisão, a beneficiar pequenos e médios produtores, a arquitetura AgroMobile baseia-se em diversos módulos desde o sensoriamento, a modelagem do conhecimento, as interfaces para usuários e o gerenciamento baseado em WebServices. Este trabalho objetiva desenvolver a parte do gerenciamento, os quais farão a interligação entre todos os módulos a fim de estabelecer o pleno funcionamento. Estas interligações são baseadas em WebServices desenvolvidos em Java no padrão RESTful com o tráfego de dados em JSON para se tornar uma interligação ágil e funcional. Palavras chave: Agricultura de Precisão, WebServices, RESTful. . 6 ABSTRACT From a project under development at the Northwest Regional University of the State of Rio Grande do Sul (UNIJUI), which targets a software architecture to aid in precision agriculture, small and medium producers qualify, AgroMobile architecture is based in several modules from the sensing, modeling of knowledge, the user interfaces and management based on WebServices. This work aims to develop the part of management, which will make the interconnection between all modules in order to establish the full operation. These interconnections are based on WebServices developed in Java on standard RESTful with JSON data traffic in order to become an agile and functional interconnection. Keywords: Precision Farming, WebServices, RESTful. . 7 LISTA DE ABREVIATURAS E SIGLAS API Application Programming Interface Embrapa Empresa Brasileira de Pesquisa Agropecuária GPS Sistema de Posicionamento Global HTML HyperText Markup Language HTTP Hypertext Transfer Protocol JSON JavaScript Object Notation PH Potêncial Hidrogeniônico REST Representational State Transfer RSSF Rede de Sensores Sem Fio SOAP Simple Object Access Protocol URL Uniform Resource Locator UTF-8 8-bit Unicode Transformation Format XML eXtensible Markup Language 8 LISTA DE FIGURAS Figura 1 - A) Diagrama de um nó de rede de sensores; B) Protótipo do nó da RSSF. .................................................................................................................................. 16 Figura 2 - Diagrama de Sequência do Coletor Definido ............................................ 17 Figura 3 - Invocação Arquitetura WebServices ......................................................... 21 Figura 4 - Exemplo de Arquivo XML .......................................................................... 23 Figura 5 - Exemplo de arquivo JSON ........................................................................ 24 Figura 6 - Diagrama Lógico da Modelagem da Informação ...................................... 26 Figura 7 - Arquitetura de software ............................................................................. 26 Figura 8 - Diagrama de Pacotes dos WebServices. .................................................. 28 Figura 9 - Classe ApplicationConfig .......................................................................... 29 Figura 10 - Métodos genéricos da classe AbstractFacade ........................................ 29 Figura 11 - Diagrama de Classes do Pacote Entidades ............................................ 30 Figura 12 - Classe Técnico do Pacote Entidades...................................................... 31 Figura 13 - Diagrama de Classes Pacote Recursos .................................................. 32 Figura 14 - Exemplo do Inicio da Classe Fachada. ................................................... 32 Figura 15 - Exemplo Método Create (POST) ............................................................ 33 Figura 16 - Exemplo Método Edit (PUT) ................................................................... 33 Figura 17 - Exemplo Método Remove (DELETE)...................................................... 34 Figura 18 - Exemplo Método Find (GET) .................................................................. 34 Figura 19 - Esquema do Protótipo............................................................................. 35 Figura 20 - Estrutura lógica da tabela leituras. .......................................................... 35 Figura 21 - Classe NewJerseyClient no Cliente. ....................................................... 36 Figura 22 - Método Mount no Cliente. ...................................................................... 36 Figura 23 - Retorno do Cliente ao Fazer POST no Recurso Leituras ....................... 37 Figura 24 - Consulta via HTTP GET no Recurso Leituras ......................................... 37 9 LISTA DE TABELAS Tabela 1: Anotações e sua Funcionalidade .............................................................. 27 10 SUMÁRIO INTRODUÇÃO ............................................................................................. 11 1 O PROJETO AGROMOBILE ................................................................. 13 1.1 Módulos da Arquitetura ....................................................................... 14 1.2 Sensoriamento ..................................................................................... 15 1.3 Representação do Conhecimento ...................................................... 17 2 WEBSERVICES ..................................................................................... 20 3 DISTRIBUIÇÃO DE SERVIÇOS DA ARQUITETURA AGROMOBILE UTILIZANDO WEBSERVICES..................................................................... 25 3.1 Informações do Projeto AgroMobile com WebServices ................... 25 3.2 Desenvolvimento dos WebServices ................................................... 27 3.2.1 Pacote Config .................................................................................... 28 3.2.2 Pacote entidades ............................................................................... 30 3.2.3 Pacote Recursos................................................................................ 31 3.3 Protótipo para AgroMobile .................................................................. 34 CONCLUSÃO............................................................................................... 38 REFERÊNCIAS ............................................................................................ 39 APÊNDICE A – Classes do Pacote Config .................................................. 41 APÊNDICE B – Classes do Pacote Entidades ............................................. 44 APÊNDICE C – Classes do Pacote Recursos ............................................ 138 11 INTRODUÇÃO A agricultura tem evoluído muito nos últimos anos, e com o avanço da tecnologia há um foco especial de estudos na área da agricultura de precisão. Este é um tema abrangente, pois não se limita a algumas culturas e nem a algumas regiões. É um sistema (baseado em um conjunto de processos) de manejo integrado de informações e tecnologias, fundamentado nos conceitos de que as variabilidades de espaço e tempo influenciam diretamente nos rendimentos dos cultivos (CAMPANHOLA, 2004). A agricultura de precisão visa auxiliar o gerenciamento mais detalhado dos sistemas de produção agrícola, não somente das aplicações de insumos ou de mapeamentos diversos, mas de todos os processos envolvidos na produção. Segundo a Empresa Brasileira de Pesquisa Agropecuária (Embrapa), um dos pontos que convergem em excelência de resultados para a agricultura de precisão é a Tecnologia da Informação. Atualmente, existem vários sistemas que fornecem auxílio à agricultura de precisão, porem há uma resistência dos produtores na utilização destes sistemas, pois eles são feitos para especialistas da área, e não para leigos, além de seu custo ser elevado, possibilitando acesso a poucos. O projeto AgroMobile busca minimizar essa desigualdade através do desenvolvimento de uma arquitetura que auxilia os assistentes técnicos como técnicos agrícolas e engenheiros agrônomos, com a utilização de ferramentas de fácil manuseio, sejam elas website ou softwares instalados em dispositivos móveis com Sistema de Posicionamento Global (GPS) para a agricultura de precisão. Desta forma, os mesmos terão um acompanhamento preciso nas áreas de produção, para que seja detectada qualquer ameaça e/ou aplicada à correção necessária em determinado ponto da lavoura, tornando assim um gerenciamento preciso e com as dosagens certas para tal problema, gerando um melhor cultivo e um aumento significativo na produção. A dependência da automação para a agricultura de precisão segundo Boemo: A agricultura de precisão também necessita cada vez mais de acesso a um grande número de dados o que é possível devido aos avanços obtidos no processamento computacional (2011). 12 Buscando beneficiar o maior número de produtores, o projeto AgroMobile, em desenvolvimento na Universidade Regional do Estado do Rio Grande do Sul (Unijuí), tem como principal objetivo propor uma arquitetura de software onde possam ser feitas recomendações aos produtores utilizando informações de sensores e tecnologias da computação móvel e pervasiva (KIRSCHNER; MARAN, 2012). Esta arquitetura é composta por diversos serviços. Estes serviços são separados por funcionalidades, tais como: coleta de dados, engine, modelos de dados, entre outros. Para que seja possível que estes serviços sejam interligados e distribuídos (devido a quantidade de informação gerada e processada pela arquitetura), é necessário que existam interfaces na forma de WebServices para os serviços da arquitetura. Sendo assim, como parte da arquitetura AgroMobile, o objetivo é utilizar os conceitos e tecnologias da área de sistemas distribuídos, desenvolvimento Java Web, padrão RESTful e definir um conjunto de interfaces WebServices com padrões para a troca de mensagens, que possam se comunicar com as demais partes da arquitetura AgroMobile, tais como: a interface Web ou o aplicativo Android utilizado pelos usuários, o coletor responsável pelas informações dos sensores na lavoura e também com a ontologia que modela o conhecimento do domínio de agricultura de precisão. Com isso é formada uma camada de software capaz de gerenciar toda essa arquitetura, visando seu total funcionamento, gerando as sugestões mais apropriadas para a solicitação ou vir a alertar ao usuário por algum evento anormal inesperado. 13 1 O PROJETO AGROMOBILE O Projeto AgroMobile, a partir de estudos relacionados nas áreas de Computação Móvel, Ubíqua e Aplicada na Agricultura de Precisão, tem como objetivo o desenvolvimento de uma arquitetura de software, e com essas ferramentas auxiliar engenheiros agrônomos na tomada de decisões mais precisas quanto às dosagens certas de insumos, coleta de amostras, fornecendo também um histórico para o melhor aproveitamento e melhor produção agrícola, informações necessárias para se ter um bom gerenciamento dos negócios. Com a mudança no padrão agrícola brasileiro, a agricultura não está mais sendo vista como uma atividade primária isolada, sendo cada vez mais associada aos setores industriais e comerciais. Países importadores de produtos primários exigem uma variedade cada vez maior de critérios de qualidade antes de comprar alimentos, causando grandes impactos na cadeia de produção de alimentos, especialmente entre pequenos e médios agricultores, os quais são pouco integrados a organizações ou circuitos de comercialização (ASSAD et al., 2004). Buscando atender a esta demanda, com tecnologia de ponta e custo baixo, o AgroMobile beneficia produtores de pequeno e médio porte que não possuem recursos suficientes para adquirir sistemas proprietários encontrados hoje no mercado. Através da utilização desta ferramenta, estes agricultores terão um melhor controle e produção de suas lavouras, além de contribuir com a preservação do meio ambiente, este sendo considerado por Assad et al. (2004) um dos principais desafios da atividade agrícola. Esta arquitetura tem como principal finalidade alertar e sugerir medidas preventivas para os Engenheiros Agrônomos e Técnicos Agrícolas. De acordo com as informações do ambiente de produção (a lavoura), estes receberão recomendações do sistema quando qualquer anomalia for identificada, sugerindo uma determinada ação a ser tomada para o problema. Assim, ele terá posse de várias informações importantes, como umidade, variações de temperatura, Potencial Hidrogeniônico (PH) do solo, entre outras. A partir de sensores localizados nas lavouras o agricultor terá informações precisas de sua área, ao passo que qualquer anomalia identificada possa gerar um alerta e uma sugestão para tal problema a fim de minimizar o impacto na sua 14 produção. Essas informações serão disparadas para seu dispositivo móvel o qual possuirá a aplicação desenvolvida ou ao utilizar o website. Para isto, necessita-se de uma rede de sensores para uma informação precisa e atualizada, da definição de uma ontologia a ser aplicada para embasar o conhecimento e assim gerar as sugestões apropriadas, uma aplicação para dispositivos móveis a fim de fazer a intermediação entre o hardware e o produtor ou um website para acessar por qualquer plataforma, tudo isso para que ele possa ter o controle e o ponto exato do evento alertado tomando assim sua decisão. 1.1 Módulos da Arquitetura A arquitetura AgroMobile é dividida em 6 módulos, sendo eles: Rede de Sensores; Coletores; Aplicativo de Interface para Dispositivos Móveis e WebSite; Servidor de Serviços para a Arquitetura (Gerenciamento) e a Representação do Conhecimento através de ontologias. Rede de Sensores: na rede de sensoriamento serão criados nós com sensores utilizando a plataforma Arduino, os quais constantemente estarão lendo informações em tempo real e enviando estes pacotes de informações aos atuadores para que estes possam tratá-las e verificar se existe algum fator de risco; Coletor: os coletores são responsáveis pelo recebimento e filtragem das informações enviadas pelos nós de sensores, que posteriormente serão enviadas para os WebServices. São desenvolvidos na linguagem de programação Java e fisicamente estarão junto ao ambiente de produção (na lavoura); Aplicativo Móvel: desenvolvido em Java para sistemas Android, este aplicativo fará o auxilio e comunicação com o usuário (Engenheiros e Técnicos), nele terá todas as informações que poderão vir a ser consultadas de determinadas áreas mapeadas com o GPS e também receberá os alertas e sugestões levantadas pela arquitetura; 15 Interface WEB: tem as mesmas funcionalidades do aplicativo para Android, sendo uma segunda opção para o usuário, a fim de poder ser utilizada em qualquer plataforma e em qualquer dispositivo. Servidor de Serviços: os WebServices terão um papel fundamental na arquitetura com um todo, pois eles que darão a possibilidade de interligação dos módulos. Serão desenvolvidas interfaces de comunicação em Java utilizando a arquitetura RESTful com o tráfego de dados no formato JavaScript Object Notation (JSON) que se comunicará com os coletores, aplicativos móveis, interface Web e as ontologias; Representação do Conhecimento: o conhecimento do domínio da Agricultura de Precisão será desenvolvido através de uma ontologia, a qual foi definida através da ferramenta Protége e modelada através da linguagem OWL-DL (Aurélio et al., 2013). 1.2 Sensoriamento O módulo de sensoriamento da arquitetura AgroMobile é formado por uma rede de sensores específicos, destinados às suas funções que são manipuladas através de um algoritmo de gerenciamento. Estes sensores enviam as leituras para os coletores (softwares que filtram as informações dos sensores) que por sua vez se comunicam como os servidores (MORGENSTERN et al., 2013). Estes sensores são interligados por uma Rede de Sensores Sem Fio (RSSF), a qual consegue fazer o compartilhamento de dados de cada nó e com que cada sensor se comunique com o agregador de dados (coletor) enviando suas informações. Os sensores utilizados neste projeto são acoplados sob a plataforma Arduino juntamente com diversos itens essenciais para seu funcionamento. Dentre estes sensores existem o sensor de PH do solo, o sensor de umidade e temperatura modelo DHT11, sensor de umidade modelo BSoil-01, módulo de GPS, placa de fotovoltaica e o módulo transmissor e receptor de rádio frequência. A Figura 1 apresenta o diagrama de um nó da rede de sensores e o protótipo de um nó da RSSF. 16 Figura 1 - A) Diagrama de um nó de rede de sensores; B) Protótipo do nó da RSSF. A) B) Fonte: MORGENSTERN et al. (2013). Os sensores numerados apresentados no diagrama de um nó de rede de sensores, na Figura 2: parte A, possuem as seguintes funções: 1. Sensor de PH do Solo: faz a coleta de dados referente ao PH do solo; 2. Sensor de Umidade e Temperatura (DHT11): faz e medição da temperatura, sendo que possui uma versão interna ao solo e outra externa; 3. GPS: responsável pelo mapeamento e localização; 4. Sensor modelo BSoil-01: informa a quantidade de umidade do solo ao seu redor; 5. Placa de Alimentação Solar: responsável por captar radiações solares e convertê-las em energia para recarregar as baterias; 6. Módulo Transmissor e Receptor de Rádio Frequência: fazem a comunicação entre os nós em uma determinada frequência a qual deve ser diferenciada para o envio e recebimento. A integração com o restante da arquitetura fica de responsabilidade do coletor de dados o qual foi desenvolvido em Java e sua função é o recebimento dos dados, envio de confirmação de recebimento dos mesmos, filtragem das informações coletadas pelos sensores, fragmentação da mensagem, armazenando 17 em um banco de dados local para que o servidor os acesse quando necessitar. A Figura 2 apresenta o fluxograma do agregador de dados. Figura 2 - Diagrama de Sequência do Coletor Definido Fonte: MORGENSTERN et al. (2013) 1.3 Representação do Conhecimento O domínio de estudo deve ser representado de forma a auxiliar na compreensão de cada aspecto do mesmo. Assim, as ontologias se aplicam de forma a organizar as informações dos mais diferentes domínios, trazendo uma série de vantagens no uso da representação do conhecimento (AURÉLIO et al., 2013). Uma melhor definição de ontologia é dada por Gruber (1995), o qual afirma que uma ontologia é uma especificação de uma conceituação, ou seja, uma descrição de conceitos e relações que existem em um domínio de interesse. Segundo Duarte et al. (2000), ontologias são úteis para apoiar a especificação e implementação de qualquer sistema de computação complexo. Dentre os propósitos para a construção de uma ontologia é possível destacar o auxílio na compreensão de certa área de conhecimento e o auxílio na obtenção de um consenso sobre determinado assunto. Dentro do projeto AgroMobile está sendo desenvolvida uma ontologia utilizando a ferramenta Protégé para fazer a modelagem semântica de informações compreendidas no domínio da Agricultura de Precisão, através da linguagem OWL-DL (Aurélio et al., 2013). A ontologia se encontra atualmente em fase de 18 especificação e aquisição de conhecimento. A sua modelagem está sendo realizada seguindo a metodologia Methontology, a qual é considerada a mais popular para o desenvolvimento de ontologias, o que torna o processo mais fácil e cria certo padrão. A especificação da ontologia servirá como base para todo o resto da modelagem, pois através da documentação utilizando de linguagem natural, é possível captar o objetivo da ontologia e seus demais propósitos. Já o processo de aquisição de conhecimento é marcado pela pesquisa às possíveis fontes disponíveis, tais como entrevistas com especialistas no domínio, consulta a livros, além de ontologias já existentes, entre outros. Esta ontologia será utilizada como base para as etapas posteriores à modelagem conceitual proposta, pois através dela serão modelados os serviços e demais componentes do sistema de apoio à decisão. Como cita o artigo de Aurélio et al. (2013), a metodologia utilizada para iniciar o desenvolvimento da ontologia é baseada em conhecimentos adquiridos através de estudos a outras ontologias já propostas na área de Agricultura de Precisão. Para modelar o ambiente rural, foram extraídos dados do Manual de Adubação e de Calagem para os estados do Rio Grande do Sul e Santa Catarina (2004), além de informações sobre eventos, principalmente climáticos, que podem interferir diretamente no domínio de agricultura de precisão. A cultura inicialmente utilizada para a criação da ontologia é a soja, sendo que a definição pode ser aplicada também em outras ontologias, para outras culturas. Foram definidas algumas superclasses, as quais desencadeiam uma vasta lista de subclasses que se relacionam ao representar os elementos do contexto, os quais podem influenciar no projeto AgroMobile. Os principais elementos do contexto são os seguintes: Áreas e Glebas (Area, Gleba): englobam as informações geográficas da agricultura de precisão, através de conceitos como coordenadas e referências geográficas. Clima (Weather): descreve possíveis eventos climáticos que podem atuar sobre o ambiente na qual a arquitetura AgroMobile atua; Safra, Planejamento, Produtor e Técnicos (Harvest, Planning, Producer, Technician): classes responsáveis pela organização 19 durante o ciclo da safra, desde o princípio até o final, com o auxílio de técnicos e o envolvimento dos produtores; Grãos (Grain): definição da cultura a ser utilizada no plantio; Solo (Soil): composto por vários fatores determinantes, como nutrientes, PH, entre outros que são indispensáveis durante as análises para determinados fins; Critérios de Recomendações de Calagem e Adubagem (Criteria of Recommendation of Liming and Composting): são geradas recomendações para realização de determinados serviços, conforme os critérios a serem analisados, de acordo com o que está acontecendo ou aconteceu no ambiente; Serviço (Service): considerada uma das classes mais importantes pela sua utilização, é nela que estão contidos os serviços a serem realizados no domínio de Agricultura de Precisão através da arquitetura AgroMobile. As classes citadas contém atributos específicos e individuais que podem armazenar tanto objetos concretos quanto abstratos, mas são os relacionamentos que fazem a ligação entre as classes e dão clareza para identificar um ambiente real. Através das regras de inferência que serão definidas na ontologia, será possível propor serviços específicos da agricultura de precisão para determinados relacionamentos criados. 20 2 WEBSERVICES Nos últimos anos a tecnologia WebServices vem despertando a atenção de analistas e arquitetos de programação, pois modifica o modo de como os sistemas são desenvolvidos, prometendo excelentes ganhos como produtividade, portabilidade e independência. Tendo como finalidade principal prover serviços, uma empresa pode automatizar diversas áreas com serviços web, sem a necessidade de uma pessoa física para intermediar a negociação. Podemos citar como exemplo uma empresa na qual o seu cliente já tem em mãos os dados principais para fazer um pedido de compras, como preço, descrição, código, entre outros. O mesmo pode acessar um serviço web disponibilizado pela empresa e diretamente fazer seu pedido sem que haja esta intermediação. Com este intuito foi criado os WebServices, para construção de aplicações automatizadas que nada mais são do que serviços disponibilizados na internet. Porém, vale lembrar que a criação de interfaces gráficas para usuários não faz parte deste conceito de WebServices, ficando a cargo de outro setor da programação. Esta arquitetura pode ser definida como uma arquitetura de software que relaciona os componentes de um sistema em um ambiente distribuído onde são disponibilizados serviços que podem ser acessados dinamicamente através de uma rede (AMORIM, 2004 apud SILVA, 2004). A tecnologia WebServices propõe a exposição das transações e das regras de negócios por meio de protocolos que podem ser acessados e entendidos por qualquer linguagem de programação, em qualquer sistema operacional, rodando em qualquer dispositivo (COSTA, 2002 apud SILVA, 2004). Para Zavalik (2004) o objetivo dos WebServices é obter interoperabilidade entre aplicações através do uso de padrões Web. A utilização de WebService é uma das maneiras mais comuns de integrar aplicações diferentes, possuindo diferentes tipos de arquiteturas para esta finalidade podemos destacar o Simple Object Access Protocol (SOAP) e o Representational State Transfer (REST) sendo este mais simples comparado com o anterior. O SOAP (2003) é um protocolo que se destina à troca de informações estruturadas em um ambiente distribuído e descentralizado. Definido no W3C é 21 baseado em eXtensible Markup Language (XML) e contém alguns elementos, tais como: Envelope: Identifica o documento XML como uma mensagem SOAP e é responsável por definir o conteúdo da mensagem; Header (opcional): Contém os dados do cabeçalho; Body: Contém as informações de chamada e de resposta ao servidor; Fault: Contém as informações dos erros ocorridos no envio da mensagem. Esse elemento só aparece nas mensagens de resposta do servidor. Na Figura 3, podemos ver a representação gráfica deste protocolo, mostrando a troca de mensagens entre o cliente (Client Wrapper) e o servidor (Server Wrapper) que disponibilizam a transparência para as aplicações e seguindo o protocolo SOAP sobre Hypertext Transfer Protocol (HTTP) só trafega XML. Figura 3 - Invocação Arquitetura WebServices Fonte: SUMRA (2003) Já o termo REST (Representacional State Transfer), originou-se da dissertação de doutorado de Roy Fielding, publicada em 2000. Segundo Fielding (apud OLIVEIRA, 2009), REST é “um conjunto de princípios arquiteturais que quando aplicadas como um todo enfatiza a escalabilidade da interação entre componentes para reduzir a latência de interação, garantir segurança e encapsular sistemas legados”. Fielding classifica com os seguintes princípios seu termo REST: 22 Cliente / Servidor; Apoiar sistemas de cache; Sistemas em camadas (suportar escalabilidade); Estado nulo (cada requisição de um cliente ao servidor deve conter todas as informações necessárias para entender a requisição); Stateless (comunicação sem controle de estado); Sistema uniforme utilizando 4 métodos padronizados: o GET – operação de leitura; o PUT – relacionada e inserção ou alteração; o POST – cria um objeto no servidor; o DELETE – operação de remoção; Conforme Tilkov (apud OLIVEIRA, 2009), o REST é “um conjunto de princípios que definem como os padrões Web, como o HTTP e URIs devem ser utilizados”. Tilkov conclui dizendo que “a principal promessa do REST é que se você aderir aos princípios durante o projeto de sua aplicação, você irá acabar com um sistema que explora a arquitetura Web em seu benefício”. Neste modelo de arquitetura o que mais importa são as URLs do sistema e os resources. Um recurso (resources) ou uma entidade é um objeto contendo informações que será representada por meio de um XML ou JSON. Geralmente a URL para acessar este recurso será a mesma, o que muda é o método HTTP (GET, PUT, POST DELETE) o qual vai definir o resultado da requisição. Para utilizar qualquer um dos padrões citados acima é necessário conhecer as linguagens de marcação XML e JSON, pois o padrão de SOAP utiliza-se de text/XML e a arquitetura REST de text/JSON. A XML (eXtensible Markup Language) é uma linguagem de marcação para propósitos especiais, usada para descrever e organizar dados para aplicações. Diferentemente da Linguagem de Marcação de Hipertexto (HTML), suas etiquetas não são pré-definidas. O desenvolvedor poderá criar suas próprias etiquetas (BRAY, et al., 2008), capaz de descrever diversos tipos de dados, podendo ser utilizada para formatação de textos, armazenamento em banco de dados, armazenamento de propriedades de áudio e vídeo, imagens vetoriais, entre outros. Como a XML segue um método hierárquico de formatação, ou seja, possui tags-pai, tags-filho e assim por diante, está bem consolidada nas diversas 23 tecnologias que temos hoje as quais já diferenciam o que são tags do que é conteúdo propriamente dito. O cabeçalho e a tag-root é o conteúdo mínimo para ser considerado um arquivo XML. O cabeçalho é onde se encontra a versão (Version) a qual implica no modo de leitura dos interpretadores e juntamente temos o tipo de padrão de caracteres utilizados em seu conteúdo (Encoding), sendo que o UTF-8 é o padrão popular internacional e o ISO-8859-1 é o padrão nacional. A tag-root consiste em uma tag que engloba todas as outras tags do arquivo e tem a função de especificar onde é o começo e o fim deste XML. Na Figura 4, podemos ver um exemplo de arquivo no formato XML, onde “<população>” é a tag-root, aberta no inicio do arquivo e fechada no final com “</população>” englobando todas as demais tags dentro dela. Figura 4 - Exemplo de Arquivo XML Fonte: Própria (2014) Já a Notação de Objetos JavaScript (JSON) conforme Crockford (2006), é um formato para representação textual de dados, em objetos. Suas principais características vantajosas são os fatos de ser leve e simplificada. Baseada em JavaScript, consegue descrever diferentes tipos de dados como por exemplo objetos e arrays. Por consumir menos banda e ser mais intuitiva que XML torna-se ideal para transferência de dados, sendo comum sua utilização em projetos de WebServices baseados em RESTful. Neste formato, diferentemente de XML o qual se trabalha com tags, usamos uma coleção de pares constituídos por um nome e um valor respectivamente, ou 24 uma lista ordenada de valores (array), tornando assim este formato mais simples para ler e escrever e muito mais ágil na transferência de dados. Na Figura 5, temos um exemplo de arquivo no formato JSON, o qual possui uma lista de dados chamado “MinhaLista” e dentro dela temos os dados de “nome” e “fone”, que por sua vez são os objetos desta lista. Figura 5 - Exemplo de arquivo JSON Fonte: Própria (2014) 25 3 DISTRIBUIÇÃO DE SERVIÇOS DA ARQUITETURA AGROMOBILE UTILIZANDO WEBSERVICES Neste capitulo será apresentada a arquitetura AgroMobile, bem como o objetivo principal deste trabalho que é o desenvolvimento de WebService para interligação da mesma exemplificando o código-fonte do software. Também é apresentado um protótipo do projeto para comprovar o pleno funcionamento na utilização do WebService. 3.1 Informações do Projeto AgroMobile com WebServices O projeto AgroMobile, a partir de estudos relacionados nas áreas de Computação Móvel, Ubíqua e Aplicada na Agricultura de Precisão, tem como objetivo o desenvolvimento de uma arquitetura de software, e com essas ferramentas auxiliar engenheiros agrônomos e técnicos agrícolas na tomada de decisões mais precisas para se ter um bom gerenciamento dos negócios, evitando desperdícios de insumos e consequentemente minimizando o impacto ambiental. Como parte desta arquitetura, este trabalho tem como principal objetivo criar interfaces na forma de WebServices a fim de interligar os módulos da arquitetura AgroMobile, visando prover serviços para que se possam gravar, excluir, alterar e consultar as informações entre eles. Estas interfaces baseiam-se na estrutura dos dados utilizados na arquitetura do banco de dados. Para isto, a modelagem das informações no diagrama lógico das tabelas do banco de dados (Figura 6) utilizado pelo sistema é fundamental para que se tenha o sincronismo com os WebServices. O banco de dados relacional utilizado pela Arquitetura AgroMobile foi o Postgres com a extensão PostGIS da qual dá suporte a dados geo-referênciados e é de distribuição livre. 26 Figura 6 - Diagrama Lógico da Modelagem da Informação Fonte: Própria (2014) A arquitetura de software representada na Figura 7 resume o AgroMobile. Nele contamos com uma rede de sensores distribuídos em nós que farão as coletas dos dados na lavoura transmitindo-os ao coletor de dados, que por sua vez faz a filtragem das informações e envia ao seu WebService para a persistência destes dados no banco. As ontologias são a base de conhecimento modelada, elas fazem o raciocínio dos dados obtidos dos sensores e dos informados pelos dispositivos (App/Web). Possui duas formas de utilização do sistema, sendo uma baseada em um aplicativo desenvolvido para Android e a outra forma via Web HTTP, onde ambas terão sincronismo com os dados através dos WebServices. Figura 7 - Arquitetura de software Fonte: Própria (2014) 27 3.2 Desenvolvimento dos WebServices O desenvolvimento dos WebServices destina-se a interligação entre os módulos da arquitetura, fazendo o gerenciamento do fluxo das informações, garantindo o pleno funcionamento do AgroMobile. O padrão REST, se baseia em métodos padrões da HTTP Web como GET, PUT, POST e DELETE e tem como foco principal explorar estes métodos com seus chamados recursos, que nada mais são que os endereços das URLs a serem utilizados. Para o desenvolvimento do WebService é necessário utilização de algumas tecnologias, onde para mapeamento das tabelas do banco de dados foi utilizado o framework Hibernate. Ele oferece todas as ferramentas para o serviço web estar em plena comunicação com a base de dados (BAUER; KING, 2005). Também foi utilizada a API Jersey que é open source e mantida pela Oracle e que possui as especificações da Interface de Programação de Aplicativos (API) JAX-RS das quais se baseiam em anotações. Estas anotações são feitas nas classes do projeto, como por exemplo: @Path, @Get, @Put, @Post, @Delete, @Produces, @Consumes, @PathParam entre outras, que servem para simplificar a necessidade extra de configurações. Na Tabela 1, veremos a utilidade das principais anotações do nosso projeto. Tabela 1 - Anotações e sua Funcionalidade ANOTAÇÃO @GET @PUT @POST @DELETE @PATH @PRODUCES @CONSUMES @STATELESS @PERSISTENCECONTEXT @OVERRIDE @ENTITY @TABLE @XMLROOTELEMENT FUNÇÃO HTTP GET lista os recursos HTTP PUT atualiza um recurso HTTP POST adiciona um recurso HTTP DELETE remove um recurso Configura o caminho do recurso Indica qual o tipo de conteúdo será produzido pelo método ao devolver a requisição Indica qual o tipo de arquivo que espera receber para trata-lo Reconhece cada requisição como uma requisição nova Local de armazenamento dos objetos (entidades) que estão sendo manipuladas pelo EntityManager (responsável pelo sincronismo com o banco de dados, gerenciando o ciclo de vida da entidade) Anotação de que o método é uma reescrita Informa que a classe é uma tabela do banco de dados Indica o nome da tabela do banco em questão Mapeamento da classe para um elemento XML 28 @NAMEDQUERIES @COLUMN @NOTNULL @SIZE Especificação de uma consulta estática no banco de dados Indica o nome da coluna da tabela em questão Indica que o valor do objeto não pode ser nulo Indica os limites de tamanho do elemento especificado Fonte: Própria (2014) Para rodar o WebService RESTful, necessita-se de um Web Container, do qual utilizaremos o servidor de aplicação Java EE com o Glassfish, que por sua vez já possui tal implementação. Visando uma melhor organização, o desenvolvimento dos WebServices REST em Java foram divididos em três pacotes conforme suas funções. Abaixo, a Figura 8 ilustra o diagrama de pacotes do desenvolvimento. Figura 8 - Diagrama de Pacotes dos WebServices. Fonte: Própria (2014) O WebService é composto pelo pacote config, entidades e recursos os quais serão explanados nas próximas seções. 3.2.1 Pacote Config As classes do pacote config são as classes padrões utilizadas por todos os recursos do projeto. Neste pacote temos a classe ApplicationConfig que tem a função de adicionar todos os recursos que possuímos e também definir parte da URL com o ApplicationPath, que será utilizada para chamar os recursos. Esta classe é ilustrada abaixo na Figura 9. 29 Figura 9 - Classe ApplicationConfig Fonte: Própria (2014) Neste mesmo pacote config também temos a classe AbstractFacade, ou Fachada Abstrata, nela contém métodos genéricos do projeto como salvar, editar, excluir e encontrar (Figura 10), os quais são relacionados a persistência dos dados. Esta classe serve como modelo para as subclasses e não permite instanciá-la. Figura 10 - Métodos genéricos da classe AbstractFacade Fonte: Própria (2014) 30 3.2.2 Pacote entidades No pacote entidades, estão às classes POJO (Plain Old Java Objects) as quais possuem os getters, setters, anotações das características relacionadas às tabelas do banco de dados (mapeamento) e métodos utilizados pelo Hibernate para persistência. No diagrama de classes apresentado na Figura 11 são ilustradas as classes que compõe este pacote. Figura 11 - Diagrama de Classes do Pacote Entidades Fonte: Própria (2014) Estas classes, como mencionado anteriormente, possuem características semelhantes, alterando de uma para outra apenas os nomes dos campos e os tipos dos objetos conforme foram criadas as tabelas no banco de dados. Todas estas classes iniciam com as anotações @Entity que as referenciam como uma entidade, @Table que indica referente à qual tabela do banco de dados é a referida classe e @XmlRootElement que indica que o mapeamento da classe ocorrerá em um elemento XML. As anotações @NamedQueries são as possíveis consultas que poderão ser realizadas para aquela entidade. Na sequência vem à classe principal serializada com os atributos definidos e suas características, vindo a formar o espelho da tabela do banco de dados e que será utilizada pelo framework Hibernate em suas persistências. Na sequência, possuímos os getters e setters dos atributos da classe para as manipulações dos referidos dados. Como exemplo na Figura 12, temos o início da classe Tecnico do pacote entidades que demonstra estas questões. 31 Figura 12 - Classe Técnico do Pacote Entidades. Fonte: Própria (2014) 3.2.3 Pacote Recursos Por fim o pacote recursos, hospedeiro das classes fachadas especificas de cada recurso. Estas classes estendem a classe AbstractFacade que possuem os métodos genéricos, e juntamente no parâmetro recebem a lista da classe entidade (POJO) do recurso em questão. São nelas que possuímos o final do endereço da URL que vimos na classe ApplicationConfig, o qual vamos utilizar o WebService e destinar os dados a determinada entidade. É aqui que possuímos os métodos padrões HTTP dos quais o REST faz uso, sendo que estes são desenvolvidos igualmente para todas as classes contidas neste pacote, alterando apenas as entidades a serem trabalhadas pela classe. No diagrama de classes apresentado na Figura 13 são ilustradas as classes que compõe o pacote recursos. 32 Figura 13 - Diagrama de Classes Pacote Recursos Fonte: Própria (2014) Nestas classes contamos com alguns recursos específicos do tipo anotações que serão abordados a seguir. Ao iniciarmos a classe fachada de um recurso, a anotação @Stateless tem a função de reconhecer a cada requisição como uma requisição nova, isto é uma característica do padrão REST, em seguida, a anotação @Path é onde configura o caminho do recurso, no exemplo abaixo (Figura 14) o caminho deste recurso ficaria “http://.../webresources/tecnico” sendo que o “webresource” vem da classe ApplicationConfig que vimos anteriormente, completando a URL com o “tecnico” do Path da classe TecnicoFacadeREST. Figura 14 - Exemplo do Inicio da Classe Fachada. Fonte: Própria (2014) Em seguida, contamos com o método local create exemplificado abaixo na Figura 15, que por ter a anotação @POST terá a função de incluir dados no banco. Para isto, é preciso ter a anotação @Consumes especificando qual o tipo de formatação de dados se espera receber, neste caso estamos trabalhando com informações no formato JSON. Ao receber estes dados é povoada a entidade da qual foi feita a requisição do recurso e por fim o método create da classe AbstractFacade que foi estendida é invocado passando a entidade para persistência destes dados no banco. 33 Figura 15 - Exemplo Método Create (POST) Fonte: Própria (2014) Já o outro método local chamado edit conforme abaixo exemplificado na Figura 16, possui a anotação @PUT que tem como função a alteração de dados já gravados no banco. Para isto é preciso da anotação no método @Path recebendo o identificador do registro na tabela a ser alterada, juntamente com os dados alterados no formato JSON através da anotação @Consumes. Igualmente no método anterior, ao receber estas informações será povoada a entidade e invocado o método edit da classe AbstractFacade para a persistência no banco. Figura 16 - Exemplo Método Edit (PUT) Fonte: Própria (2014) Para fazer a exclusão de um registro do banco de dados é utilizado o método local remove com a anotação @DELETE, que também recebe através do @Path no método, o identificador do registro a ser eliminado na tabela do banco de dados. Para tal execução, é invocado o método padrão remove da classe AbstractFacade concatenado ao método find desta mesma classe que tem como função encontrar na tabela especifica o identificador passado no parâmetro para finalmente excluí-lo. Abaixo na Figura 17 tem-se o exemplo deste método de remoção. 34 Figura 17 - Exemplo Método Remove (DELETE) Fonte: Própria (2014) Finalizando as classes do pacote recursos, contamos com o método local find que atrelado à anotação @GET tem a função de retornar uma pesquisa feita através do identificador do registro. Para isto, é necessária a anotação no método @Path indicando que deverá receber o “id” a ser encontrado na tabela, e, diferentemente dos demais métodos ao invés de consumir dados, este irá produzir dados para o retorno da informação a quem a solicitou utilizando a anotação @Produces indicando o formato do retorno, que neste caso também é JSON. Após receber este identificador é invocado o método find da classe AbstractFacade que fará a pesquisa e retornará os dados solicitados. O exemplo do método de pesquisa consta na Figura 18. Figura 18 - Exemplo Método Find (GET) Fonte: Própria (2014) 3.3 Protótipo para AgroMobile Nesta seção, é apresentado um protótipo desenvolvido em Java baseado em RESTful com padrão de troca de dados JSON, utilizando banco de dados Postgresql. O caso em questão corresponde ao envio de dados a partir de um módulo Arduíno para o WebService, simulando dados coletados dos sensores e gravando estes no banco de dados para que posteriormente sejam feitas possíveis consultas ou alertas a serem enviados ao agricultor. 35 Devido ao foco do trabalho não ser a parte do banco de dados e nem do cliente que irá consumir o WebService, será abordado somente as partes básicas destes dois elementos para que se possa entender e provar o pleno funcionamento do WebService. Abaixo na Figura 19, o esquema do protótipo em questão. Figura 19 - Esquema do Protótipo Fonte: Própria (2014) A tabela do banco de dados para gerar este modelo chama-se “leituras”, aonde serão armazenados dados dos sensores que serão enviados ao coletor que posteriormente enviará as mesmas para o WebService, que fará a persistência dos dados nesta tabela. Sua estrutura é mostrada na Figura 20. Figura 20 - Estrutura lógica da tabela leituras. Fonte: Própria (2014) 36 Em relação ao Cliente que consumirá o WebService, precisamos de uma classe POJO com os atributos da tabela “leituras” para que possam ser criados os objetos para enviar ao recurso desejado do WebService. Para o envio destes dados é necessário uma classe aonde seja criado um Cliente, um recurso (caminho para aonde enviar os dados), um método (create) para o qual se deseja enviar a solicitação ao WebService (neste caso é um POST) e um método (close) que fecha o Cliente após o envio dos dados. Na Figura 21, pode-se ver como ficou a classe NewJerseyClient que executa estes procedimentos. Figura 21 - Classe NewJerseyClient no Cliente. Fonte: Própria (2014) Estas duas classes descritas acima são chamadas pelo método mount também no Cliente conforme ilustra na Figura 22, que tem a função de povoar a classe POJO e chamar o método create da classe NewJerseyClient, afim de enviar o arquivo no formato JSON ao WebService, e ao final fechar esta conexão do Cliente. Figura 22 - Método Mount no Cliente. Fonte: Própria (2014) 37 Como podemos obsevar na Figura 23, os dados enviados pelo Cliente através do Arduíno estão sendo gravados com sucesso no banco de dados ao passarem pelo recurso do WebService. Neste caso, está sendo feito um POST no recurso Leituras que foi definido no Path do WebService. Figura 23 - Retorno do Cliente ao Fazer POST no Recurso Leituras Fonte: Própria (2014) Constatou-se ainda, que ao fazer uma requisição via HTTP pelo browser no recurso criado (Figura 24), retorna a lista em formato JSON dos dados inseridos na tabela Leituras do banco de dados. Esta solicitação caracteriza uma consulta na requisição GET. Figura 24 - Consulta via HTTP GET no Recurso Leituras Fonte: Própria (2014) Com os códigos e os resultados apresentados acima, demonstra-se o pleno funcionamento no WebService Leituras, o qual tem a finalidade de receber os dados enviados pelos sensores ao coletor e este encaminhar ao WebService que designará ao método create para fazer a inserção destas informações na tabela Leituras do banco de dados. 38 CONCLUSÃO Uma das atividades mais importantes na agricultura de precisão é o acompanhamento do desenvolvimento da cultura em tempo real e a correção dos fatores deficientes no instante em que é diagnosticado. A tecnologia possui técnicas que podem auxiliar na identificação dos fatores que afetam a variação da produtividade em áreas distintas da lavoura. Estes fatores podem ser a infestação de pragas que atacam a plantação, de ervas daninhas que concorrem com a planta, entre outros. A agricultura de precisão é a nova tendência do mercado agrícola. As vantagens que podem obter com ela são inúmeras, colheitas mais produtivas, uma menor poluição devido ao uso reduzido de insumos e consequentemente uma grande economia. Ela tende a se tornar cada vez mais comum nas propriedades rurais. As tecnologias hoje existentes já permitem que se tenha um grande conhecimento das variabilidades encontradas entre as diferentes áreas da propriedade, o que já proporciona a tomada de decisões com base em dados mais precisos. Este trabalho demonstrou o desenvolvimento de uma aplicação na linguagem de programação Java, baseada em WebServices aonde segue-se padrões pré-definidos do RESTful juntamente com algumas tecnologias embutidas como o framework Hibernate, a API Jersey com anotações do JAX-RS, dos quais pode-se tirar o máximo de proveito no desenvolvimento, segurança e rapidez da informação a fim de gerenciar o tráfego dos dados e fazer a sincronização entre os módulos da arquitetura AgroMobile. O padrão RESTful vem confirmar seu ótimo funcionamento em WebServices, tornando sua utilização ideal em projetos que necessitam de agilidade e eficiência na interoperabilidade entre as partes. Por utilizar métodos padrões HTTP, torna-se amplamente acoplada a qualquer tipo de desenvolvimento em diferentes linguagens de programação explorando toda arquitetura Web em seu benefício. Diante disto, com os recursos de WebServices desenvolvidos neste trabalho a Arquitetura AgroMobile torna-se totalmente interligada entre seus diversos módulos, proporcionando a interoperabilidade entre eles. 39 REFERÊNCIAS ASSAD, Maria Leonor Lopes; ALMEIDA, Jalcione. Agricultura e sustentabilidade. Contexto, Desafios e Cenários. Artigo publicado Ciência & Ambiente, 2004. AURÉLIO, Rafael; MORGENSTERN, Marcos; MARAN, Vinicius. UMA DEFINIÇÃO ONTOLÓGICA DO DOMÍNIO DE AGRICULTURA DE PRECISÃO PARA A ARQUITETURA AGROMOBILE. Salão do Conhecimento, 2013. BAUER, Cristian; KING, Gavin. Java Persistence com Hibernate. Editora Ciência Moderna, 2005. BOEMO, Daniel, Desenvolvimento de Sistemas de Geoprocessamento e tecnologia móvel aplicados à agricultura de precisão. Santa Maria-RS, Abril 2011. Disponível em: <http://cascavel.cpd.ufsm.br/tede/tde_busca/arquivo.php?codArquivo=3905> Acessado em 09/10/2013. BRAY, Tim. et al. E.Extensible MarkupLanguage (XML) 1.0 (Fifth Edition), 2008. Disponível em: <http://www.w3.org/TR/REC-xml>, Acessado em 02/11/2013. CAMPANHOLA, C. Novos significados e desafios. Brasília, DF: Embrapa Informação Tecnológica, 2004. COMISSÃO DE QUÍMICA E FERTILIDADE DO SOLO. Manual de adubação e de calagem para os estados do Rio Grande do Sul e Santa Catarina. SBCS/NRS. Porto Alegre, 2004. CROCKFORD, Douglas. JavaScript Object Notation (JSON), Julho 2006. Diponível em <http://www.ietf.org/rfc/rfc4627.txt?number=4627>, Acessado em 02/11/2013. DUARTE, Katia C.; FALBO, Ricardo A. Uma ontologia de qualidade de software. In: Workshop de Qualidade de Software, João Pessoa. 2000. EMBRAPA. Rede Agricultura de Precisão (AP 2). O que é Agricultura de Precisão?. Disponível em: <http://www.macroprograma1.cnptia.embrapa.br/redeap2/o-que-e-agricultura-de-precisao> Acessado em 20/11/2013. GRUBER, Thomas R. Toward principles for the design of ontologies used for knowledge sharing?. International journal of human-computer studies,1995. KIRSCHNER, S. F. ; MARAN, V. . Um Sistema de Auxílio à Coleta de Dados na Área de Agricultura de Precisão Baseada em Aplicações Móveis. In: XX Seminário de Iniciação Científica - Salão do Conhecimento 2012 - Unijuí, 2012, Ijuí. MORGENSTERN, M. S. ; AURELIO, R. ; ALVES, R. ; MARAN, V. . Definição de uma Rede de Sensores para a Arquitetura AgroMobile. In: XII Simpósio de Informática da UNIFRA (SIRC), 2013, Santa Maria - RS. Anais do XII Simpósio de Informática da UNIFRA (SIRC), 2013. OLIVEIRA, Leonardo Eloy. Estado da arte de banco de dados orientados a documento, 2009. Monografia (Conclusão do Curso de Graduação em Ciências Tecnológicas)–Universidade de Fortaleza –UNIFOR, Ceára, 2009. SILVA, Grace Kelly de Castro; PEREIRA, Patrícia Maria; MAGALHÃES, Geovane. Disponibilização de Serviços Baseados em Localização via Web Services. In: Simpósio Brasileiro de GeoInformática, GeoInfo. 2004. SOAP, 2003, “Simple Object Access Protocol” (27 de abril, 2007); Disponível em <http://www.w3.org/TR/soap12 >. Acessado em 02/11/2013. 40 SUMRA, Rajesh. “Developing JAX-RPC-Based Web Services Using Axis and SOAP”, 2003. Disponível em: <http://www.developer.com/open/article.php/2237251/Developing-JAXRPCndashBased-Web-Services-Using-Axis-and-SOAP.htm>, Acessado em 01/11/2013. ZAVALIK, Claudimir. Integração de sistemas de informação através de web services. 2004. Dissertação de Mestrado (Programa de Pós Graduação em Computação)–Universidade Federal do Rio Grande do Sul. Porto Alegre, 2004. 41 APÊNDICE A – Classes do Pacote Config Classe AbstractFacade.java package config; import java.util.List; import javax.persistence.EntityManager; public abstract class AbstractFacade<T> { private Class<T> entityClass; public AbstractFacade(Class<T> entityClass) { this.entityClass = entityClass; } protected abstract EntityManager getEntityManager(); public void create(T entity) { getEntityManager().persist(entity); } public void edit(T entity) { getEntityManager().merge(entity); } public void remove(T entity) { getEntityManager().remove(getEntityManager().merge(entity)); } public T find(Object id) { return getEntityManager().find(entityClass, id); } public List<T> findAll() { javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); return getEntityManager().createQuery(cq).getResultList(); } public List<T> findRange(int[] range) { javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); 42 javax.persistence.Query q = getEntityManager().createQuery(cq); q.setMaxResults(range[1] - range[0] + 1); q.setFirstResult(range[0]); return q.getResultList(); } public int count() { javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); javax.persistence.criteria.Root<T> rt = cq.from(entityClass); cq.select(getEntityManager().getCriteriaBuilder().count(rt)); javax.persistence.Query q = getEntityManager().createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } } 43 Classe ApplicationConfig.java package config; import java.util.Set; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("webresources") public class ApplicationConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new java.util.HashSet<>(); addRestResourceClasses(resources); return resources; } private void addRestResourceClasses(Set<Class<?>> resources) { resources.add(recursos.AnoagricolaFacadeREST.class); resources.add(recursos.CidadeFacadeREST.class); resources.add(recursos.CultivaresFacadeREST.class); resources.add(recursos.CulturaFacadeREST.class); resources.add(recursos.EspeciemFacadeREST.class); resources.add(recursos.EstadioFacadeREST.class); resources.add(recursos.EventoscFacadeREST.class); resources.add(recursos.GlebaFacadeREST.class); resources.add(recursos.GlebasvinculadasFacadeREST.class); resources.add(recursos.ItemplanjFacadeREST.class); resources.add(recursos.LeiturasFacadeREST.class); resources.add(recursos.MonitoramentoFacadeREST.class); resources.add(recursos.PlanejamentoFacadeREST.class); resources.add(recursos.PontoamostraFacadeREST.class); resources.add(recursos.ProdutoFacadeREST.class); resources.add(recursos.ProdutorFacadeREST.class); resources.add(recursos.PropriedadeFacadeREST.class); resources.add(recursos.SafraFacadeREST.class); resources.add(recursos.TecnicoFacadeREST.class); resources.add(recursos.VariedadesFacadeREST.class); resources.add(recursos.VariedadesglebaFacadeREST.class); } } 44 APÊNDICE B – Classes do Pacote Entidades Classe Anoagriola.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "anoagricola") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Anoagricola.findAll", query = "SELECT a FROM Anoagricola a"), @NamedQuery(name = "Anoagricola.findByIdAnoagricola", query = "SELECT a FROM Anoagricola a WHERE a.idAnoagricola = :idAnoagricola"), @NamedQuery(name = "Anoagricola.findByDescricao", query = "SELECT a FROM Anoagricola a WHERE a.descricao = :descricao"), @NamedQuery(name = "Anoagricola.findByAnoinicial", query = "SELECT a FROM Anoagricola a WHERE a.anoinicial = :anoinicial"), @NamedQuery(name = "Anoagricola.findByCondicao", query = "SELECT a FROM Anoagricola a WHERE a.condicao = :condicao"), @NamedQuery(name = "Anoagricola.findByFlagSincronizacao", query = "SELECT a FROM Anoagricola a WHERE a.flagSincronizacao = :flagSincronizacao")}) public class Anoagricola implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_anoagricola") private Integer idAnoagricola; 45 @Size(max = 25) @Column(name = "descricao") private String descricao; @Size(max = 4) @Column(name = "anoinicial") private String anoinicial; @Size(max = 1) @Column(name = "condicao") private String condicao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idAnoagricola") private Collection<Safra> safraCollection; public Anoagricola() { } public Anoagricola(Integer idAnoagricola) { this.idAnoagricola = idAnoagricola; } public Integer getIdAnoagricola() { return idAnoagricola; } public void setIdAnoagricola(Integer idAnoagricola) { this.idAnoagricola = idAnoagricola; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getAnoinicial() { return anoinicial; 46 } public void setAnoinicial(String anoinicial) { this.anoinicial = anoinicial; } public String getCondicao() { return condicao; } public void setCondicao(String condicao) { this.condicao = condicao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Safra> getSafraCollection() { return safraCollection; } public void setSafraCollection(Collection<Safra> safraCollection) { this.safraCollection = safraCollection; } @Override public int hashCode() { int hash = 0; hash += (idAnoagricola != null ? idAnoagricola.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { 47 if (!(object instanceof Anoagricola)) { return false; } Anoagricola other = (Anoagricola) object; if ((this.idAnoagricola == null && other.idAnoagricola != null) || (this.idAnoagricola != null && !this.idAnoagricola.equals(other.idAnoagricola))) { return false; } return true; } @Override public String toString() { return "entidades.Anoagricola[ idAnoagricola=" + idAnoagricola + " ]"; } } Classe Cidade.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; 48 @Entity @Table(name = "cidade") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Cidade.findAll", query = "SELECT c FROM Cidade c"), @NamedQuery(name = "Cidade.findByIdCidade", query = "SELECT c FROM Cidade c WHERE c.idCidade = :idCidade"), @NamedQuery(name = "Cidade.findByCidade", query = "SELECT c FROM Cidade c WHERE c.cidade = :cidade"), @NamedQuery(name = "Cidade.findByFlagSincronizacao", query = "SELECT c FROM Cidade c WHERE c.flagSincronizacao = :flagSincronizacao"), @NamedQuery(name = "Cidade.findByUf", query = "SELECT c FROM Cidade c WHERE c.uf = :uf")}) public class Cidade implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_cidade") private Integer idCidade; @Basic(optional = false) @NotNull @Size(min = 1, max = 40) @Column(name = "cidade") private String cidade; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @Size(max = 2) @Column(name = "uf") private String uf; @OneToMany(mappedBy = "idCidade") private Collection<Produtor> produtorCollection; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idCidade") private Collection<Gleba> glebaCollection; public Cidade() { } public Cidade(Integer idCidade) { this.idCidade = idCidade; } public Cidade(Integer idCidade, String cidade) { this.idCidade = idCidade; 49 this.cidade = cidade; } public Integer getIdCidade() { return idCidade; } public void setIdCidade(Integer idCidade) { this.idCidade = idCidade; } public String getCidade() { return cidade; } public void setCidade(String cidade) { this.cidade = cidade; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public String getUf() { return uf; } public void setUf(String uf) { this.uf = uf; } @XmlTransient public Collection<Produtor> getProdutorCollection() { return produtorCollection; } 50 public void setProdutorCollection(Collection<Produtor> produtorCollection) { this.produtorCollection = produtorCollection; } @XmlTransient public Collection<Gleba> getGlebaCollection() { return glebaCollection; } public void setGlebaCollection(Collection<Gleba> glebaCollection) { this.glebaCollection = glebaCollection; } @Override public int hashCode() { int hash = 0; hash += (idCidade != null ? idCidade.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Cidade)) { return false; } Cidade other = (Cidade) object; if ((this.idCidade == null && other.idCidade != null) || (this.idCidade != null && !this.idCidade.equals(other.idCidade))) { return false; } return true; } @Override public String toString() { return "entidades.Cidade[ idCidade=" + idCidade + " ]"; } } 51 Classe Cultivares.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "cultivares") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Cultivares.findAll", query = "SELECT c FROM Cultivares c"), @NamedQuery(name = "Cultivares.findByIdCultivares", query = "SELECT c FROM Cultivares c WHERE c.idCultivares = :idCultivares"), @NamedQuery(name = "Cultivares.findByDatac", query = "SELECT c FROM Cultivares c WHERE c.datac = :datac"), @NamedQuery(name = "Cultivares.findByObservacao", query = "SELECT c FROM Cultivares c WHERE c.observacao = :observacao"), @NamedQuery(name = "Cultivares.findByPestimada", query = "SELECT c FROM Cultivares c WHERE c.pestimada = :pestimada"), @NamedQuery(name = "Cultivares.findByEestimada", query = "SELECT c FROM Cultivares c WHERE c.eestimada = :eestimada"), @NamedQuery(name = "Cultivares.findBySituacao", query = "SELECT c FROM Cultivares c WHERE c.situacao = :situacao"), @NamedQuery(name = "Cultivares.findByFlagSincronizacao", query = "SELECT c FROM Cultivares c WHERE c.flagSincronizacao = :flagSincronizacao")}) public class Cultivares implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_cultivares") private Integer idCultivares; @Size(max = 10) @Column(name = "datac") 52 private String datac; @Size(max = 100) @Column(name = "observacao") private String observacao; @Column(name = "pestimada") private Integer pestimada; @Column(name = "eestimada") private Integer eestimada; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_variedadesgleba", referencedColumnName = "id_variedadesgleba") @ManyToOne(optional = false) private Variedadesgleba idVariedadesgleba; @JoinColumn(name = "id_glebavinculada", referencedColumnName = "id_glebavinculada") @ManyToOne(optional = false) private Glebasvinculadas idGlebavinculada; @JoinColumn(name = "id_estadio", referencedColumnName = "id_estadio") @ManyToOne private Estadio idEstadio; @OneToMany(mappedBy = "idCultivares") private Collection<Pontoamostra> pontoamostraCollection; public Cultivares() { } public Cultivares(Integer idCultivares) { this.idCultivares = idCultivares; } public Integer getIdCultivares() { return idCultivares; } public void setIdCultivares(Integer idCultivares) { this.idCultivares = idCultivares; } 53 public String getDatac() { return datac; } public void setDatac(String datac) { this.datac = datac; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } public Integer getPestimada() { return pestimada; } public void setPestimada(Integer pestimada) { this.pestimada = pestimada; } public Integer getEestimada() { return eestimada; } public void setEestimada(Integer eestimada) { this.eestimada = eestimada; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } 54 public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Variedadesgleba getIdVariedadesgleba() { return idVariedadesgleba; } public void setIdVariedadesgleba(Variedadesgleba idVariedadesgleba) { this.idVariedadesgleba = idVariedadesgleba; } public Glebasvinculadas getIdGlebavinculada() { return idGlebavinculada; } public void setIdGlebavinculada(Glebasvinculadas idGlebavinculada) { this.idGlebavinculada = idGlebavinculada; } public Estadio getIdEstadio() { return idEstadio; } public void setIdEstadio(Estadio idEstadio) { this.idEstadio = idEstadio; } @XmlTransient public Collection<Pontoamostra> getPontoamostraCollection() { return pontoamostraCollection; } public void setPontoamostraCollection(Collection<Pontoamostra> pontoamostraCollection) { this.pontoamostraCollection = pontoamostraCollection; 55 } @Override public int hashCode() { int hash = 0; hash += (idCultivares != null ? idCultivares.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Cultivares)) { return false; } Cultivares other = (Cultivares) object; if ((this.idCultivares == null && other.idCultivares != null) || (this.idCultivares != null && !this.idCultivares.equals(other.idCultivares))) { return false; } return true; } @Override public String toString() { return "entidades.Cultivares[ idCultivares=" + idCultivares + " ]"; } } Classe Cultura.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; 56 import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "cultura") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Cultura.findAll", query = "SELECT c FROM Cultura c"), @NamedQuery(name = "Cultura.findByIdCultura", query = "SELECT c FROM Cultura c WHERE c.idCultura = :idCultura"), @NamedQuery(name = "Cultura.findByNome", query = "SELECT c FROM Cultura c WHERE c.nome = :nome"), @NamedQuery(name = "Cultura.findByPoprec", query = "SELECT c FROM Cultura c WHERE c.poprec = :poprec"), @NamedQuery(name = "Cultura.findByEpocaplant", query = "SELECT c FROM Cultura c WHERE c.epocaplant = :epocaplant"), @NamedQuery(name = "Cultura.findByOrdimp", query = "SELECT c FROM Cultura c WHERE c.ordimp = :ordimp"), @NamedQuery(name = "Cultura.findByFlagSincronizacao", query = "SELECT c FROM Cultura c WHERE c.flagSincronizacao = :flagSincronizacao")}) public class Cultura implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_cultura") private Integer idCultura; @Size(max = 40) @Column(name = "nome") private String nome; @Column(name = "poprec") private Integer poprec; @Size(max = 1) @Column(name = "epocaplant") private String epocaplant; @Column(name = "ordimp") private Integer ordimp; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idCultura") private Collection<Variedades> variedadesCollection; 57 @OneToMany(cascade = CascadeType.ALL, mappedBy = "idCultura") private Collection<Safra> safraCollection; public Cultura() { } public Cultura(Integer idCultura) { this.idCultura = idCultura; } public Integer getIdCultura() { return idCultura; } public void setIdCultura(Integer idCultura) { this.idCultura = idCultura; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Integer getPoprec() { return poprec; } public void setPoprec(Integer poprec) { this.poprec = poprec; } public String getEpocaplant() { return epocaplant; } public void setEpocaplant(String epocaplant) { this.epocaplant = epocaplant; 58 } public Integer getOrdimp() { return ordimp; } public void setOrdimp(Integer ordimp) { this.ordimp = ordimp; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Variedades> getVariedadesCollection() { return variedadesCollection; } public void setVariedadesCollection(Collection<Variedades> variedadesCollection) { this.variedadesCollection = variedadesCollection; } @XmlTransient public Collection<Safra> getSafraCollection() { return safraCollection; } public void setSafraCollection(Collection<Safra> safraCollection) { this.safraCollection = safraCollection; } @Override public int hashCode() { int hash = 0; hash += (idCultura != null ? idCultura.hashCode() : 0); 59 return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Cultura)) { return false; } Cultura other = (Cultura) object; if ((this.idCultura == null && other.idCultura != null) || (this.idCultura != null && !this.idCultura.equals(other.idCultura))) { return false; } return true; } @Override public String toString() { return "entidades.Cultura[ idCultura=" + idCultura + " ]"; } } Classe Especiem.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; 60 import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "especiem") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Especiem.findAll", query = "SELECT e FROM Especiem e"), @NamedQuery(name = "Especiem.findByIdEspeciem", query = "SELECT e FROM Especiem e WHERE e.idEspeciem = :idEspeciem"), @NamedQuery(name = "Especiem.findByDescricao", query = "SELECT e FROM Especiem e WHERE e.descricao = :descricao"), @NamedQuery(name = "Especiem.findByTipo", query = "SELECT e FROM Especiem e WHERE e.tipo = :tipo"), @NamedQuery(name = "Especiem.findByFlagSincronizacao", query = "SELECT e FROM Especiem e WHERE e.flagSincronizacao = :flagSincronizacao")}) public class Especiem implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_especiem") private Integer idEspeciem; @Size(max = 40) @Column(name = "descricao") private String descricao; @Size(max = 1) @Column(name = "tipo") private String tipo; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idEspeciem") private Collection<Monitoramento> monitoramentoCollection; public Especiem() { } public Especiem(Integer idEspeciem) { this.idEspeciem = idEspeciem; } public Integer getIdEspeciem() { return idEspeciem; } 61 public void setIdEspeciem(Integer idEspeciem) { this.idEspeciem = idEspeciem; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Monitoramento> getMonitoramentoCollection() { return monitoramentoCollection; } public void setMonitoramentoCollection(Collection<Monitoramento> monitoramentoCollection) { this.monitoramentoCollection = monitoramentoCollection; } @Override public int hashCode() { 62 int hash = 0; hash += (idEspeciem != null ? idEspeciem.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Especiem)) { return false; } Especiem other = (Especiem) object; if ((this.idEspeciem == null && other.idEspeciem != null) || (this.idEspeciem != null && !this.idEspeciem.equals(other.idEspeciem))) { return false; } return true; } @Override public String toString() { return "entidades.Especiem[ idEspeciem=" + idEspeciem + " ]"; } } Classe Estadio.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; 63 import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "estadio") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Estadio.findAll", query = "SELECT e FROM Estadio e"), @NamedQuery(name = "Estadio.findByIdEstadio", query = "SELECT e FROM Estadio e WHERE e.idEstadio = :idEstadio"), @NamedQuery(name = "Estadio.findByNomeEsstadio", query = "SELECT e FROM Estadio e WHERE e.nomeEsstadio = :nomeEsstadio"), @NamedQuery(name = "Estadio.findByDescricao", query = "SELECT e FROM Estadio e WHERE e.descricao = :descricao"), @NamedQuery(name = "Estadio.findByFlagSincronizacao", query = "SELECT e FROM Estadio e WHERE e.flagSincronizacao = :flagSincronizacao")}) public class Estadio implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_estadio") private Integer idEstadio; @Size(max = 40) @Column(name = "nome_esstadio") private String nomeEsstadio; @Size(max = 100) @Column(name = "descricao") private String descricao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idEstadio") private Collection<Monitoramento> monitoramentoCollection; @OneToMany(mappedBy = "idEstadio") private Collection<Cultivares> cultivaresCollection; @OneToMany(mappedBy = "idEstadio") private Collection<Eventosc> eventoscCollection; public Estadio() { } public Estadio(Integer idEstadio) { this.idEstadio = idEstadio; 64 } public Integer getIdEstadio() { return idEstadio; } public void setIdEstadio(Integer idEstadio) { this.idEstadio = idEstadio; } public String getNomeEsstadio() { return nomeEsstadio; } public void setNomeEsstadio(String nomeEsstadio) { this.nomeEsstadio = nomeEsstadio; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Monitoramento> getMonitoramentoCollection() { return monitoramentoCollection; } 65 public void setMonitoramentoCollection(Collection<Monitoramento> monitoramentoCollection) { this.monitoramentoCollection = monitoramentoCollection; } @XmlTransient public Collection<Cultivares> getCultivaresCollection() { return cultivaresCollection; } public void setCultivaresCollection(Collection<Cultivares> cultivaresCollection) { this.cultivaresCollection = cultivaresCollection; } @XmlTransient public Collection<Eventosc> getEventoscCollection() { return eventoscCollection; } public void setEventoscCollection(Collection<Eventosc> eventoscCollection) { this.eventoscCollection = eventoscCollection; } @Override public int hashCode() { int hash = 0; hash += (idEstadio != null ? idEstadio.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Estadio)) { return false; } Estadio other = (Estadio) object; if ((this.idEstadio == null && other.idEstadio != null) || (this.idEstadio != null && !this.idEstadio.equals(other.idEstadio))) { return false; } 66 return true; } @Override public String toString() { return "entidades.Estadio[ idEstadio=" + idEstadio + " ]"; } } Classe Eventosc.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "eventosc") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Eventosc.findAll", query = "SELECT e FROM Eventosc e"), @NamedQuery(name = "Eventosc.findByIdEventosc", query = "SELECT e FROM Eventosc e WHERE e.idEventosc = :idEventosc"), @NamedQuery(name = "Eventosc.findByDatae", query = "SELECT e FROM Eventosc e WHERE e.datae = :datae"), @NamedQuery(name = "Eventosc.findByTipo", query = "SELECT e FROM Eventosc e WHERE e.tipo = :tipo"), @NamedQuery(name = "Eventosc.findByPrecipitacao", query = "SELECT e FROM Eventosc e WHERE e.precipitacao = :precipitacao"), @NamedQuery(name = "Eventosc.findByEstperda", query = "SELECT e FROM Eventosc e WHERE e.estperda = :estperda"), 67 @NamedQuery(name = "Eventosc.findByObservacao", query = "SELECT e FROM Eventosc e WHERE e.observacao = :observacao"), @NamedQuery(name = "Eventosc.findBySituacao", query = "SELECT e FROM Eventosc e WHERE e.situacao = :situacao"), @NamedQuery(name = "Eventosc.findByFlagSincronizacao", query = "SELECT e FROM Eventosc e WHERE e.flagSincronizacao = :flagSincronizacao")}) public class Eventosc implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_eventosc") private Integer idEventosc; @Size(max = 10) @Column(name = "datae") private String datae; @Size(max = 15) @Column(name = "tipo") private String tipo; @Size(max = 4) @Column(name = "precipitacao") private String precipitacao; @Column(name = "estperda") private Integer estperda; @Size(max = 100) @Column(name = "observacao") private String observacao; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idEventosc") private Collection<Pontoamostra> pontoamostraCollection; @JoinColumn(name = "id_glebavinculada", referencedColumnName = "id_glebavinculada") @ManyToOne(optional = false) private Glebasvinculadas idGlebavinculada; @JoinColumn(name = "id_estadio", referencedColumnName = "id_estadio") @ManyToOne private Estadio idEstadio; public Eventosc() { } 68 public Eventosc(Integer idEventosc) { this.idEventosc = idEventosc; } public Integer getIdEventosc() { return idEventosc; } public void setIdEventosc(Integer idEventosc) { this.idEventosc = idEventosc; } public String getDatae() { return datae; } public void setDatae(String datae) { this.datae = datae; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public String getPrecipitacao() { return precipitacao; } public void setPrecipitacao(String precipitacao) { this.precipitacao = precipitacao; } public Integer getEstperda() { return estperda; } 69 public void setEstperda(Integer estperda) { this.estperda = estperda; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Pontoamostra> getPontoamostraCollection() { return pontoamostraCollection; } public void setPontoamostraCollection(Collection<Pontoamostra> pontoamostraCollection) { this.pontoamostraCollection = pontoamostraCollection; } public Glebasvinculadas getIdGlebavinculada() { return idGlebavinculada; 70 } public void setIdGlebavinculada(Glebasvinculadas idGlebavinculada) { this.idGlebavinculada = idGlebavinculada; } public Estadio getIdEstadio() { return idEstadio; } public void setIdEstadio(Estadio idEstadio) { this.idEstadio = idEstadio; } @Override public int hashCode() { int hash = 0; hash += (idEventosc != null ? idEventosc.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Eventosc)) { return false; } Eventosc other = (Eventosc) object; if ((this.idEventosc == null && other.idEventosc != null) || (this.idEventosc != null && !this.idEventosc.equals(other.idEventosc))) { return false; } return true; } @Override public String toString() { return "entidades.Eventosc[ idEventosc=" + idEventosc + " ]"; } } 71 Classe Gleba.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "gleba") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Gleba.findAll", query = "SELECT g FROM Gleba g"), @NamedQuery(name = "Gleba.findByIdGleba", query = "SELECT g FROM Gleba g WHERE g.idGleba = :idGleba"), @NamedQuery(name = "Gleba.findByNomeGleba", query = "SELECT g FROM Gleba g WHERE g.nomeGleba = :nomeGleba"), @NamedQuery(name = "Gleba.findByAreaPropria", query = "SELECT g FROM Gleba g WHERE g.areaPropria = :areaPropria"), @NamedQuery(name = "Gleba.findByAreaArrendada", query = "SELECT g FROM Gleba g WHERE g.areaArrendada = :areaArrendada"), @NamedQuery(name = "Gleba.findByValorArrend", query = "SELECT g FROM Gleba g WHERE g.valorArrend = :valorArrend"), @NamedQuery(name = "Gleba.findByPrazoArrend", query = "SELECT g FROM Gleba g WHERE g.prazoArrend = :prazoArrend"), @NamedQuery(name = "Gleba.findByCordendasGps", query = "SELECT g FROM Gleba g WHERE g.cordendasGps = :cordendasGps"), @NamedQuery(name = "Gleba.findByPontosGps", query = "SELECT g FROM Gleba g WHERE g.pontosGps = :pontosGps"), @NamedQuery(name = "Gleba.findByFlagSincronizacao", query = "SELECT g FROM Gleba g WHERE g.flagSincronizacao = :flagSincronizacao")}) public class Gleba implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_gleba") private Integer idGleba; 72 @Size(max = 40) @Column(name = "nome_gleba") private String nomeGleba; @Size(max = 40) @Column(name = "area_propria") private String areaPropria; @Size(max = 40) @Column(name = "area_arrendada") private String areaArrendada; @Size(max = 40) @Column(name = "valor_arrend") private String valorArrend; @Size(max = 40) @Column(name = "prazo_arrend") private String prazoArrend; @Size(max = 200) @Column(name = "cordendas_gps") private String cordendasGps; @Size(max = 200) @Column(name = "pontos_gps") private String pontosGps; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_propriedade", referencedColumnName = "id_propriedade") @ManyToOne(optional = false) private Propriedade idPropriedade; @JoinColumn(name = "id_cidade", referencedColumnName = "id_cidade") @ManyToOne(optional = false) private Cidade idCidade; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idGleba") private Collection<Glebasvinculadas> glebasvinculadasCollection; public Gleba() { } public Gleba(Integer idGleba) { this.idGleba = idGleba; } 73 public Integer getIdGleba() { return idGleba; } public void setIdGleba(Integer idGleba) { this.idGleba = idGleba; } public String getNomeGleba() { return nomeGleba; } public void setNomeGleba(String nomeGleba) { this.nomeGleba = nomeGleba; } public String getAreaPropria() { return areaPropria; } public void setAreaPropria(String areaPropria) { this.areaPropria = areaPropria; } public String getAreaArrendada() { return areaArrendada; } public void setAreaArrendada(String areaArrendada) { this.areaArrendada = areaArrendada; } public String getValorArrend() { return valorArrend; } public void setValorArrend(String valorArrend) { this.valorArrend = valorArrend; } 74 public String getPrazoArrend() { return prazoArrend; } public void setPrazoArrend(String prazoArrend) { this.prazoArrend = prazoArrend; } public String getCordendasGps() { return cordendasGps; } public void setCordendasGps(String cordendasGps) { this.cordendasGps = cordendasGps; } public String getPontosGps() { return pontosGps; } public void setPontosGps(String pontosGps) { this.pontosGps = pontosGps; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Propriedade getIdPropriedade() { return idPropriedade; } public void setIdPropriedade(Propriedade idPropriedade) { this.idPropriedade = idPropriedade; } 75 public Cidade getIdCidade() { return idCidade; } public void setIdCidade(Cidade idCidade) { this.idCidade = idCidade; } @XmlTransient public Collection<Glebasvinculadas> getGlebasvinculadasCollection() { return glebasvinculadasCollection; } public void setGlebasvinculadasCollection(Collection<Glebasvinculadas> glebasvinculadasCollection) { this.glebasvinculadasCollection = glebasvinculadasCollection; } @Override public int hashCode() { int hash = 0; hash += (idGleba != null ? idGleba.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Gleba)) { return false; } Gleba other = (Gleba) object; if ((this.idGleba == null && other.idGleba != null) || (this.idGleba != null && !this.idGleba.equals(other.idGleba))) { return false; } return true; } @Override public String toString() { 76 return "entidades.Gleba[ idGleba=" + idGleba + " ]"; } } Classe Glebasvinculadas.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "glebasvinculadas") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Glebasvinculadas.findAll", query = "SELECT g FROM Glebasvinculadas g"), @NamedQuery(name = "Glebasvinculadas.findByIdGlebavinculada", query = "SELECT g FROM Glebasvinculadas g WHERE g.idGlebavinculada = :idGlebavinculada"), @NamedQuery(name = "Glebasvinculadas.findByAreaCultivo", query = "SELECT g FROM Glebasvinculadas g WHERE g.areaCultivo = :areaCultivo"), @NamedQuery(name = "Glebasvinculadas.findByFlagSincronizacao", query = "SELECT g FROM Glebasvinculadas g WHERE g.flagSincronizacao = :flagSincronizacao")}) public class Glebasvinculadas implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 77 @Basic(optional = false) @Column(name = "id_glebavinculada") private Integer idGlebavinculada; @Column(name = "area_cultivo") private Integer areaCultivo; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idGlebavinculada") private Collection<Monitoramento> monitoramentoCollection; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idGlebavinculada") private Collection<Cultivares> cultivaresCollection; @JoinColumn(name = "id_planejamento", referencedColumnName = "id_planejamento") @ManyToOne(optional = false) private Planejamento idPlanejamento; @JoinColumn(name = "id_gleba", referencedColumnName = "id_gleba") @ManyToOne(optional = false) private Gleba idGleba; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idGlebavinculada") private Collection<Eventosc> eventoscCollection; public Glebasvinculadas() { } public Glebasvinculadas(Integer idGlebavinculada) { this.idGlebavinculada = idGlebavinculada; } public Integer getIdGlebavinculada() { return idGlebavinculada; } public void setIdGlebavinculada(Integer idGlebavinculada) { this.idGlebavinculada = idGlebavinculada; } public Integer getAreaCultivo() { return areaCultivo; } 78 public void setAreaCultivo(Integer areaCultivo) { this.areaCultivo = areaCultivo; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Monitoramento> getMonitoramentoCollection() { return monitoramentoCollection; } public void setMonitoramentoCollection(Collection<Monitoramento> monitoramentoCollection) { this.monitoramentoCollection = monitoramentoCollection; } @XmlTransient public Collection<Cultivares> getCultivaresCollection() { return cultivaresCollection; } public void setCultivaresCollection(Collection<Cultivares> cultivaresCollection) { this.cultivaresCollection = cultivaresCollection; } public Planejamento getIdPlanejamento() { return idPlanejamento; } public void setIdPlanejamento(Planejamento idPlanejamento) { this.idPlanejamento = idPlanejamento; } public Gleba getIdGleba() { 79 return idGleba; } public void setIdGleba(Gleba idGleba) { this.idGleba = idGleba; } @XmlTransient public Collection<Eventosc> getEventoscCollection() { return eventoscCollection; } public void setEventoscCollection(Collection<Eventosc> eventoscCollection) { this.eventoscCollection = eventoscCollection; } @Override public int hashCode() { int hash = 0; hash += (idGlebavinculada != null ? idGlebavinculada.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Glebasvinculadas)) { return false; } Glebasvinculadas other = (Glebasvinculadas) object; if ((this.idGlebavinculada == null && other.idGlebavinculada != null) || (this.idGlebavinculada != null && !this.idGlebavinculada.equals(other.idGlebavinculada))) { return false; } return true; } @Override public String toString() { return "entidades.Glebasvinculadas[ idGlebavinculada=" + idGlebavinculada + " ]"; }} 80 Classe Itemplanj.java package entidades; import java.io.Serializable; import java.math.BigDecimal; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "itemplanj") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Itemplanj.findAll", query = "SELECT i FROM Itemplanj i"), @NamedQuery(name = "Itemplanj.findByIdItemplanj", query = "SELECT i FROM Itemplanj i WHERE i.idItemplanj = :idItemplanj"), @NamedQuery(name = "Itemplanj.findByCategoria", query = "SELECT i FROM Itemplanj i WHERE i.categoria = :categoria"), @NamedQuery(name = "Itemplanj.findByTipo", query = "SELECT i FROM Itemplanj i WHERE i.tipo = :tipo"), @NamedQuery(name = "Itemplanj.findByDtaplic", query = "SELECT i FROM Itemplanj i WHERE i.dtaplic = :dtaplic"), @NamedQuery(name = "Itemplanj.findByQuantidade", query = "SELECT i FROM Itemplanj i WHERE i.quantidade = :quantidade"), @NamedQuery(name = "Itemplanj.findByUnidade", query = "SELECT i FROM Itemplanj i WHERE i.unidade = :unidade"), @NamedQuery(name = "Itemplanj.findByArea", query = "SELECT i FROM Itemplanj i WHERE i.area = :area"), @NamedQuery(name = "Itemplanj.findByVlunitario", query = "SELECT i FROM Itemplanj i WHERE i.vlunitario = :vlunitario"), @NamedQuery(name = "Itemplanj.findByVltotal", query = "SELECT i FROM Itemplanj i WHERE i.vltotal = :vltotal"), @NamedQuery(name = "Itemplanj.findByTpfertilizante", query = "SELECT i FROM Itemplanj i WHERE i.tpfertilizante = :tpfertilizante"), @NamedQuery(name = "Itemplanj.findByEspeciebase", query = "SELECT i FROM Itemplanj i WHERE i.especiebase = :especiebase"), @NamedQuery(name = "Itemplanj.findByTpoperac", query = "SELECT i FROM Itemplanj i WHERE i.tpoperac = :tpoperac"), @NamedQuery(name = "Itemplanj.findByNutilizacao", query = "SELECT i FROM Itemplanj i WHERE i.nutilizacao = :nutilizacao"), @NamedQuery(name = "Itemplanj.findByFormulacao", query = "SELECT i FROM Itemplanj i WHERE i.formulacao = :formulacao"), @NamedQuery(name = "Itemplanj.findByCondicao", query = "SELECT i FROM Itemplanj i WHERE i.condicao = :condicao"), @NamedQuery(name = "Itemplanj.findByTpdespesa", query = "SELECT i FROM Itemplanj i WHERE i.tpdespesa = :tpdespesa"), @NamedQuery(name = "Itemplanj.findBySituacao", query = "SELECT i FROM Itemplanj i WHERE i.situacao = :situacao"), @NamedQuery(name = "Itemplanj.findByFlagSincronizacao", query = "SELECT i FROM Itemplanj i WHERE i.flagSincronizacao = :flagSincronizacao")}) public class Itemplanj implements Serializable { private static final long serialVersionUID = 1L; 81 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_itemplanj") private Integer idItemplanj; @Size(max = 15) @Column(name = "categoria") private String categoria; @Size(max = 1) @Column(name = "tipo") private String tipo; @Size(max = 10) @Column(name = "dtaplic") private String dtaplic; @Column(name = "quantidade") private BigDecimal quantidade; @Size(max = 3) @Column(name = "unidade") private String unidade; @Column(name = "area") private BigDecimal area; @Column(name = "vlunitario") private BigDecimal vlunitario; @Column(name = "vltotal") private BigDecimal vltotal; @Size(max = 10) @Column(name = "tpfertilizante") private String tpfertilizante; @Size(max = 5) @Column(name = "especiebase") private String especiebase; @Size(max = 25) @Column(name = "tpoperac") private String tpoperac; @Column(name = "nutilizacao") private Integer nutilizacao; @Size(max = 12) @Column(name = "formulacao") private String formulacao; @Size(max = 1) 82 @Column(name = "condicao") private String condicao; @Size(max = 1) @Column(name = "tpdespesa") private String tpdespesa; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idItemplanj") private Collection<Variedadesgleba> variedadesglebaCollection; @JoinColumn(name = "id_produto", referencedColumnName = "id_produto") @ManyToOne(optional = false) private Produto idProduto; @JoinColumn(name = "id_planejamento", referencedColumnName = "id_planejamento") @ManyToOne(optional = false) private Planejamento idPlanejamento; public Itemplanj() { } public Itemplanj(Integer idItemplanj) { this.idItemplanj = idItemplanj; } public Integer getIdItemplanj() { return idItemplanj; } public void setIdItemplanj(Integer idItemplanj) { this.idItemplanj = idItemplanj; } public String getCategoria() { return categoria; } public void setCategoria(String categoria) { 83 this.categoria = categoria; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public String getDtaplic() { return dtaplic; } public void setDtaplic(String dtaplic) { this.dtaplic = dtaplic; } public BigDecimal getQuantidade() { return quantidade; } public void setQuantidade(BigDecimal quantidade) { this.quantidade = quantidade; } public String getUnidade() { return unidade; } public void setUnidade(String unidade) { this.unidade = unidade; } public BigDecimal getArea() { return area; } public void setArea(BigDecimal area) { 84 this.area = area; } public BigDecimal getVlunitario() { return vlunitario; } public void setVlunitario(BigDecimal vlunitario) { this.vlunitario = vlunitario; } public BigDecimal getVltotal() { return vltotal; } public void setVltotal(BigDecimal vltotal) { this.vltotal = vltotal; } public String getTpfertilizante() { return tpfertilizante; } public void setTpfertilizante(String tpfertilizante) { this.tpfertilizante = tpfertilizante; } public String getEspeciebase() { return especiebase; } public void setEspeciebase(String especiebase) { this.especiebase = especiebase; } public String getTpoperac() { return tpoperac; } public void setTpoperac(String tpoperac) { 85 this.tpoperac = tpoperac; } public Integer getNutilizacao() { return nutilizacao; } public void setNutilizacao(Integer nutilizacao) { this.nutilizacao = nutilizacao; } public String getFormulacao() { return formulacao; } public void setFormulacao(String formulacao) { this.formulacao = formulacao; } public String getCondicao() { return condicao; } public void setCondicao(String condicao) { this.condicao = condicao; } public String getTpdespesa() { return tpdespesa; } public void setTpdespesa(String tpdespesa) { this.tpdespesa = tpdespesa; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { 86 this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Variedadesgleba> getVariedadesglebaCollection() { return variedadesglebaCollection; } public void setVariedadesglebaCollection(Collection<Variedadesgleba> variedadesglebaCollection) { this.variedadesglebaCollection = variedadesglebaCollection; } public Produto getIdProduto() { return idProduto; } public void setIdProduto(Produto idProduto) { this.idProduto = idProduto; } public Planejamento getIdPlanejamento() { return idPlanejamento; } public void setIdPlanejamento(Planejamento idPlanejamento) { this.idPlanejamento = idPlanejamento; } @Override public int hashCode() { int hash = 0; 87 hash += (idItemplanj != null ? idItemplanj.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Itemplanj)) { return false; } Itemplanj other = (Itemplanj) object; if ((this.idItemplanj == null && other.idItemplanj != null) || (this.idItemplanj != null && !this.idItemplanj.equals(other.idItemplanj))) { return false; } return true; } @Override public String toString() { return "entidades.Itemplanj[ idItemplanj=" + idItemplanj + " ]"; } } Classe Leituras.java package entidades; import java.io.Serializable; import java.math.BigDecimal; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.validation.constraints.NotNull; 88 import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; @Entity @Table(name = "leituras") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Leituras.findAll", query = "SELECT l FROM Leituras l"), @NamedQuery(name = "Leituras.findByIdChave", query = "SELECT l FROM Leituras l WHERE l.idChave = :idChave"), @NamedQuery(name = "Leituras.findByIdLeitura", query = "SELECT l FROM Leituras l WHERE l.idLeitura = :idLeitura"), @NamedQuery(name = "Leituras.findByResistenceLeitura", query = "SELECT l FROM Leituras l WHERE l.resistenceLeitura = :resistenceLeitura"), @NamedQuery(name = "Leituras.findByEnviromentmoistureLeitura", query = "SELECT l FROM Leituras l WHERE l.enviromentmoistureLeitura = :enviromentmoistureLeitura"), @NamedQuery(name = "Leituras.findByEnviromenttemperatureLeitura", query = "SELECT l FROM Leituras l WHERE l.enviromenttemperatureLeitura = :enviromenttemperatureLeitura"), @NamedQuery(name = "Leituras.findByHourLeitura", query = "SELECT l FROM Leituras l WHERE l.hourLeitura = :hourLeitura"), @NamedQuery(name = "Leituras.findByDateLeitura", query = "SELECT l FROM Leituras l WHERE l.dateLeitura = :dateLeitura")}) public class Leituras implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_chave") private Integer idChave; @Basic(optional = false) @NotNull @Column(name = "id_leitura") private int idLeitura; @Basic(optional = false) @NotNull @Column(name = "resistence_leitura") private BigDecimal resistenceLeitura; @Basic(optional = false) @NotNull @Column(name = "enviromentmoisture_leitura") private BigDecimal enviromentmoistureLeitura; @Basic(optional = false) @NotNull @Column(name = "enviromenttemperature_leitura") private BigDecimal enviromenttemperatureLeitura; @Basic(optional = false) @NotNull @Size(min = 1, max = 8) @Column(name = "hour_leitura") 89 private String hourLeitura; @Basic(optional = false) @NotNull @Size(min = 1, max = 10) @Column(name = "date_leitura") private String dateLeitura; public Leituras() { } public Leituras(Integer idChave) { this.idChave = idChave; } public Leituras(Integer idChave, int idLeitura, BigDecimal resistenceLeitura, BigDecimal enviromentmoistureLeitura, BigDecimal enviromenttemperatureLeitura, String hourLeitura, String dateLeitura) { this.idChave = idChave; this.idLeitura = idLeitura; this.resistenceLeitura = resistenceLeitura; this.enviromentmoistureLeitura = enviromentmoistureLeitura; this.enviromenttemperatureLeitura = enviromenttemperatureLeitura; this.hourLeitura = hourLeitura; this.dateLeitura = dateLeitura; } public Integer getIdChave() { return idChave; } public void setIdChave(Integer idChave) { this.idChave = idChave; } public int getIdLeitura() { return idLeitura; } public void setIdLeitura(int idLeitura) { this.idLeitura = idLeitura; 90 } public BigDecimal getResistenceLeitura() { return resistenceLeitura; } public void setResistenceLeitura(BigDecimal resistenceLeitura) { this.resistenceLeitura = resistenceLeitura; } public BigDecimal getEnviromentmoistureLeitura() { return enviromentmoistureLeitura; } public void setEnviromentmoistureLeitura(BigDecimal enviromentmoistureLeitura) { this.enviromentmoistureLeitura = enviromentmoistureLeitura; } public BigDecimal getEnviromenttemperatureLeitura() { return enviromenttemperatureLeitura; } public void setEnviromenttemperatureLeitura(BigDecimal enviromenttemperatureLeitura) { this.enviromenttemperatureLeitura = enviromenttemperatureLeitura; } public String getHourLeitura() { return hourLeitura; } public void setHourLeitura(String hourLeitura) { this.hourLeitura = hourLeitura; } public String getDateLeitura() { return dateLeitura; } public void setDateLeitura(String dateLeitura) { this.dateLeitura = dateLeitura; 91 } @Override public int hashCode() { int hash = 0; hash += (idChave != null ? idChave.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Leituras)) { return false; } Leituras other = (Leituras) object; if ((this.idChave == null && other.idChave != null) || (this.idChave != null && !this.idChave.equals(other.idChave))) { return false; } return true; } @Override public String toString() { return "entidades.Leituras[ idChave=" + idChave + " ]"; } } Classe Monitoramento.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; 92 import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "monitoramento") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Monitoramento.findAll", query = "SELECT m FROM Monitoramento m"), @NamedQuery(name = "Monitoramento.findByIdMonitoramento", query = "SELECT m FROM Monitoramento m WHERE m.idMonitoramento = :idMonitoramento"), @NamedQuery(name = "Monitoramento.findByData", query = "SELECT m FROM Monitoramento m WHERE m.data = :data"), @NamedQuery(name = "Monitoramento.findByTipo", query = "SELECT m FROM Monitoramento m WHERE m.tipo = :tipo"), @NamedQuery(name = "Monitoramento.findByNivel", query = "SELECT m FROM Monitoramento m WHERE m.nivel = :nivel"), @NamedQuery(name = "Monitoramento.findByOcorrencia", query = "SELECT m FROM Monitoramento m WHERE m.ocorrencia = :ocorrencia"), @NamedQuery(name = "Monitoramento.findByObservacao", query = "SELECT m FROM Monitoramento m WHERE m.observacao = :observacao"), @NamedQuery(name = "Monitoramento.findBySituacao", query = "SELECT m FROM Monitoramento m WHERE m.situacao = :situacao"), @NamedQuery(name = "Monitoramento.findByFlagSincronizacao", query = "SELECT m FROM Monitoramento m WHERE m.flagSincronizacao = :flagSincronizacao")}) public class Monitoramento implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_monitoramento") private Integer idMonitoramento; @Size(max = 10) @Column(name = "data") private String data; @Size(max = 1) @Column(name = "tipo") private String tipo; @Size(max = 15) @Column(name = "nivel") private String nivel; @Column(name = "ocorrencia") private Integer ocorrencia; @Size(max = 100) 93 @Column(name = "observacao") private String observacao; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_glebavinculada", referencedColumnName = "id_glebavinculada") @ManyToOne(optional = false) private Glebasvinculadas idGlebavinculada; @JoinColumn(name = "id_estadio", referencedColumnName = "id_estadio") @ManyToOne private Estadio idEstadio; @JoinColumn(name = "id_especiem", referencedColumnName = "id_especiem") @ManyToOne private Especiem idEspeciem; @OneToMany(mappedBy = "idMonitoramento") private Collection<Pontoamostra> pontoamostraCollection; public Monitoramento() { } public Monitoramento(Integer idMonitoramento) { this.idMonitoramento = idMonitoramento; } public Integer getIdMonitoramento() { return idMonitoramento; } public void setIdMonitoramento(Integer idMonitoramento) { this.idMonitoramento = idMonitoramento; } public String getData() { return data; } public void setData(String data) { 94 this.data = data; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public String getNivel() { return nivel; } public void setNivel(String nivel) { this.nivel = nivel; } public Integer getOcorrencia() { return ocorrencia; } public void setOcorrencia(Integer ocorrencia) { this.ocorrencia = ocorrencia; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { 95 this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Glebasvinculadas getIdGlebavinculada() { return idGlebavinculada; } public void setIdGlebavinculada(Glebasvinculadas idGlebavinculada) { this.idGlebavinculada = idGlebavinculada; } public Estadio getIdEstadio() { return idEstadio; } public void setIdEstadio(Estadio idEstadio) { this.idEstadio = idEstadio; } public Especiem getIdEspeciem() { return idEspeciem; } public void setIdEspeciem(Especiem idEspeciem) { this.idEspeciem = idEspeciem; } @XmlTransient public Collection<Pontoamostra> getPontoamostraCollection() { return pontoamostraCollection; } 96 public void setPontoamostraCollection(Collection<Pontoamostra> pontoamostraCollection) { this.pontoamostraCollection = pontoamostraCollection; } @Override public int hashCode() { int hash = 0; hash += (idMonitoramento != null ? idMonitoramento.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Monitoramento)) { return false; } Monitoramento other = (Monitoramento) object; if ((this.idMonitoramento == null && other.idMonitoramento != null) || (this.idMonitoramento != null && !this.idMonitoramento.equals(other.idMonitoramento))) { return false; } return true; } @Override public String toString() { return "entidades.Monitoramento[ idMonitoramento=" + idMonitoramento + " ]"; } } Classe Planejamento.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; 97 import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "planejamento") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Planejamento.findAll", query = "SELECT p FROM Planejamento p"), @NamedQuery(name = "Planejamento.findByIdPlanejamento", query = "SELECT p FROM Planejamento p WHERE p.idPlanejamento = :idPlanejamento"), @NamedQuery(name = "Planejamento.findByDescricao", query = "SELECT p FROM Planejamento p WHERE p.descricao = :descricao"), @NamedQuery(name = "Planejamento.findByEspcontrole", query = "SELECT p FROM Planejamento p WHERE p.espcontrole = :espcontrole"), @NamedQuery(name = "Planejamento.findByProdestimada", query = "SELECT p FROM Planejamento p WHERE p.prodestimada = :prodestimada"), @NamedQuery(name = "Planejamento.findByProdrealizada", query = "SELECT p FROM Planejamento p WHERE p.prodrealizada = :prodrealizada"), @NamedQuery(name = "Planejamento.findByProdentregue", query = "SELECT p FROM Planejamento p WHERE p.prodentregue = :prodentregue"), @NamedQuery(name = "Planejamento.findByCondicao", query = "SELECT p FROM Planejamento p WHERE p.condicao = :condicao"), @NamedQuery(name = "Planejamento.findBySituacao", query = "SELECT p FROM Planejamento p WHERE p.situacao = :situacao"), @NamedQuery(name = "Planejamento.findByFlagSincronizacao", query = "SELECT p FROM Planejamento p WHERE p.flagSincronizacao = :flagSincronizacao")}) public class Planejamento implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_planejamento") private Integer idPlanejamento; @Size(max = 25) @Column(name = "descricao") private String descricao; @Size(max = 1) @Column(name = "espcontrole") private String espcontrole; @Column(name = "prodestimada") private Integer prodestimada; @Column(name = "prodrealizada") private Integer prodrealizada; 98 @Column(name = "prodentregue") private Integer prodentregue; @Size(max = 1) @Column(name = "condicao") private String condicao; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPlanejamento") private Collection<Glebasvinculadas> glebasvinculadasCollection; @JoinColumn(name = "id_safra", referencedColumnName = "id_safra") @ManyToOne(optional = false) private Safra idSafra; @JoinColumn(name = "id_produtor", referencedColumnName = "id_produtor") @ManyToOne(optional = false) private Produtor idProdutor; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPlanejamento") private Collection<Itemplanj> itemplanjCollection; public Planejamento() { } public Planejamento(Integer idPlanejamento) { this.idPlanejamento = idPlanejamento; } public Integer getIdPlanejamento() { return idPlanejamento; } public void setIdPlanejamento(Integer idPlanejamento) { this.idPlanejamento = idPlanejamento; } public String getDescricao() { return descricao; } 99 public void setDescricao(String descricao) { this.descricao = descricao; } public String getEspcontrole() { return espcontrole; } public void setEspcontrole(String espcontrole) { this.espcontrole = espcontrole; } public Integer getProdestimada() { return prodestimada; } public void setProdestimada(Integer prodestimada) { this.prodestimada = prodestimada; } public Integer getProdrealizada() { return prodrealizada; } public void setProdrealizada(Integer prodrealizada) { this.prodrealizada = prodrealizada; } public Integer getProdentregue() { return prodentregue; } public void setProdentregue(Integer prodentregue) { this.prodentregue = prodentregue; } public String getCondicao() { return condicao; } 100 public void setCondicao(String condicao) { this.condicao = condicao; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Glebasvinculadas> getGlebasvinculadasCollection() { return glebasvinculadasCollection; } public void setGlebasvinculadasCollection(Collection<Glebasvinculadas> glebasvinculadasCollection) { this.glebasvinculadasCollection = glebasvinculadasCollection; } public Safra getIdSafra() { return idSafra; } public void setIdSafra(Safra idSafra) { this.idSafra = idSafra; } public Produtor getIdProdutor() { 101 return idProdutor; } public void setIdProdutor(Produtor idProdutor) { this.idProdutor = idProdutor; } @XmlTransient public Collection<Itemplanj> getItemplanjCollection() { return itemplanjCollection; } public void setItemplanjCollection(Collection<Itemplanj> itemplanjCollection) { this.itemplanjCollection = itemplanjCollection; } @Override public int hashCode() { int hash = 0; hash += (idPlanejamento != null ? idPlanejamento.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Planejamento)) { return false; } Planejamento other = (Planejamento) object; if ((this.idPlanejamento == null && other.idPlanejamento != null) || (this.idPlanejamento != null && !this.idPlanejamento.equals(other.idPlanejamento))) { return false; } return true; } @Override public String toString() { return "entidades.Planejamento[ idPlanejamento=" + idPlanejamento + " ]"; }} 102 Classe Pontoamostra.java package entidades; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; @Entity @Table(name = "pontoamostra") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Pontoamostra.findAll", query = "SELECT p FROM Pontoamostra p"), @NamedQuery(name = "Pontoamostra.findByIdPontoamostra", query = "SELECT p FROM Pontoamostra p WHERE p.idPontoamostra = :idPontoamostra"), @NamedQuery(name = "Pontoamostra.findByLatitude", query = "SELECT p FROM Pontoamostra p WHERE p.latitude = :latitude"), @NamedQuery(name = "Pontoamostra.findByLongitude", query = "SELECT p FROM Pontoamostra p WHERE p.longitude = :longitude"), @NamedQuery(name = "Pontoamostra.findByChave", query = "SELECT p FROM Pontoamostra p WHERE p.chave = :chave"), @NamedQuery(name = "Pontoamostra.findByObservacao", query = "SELECT p FROM Pontoamostra p WHERE p.observacao = :observacao"), @NamedQuery(name = "Pontoamostra.findByFlagSincronizacao", query = "SELECT p FROM Pontoamostra p WHERE p.flagSincronizacao = :flagSincronizacao")}) public class Pontoamostra implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_pontoamostra") private Integer idPontoamostra; @Size(max = 200) @Column(name = "latitude") private String latitude; @Size(max = 200) @Column(name = "longitude") 103 private String longitude; @Size(max = 200) @Column(name = "chave") private String chave; @Size(max = 100) @Column(name = "observacao") private String observacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_monitoramento", referencedColumnName = "id_monitoramento") @ManyToOne private Monitoramento idMonitoramento; @JoinColumn(name = "id_eventosc", referencedColumnName = "id_eventosc") @ManyToOne private Eventosc idEventosc; @JoinColumn(name = "id_cultivares", referencedColumnName = "id_cultivares") @ManyToOne private Cultivares idCultivares; public Pontoamostra() { } public Pontoamostra(Integer idPontoamostra) { this.idPontoamostra = idPontoamostra; } public Integer getIdPontoamostra() { return idPontoamostra; } public void setIdPontoamostra(Integer idPontoamostra) { this.idPontoamostra = idPontoamostra; } public String getLatitude() { return latitude; } public void setLatitude(String latitude) { 104 this.latitude = latitude; } public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } public String getChave() { return chave; } public void setChave(String chave) { this.chave = chave; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Monitoramento getIdMonitoramento() { return idMonitoramento; } public void setIdMonitoramento(Monitoramento idMonitoramento) { 105 this.idMonitoramento = idMonitoramento; } public Eventosc getIdEventosc() { return idEventosc; } public void setIdEventosc(Eventosc idEventosc) { this.idEventosc = idEventosc; } public Cultivares getIdCultivares() { return idCultivares; } public void setIdCultivares(Cultivares idCultivares) { this.idCultivares = idCultivares; } @Override public int hashCode() { int hash = 0; hash += (idPontoamostra != null ? idPontoamostra.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Pontoamostra)) { return false; } Pontoamostra other = (Pontoamostra) object; if ((this.idPontoamostra == null && other.idPontoamostra != null) || (this.idPontoamostra != null && !this.idPontoamostra.equals(other.idPontoamostra))) { return false; } return true; } @Override 106 public String toString() { return "entidades.Pontoamostra[ idPontoamostra=" + idPontoamostra + " ]"; } } Classe Produto.java package entidades; import java.io.Serializable; import java.math.BigDecimal; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "produto") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Produto.findAll", query = "SELECT p FROM Produto p"), @NamedQuery(name = "Produto.findByIdProduto", query = "SELECT p FROM Produto p WHERE p.idProduto = :idProduto"), @NamedQuery(name = "Produto.findByNome", query = "SELECT p FROM Produto p WHERE p.nome = :nome"), @NamedQuery(name = "Produto.findByUnidade", query = "SELECT p FROM Produto p WHERE p.unidade = :unidade"), @NamedQuery(name = "Produto.findByPreco", query = "SELECT p FROM Produto p WHERE p.preco = :preco"), @NamedQuery(name = "Produto.findByDosagem", query = "SELECT p FROM Produto p WHERE p.dosagem = :dosagem"), @NamedQuery(name = "Produto.findByFormulacao", query = "SELECT p FROM Produto p WHERE p.formulacao = :formulacao"), @NamedQuery(name = "Produto.findBySituacao", query = "SELECT p FROM Produto p WHERE p.situacao = :situacao"), @NamedQuery(name = "Produto.findByFlagSincronizacao", query = "SELECT p FROM Produto p WHERE p.flagSincronizacao = :flagSincronizacao")}) public class Produto implements Serializable { private static final long serialVersionUID = 1L; @Id 107 @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_produto") private Integer idProduto; @Size(max = 15) @Column(name = "nome") private String nome; @Size(max = 3) @Column(name = "unidade") private String unidade; @Column(name = "preco") private BigDecimal preco; @Column(name = "dosagem") private BigDecimal dosagem; @Size(max = 4) @Column(name = "formulacao") private String formulacao; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idProduto") private Collection<Itemplanj> itemplanjCollection; public Produto() { } public Produto(Integer idProduto) { this.idProduto = idProduto; } public Integer getIdProduto() { return idProduto; } public void setIdProduto(Integer idProduto) { this.idProduto = idProduto; } 108 public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getUnidade() { return unidade; } public void setUnidade(String unidade) { this.unidade = unidade; } public BigDecimal getPreco() { return preco; } public void setPreco(BigDecimal preco) { this.preco = preco; } public BigDecimal getDosagem() { return dosagem; } public void setDosagem(BigDecimal dosagem) { this.dosagem = dosagem; } public String getFormulacao() { return formulacao; } public void setFormulacao(String formulacao) { this.formulacao = formulacao; } 109 public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Itemplanj> getItemplanjCollection() { return itemplanjCollection; } public void setItemplanjCollection(Collection<Itemplanj> itemplanjCollection) { this.itemplanjCollection = itemplanjCollection; } @Override public int hashCode() { int hash = 0; hash += (idProduto != null ? idProduto.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Produto)) { return false; } Produto other = (Produto) object; 110 if ((this.idProduto == null && other.idProduto != null) || (this.idProduto != null && !this.idProduto.equals(other.idProduto))) { return false; } return true; } @Override public String toString() { return "entidades.Produto[ idProduto=" + idProduto + " ]"; } } Classe Produtor.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "produtor") @XmlRootElement @NamedQueries({ 111 @NamedQuery(name = "Produtor.findAll", query = "SELECT p FROM Produtor p"), @NamedQuery(name = "Produtor.findByIdProdutor", query = "SELECT p FROM Produtor p WHERE p.idProdutor = :idProdutor"), @NamedQuery(name = "Produtor.findByNome", query = "SELECT p FROM Produtor p WHERE p.nome = :nome"), @NamedQuery(name = "Produtor.findByDatanasc", query = "SELECT p FROM Produtor p WHERE p.datanasc = :datanasc"), @NamedQuery(name = "Produtor.findByCpf", query = "SELECT p FROM Produtor p WHERE p.cpf = :cpf"), @NamedQuery(name = "Produtor.findByNivelassist", query = "SELECT p FROM Produtor p WHERE p.nivelassist = :nivelassist"), @NamedQuery(name = "Produtor.findByTipocadastro", query = "SELECT p FROM Produtor p WHERE p.tipocadastro = :tipocadastro"), @NamedQuery(name = "Produtor.findBySituacao", query = "SELECT p FROM Produtor p WHERE p.situacao = :situacao"), @NamedQuery(name = "Produtor.findBySexo", query = "SELECT p FROM Produtor p WHERE p.sexo = :sexo"), @NamedQuery(name = "Produtor.findByEndereco", query = "SELECT p FROM Produtor p WHERE p.endereco = :endereco"), @NamedQuery(name = "Produtor.findByTelefone", query = "SELECT p FROM Produtor p WHERE p.telefone = :telefone"), @NamedQuery(name = "Produtor.findByEmail", query = "SELECT p FROM Produtor p WHERE p.email = :email"), @NamedQuery(name = "Produtor.findByObservacao", query = "SELECT p FROM Produtor p WHERE p.observacao = :observacao"), @NamedQuery(name = "Produtor.findByFlagSincronizacao", query = "SELECT p FROM Produtor p WHERE p.flagSincronizacao = :flagSincronizacao")}) public class Produtor implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_produtor") private Integer idProdutor; @Size(max = 2147483647) @Column(name = "nome") private String nome; @Size(max = 10) @Column(name = "datanasc") private String datanasc; @Size(max = 14) @Column(name = "cpf") private String cpf; @Size(max = 1) @Column(name = "nivelassist") private String nivelassist; @Size(max = 1) @Column(name = "tipocadastro") private String tipocadastro; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "sexo") private String sexo; @Size(max = 2147483647) @Column(name = "endereco") private String endereco; @Size(max = 2147483647) 112 @Column(name = "telefone") private String telefone; @Size(max = 2147483647) @Column(name = "email") private String email; @Size(max = 2147483647) @Column(name = "observacao") private String observacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_tecnico", referencedColumnName = "id_tecnico") @ManyToOne private Tecnico idTecnico; @JoinColumn(name = "id_cidade", referencedColumnName = "id_cidade") @ManyToOne private Cidade idCidade; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idProdutor") private Collection<Propriedade> propriedadeCollection; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idProdutor") private Collection<Planejamento> planejamentoCollection; public Produtor() { } public Produtor(Integer idProdutor) { this.idProdutor = idProdutor; } public Integer getIdProdutor() { return idProdutor; } public void setIdProdutor(Integer idProdutor) { this.idProdutor = idProdutor; } public String getNome() { return nome; } 113 public void setNome(String nome) { this.nome = nome; } public String getDatanasc() { return datanasc; } public void setDatanasc(String datanasc) { this.datanasc = datanasc; } public String getCpf() { return cpf; } public void setCpf(String cpf) { this.cpf = cpf; } public String getNivelassist() { return nivelassist; } public void setNivelassist(String nivelassist) { this.nivelassist = nivelassist; } public String getTipocadastro() { return tipocadastro; } public void setTipocadastro(String tipocadastro) { this.tipocadastro = tipocadastro; } public String getSituacao() { return situacao; } 114 public void setSituacao(String situacao) { this.situacao = situacao; } public String getSexo() { return sexo; } public void setSexo(String sexo) { this.sexo = sexo; } public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getObservacao() { return observacao; } 115 public void setObservacao(String observacao) { this.observacao = observacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Tecnico getIdTecnico() { return idTecnico; } public void setIdTecnico(Tecnico idTecnico) { this.idTecnico = idTecnico; } public Cidade getIdCidade() { return idCidade; } public void setIdCidade(Cidade idCidade) { this.idCidade = idCidade; } @XmlTransient public Collection<Propriedade> getPropriedadeCollection() { return propriedadeCollection; } public void setPropriedadeCollection(Collection<Propriedade> propriedadeCollection) { this.propriedadeCollection = propriedadeCollection; } @XmlTransient public Collection<Planejamento> getPlanejamentoCollection() { 116 return planejamentoCollection; } public void setPlanejamentoCollection(Collection<Planejamento> planejamentoCollection) { this.planejamentoCollection = planejamentoCollection; } @Override public int hashCode() { int hash = 0; hash += (idProdutor != null ? idProdutor.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Produtor)) { return false; } Produtor other = (Produtor) object; if ((this.idProdutor == null && other.idProdutor != null) || (this.idProdutor != null && !this.idProdutor.equals(other.idProdutor))) { return false; } return true; } @Override public String toString() { return "entidades.Produtor[ idProdutor=" + idProdutor + " ]"; } } Classe Propriedade.java package entidades; import java.io.Serializable; import java.util.Collection; 117 import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "propriedade") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Propriedade.findAll", query = "SELECT p FROM Propriedade p"), @NamedQuery(name = "Propriedade.findByIdPropriedade", query = "SELECT p FROM Propriedade p WHERE p.idPropriedade = :idPropriedade"), @NamedQuery(name = "Propriedade.findByNomePropriedade", query = "SELECT p FROM Propriedade p WHERE p.nomePropriedade = :nomePropriedade"), @NamedQuery(name = "Propriedade.findByLocalidade", query = "SELECT p FROM Propriedade p WHERE p.localidade = :localidade"), @NamedQuery(name = "Propriedade.findByArea", query = "SELECT p FROM Propriedade p WHERE p.area = :area"), @NamedQuery(name = "Propriedade.findByAreaArrendada", query = "SELECT p FROM Propriedade p WHERE p.areaArrendada = :areaArrendada"), @NamedQuery(name = "Propriedade.findBySituacao", query = "SELECT p FROM Propriedade p WHERE p.situacao = :situacao"), @NamedQuery(name = "Propriedade.findByObservacao", query = "SELECT p FROM Propriedade p WHERE p.observacao = :observacao"), @NamedQuery(name = "Propriedade.findByFlagSincronizacao", query = "SELECT p FROM Propriedade p WHERE p.flagSincronizacao = :flagSincronizacao")}) public class Propriedade implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_propriedade") private Integer idPropriedade; @Basic(optional = false) @NotNull @Size(min = 1, max = 40) @Column(name = "nome_propriedade") private String nomePropriedade; 118 @Size(max = 40) @Column(name = "localidade") private String localidade; @Size(max = 10) @Column(name = "area") private String area; @Size(max = 10) @Column(name = "area_arrendada") private String areaArrendada; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 2147483647) @Column(name = "observacao") private String observacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_produtor", referencedColumnName = "id_produtor") @ManyToOne(optional = false) private Produtor idProdutor; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPropriedade") private Collection<Gleba> glebaCollection; public Propriedade() { } public Propriedade(Integer idPropriedade) { this.idPropriedade = idPropriedade; } public Propriedade(Integer idPropriedade, String nomePropriedade) { this.idPropriedade = idPropriedade; this.nomePropriedade = nomePropriedade; } public Integer getIdPropriedade() { return idPropriedade; } 119 public void setIdPropriedade(Integer idPropriedade) { this.idPropriedade = idPropriedade; } public String getNomePropriedade() { return nomePropriedade; } public void setNomePropriedade(String nomePropriedade) { this.nomePropriedade = nomePropriedade; } public String getLocalidade() { return localidade; } public void setLocalidade(String localidade) { this.localidade = localidade; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getAreaArrendada() { return areaArrendada; } public void setAreaArrendada(String areaArrendada) { this.areaArrendada = areaArrendada; } public String getSituacao() { return situacao; } 120 public void setSituacao(String situacao) { this.situacao = situacao; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Produtor getIdProdutor() { return idProdutor; } public void setIdProdutor(Produtor idProdutor) { this.idProdutor = idProdutor; } @XmlTransient public Collection<Gleba> getGlebaCollection() { return glebaCollection; } public void setGlebaCollection(Collection<Gleba> glebaCollection) { this.glebaCollection = glebaCollection; } @Override public int hashCode() { int hash = 0; 121 hash += (idPropriedade != null ? idPropriedade.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Propriedade)) { return false; } Propriedade other = (Propriedade) object; if ((this.idPropriedade == null && other.idPropriedade != null) || (this.idPropriedade != null && !this.idPropriedade.equals(other.idPropriedade))) { return false; } return true; } @Override public String toString() { return "entidades.Propriedade[ idPropriedade=" + idPropriedade + " ]"; } } Classe Safra.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; 122 import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "safra") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Safra.findAll", query = "SELECT s FROM Safra s"), @NamedQuery(name = "Safra.findByIdSafra", query = "SELECT s FROM Safra s WHERE s.idSafra = :idSafra"), @NamedQuery(name = "Safra.findByDescricao", query = "SELECT s FROM Safra s WHERE s.descricao = :descricao"), @NamedQuery(name = "Safra.findByCondicao", query = "SELECT s FROM Safra s WHERE s.condicao = :condicao"), @NamedQuery(name = "Safra.findByMascinicio", query = "SELECT s FROM Safra s WHERE s.mascinicio = :mascinicio"), @NamedQuery(name = "Safra.findByMascfim", query = "SELECT s FROM Safra s WHERE s.mascfim = :mascfim"), @NamedQuery(name = "Safra.findBySituacao", query = "SELECT s FROM Safra s WHERE s.situacao = :situacao"), @NamedQuery(name = "Safra.findByFlagSincronizacao", query = "SELECT s FROM Safra s WHERE s.flagSincronizacao = :flagSincronizacao")}) public class Safra implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_safra") private Integer idSafra; @Size(max = 40) @Column(name = "descricao") private String descricao; @Size(max = 1) @Column(name = "condicao") private String condicao; @Size(max = 40) @Column(name = "mascinicio") private String mascinicio; @Size(max = 40) @Column(name = "mascfim") private String mascfim; @Size(max = 40) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; 123 @JoinColumn(name = "id_cultura", referencedColumnName = "id_cultura") @ManyToOne(optional = false) private Cultura idCultura; @JoinColumn(name = "id_anoagricola", referencedColumnName = "id_anoagricola") @ManyToOne(optional = false) private Anoagricola idAnoagricola; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idSafra") private Collection<Planejamento> planejamentoCollection; public Safra() { } public Safra(Integer idSafra) { this.idSafra = idSafra; } public Integer getIdSafra() { return idSafra; } public void setIdSafra(Integer idSafra) { this.idSafra = idSafra; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public String getCondicao() { return condicao; } public void setCondicao(String condicao) { this.condicao = condicao; } 124 public String getMascinicio() { return mascinicio; } public void setMascinicio(String mascinicio) { this.mascinicio = mascinicio; } public String getMascfim() { return mascfim; } public void setMascfim(String mascfim) { this.mascfim = mascfim; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Cultura getIdCultura() { return idCultura; } public void setIdCultura(Cultura idCultura) { this.idCultura = idCultura; } 125 public Anoagricola getIdAnoagricola() { return idAnoagricola; } public void setIdAnoagricola(Anoagricola idAnoagricola) { this.idAnoagricola = idAnoagricola; } @XmlTransient public Collection<Planejamento> getPlanejamentoCollection() { return planejamentoCollection; } public void setPlanejamentoCollection(Collection<Planejamento> planejamentoCollection) { this.planejamentoCollection = planejamentoCollection; } @Override public int hashCode() { int hash = 0; hash += (idSafra != null ? idSafra.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Safra)) { return false; } Safra other = (Safra) object; if ((this.idSafra == null && other.idSafra != null) || (this.idSafra != null && !this.idSafra.equals(other.idSafra))) { return false; } return true; } @Override public String toString() { return "entidades.Safra[ idSafra=" + idSafra + " ]"; }} 126 Classe Tecnico.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "tecnico") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Tecnico.findAll", query = "SELECT t FROM Tecnico t"), @NamedQuery(name = "Tecnico.findByIdTecnico", query = "SELECT t FROM Tecnico t WHERE t.idTecnico = :idTecnico"), @NamedQuery(name = "Tecnico.findByTecnico", query = "SELECT t FROM Tecnico t WHERE t.tecnico = :tecnico"), @NamedQuery(name = "Tecnico.findByCrea", query = "SELECT t FROM Tecnico t WHERE t.crea = :crea"), @NamedQuery(name = "Tecnico.findByFlagSincronizacao", query = "SELECT t FROM Tecnico t WHERE t.flagSincronizacao = :flagSincronizacao")}) public class Tecnico implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_tecnico") private Integer idTecnico; @Size(max = 40) @Column(name = "tecnico") private String tecnico; @Basic(optional = false) @NotNull 127 @Size(min = 1, max = 15) @Column(name = "crea") private String crea; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(mappedBy = "idTecnico") private Collection<Produtor> produtorCollection; public Tecnico() { } public Tecnico(Integer idTecnico) { this.idTecnico = idTecnico; } public Tecnico(Integer idTecnico, String crea) { this.idTecnico = idTecnico; this.crea = crea; } public Integer getIdTecnico() { return idTecnico; } public void setIdTecnico(Integer idTecnico) { this.idTecnico = idTecnico; } public String getTecnico() { return tecnico; } public void setTecnico(String tecnico) { this.tecnico = tecnico; } public String getCrea() { return crea; } 128 public void setCrea(String crea) { this.crea = crea; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Produtor> getProdutorCollection() { return produtorCollection; } public void setProdutorCollection(Collection<Produtor> produtorCollection) { this.produtorCollection = produtorCollection; } @Override public int hashCode() { int hash = 0; hash += (idTecnico != null ? idTecnico.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Tecnico)) { return false; } Tecnico other = (Tecnico) object; if ((this.idTecnico == null && other.idTecnico != null) || (this.idTecnico != null && !this.idTecnico.equals(other.idTecnico))) { return false; } return true; 129 } @Override public String toString() { return "entidades.Tecnico[ idTecnico=" + idTecnico + " ]"; } } Classe Variedades.java package entidades; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "variedades") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Variedades.findAll", query = "SELECT v FROM Variedades v"), @NamedQuery(name = "Variedades.findByIdVariedades", query = "SELECT v FROM Variedades v WHERE v.idVariedades = :idVariedades"), @NamedQuery(name = "Variedades.findByDescricao", query = "SELECT v FROM Variedades v WHERE v.descricao = :descricao"), @NamedQuery(name = "Variedades.findByPopfinal", query = "SELECT v FROM Variedades v WHERE v.popfinal = :popfinal"), @NamedQuery(name = "Variedades.findBySituacao", query = "SELECT v FROM Variedades v WHERE v.situacao = :situacao"), @NamedQuery(name = "Variedades.findByFlagSincronizacao", query = "SELECT v FROM Variedades v WHERE v.flagSincronizacao = :flagSincronizacao")}) 130 public class Variedades implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_variedades") private Integer idVariedades; @Size(max = 30) @Column(name = "descricao") private String descricao; @Column(name = "popfinal") private Integer popfinal; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @JoinColumn(name = "id_cultura", referencedColumnName = "id_cultura") @ManyToOne private Cultura idCultura; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idVariedades") private Collection<Variedadesgleba> variedadesglebaCollection; public Variedades() { } public Variedades(Integer idVariedades) { this.idVariedades = idVariedades; } public Integer getIdVariedades() { return idVariedades; } public void setIdVariedades(Integer idVariedades) { this.idVariedades = idVariedades; } public String getDescricao() { 131 return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Integer getPopfinal() { return popfinal; } public void setPopfinal(Integer popfinal) { this.popfinal = popfinal; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } public Cultura getIdCultura() { return idCultura; } public void setIdCultura(Cultura idCultura) { this.idCultura = idCultura; } @XmlTransient 132 public Collection<Variedadesgleba> getVariedadesglebaCollection() { return variedadesglebaCollection; } public void setVariedadesglebaCollection(Collection<Variedadesgleba> variedadesglebaCollection) { this.variedadesglebaCollection = variedadesglebaCollection; } @Override public int hashCode() { int hash = 0; hash += (idVariedades != null ? idVariedades.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Variedades)) { return false; } Variedades other = (Variedades) object; if ((this.idVariedades == null && other.idVariedades != null) || (this.idVariedades != null && !this.idVariedades.equals(other.idVariedades))) { return false; } return true; } @Override public String toString() { return "entidades.Variedades[ idVariedades=" + idVariedades + " ]"; } } Classe Variedadegleba.java package entidades; 133 import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @Entity @Table(name = "variedadesgleba") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Variedadesgleba.findAll", query = "SELECT v FROM Variedadesgleba v"), @NamedQuery(name = "Variedadesgleba.findByIdVariedadesgleba", query = "SELECT v FROM Variedadesgleba v WHERE v.idVariedadesgleba = :idVariedadesgleba"), @NamedQuery(name = "Variedadesgleba.findByQntaplic", query = "SELECT v FROM Variedadesgleba v WHERE v.qntaplic = :qntaplic"), @NamedQuery(name = "Variedadesgleba.findByEspalinha", query = "SELECT v FROM Variedadesgleba v WHERE v.espalinha = :espalinha"), @NamedQuery(name = "Variedadesgleba.findByPmetrolinear", query = "SELECT v FROM Variedadesgleba v WHERE v.pmetrolinear = :pmetrolinear"), @NamedQuery(name = "Variedadesgleba.findByPopulhec", query = "SELECT v FROM Variedadesgleba v WHERE v.populhec = :populhec"), @NamedQuery(name = "Variedadesgleba.findByDtinicio", query = "SELECT v FROM Variedadesgleba v WHERE v.dtinicio = :dtinicio"), @NamedQuery(name = "Variedadesgleba.findByDtfinal", query = "SELECT v FROM Variedadesgleba v WHERE v.dtfinal = :dtfinal"), @NamedQuery(name = "Variedadesgleba.findBySituacao", query = "SELECT v FROM Variedadesgleba v WHERE v.situacao = :situacao"), @NamedQuery(name = "Variedadesgleba.findByFlagSincronizacao", query = "SELECT v FROM Variedadesgleba v WHERE v.flagSincronizacao = :flagSincronizacao")}) public class Variedadesgleba implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id_variedadesgleba") private Integer idVariedadesgleba; @Column(name = "qntaplic") private Integer qntaplic; @Column(name = "espalinha") 134 private Integer espalinha; @Column(name = "pmetrolinear") private Integer pmetrolinear; @Column(name = "populhec") private Integer populhec; @Size(max = 10) @Column(name = "dtinicio") private String dtinicio; @Size(max = 10) @Column(name = "dtfinal") private String dtfinal; @Size(max = 1) @Column(name = "situacao") private String situacao; @Size(max = 1) @Column(name = "flag_sincronizacao") private String flagSincronizacao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idVariedadesgleba") private Collection<Cultivares> cultivaresCollection; @JoinColumn(name = "id_variedades", referencedColumnName = "id_variedades") @ManyToOne(optional = false) private Variedades idVariedades; @JoinColumn(name = "id_itemplanj", referencedColumnName = "id_itemplanj") @ManyToOne private Itemplanj idItemplanj; public Variedadesgleba() { } public Variedadesgleba(Integer idVariedadesgleba) { this.idVariedadesgleba = idVariedadesgleba; } public Integer getIdVariedadesgleba() { return idVariedadesgleba; } public void setIdVariedadesgleba(Integer idVariedadesgleba) { this.idVariedadesgleba = idVariedadesgleba; } 135 public Integer getQntaplic() { return qntaplic; } public void setQntaplic(Integer qntaplic) { this.qntaplic = qntaplic; } public Integer getEspalinha() { return espalinha; } public void setEspalinha(Integer espalinha) { this.espalinha = espalinha; } public Integer getPmetrolinear() { return pmetrolinear; } public void setPmetrolinear(Integer pmetrolinear) { this.pmetrolinear = pmetrolinear; } public Integer getPopulhec() { return populhec; } public void setPopulhec(Integer populhec) { this.populhec = populhec; } public String getDtinicio() { return dtinicio; } public void setDtinicio(String dtinicio) { this.dtinicio = dtinicio; } 136 public String getDtfinal() { return dtfinal; } public void setDtfinal(String dtfinal) { this.dtfinal = dtfinal; } public String getSituacao() { return situacao; } public void setSituacao(String situacao) { this.situacao = situacao; } public String getFlagSincronizacao() { return flagSincronizacao; } public void setFlagSincronizacao(String flagSincronizacao) { this.flagSincronizacao = flagSincronizacao; } @XmlTransient public Collection<Cultivares> getCultivaresCollection() { return cultivaresCollection; } public void setCultivaresCollection(Collection<Cultivares> cultivaresCollection) { this.cultivaresCollection = cultivaresCollection; } public Variedades getIdVariedades() { return idVariedades; } public void setIdVariedades(Variedades idVariedades) { this.idVariedades = idVariedades; 137 } public Itemplanj getIdItemplanj() { return idItemplanj; } public void setIdItemplanj(Itemplanj idItemplanj) { this.idItemplanj = idItemplanj; } @Override public int hashCode() { int hash = 0; hash += (idVariedadesgleba != null ? idVariedadesgleba.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Variedadesgleba)) { return false; } Variedadesgleba other = (Variedadesgleba) object; if ((this.idVariedadesgleba == null && other.idVariedadesgleba != null) || (this.idVariedadesgleba != null && !this.idVariedadesgleba.equals(other.idVariedadesgleba))) { return false; } return true; } @Override public String toString() { return "entidades.Variedadesgleba[ idVariedadesgleba=" + idVariedadesgleba + " ]"; } } 138 APÊNDICE C – Classes do Pacote Recursos Classe AnoagricolaFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Anoagricola; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.anoagricola") public class AnoagricolaFacadeREST extends AbstractFacade<Anoagricola> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public AnoagricolaFacadeREST() { super(Anoagricola.class); } @POST @Override @Consumes("application/json") public void create(Anoagricola entity) { super.create(entity); } @PUT 139 @Path("{id}") @Consumes( "application/json") public void edit(@PathParam("id") Integer id, Anoagricola entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Anoagricola find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Anoagricola> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Anoagricola> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } 140 @Override protected EntityManager getEntityManager() { return em; } } Classe CidadeFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Cidade; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.cidade") public class CidadeFacadeREST extends AbstractFacade<Cidade> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public CidadeFacadeREST() { super(Cidade.class); } @POST @Override @Consumes("application/json") 141 public void create(Cidade entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Cidade entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Cidade find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces( "application/json") public List<Cidade> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Cidade> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET 142 @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe CultivaresFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Cultivares; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.cultivares") public class CultivaresFacadeREST extends AbstractFacade<Cultivares> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public CultivaresFacadeREST() { super(Cultivares.class); 143 } @POST @Override @Consumes("application/json") public void create(Cultivares entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Cultivares entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Cultivares find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Cultivares> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") 144 public List<Cultivares> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe CulturaFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Cultura; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.cultura") 145 public class CulturaFacadeREST extends AbstractFacade<Cultura> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public CulturaFacadeREST() { super(Cultura.class); } @POST @Override @Consumes("application/json") public void create(Cultura entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Cultura entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Cultura find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Cultura> findAll() { return super.findAll(); 146 } @GET @Path("{from}/{to}") @Produces("application/json") public List<Cultura> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe EspeciemFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Especiem; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; 147 import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.especiem") public class EspeciemFacadeREST extends AbstractFacade<Especiem> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public EspeciemFacadeREST() { super(Especiem.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Especiem entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Especiem entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Especiem find(@PathParam("id") Integer id) { return super.find(id); } 148 @GET @Override @Produces({"application/xml", "application/json"}) public List<Especiem> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Especiem> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe EstadioFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Estadio; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; 149 import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.estadio") public class EstadioFacadeREST extends AbstractFacade<Estadio> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public EstadioFacadeREST() { super(Estadio.class); } @POST @Override @Consumes("application/json") public void create(Estadio entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Estadio entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") 150 @Produces("application/json") public Estadio find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Estadio> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Estadio> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe EventoscFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Eventosc; 151 import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.eventosc") public class EventoscFacadeREST extends AbstractFacade<Eventosc> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public EventoscFacadeREST() { super(Eventosc.class); } @POST @Override @Consumes("application/json") public void create(Eventosc entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Eventosc entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { 152 super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Eventosc find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Eventosc> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Eventosc> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } 153 Classe GlebaFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Gleba; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.gleba") public class GlebaFacadeREST extends AbstractFacade<Gleba> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public GlebaFacadeREST() { super(Gleba.class); } @POST @Override @Consumes("application/json") public void create(Gleba entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Gleba entity) { 154 super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Gleba find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Gleba> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Gleba> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { 155 return em; } } Classe GlebasvinculadasFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Glebasvinculadas; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.glebasvinculadas") public class GlebasvinculadasFacadeREST extends AbstractFacade<Glebasvinculadas> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public GlebasvinculadasFacadeREST() { super(Glebasvinculadas.class); } @POST @Override @Consumes("application/json") public void create(Glebasvinculadas entity) { super.create(entity); 156 } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Glebasvinculadas entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Glebasvinculadas find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Glebasvinculadas> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Glebasvinculadas> findRange(@PathParam("from") @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") Integer from, 157 public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe ItemplanjFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Itemplanj; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.itemplanj") public class ItemplanjFacadeREST extends AbstractFacade<Itemplanj> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public ItemplanjFacadeREST() { super(Itemplanj.class); } 158 @POST @Override @Consumes( "application/json") public void create(Itemplanj entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Itemplanj entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Itemplanj find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces( "application/json") public List<Itemplanj> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Itemplanj> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); 159 } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe LeiturasFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Leituras; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.leituras") public class LeiturasFacadeREST extends AbstractFacade<Leituras> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; 160 public LeiturasFacadeREST() { super(Leituras.class); } @POST @Override @Consumes("application/json") public void create(Leituras entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Leituras entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Leituras find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Leituras> findAll() { return super.findAll(); } @GET 161 @Path("{from}/{to}") @Produces("application/json") public List<Leituras> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe MonitoramentoFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Monitoramento; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; 162 @Stateless @Path("entidades.monitoramento") public class MonitoramentoFacadeREST extends AbstractFacade<Monitoramento> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public MonitoramentoFacadeREST() { super(Monitoramento.class); } @POST @Override @Consumes("application/json") public void create(Monitoramento entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Monitoramento entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") public Monitoramento find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override 163 @Produces("application/json") public List<Monitoramento> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Monitoramento> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe PlanejamentoFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Planejamento; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; 164 import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.planejamento") public class PlanejamentoFacadeREST extends AbstractFacade<Planejamento> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public PlanejamentoFacadeREST() { super(Planejamento.class); } @POST @Override @Consumes("application/json") public void create(Planejamento entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Planejamento entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces("application/json") 165 public Planejamento find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Planejamento> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Planejamento> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe PontoamostraFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Pontoamostra; import java.util.List; 166 import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.pontoamostra") public class PontoamostraFacadeREST extends AbstractFacade<Pontoamostra> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public PontoamostraFacadeREST() { super(Pontoamostra.class); } @POST @Override @Consumes("application/json") public void create(Pontoamostra entity) { super.create(entity); } @PUT @Path("{id}") @Consumes("application/json") public void edit(@PathParam("id") Integer id, Pontoamostra entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); 167 } @GET @Path("{id}") @Produces("application/json") public Pontoamostra find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces("application/json") public List<Pontoamostra> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces("application/json") public List<Pontoamostra> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe ProdutoFacadeREST.java 168 package recursos; import config.AbstractFacade; import entidades.Produto; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.produto") public class ProdutoFacadeREST extends AbstractFacade<Produto> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public ProdutoFacadeREST() { super(Produto.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Produto entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Produto entity) { super.edit(entity); } 169 @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Produto find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Produto> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Produto> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } 170 } Classe ProdutorFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Produtor; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.produtor") public class ProdutorFacadeREST extends AbstractFacade<Produtor> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public ProdutorFacadeREST() { super(Produtor.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Produtor entity) { super.create(entity); } @PUT 171 @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Produtor entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Produtor find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Produtor> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Produtor> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } 172 @Override protected EntityManager getEntityManager() { return em; } } Classe PropriedadeFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Propriedade; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.propriedade") public class PropriedadeFacadeREST extends AbstractFacade<Propriedade> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public PropriedadeFacadeREST() { super(Propriedade.class); } @POST @Override 173 @Consumes({"application/xml", "application/json"}) public void create(Propriedade entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Propriedade entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Propriedade find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Propriedade> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Propriedade> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } 174 @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe SafraFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Safra; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.safra") public class SafraFacadeREST extends AbstractFacade<Safra> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; 175 public SafraFacadeREST() { super(Safra.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Safra entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Safra entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Safra find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Safra> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") 176 @Produces({"application/xml", "application/json"}) public List<Safra> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe TecnicoFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Tecnico; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; 177 @Stateless @Path("entidades.tecnico") public class TecnicoFacadeREST extends AbstractFacade<Tecnico> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public TecnicoFacadeREST() { super(Tecnico.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Tecnico entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Tecnico entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Tecnico find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) 178 public List<Tecnico> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Tecnico> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe VariedadesFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Variedades; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; 179 import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.variedades") public class VariedadesFacadeREST extends AbstractFacade<Variedades> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public VariedadesFacadeREST() { super(Variedades.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Variedades entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Variedades entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Variedades find(@PathParam("id") Integer id) { 180 return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Variedades> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Variedades> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Classe VariedadesglebaFacadeREST.java package recursos; import config.AbstractFacade; import entidades.Variedadesgleba; import java.util.List; import javax.ejb.Stateless; 181 import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Stateless @Path("entidades.variedadesgleba") public class VariedadesglebaFacadeREST extends AbstractFacade<Variedadesgleba> { @PersistenceContext(unitName = "AgroMobileWSPU") private EntityManager em; public VariedadesglebaFacadeREST() { super(Variedadesgleba.class); } @POST @Override @Consumes({"application/xml", "application/json"}) public void create(Variedadesgleba entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({"application/xml", "application/json"}) public void edit(@PathParam("id") Integer id, Variedadesgleba entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } 182 @GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Variedadesgleba find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({"application/xml", "application/json"}) public List<Variedadesgleba> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Variedadesgleba> findRange(@PathParam("from") @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } Integer from,