Java Expert....Java/Open Source Addict

Redes Sociales

twitterlinkedinrss feedemail youtube

Subscribete

Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

martes, 3 de agosto de 2021

How to resolve errors related with JAXBException


Hello friends, when you have these errors related to JAXBException and you are using java version 9,10 o greater.



You can download the libraries (jars) o use Java 8. Because the JAXB API classes only are available in Java 6/7/8 but no in future Java versions. Since Java 9 they are part of the JEE API.

If you use Linux, you should make sure you use the correct version of the java. For this, you must select the version with command alternatives --config java


Later to select the version, you can use the java -version command, to verify the java version.

domingo, 11 de octubre de 2020

Configure Payara Server in Eclipse IDE


Hello friends, in this opportunity I will show how to install the Payara Tools in Eclipse to work with Payara Server Application. Before to begin is important say you, that  I am working with: Eclipse IDE 2019 and Payara 5.20. Once said it, let me begin.

1.- First, we need to install the plugin Payara Tools from Eclipse Marketplace from  Help--> Eclipse Marketplace option. Click the Install button, accept the terms of the license agreements, and click the Finish button. Once installed, the eclipse needs to restart to apply the changes.



2.- Before to create a new Payara server instance, we need to create a Payara Runtime. To do this, we need to do the following:

  • Select the Windows-->Preferences-->Runtime Environments option and click the Add button to configure the Payara Runtime


  • Select the Payara Runtime Environment and click the Next button.
  • Configure the Payara and Java Location and click the Finish button. 




3.- Finally, we need to create a Payara Server Instance. To do this, we need to do the following:

  • Select the Windows-->Show View --> Server option. Once opened the view, right-click on it and select New --> Server option.


  • Select the Server type, in this case, we need to select Payara and click Next.


  • Configure the Payara Server properties, we use the default options, but you can configure the other domain, credentials, and other parameters according to your needs. Finally, click Finish and the Payara Server are ready to work with it.


I hope, that the post is useful for you. Don't forget to share, comment on it. Greetings and bless you.

jueves, 24 de septiembre de 2020

Install Maven Archetype and Create Project Jakarta EE 8


Hello friends, in this opportunity I show how to install a Maven Archetype and create a project from it. I will use the JakartaEE8 Archetype, we need to do the following.

1.- First, we need to download and decompress the archetype from this link. You can choose the zip or tar.gz format.


2.- Once unzipped, open the terminal in the main root folder and execute mvn clean install command. This command installs the archetype in the local maven repository (.m2).



3.- After this, go to the directory where you create a project and execute the following command (dont forget to change the GROUP_ID, PROJECT_NAME and VERSION variables until to execute it):

mvn archetype:generate -DarchetypeGroupId=com.matoosfe -DarchetypeArtifactId=jakartaee8-archetype -DarchetypeVersion=1.0 -Darchetype.interactive=false --batch-mode -DgroupId=GROUP_ID -DartifactId=PROJECT_NAME -Dversion=VERSION




4.- Finally, your project will be ready to work on it.




miércoles, 23 de septiembre de 2020

Jakarta EE 8 archetype


Hello friends, in this opportunity, I want to share with all a JakartaEE8 Archetype, that has the following features:

  • It has an EAR, EJB y WEB project.
  • It has a basic example to save the employee data to the h2 database.
  • It can be deployed in both Wildfly and Payara, I built and tested with Wildfly 20 and Payara 5. To use the deploy, you must configure the profiles, in this link you can see how to do.
  • The Jakarta EE 8 Archetype is available on git, in the following URL.

  • Finally to install the archetype and create a project from it, you can review this link.
I hope, it will be useful. If you have any doubt, you can write to me without any problem.

Greetings

martes, 20 de agosto de 2019

Maven Configuration Problem "Uknown" on SpringBoot Project


Dear friends.

In this opportunity, I am going to show how to fix the Maven Configuration Problem "Unknow" on the pom.xml when we create a new Spring Boot project, bellow I show the screenshots about it.



To fix this problem, we need to update the Spring Tool Suite or Eclipse IDE following the next steps.

1.- Go to the menu Help -> Check For Updates,  a screen shows us with the packages that we need to update. But we need one, I selected it. However, there is no problem if you can update all.


2.- Next we must to accept the terms of license agreements
3.- Then that Spring Tool Suite updated, we need to restart the IDE.
4.- Finally when the IDE had finished restarting. We can note that the error disappeared


domingo, 5 de mayo de 2019

Problemas al Ejecutar una aplicación Android - Unauthorized Device


Estimad@s amig@s

En el caso de que al querer ejecutar una aplicación Android en un dispositivo real no sea reconocido el dispositivo se tiene que realizar lo siguiente:
1.-  Conectar el cable del Usb al dispositivo y dirigirse en la computadora al directorio platform-tools dentro del SDK de Android y ejecutar el comando adb devices para verificar el estado del dispositivo. 
 
Dispositivo No Autorizado
 
2.-  Como el dispositivo no esté autorizado se tiene que desconectar el cable USB del dispositivo, diriguirse al teléfono a la pantalla de Opciones de Desarrollador y proceder a revocar los permisos de depuración como se muestra a continuación.
 
 
3.- Diriguirse al directorio platform-tools dentro del SDK de Android y ejecutar el comando adb kill-server y adb start-server para reiniciar el ADB Server como se muestra a continuación.
 
 

4.- Conectar nuevamente el cable USB al dispositivo, diriguirse a la computadora,  proceder a ejecutar nuevamente el comando adb devices y aceptar la huella de seguridad que aparece en el dispositivo como se muestra a continuación.
 
 
5. Finalmente ejecutar el proyecto Android seleccionando la opción Run -> Run app, a lo que se desplegará la lista de AVD's que se tiene configurado así como los dispositivos que se tienen conectado al equipo y estén autorizados para ejecutar la aplicación como se muestra a continuación.


miércoles, 2 de enero de 2019

Encoding JSP



Hello friends, in this opportunity I will show how to change the JSP encoding. For this we need the following:

1. Select the option Windows --> Preferences o Eclipse --> Preferences depending windows or mac respectively.



2. Change the Encoding, apply and close.

miércoles, 24 de octubre de 2018

Install OpenJDK on MAC Computer



Hello friends, in this post I'm going to show how install the OpenJDK on Mac computer using Homebrew Package Manager . This way is very simple, for this we need to do the following:

1.- First install homebrew package manager, the indications how to do this is here.
2.- Next open a console o terminal and execute the brew tap homebrew/cask-versions command to update versions.



3.- Next execute the brew cask install adoptopenjdk8 command to install the openJDK.


4.- After that we must configure the JAVA_HOME environment variable in the .bash_profile file with the value  /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/ and export it.


Don't forget re-open the terminal to update the .bash_profile file.




5.- Finally verify the java version with the java -version command.



viernes, 19 de octubre de 2018

Configuración EclipseLink WildFly 10


Estimad@s amig@s,

En el caso de que se requiera trabajar con la capa de persistencia eclipselink en el servidor de aplicación WildFly (que viene configurado por defecto con Hibernate) se necesita realizar los siguientes pasos:

  1. Descargarse la capa de persistencia eclipselink, proceder a descomprimirle y copiar del directorio  jlib el archivo eclipselink.jar
  2. Ubicarse en el directorio /modules/system/layers/base/org/eclipse/persistence/main y proceder a copiar el archivo eclipselink.jar, donde es el lugar de instalación del WildFly.
  3. Proceder a editar el archivo module.xml referenciando al nombre de la librería (jar descargado) y excluyendo las clases del path javax que vienen precargadas en el servidor como se muestra a continuación.


 4. Finalmente reiniciar el servidor y estaremos listos para trabajar en nuestro servidor de aplicación con la capa de persistencia eclipselink.

Nota: En el caso de estén utilizando una versión anterior a WildFly 10. se deberá incluir la propiedad eclipselink.archive.factory  para poder ubicar las clases de JPA. Como se muestra a continuación.

viernes, 31 de agosto de 2018

JDBC Connection Pool - Resource Type Datasources



When we need to configure the connection pool on Glassfish or Payara Server, could be that the Resource Types Datasources options are not clear. Because in this post I going to explain the differences between them.

Resource Types Datasource

  • javax.sql.Datasource.- This datasource type is used in applications that manage a global transaction that always involves just one resource. Sometimes called local transactions. This datasource is related with No-XA Transaction.
  • javax.sql.XADatasource.-  This datasource type is used in applications that manage distributed transactions with one or more databases or other resources like JMS. This datasource is related with XA Transaction.
  •  javax.sql.ConnectionPoolDatasource.- This datasource type is more general, produces a connection (PooledConnection) object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling, generally isn't used by a programmer.

Datasource Hierarchy (Ref: shengwangi)


jueves, 30 de agosto de 2018

Problema Could be another instance of Payara Server or Payara Micro


Una vez que se haya instalado PayaraServer y se requiere levantar el servidor de aplicación, en el dominio por defecto (domain1) puede que se presente el siguiente error:




El cual de lo investigado se debe a un conflicto de configuración del valor que tiene la variable  hostname con el valor registrado en los hosts del equipo /etc/hosts, como se puede apreciar en la figura a continuación.




Para solventar el inconveniente, lo que se realizó es actualizar la variable de hostname a localhost para que este igual a la configuración que se tenía en /etc/hosts y posterior a eso ejecutar nuevamente el comando ./asadmin start-domain como se muestra en las figuras a continuación. Es importante mencionar que la actualización de la variable hostname debe realizarse como superusuario.


miércoles, 29 de agosto de 2018

Payara Server una alternativa interesante!!!


En el mundo del desarrollo de software de aplicaciones Java en el ámbito web se han manejado específicamente dos tipos de servidores durante varios años, los servidores web y los servidores de aplicaciones. En este último se han tenido varias opciones como JBossAS, JBossEAP, Wildfly, Gerónimo, Glassfish entre otros; manteniendo mucha similitud entre ellos.

Sin embargo a partir del 2014 se crea un nuevo servidor de aplicaciones llamado Payara Server, el cual aparece producto de la noticia de Oracle en la cual manifiesta que descontinuará el soporte comercial para Glassfish.

Dicho servidor es creado basado en el servidor de aplicaciones Glassfish, pero con algunas diferencias interesantes razón por la cual hoy muchos desarrolladores lo han adoptado y otros estamos en ese proceso.  Les quiero compartir a continuación, las más reelevantes desde mi punto de vista.


  • Actualización Constante.- Payara Server a diferencia de Glassfish  que tenia una frecuencia irregular de liberación de versiones, establece una frecuencia de liberación constante de forma trimestral no solo para las versiones sino también para los parches y actualización de componentes.
  • Herramientas de Caching.- Payara Server integra varias herramientas para manejar el tema del cache como son JCache, Domain Data Grid y Payara Scales (tiene un costo adicional).
  • Agrupamiento Automático.- Payara Server integra a Hazelcast, la cual es una herramienta escalable utilizada para la distribución de datos, para manejar la clusterización (agrupamiento) de manera automática.
  • Seguridad, Monitoreo.- Payara Server incluye varias herramientas para manejar el tema de seguridad y monitoreo.
  • Soporte Microservicios.- Payara Server cuenta con una distribución llamada Payara Micro para el manejo de microservicios. Adicionalmente soporte MicroProfile.
  • Optimizado para Producción.- Payara Server tiene un soporte comercial tanto para ambientes de producción y desarrollo que incluye un soporte 24/7 con una hora de delay de tiempo de respuesta para asuntos de producción urgentes.
  • Participación de la Comunidad.- El proyecto Payara Server se encuentra subido en un repositorio de Payara Github, lo cual permite a la comunidad revisar el código fuente, descargarlo y participar en las mejoras. Adicionalmente se puede apoyar de varias maneras lo cual se puede revisar en el siguiente enlace How to Contribuite Payara Server.

Cabe mencionar que una aplicación Web(.war) o JEE(.ear) puede ejecutarse en cualquier servidor de aplicación. Sin embargo, la decisión de elegir uno u otro dependerá mucho de las características que nos brinden y la expertiz que se tenga en el manejo de uno en particular.

viernes, 16 de junio de 2017

Error Web Service RESTEASY003200



Estimad@s amig@s

Revisando una aplicación web, específicamente temas relacionados a servicios web de una aplicación de un cliente me tope con el siguiente error:

RESTEASY003200: Could not find message body reader for type: class java.lang.Integer of content type: */*

Revisando detenidamente la app, pude detectar el error. El cual se debió a la importación incorrecta del paquete para la clase PathParam. 

Paquete Incorrecto.
import javax.websocket.server.PathParam;

Paquete Correcto
import javax.ws.rs.PathParam;

Espero les sirva de ayuda, no olviden subscribirse al Canal de Matoosfe. Saludos

miércoles, 5 de abril de 2017

LinkageError: Loader Constraint Violation


Estimad@s amig@s 

Quiero compartirles un error que se presentó cuando estaba realizando una integración de sistemas desarrollado bajo la plataforma JEE. El error específicamente que salio fue:

  Loader: 
java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/modules/ModuleClassLoader) previously initiated loading for a different type with name

Luego de revisar las configuraciones de cada sistema que formó parte de la integración y las librerías utilizadas, pude identificar que el inconveniente se presenta cuando se tiene dos jars de la misma librería cargada en el proyecto. En este caso en la carpeta lib del EAR se tenia a la librería XYZ.jar y dentro del proyecto web en la carpeta WEB-INF/lib/ la misma librería XYZ.jar. Lo cual provocaba el error, la solución fue mantener una sola librería, en mi caso mantuve la de carpeta lib del EAR por su alcance.

Espero les sirve de ayuda, no olviden compartirlo, revisar el canal de Matoosfe en Youtube y subscribirse.

Saludos

martes, 21 de febrero de 2017

Error Versión Maven : Unsupported major.minor version 51.0


Estimad@s amig@s

En esta oportunidad quiero compartirles un error que se me presentó con un proyecto desarrollado en JEE que utiliza Maven, al momento de compilar (Maven Build). El error que se me presentó es el siguiente:



Este error se debe a la incompatibilidad de la versión de JDK con la versión de Maven; es decir, cada versión de Maven requiere una versión de jdk base o superior para poder ejecutarse. Por ejemplo, en la versión de Maven 3.3 que tengo instalada en mi equipo la versión base de JDK es la 1.7 o superior, pero el error se produjo porque quiero ejecutar Maven 3.3 con una versión inferior al JDK; en este caso la 1.6. Se tiene dos soluciones:

  1. Bajar la versión de Maven  a la 3.2.5 que soporta JDK 1.6.
  2. Configurar el JDK de mis proyectos de Maven al JDK 1.7.

Espero les haya servido este post, no olviden compartir, comentar y subscribirse al canal de Matoosfe. En el cual encontrarán varios cursos relacionados con la tecnología Java.

miércoles, 16 de noviembre de 2016

This compilation unit is not on the build path of a Java Project



Estimad@s amig@s  les quiero compartir la solución a un error que se me presentó al momento de realizar un autocomplete en Eclipse para llamar a un método dentro de una clase. Lo cual se lo realiza con CTRL + SPACE. El error que salio, fue el siguiente:



Cabe mencionar que este error se suscita cuando en un proyecto Java no se tiene configurado el JDK. Pero en este caso se produjo porque se estaba editando la clase Java apuntando al proyecto principal de Maven, donde no se tiene configurado una unidad de compilación (JDK Library). La solución es editar la clase que se encuentra dentro del proyecto que contiene la clase como módulo. A continuación se expone la gráfica.




Espero les sirve de ayuda, no olviden revisar las redes sociales de Matoosfe, ni subscribirse al canal de youtube. Un abrazo, bendiciones.

jueves, 18 de febrero de 2016

Composite id with FK – JPA


Muchas veces se necesite crear una clave primaria utilizando más de una columna ya sea que ésta este formado por dos columnas simples o que una de ellas represente un FK de otra tabla. Para representar esto en JPA utilizaremos el siguiente ejemplo relacional.

En este caso la tabla Mat_Tarea tiene dos PK y una de ellas es FK de la tabla Mat_Proyecto; para realizar el respectivo mapeo en JPA se debe realizar lo siguiente:
  • Crear los EntityBean para cada tabla

  • Proyecto [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Proyecto database table. * */ @Entity @Table(name="Mat_Proyecto") public class Proyecto implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int idProy; private String desProy; @Temporal( TemporalType.TIMESTAMP) private Date fecFinProy; @Temporal( TemporalType.TIMESTAMP) private Date fecIniProy; private String nomProy; //bi-directional many-to-one association to Tarea @OneToMany(mappedBy="matProyecto") private Set<Tarea> matTareas; public Proyecto() { } public int getIdProy() { return this.idProy; } public void setIdProy(int idProy) { this.idProy = idProy; } public String getDesProy() { return this.desProy; } public void setDesProy(String desProy) { this.desProy = desProy; } public Date getFecFinProy() { return this.fecFinProy; } public void setFecFinProy(Date fecFinProy) { this.fecFinProy = fecFinProy; } public Date getFecIniProy() { return this.fecIniProy; } public void setFecIniProy(Date fecIniProy) { this.fecIniProy = fecIniProy; } public String getNomProy() { return this.nomProy; } public void setNomProy(String nomProy) { this.nomProy = nomProy; } public Set<Tarea> getMatTareas() { return this.matTareas; } public void setMatTareas(Set<Tarea> matTareas) { this.matTareas = matTareas; } } [/code] Tarea [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Tarea database table. * */ @Entity @Table(name="Mat_Tarea") public class Tarea implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private TareaPK id; @Temporal( TemporalType.TIMESTAMP) private Date fechaFinTar; @Temporal( TemporalType.TIMESTAMP) private Date fechaIniTar; private String nomTarea; //bi-directional many-to-one association to Proyecto @ManyToOne @JoinColumn(name="idProy", insertable=false, updatable=false) private Proyecto matProyecto; public Tarea() { } public TareaPK getId() { return this.id; } public void setId(TareaPK id) { this.id = id; } public Date getFechaFinTar() { return this.fechaFinTar; } public void setFechaFinTar(Date fechaFinTar) { this.fechaFinTar = fechaFinTar; } public Date getFechaIniTar() { return this.fechaIniTar; } public void setFechaIniTar(Date fechaIniTar) { this.fechaIniTar = fechaIniTar; } public String getNomTarea() { return this.nomTarea; } public void setNomTarea(String nomTarea) { this.nomTarea = nomTarea; } public Proyecto getMatProyecto() { return this.matProyecto; } public void setMatProyecto(Proyecto matProyecto) { this.matProyecto = matProyecto; } } [/code]
  • Cuando se tiene más de una columna como PK se debe crear una clase por tabla donde se asocia todos los atributos que representan la PK y relacionarlo con la clase padre. En este caso se creará una clase llamada TareaPK como se muestra a continuación.
  • [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; /** * The primary key class for the Mat_Tarea database table. * */ @Embeddable public class TareaPK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; private int idTarea; private int idProy; public TareaPK() { } public int getIdTarea() { return this.idTarea; } public void setIdTarea(int idTarea) { this.idTarea = idTarea; } public int getIdProy() { return this.idProy; } public void setIdProy(int idProy) { this.idProy = idProy; } public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof TareaPK)) { return false; } TareaPK castOther = (TareaPK)other; return (this.idTarea == castOther.idTarea) && (this.idProy == castOther.idProy); } public int hashCode() { final int prime = 31; int hash = 17; hash = hash * prime + this.idTarea; hash = hash * prime + this.idProy; return hash; } } [/code]
  • Como último paso se tiene que aumentar los atributos insertable=false y updatable=false en el mapeo de la relación existente en el POJO Tarea con Proyecto para realizar la dependencia.
  • [code] package com.matoosfe.modelo.entitybeans; import java.io.Serializable; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * The persistent class for the Mat_Tarea database table. * */ @Entity @Table(name="Mat_Tarea") public class Tarea implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private TareaPK id; @Temporal( TemporalType.TIMESTAMP) private Date fechaFinTar; @Temporal( TemporalType.TIMESTAMP) private Date fechaIniTar; private String nomTarea; //bi-directional many-to-one association to Proyecto @ManyToOne @JoinColumn(name="idProy", insertable=false, updatable=false) private Proyecto matProyecto; ....... } [/code]
Saludos

CRUD Java Basico sin BDD


Estimad@s amig@s,

En este post se realizará un ejemplo básico de manejo de operaciones CRUD pero sin base de datos todo manejado a través de collections y bloques estáticos. La aplicación se utilizará es para manejar la compra de vehículos.El proyecto definirá la siguiente arquitectura:

  • Tres capas lógicas representadas en tres packages basados en un modelo MVC
  • Una clase llamada MemoriaBDD.java que representará nuestra BDD
Cada capa lógica o package tiene su ámbito basado en la siguiente especificación de patrón:
  •  El package modelo representará los objetos persistentes o tablas de la BDD .
  • El package controlador contendrá toda la lógica de negocio, en esta caso las operaciones CRUD y demás.
  • El package vista contendrá las interfaces o formularios que el usuario final llenará o interactuará, en este caso es una clase llamada Principal que recepta los datos desde consola.
 Comenzaré explicando la clase MemoriaBDD.java que se encuentra en el package modelo y que representa nuestra Base de Datos. A continuación se muestra la misma.

MemoriaBdd.java
[code] /** * Clase que representa la badse de Datos * @author martosfre * @see www.matoosfe.com */ public class MemoriaBDD { public static Set<vehiculo> vehiculos; public static Set<cliente> clientes; public static Set<factura> facturas; static{ //Inicilializar Facturas facturas = new HashSet<factura>(); //Inicializar Vehiculos vehiculos = new HashSet<vehiculo>(); Moto motoUno = new Moto("azul","PBB-987","QMC","2007", new BigDecimal(1567.45d)); Moto motoDos = new Moto("verde","PAL-747","HONDA","2010", new BigDecimal(1000.45d)); vehiculos.add(motoUno); vehiculos.add(motoDos); Trailer trailerUno = new Trailer("rojo","UBJ-098","MERCEDES BENZ","2005", new BigDecimal(144000)); Trailer trailerDos = new Trailer("azul","XJT-233","MERCEDES BENZ","2004", new BigDecimal(124000)); vehiculos.add(trailerUno); vehiculos.add(trailerDos); Buseta busUno = new Buseta("amarilla","GYT-9889","HYUNDAI","2002", new BigDecimal(75000)); Buseta busDos = new Buseta("amarilla","PKT-956","CHEVROLET","1999", new BigDecimal(55000)); vehiculos.add(busUno); vehiculos.add(busDos); //Inicializar clientes clientes = new HashSet<cliente>(); Cliente clienteUno = new Cliente("Vazquez", "Juan", "1111111189", "Las Casas", "098890988"); Cliente clienteDos = new Cliente("Sanchez", "Luis", "1234567890", "El Dorado", "097090988"); Cliente clienteTres = new Cliente("Prado", "Maria Fernanda", "222222220", "Carapungo", "2345659"); clientes.add(clienteUno); clientes.add(clienteDos); clientes.add(clienteTres); } } [/code]En esta clase se hizo uso de bloque estático que permite inicializar objetos o ejecutar procesos automáticos. Para este caso permitirá inicializar los objetos o “tablas” de nuestro BDD pero en memoria es decir luego de que la aplicación se cierre todas las operaciones o los nuevos registros (objetos colocados en cada collection adicional a los que ya se inicilizan) se perderán.
Ahora voy a explicar la lógica de negocio la cual será implementada en el package controlador en la clases AdminFactura.java, AdminVehiculo.java, AdminCliente.javalas cuales contendrán todas los métodos de negocio. A continuación se muestra las clases en cuestión. AdminCliente.java [code] package com.matoosfe.controlador; import com.matoosfe.modelo.Cliente; /** * Esta clase permitirá manejar toda la lógica de negocio relacionada con clientes * @author martosfre * @see www.matoosfe.com */ public class AdminCliente { /** * Método para guardar un cliente * @param cliente * @return */ public static String guardarCliente(Cliente cliente){ MemoriaBDD.clientes.add(cliente); return "Registro Guardado Satisfactoriamente"; } /** * Método para buscar un cliente por la cédula de identidad * @param cedIn * @return */ public static Cliente buscarClienteByCedula(String cedIn) { Cliente clienteDev = null; for(Cliente cli: MemoriaBDD.clientes){ if(cli.getCedula().equals(cedIn)){ clienteDev = cli; break; } } return clienteDev; } /** * Método para actualizar un cliente * @param cedIn * @param clienteAct * @return */ public static String actualizarCliente(String cedIn, Cliente clienteAct){ guardarCliente(clienteAct); return "Registro actualizado Satisfactoriamente"; } /** * Método para eliminar un cliente * @param cedIn * @return */ public static String eliminarCliente(String cedIn) { Cliente clienteOri = buscarClienteByCedula(cedIn); boolean confEli = MemoriaBDD.clientes.remove(clienteOri); if(confEli){ return "Registro eliminado Satisfactoriamente"; }else{ return "No se pudo eliminar el cliente"; } } } [/code] AdminVehiculo.java [code] package com.matoosfe.controlador; import com.matoosfe.modelo.Vehiculo; /** * * Esta clase permite manipular todas las operaciones relacionadas con Vehiculo * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class AdminVehiculo { /** * Método para guardar un vehículo * @param vehiculoGen * @return */ public String guardarVehiculo(Vehiculo vehiculoGen){ MemoriaBDD.vehiculos.add(vehiculoGen); return "Registro Guardado Satisfactoriamente"; } /** * Método para buscar un vehículo de acuerdo a la placa y tipo * @param placa * @param tipo * @return */ public static Vehiculo buscarVehiculoPorPlaca(String placa) { Vehiculo vehDev = null; for (Vehiculo veh : MemoriaBDD.vehiculos) { if(veh.getPlaca().equals(placa)){ vehDev = veh; break; } } return vehDev; } } [/code] AdminFactura.java [code] package com.matoosfe.controlador; import java.util.ArrayList; import java.util.List; import com.matoosfe.modelo.Factura; /** * * Esta clase permitirá manejar todas las operaciones relacionadas con Factura * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class AdminFactura { /** * Método para guardar una factura * @param factura * @return */ public static String guardarFactura(Factura factura){ MemoriaBDD.facturas.add(factura); return "Factura registrada Exitosamente"; } /** * Métodos para buscar facturas por cliente de acuerdo * a la cédula * @param cedCliente * @return */ public static List<factura> buscarFacturasPorCliente(String cedCliente){ List<factura> facturasCliente = new ArrayList<factura>(); for (Factura factura : MemoriaBDD.facturas) { if(factura.getCliente().getCedula().equals(cedCliente)){ facturasCliente.add(factura); } } return facturasCliente; } } [/code] En estas clases se puede apreciar que todas las operaciones CRUD están relacionadas directamente con la clase MemoriaBDD.java en sus atributos representados como collections que para este caso son las tablas de la base de datos. Por último se explicará la clase Formulario.java que se encuentra en el package vista que representa el formulario que será manipulado por el usuario final.
Formulario.java [code] package com.matoosfe.vista; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.matoosfe.controlador.AdminCliente; import com.matoosfe.controlador.AdminFactura; import com.matoosfe.controlador.AdminVehiculo; import com.matoosfe.modelo.Cliente; import com.matoosfe.modelo.DetalleFactura; import com.matoosfe.modelo.Factura; import com.matoosfe.modelo.Vehiculo; /** * * Esta clase representa el formulario de ingreso de la información * para la gestión de la compra de los vehículos * @author martosfre * @see www.matoosfe.com * Aug 18, 2010 */ public class Formulario { public void registrarFactura(){ //Recibo los datos del vehiculos que son los detalles, cliente BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese el cliente que va a comprar:"); try { String cedIn = br.readLine(); Cliente cliente = AdminCliente.buscarClienteByCedula(cedIn); Factura facturaCompra = new Factura(); List<detallefactura> detallesFactura = new ArrayList<detallefactura>(); BigDecimal subtotal = new BigDecimal(0.0d); BigDecimal total = new BigDecimal(0.0d); System.out.println("\n*************DATOS VEHICULO************"); String placaVeh = "1"; //Registro los vehículos que se vayan a comprar while(!placaVeh.equals("0")){ System.out.print("Ingrese vehículo codigo:"); placaVeh = br.readLine(); //Buscamos al vehículo para registrarlo Vehiculo vehTmp = AdminVehiculo.buscarVehiculoPorPlaca(placaVeh); //Verificamos que si se encontró el vehiculo guardamos el detalle if(vehTmp != null){ //Ingresando cada detalle DetalleFactura detalleTmp = new DetalleFactura(); detalleTmp.setCantidad(1); detalleTmp.setFactura(facturaCompra); detalleTmp.setVehiculo(vehTmp); detalleTmp.setPrecio(vehTmp.getPrecio()); detallesFactura.add(detalleTmp); subtotal = subtotal.add(vehTmp.getPrecio()); } } //Añado detalles y calculo el IVA facturaCompra.setDetalles(detallesFactura); total = subtotal.add(subtotal.multiply(new BigDecimal(0.12d))); //Registro la factura siempre que haya minimo un detalle if(facturaCompra.getDetalles().size() &gt; 1){ facturaCompra.setCliente(cliente); facturaCompra.setFechaCompra(new Date()); facturaCompra.setNumeroFactura(String.valueOf(Math.random())); facturaCompra.setDetalles(detallesFactura); facturaCompra.setSubtotal(subtotal); facturaCompra.setTotal(total); } //Guardamos la factura AdminFactura.guardarFactura(facturaCompra); //Imprimir Registro Compra System.out.println("\n*************DATOS COMPRA************"); System.out.println("Cliente:" + cliente.getNombres() + " " + cliente.getApellidos()); for (Factura fac : AdminFactura.buscarFacturasPorCliente(cliente.getCedula())) { System.out.println("Factura:" + fac.getNumeroFactura()); System.out.println("Total Factura:" + fac.getTotal()); //Imprimir Vehiculos comprados for (DetalleFactura det : fac.getDetalles()) { System.out.println("Vehiculo Marca:" + det.getVehiculo().getMarca()); System.out.println("Vehiculo Modelo:" + det.getVehiculo().getModelo()); System.out.println("Vehiculo Placa:" + det.getVehiculo().getPlaca()); } } } catch (NumberFormatException e) { System.out.println("Error Formato"); e.printStackTrace(); } catch (IOException e) { System.out.println("Error Lectura"); e.printStackTrace(); } //Aqui ya tengo el cliente y todos los vehiculos que quiere comprar } public static void main(String[] args) { Formulario pr = new Formulario(); pr.registrarFactura(); } } [/code]
En esta clase se buscará al cliente que va a comprar el vehículo, luego se registrarán todos los vehículos que se comprarán como un ítem del detalle, asociando al final todos los detalles junto con el cliente a la factura que se guardará o procesará.&

Espero les sirve de mucho, no olviden comentar, compartir. Además les recordamos revisar y subscribirse al canal de Youtube. Saludos

Split con .


Estimados amig@s

Al utilizar el método split sobre una cadena para obtener el conjunto de valores por una ocurrencia me tope con el problema que al utilizar el caracter  “.” no funcionaba.  Al analizar el método se comprobó que debido a que el método utiliza una expresión regular regex para buscar la ocurrencia no se podia hacerlo normalmente por que el . es utilizado como un delimitador; se tuvo que añadir el caracter de escape \\

Forma Normal – Incorrecta
[code] String cadena = "1.1.1"; String [] secuencia = cadena.split("."); //No obtiene nada [/code]
Forma Correcta 
[code] String cadena = "1.1.1"; String [] secuencia = cadena.split("\\."); //Obtiene valor [/code]

martes, 16 de febrero de 2016

Librerías JDCB en un solo punto


Estimad@s Quisiera compartir con ustedes enlaces a los sitios de descarga de las librerías JDBC para las base de datos más comunes. A continuación se las presento.

Espero que haya sido de utilidad, compartamos la información. No olvides seguirnos/mencionarnos en twitter o facebook https://www.facebook.com/MATOOSFE.