lunes, 19 de diciembre de 2016

Como Generar Entidades a partir del Modelo

Después de generar una aplicación con JHipster, esta se encontrá vacia de contenido a no ser que generemos entidades, tendrá la funcinalidad básica, control de acceso, autentificación y autorización, tendrá implementada la internacionalización, etc. pero no podremos hacer mucho más porque no contamos con entidades.

Para generar entidades tenemos dos opciones:

Generar las entidades una a una.

Con el siguiente comando:
yo jhipster:entity EntityName
Donde EntityName es el nombre de la entidad que queremos generar,  jhipster nos preguntará si queremos añadir campos a esta entidad, el nombre del campo, el tipo, si queremos validaciones básicas sobre este campo, como que sea obligatorio, o una longitud mínima, si queremos relaciones con otras entidades.

En lo que a la interfaz de usuario se refiere nos preguntará si queremos paginación y de que tipo.

Y en lo que a la arquitectura se refiere nos preguntará si queremos crear un DTO (Data transefer Object, o Objeto de Transferencia de Datos) o si queremos usar la entidad directamente.

Finalmente nos informará de los ficheros que genera.


~$ yo jhipster:entity entity
The entity entity is being created.

Generating field #1
? Do you want to add a field to your entity? Yes
? What is the name of your field? field1
? What is the type of your field? String
? Do you want to add validation rules to your field? Yes
? Which validation rules do you want to add? Required, Minimum length
? What is the minimum length of your field? 10
================= Entity =================
Fields
field1 (String) required minlength='10'

Generating field #2
? Do you want to add a field to your entity? No
================= Entity =================
Fields
field1 (String) required minlength='10'

Generating relationships to other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? user
? What is the name of the relationship? user
? What is the type of the relationship? one-to-one
================= Entity =================
Fields
field1 (String) required minlength='10'
Relationships
user (User) one-to-one

Generating relationships to other entities
? Do you want to add a relationship to another entity? No
================= Entity =================
Fields
field1 (String) required minlength='10'
Relationships
user (User) one-to-one


? Do you want to use a Data Transfer Object (DTO)? No, use the entity directly
? Do you want to use separate service class for your business logic? No, the REST controller should use the repository
directly
? Do you want pagination on your entity? Yes, with a simple pager
Everything is configured, generating the entity...
   create .jhipster\Entity.json
   create src\main\resources\config\liquibase\changelog\20161208212848_added_entity_Entity.xml
   create src\main\resources\config\liquibase\changelog\20161208212848_added_entity_constraints_Entity.xml
 conflict src\main\resources\config\liquibase\master.xml
? Overwrite src\main\resources\config\liquibase\master.xml? overwrite this and all others
    force src\main\resources\config\liquibase\master.xml
   create src\main\java\com\jlg\basketshop\domain\Entity.java
   create src\main\java\com\jlg\basketshop\repository\EntityRepository.java
   create src\main\java\com\jlg\basketshop\repository\search\EntitySearchRepository.java
   create src\main\java\com\jlg\basketshop\web\rest\EntityResource.java
    force src\main\resources\ehcache.xml
   create src\main\webapp\app\entities\entity\entities.html
   create src\main\webapp\app\entities\entity\entity-detail.html
   create src\main\webapp\app\entities\entity\entity-dialog.html
   create src\main\webapp\app\entities\entity\entity-delete-dialog.html
    force src\main\webapp\app\layouts\navbar\navbar.html
   create src\main\webapp\app\entities\entity\entity.state.js
   create src\main\webapp\app\entities\entity\entity.controller.js
   create src\main\webapp\app\entities\entity\entity-dialog.controller.js
   create src\main\webapp\app\entities\entity\entity-delete-dialog.controller.js
   create src\main\webapp\app\entities\entity\entity-detail.controller.js
   create src\main\webapp\app\entities\entity\entity.service.js
   create src\main\webapp\app\entities\entity\entity.search.service.js
   create src\main\webapp\i18n\en\entity.json
    force src\main\webapp\i18n\en\global.json
   create src\main\webapp\i18n\es\entity.json
    force src\main\webapp\i18n\es\global.json
   create src\test\javascript\spec\app\entities\entity\entity-detail.controller.spec.js
   create src\test\java\com\jlg\basketshop\web\rest\EntityResourceIntTest.java
   create src\test\gatling\simulations\EntityGatlingTest.scala
Running gulp Inject to add javascript to index

Generar todas las entidades y sus relaciones de golpe a partir de una representación del modelo.

La otra forma de generar las entidades, es utilizar jdl-studio para diseñar el modelo, entidades y relaciones, exportar ese modelo a un fichero en formato json, y después utilizar ese fichero como entrada para generar todas las entidades de una sóla vez.




Este este es el diagrama ejemplo que podemos encontrar en jdl- studio.

A mi esta herramienta me gusta bastante, a medida que diseñas las entidades mediante la edición de texto, puedes ver la representación en la parte de la derecha, por ejemplo, la entidad Empleado tiene la siguiente pinta:

entity Employee {
/**
* The firstname attribute.
*/
firstName String,
lastName String,
email String,
phoneNumber String,
hireDate ZonedDateTime,
salary Long,
commissionPct Long
}

Una vez que estamos contentos con el modelo, sólo tenemos que descargar el fichero y utilizar el comando:

yo jhipster:import-jdl jhipster-jdl.jh

En este caso he llamado al fichero con el modelo, "jhipster-jdl.jh".




jueves, 1 de diciembre de 2016

Video Demostración de JHipster


En este vídeo muestro la potencia de JHipster, como generar una aplicación con tecnologías a medida. En concreto en este vídeo se utilizan:

  • OAuth2
  • H2 y MySQL BBDD
  • Hibernate
  • Spring y Spring Boot
  • Gradle
  • Saas y LibSaas
  • Gatling
  • Angularjs
  • gulp


















Posteriormente se crea el modelo utilizando como entrada un fichero donde especifican las entidades que se quieren generar, pero ya hablaremos de este proceso en sucesivos post.

Y para finalizar se hace una pequeña demostración de la aplicación generada.

domingo, 20 de noviembre de 2016

JHipster



En pocas palabras, JHipster es un generador de Aplicaciones web con Angularjs en la parte del cliente y Sprint Framework en la parte del servidor, en el pasado he trabajado con Sprint, pero no con Angularjs, y no tengo que deciros que Angularjs es muy popular cuando se trata de desarrollar aplicaciones web de una sóla página, esto es lo que principalmente hace de JHipster un generador de código muy interesante, en particular si lo comparamos con otros generadores de código para Sprint como "Sprint Initializr".

Pero empecemos por el principio.



¿Qué es un generador de código?

Pues bien, en un generador de código especificamos una serie de parámetros, como las technologías que queremos utilizar en la aplicación, especificamos el modelo de datos, pulsamos un botón, y el generador se encarga magicamente de producir una aplicación entera para nosotros.










Como es de esperar esta aplicación es muy genérica y necesita customización, y aquí entramos en uno de los problemas más habituales que tienen este tipo de herramientas y donde se nos ocuren la típicas preguntas:


  • ¿Como de fácil es luego customizar estas aplicaciones?
  • ¿Si cambiamos el modelo, tenemos que volver a generar la aplicación?
  • ¿Es posible generarar sólo una parte de la aplicacion?


La mejor forma de responder estas preguntas es utilizar Jhipter en un pequeño proyecto, y esa es mi intención para el próximo post.

¿Qué generará JHipster por mi?

Entre otros cosas generará:


  • CRUD para cada una de las entidades especificadas.
  • Sistema de autorización y autentificación, con varios usuarios por defecto.
  • Frontend application with Angularjs y Bootstrap.





miércoles, 11 de julio de 2012

Play Framework

Ayer estuve probando el Framework para desarrollo de aplicaciones web Play, es un framework open source escrito en Scala y Java, ideado para construir aplicaciones web de una forma rápida y eficiente, se basa en el archiconocido patrón de diseño Modelo-Vista-Controlador, el cual por cierto, se puede ver claramente reflejado en la estructura básica de un proyecto Play.

Mi primer contacto, como no puede ser de otra manera, fue seguir el tutorial que se ofrece en la página principal de Play, este tutorial está disponible tanto para Java como para Scala, mi primera intención fue seguirlo en Scala ya que en su día me interesé por este lenguaje de programación, pero dado que no tenía mucho tiempo para evaluarlo, finalmente decidí seguirlo en Java, lenguaje en el cual me encuentro más confortable.

La primera impresión fue muy agradable, Play proporciona herramientas para trabajar dentro de un Entorno Integrado de Desarrollo como puede ser Eclipse, lo cual todo sea dicho suele ser en general mi primera intención, pero lo cierto es que no es para nada necesario, este framework esta preparado de tal forma que es muy sencillo crear una aplicación sólo con un editor de texto, arrancando el framework en modo comando desde una consola, con un editor de texto y un navegador se puede trabajar de forma autónoma, para los que venimos del mundo de los servidores de aplicaciones J2EE es especialmente agradable no tener que preocuparse por actualizar los cambios en la aplicación en el servidor, con guardar los cambios en el editor de texto y refrescar el navegador es suficiente. Los errores, como errores de sintaxis o configuración, aparecen en el navegador, no es necesario buscalos en la consola.

Lo cierto es que siguiendo el tutorial se construye de forma rápida y sencilla una aplicación de tipo CRUD, en este caso una lista de tareas por hacer, al final del tutorial se explica una forma de subir la aplicación a producción mediante el sistema de control de versiones GIT, y la infraestructura para aplicaciones en la nube, Heroku.

Para la persistencia de datos utiliza un Sistema gestor de Base de Datos en Memoria, la configuración de este parece muy sencilla y no creo que cambiar a otro Proveedor sea muy difícil ya que todo parece muy estándar, sólo es necesario cambiar unos parámetros en un fichero de configuración.

Conclusiones.

He tenido buenas sensaciones con este framework, parece bastante orientado a REST y mi intención es seguir su evolución, hoy en día a mi no me sirve porque hay un par de funcionalidades que ha perdido de la versión 1.* a la 2.0.2, que es la actual, como es poder exportar el proyecto a un fichero .war, que es justo lo que satisfaría mis necesidades ahora mismo.

viernes, 16 de marzo de 2012

Balance entre el aspecto de una web y el posicionamiento en buscadores y accesibilidad

Como se dice popularmente, "Más vale una imagen que cien palabras", "El amor entra por los ojos", "La primera impresión es la que cuenta", y es verdad que si queremos fidelizar visitas en nuestra web es muy importante que tenga un aspecto atractivo, en otras palabras, que tenga una apariencia profesional, que de la impresión de que se está cuidando el componente visual, así los visitantes pensarán que han entrado en un sitio serio, agradable, y la posibilidad de que vuelvan será mayor.

Pero para que un navegante vuelva a una web esta no sólo debe ser agradable, debe ofrecerle un servicio útil y de calidad, introduciendo componentes visuales, "gadgets", utilizando librerías Web 2.0, AJAX, etc, podemos alcanzar este objetivo, pero debemos tener cuidado desde mi punto de vista principalmente en dos aspectos:

Por un lado que nuestra web sea accesible, que se pueda seguir visitando desde todo tipo de dispositivos y navegadores, si no es así, el efecto será contraproducente, no fidelizaremos visitas sino más bien todo lo contrario.

Y por otra parte que añadir este tipo de componentes no penalize nuestro posicionamiento en buscadores, existe una serie de recomendaciones SEO "Search Engine Optimization", que en muchos casos no se llevan bien con este tipo de tecnologías, ya que hacen un uso intensivo de javaScript, y de poco sirve que un sitio sea muy vistoso si nadie lo visita porque el mundo no sabe que existe.

viernes, 13 de enero de 2012

¿Como asegurar que mi aplicación web es accesible?

Recientemente estoy impartiendo un curso del Ministerio y de la Comunidad Económica Europea sobre desarrollo de aplicaciones Web con J2EE y software libre, uno de los temas trata sobre accesibilidad, la pregunta más frecuente es "¿Como asegurar que mi aplicación web es accesible?", según la wikipedia La accesibilidad: es el grado en el que todas las personas pueden utilizar un objeto, visitar un lugar o acceder a un servicio, independientemente de sus capacidades técnicas, cognitivas o físicas, resumiendo es como preparo mi aplicación para el mayor rango de usuarios posible, incluyendo los que tienen discapacidades, para las aplicaciones web el W3C (World Wide Web Consortium) ofrece pautas específicas para asegurar este tipo de accesiblidad, en concreto existe un grupo de trabajo que se encarga de este tema WAI (Web Accessibility Initiative, Iniciativa de Accesibilidad Web), y puede que la forma más rápida de entrar en contacto con estos conceptos es ir directamente a una guía rápida que ofrece WAI donde existe una serie de pautas que se puede utilizar como lista de chequeo sobre la aplicación.

jueves, 5 de enero de 2012

Editores de texto enriquecido y Cross Site Scripting

Recientemente he tenido que incorporar un editor de texto enriquecido a una aplicación, www.tabladequesos.es, después de investigar entre las diferentes opciones que encontré, me decidí por Tinyemc, seguramente el editor de texto enriquecido más extendido entre los desarrolladores, se caracteriza por ser un edito WYSIWYG, que traducido, el acrónimo viene a significar lo que ves es lo que tienes, esto quiere decir que tu editas el texto como lo editarías en una aplicación tipo openoffice word y el propio editor lo traduce a HTML de forma transparente para el usuario, en mi caso luego quiero mostrar este texto dentro de una página generada mediante JSF (Java Server Faces), la primera opción es mostrarlo en una etiqueta de texto pero el resultado es que muestra el texto HTML en crudo, como si lo viésemos en un editor texto, sin que esté interpretado, para conseguir que se interprete como HTML es necesario poner un atributo de la etiqueta h:outputText escape="false", en este momento es cuando se me empezaron a encender en la cabeza las señales de alarma, este detalle hace que la aplicación sea vulnerable a los ataques de XSS (Cross Site Scripting), que no es ninguna tontería ya que según OWASP, que desde mi punto de vista es la biblia de la seguridad en aplicaciones web, es el segundo riesgo más importante en este tipo de desarrollos (ver top 10), indagué un poco más y vi que desde OWASP ofrecían una solución que afortunadamente estaba disponible en java, es un proyecto alojado en google code que se llama antisamy, básicamente consiste en un API y un fichero de configuración XML que es en el que se basa el análisis de código HTML para ver si es malicioso o no, en la zona de descarga se ofrecen varios de estos ficheros para que el usuario seleccione el que más se ajuste a sus necesidades, a día de hoy se dispone de cinco ficheros, entre los que destacan los de ebay y myspace, y como no el de tinymce, pues va a ser verdad que tinymce está muy extendido.