domingo, 6 de marzo de 2022

Algunos plugins útiles para Eclipse

 1. EGradle (Editor) 

Es un editor de ficheros de gradle

Detecta algunos errores de sintaxis. Puede ser válido


2. Yaml editor

Para editar ficheros YAML



martes, 1 de marzo de 2022

La API de JPA 2.1 (X). Java 17 problems. Jaxb-runtime dependency needed

 As stated in stack overflow (https://stackoverflow.com/a/70472102/7704658) A depenendency is needed

Here is the error


java.security.PrivilegedActionException: java.lang.NoSuchMethodException: sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)


When using Hibernate, this dependency in gradle should be added 

implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.2'    



Here is an example with hibernate (in the dependencies section)

    
/* HIbernate */    
implementation "org.hibernate:hibernate-core-jakarta:5.6.5.Final"
implementation "org.hibernate:hibernate-envers-jakarta:5.6.5.Final"
implementation "org.hibernate:hibernate-validator:7.0.2.Final" 
    
//Jaxb Needed in java 17 @see https://stackoverflow.com/a/70472102
implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.2'    

jueves, 10 de febrero de 2022

Ubuntu 18 Instalar USB smart card (tarjeta criptografica) (Lector SRC 3310)

 Ya hemos hecho algunas entradas al respecto. Pero ahora está un poco mas actualizado connuevas verswiones de SafeSign.


1. Instalar drivers del lector

1. Instalar el prerequisitos 

  • (para libusblib 1.0.25) libudev-dev 
  • (para pcsclite.1.9.5) libsystemd-dev

sudo apt install -y libudev-dev

sudo apt install -y libsystemd-dev


2. Descargar libusb-1.0.25  y descomprimirlo en una carpeta e intalarlo

cd libusb-1.0.25                  
sudo ./configure                             
sudo make                                    
sudo make install   

3. Descargar PCSC lite1.9.5.tar.bz2, descomprimirlo e instalarlo

cd ../pcsc-lite-1.9.5
sudo ./configure 
sudo make                                    
sudo make install

4. Descargar ccid-1-5-0 , descomprimirlo e instalarlo

cd ../ccid-1.5.0
sudo ./configure
sudo make                                    
sudo make install  

sudo cd src
sudo cp 92_pcscd_ccid.rules /etc/udev/rules.d/

5. Verificamos en https://ccid.apdu.fr/ccid/supported.html que nuestro lector SCR 3310 esta verificado

6. Instalar pcsc-tools

sudo apt install -y pcsc-tools


7. Instalar pcscd 

sudo apt install -y pcscd


8. Rearrancamos el demonio pcscd 

sudo /etc/init.d/pcscd restart


9. Comprobamos si lee  la tarjeta.

pcsc_scan

y sale (reconociendo el lector y la tarjeta)

PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
0: SCR3310 Smart Card Reader [CCID Interface] 00 00
 
Thu Feb 10 14:42:58 2022
 Reader 0: SCR3310 Smart Card Reader [CCID Interface] 00 00
  Card state: Card inserted, 
  ATR: 3B F7 18 00 00 80 31 FE 45 73 66 74 65 2D 6E 66 C4

ATR: 3B F7 18 00 00 80 31 FE 45 73 66 74 65 2D 6E 66 C4
+ TS = 3B --> Direct Convention
+ T0 = F7, Y(1): 1111, K: 7 (historical bytes)
  TA(1) = 18 --> Fi=372, Di=12, 31 cycles/ETU
    129032 bits/s at 4 MHz, fMax for Fi = 5 MHz => 161290 bits/s
  TB(1) = 00 --> VPP is not electrically connected
  TC(1) = 00 --> Extra guard time: 0
  TD(1) = 80 --> Y(i+1) = 1000, Protocol T = 0 
-----
  TD(2) = 31 --> Y(i+1) = 0011, Protocol T = 1 
-----
  TA(3) = FE --> IFSC: 254
  TB(3) = 45 --> Block Waiting Integer: 4 - Character Waiting Integer: 5
+ Historical bytes: 73 66 74 65 2D 6E 66
  Category indicator byte: 73 (proprietary format)
+ TCK = C4 (correct checksum)

Possibly identified card (using /home/eduard/.cache/smartcard_list.txt):
3B F7 18 00 00 80 31 FE 45 73 66 74 65 2D 6E 66 C4
	SmartCafe Expert 3.2 72K


10. A veves cuando rearranca el ordenador no arranca el demonio pcsc por tanto recordar de ejecutar

sudo /etc/init.d/pcscd restart


2. Instalar drivers adicionales y de la tarjeta

Para ello se baja el programita para instalar los drivers desde la entidad certificadora brasileña VALID , que tiene los drivers mas recientes que he encontrado. Ver tambien este documento con enlaces para descarga

Para ello creo que es mejor  seguir los pasos:

1. Crear una carpeta de instalación (Llamemosla SafeSign) descargamos los drivers 

wget https://s3-sa-east-1.amazonaws.com/shared-www.validcertificadora.com.br/Downloads/Safesign/Safesign.zip


2. Descomprimimos el fichero0 SafeSign.zip

unzip Safesign*

3. Instalamos las librerias descargas

sudo apt-get update 
sudo apt-get install pcscd 
sudo apt-get install libccid 
sudo dpkg -i libgdbm3_1.8.3-14_amd64.deb
sudo dpkg -i libpng* 
sudo dpkg -i libjpeg* 
sudo dpkg -i libwxbase* 
sudo dpkg -i libwxgtk* 
sudo apt-get update -y 

4. Por último instalamos el SafeSign

sudo dpkg -i  SafeSign.deb

3. Instalar en Firefox. (En chrome parece ser que no se puede)

1. Abrir Firefox i pinchar en la parte superior derecha 


2. Elegir "parámetros" del menu desplegable, y en el menú marcar "Privacidad y Seguridad"


3.  En el subapartado de "Certificados" darle al botón de "Dispositivos de Seguridad"


4. Marcamos "NSS Internal PCKS # 11 Module" y le damos al boton "Cargar"


Le damos un nombre conveniente en mi caso "ACCV PKCS#11" y le damos al botón de "navega" y escogemos la libreria "/usr/lib/libaetpkss.so" que es la que se ha instalado.


Verificamos que la tarjeta esté introducida y le damos al boton de iniciar la sesión y le damos la contraseña y ya está instalada.


Y le damos la contraseña


Y una vez dada la contraseña, entramos en la web de la SS y podemos consultar con el certificado.!

4. Problemas:

Cada vez que arranquemos la máquina comprobar que el servicio pcscd esté en marcha, sinó, hay que rearrancarlo

sudo /etc/init.d/pcscd restart

Comprobar si el lector está operativo

pcsc_scan

jueves, 27 de enero de 2022

Gradle-7 (7) BUENA: Recapitulación, Dependencias transitivas incompatibles, Shadow Plugin, Strictly, Incluir Sources fuentes

 0. Introducción

1. Quitar la carpeta lib (como antes en Gradle <6.7)

2. El maravilloso Shodow plugin de John Engelman

3. Versionado "sctrictly", para fijar la veersión de la dependencia que funcione bien (FALLA)


 

1. Quitar la carpeta lib (como antes en Gradle <6.7)

Para ello, seguir estos pasos:

1. Crear el propyecto gradle en Eclipse

2. Una vez creado, se aprieta el boton derecho del ratón sobre el proyecto y indicamos "Delete", pero sin borrar el contenido.

3. Borramos todos los ficheros del proyecto creado, excepto la carpeta "lib",

4. Trasladamos el fichero build.gradle y la carpeta src a la carpeta del proyecto.

5. Borramos la carpeta lib, con lo que nos queda: la carpeta del proyecto, y dentro de ella, la carpeta src y el build.gradle

6. Ahora importamos el proyecto gradle desde Eclipse y ya está.


2. El maravilloso Shadow plugin de John Engelman

Este plugin permite:

1.Usar el plugin (línea 4 -> id 'com.github.johnrengelman.shadow' version '7.1.2')

2. Muy importante la línea 12  para ver donde falla la compilación!

3 Crear un "uber jar" o jar total. Para ello se añade la tarea shadowJar (línea 29) 

NO! 4 Reducir el tamaño del "uber jar" (linea 40 -> minimize() ) eliminameos dependencias no usadas

5. Solucionar el problema de las depencias transitivas con diferentes versiones e incompatibles. Para ello utiliza internamente la libreria ASM para cambier el "bytecode" de las clases. (Pueden haver algunos problemillas si se hace referencia a

las clases por reflexión). (Línea   ->relocate 'com.sun.xml.ws', 'com.sun.xml.ws234') En este caso cambiamos la ubicación de la carpeta com.sun.xml.ws a com.sun.xml.ws234

Veamos como hacerlo, para muestra un fichero "build.gradle"

6. Lo mas importante, aparece en las tareas de gradle, una carpeta "shadow" con la tarea shadowJar, que es la que genera el jar.

7. Las líneas 33-34 indicamos el nombre del fichero jar, versión y la carpeta donde se genera (en este caso se crea una carpeta llamada "mytargets" dentro del Workspace (a la misma altura que la carpeta del proyeco, así guardamos todos los jars que hacemos en la misma carpeta.

7. Se puede incluir el código fuente para poder depurarlo en Eclipse (línea 43)


 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
plugins {
    // Apply the java-library plugin for API and implementation separation.
    id 'java-library'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

repositories {
    jcenter()
    mavenCentral()
    maven { url "https://jitpack.io" } //@see: https://stackoverflow.com/questions/38905939/how-to-import-library-from-jitpack-io-using-gradle
}
gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace.ALWAYS
dependencies {
    // Use JUnit test framework.
    testImplementation 'junit:junit:4.13.1'
    
    /***********************************************************************
    *********************** LOMBOK DEFINITION ******************************/
    compileOnly             'org.projectlombok:lombok:1.18.20'
    annotationProcessor     'org.projectlombok:lombok:1.18.20'
    testCompileOnly         'org.projectlombok:lombok:1.18.20'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
    /************************************************************************/
   
    /* Apache */
    implementation "commons-io:commons-io:2.11.0"
}    
// Output to build/libs/shadow.jar ?
shadowJar {
    //1. Name and location of jars
	archiveBaseName.set('a004-pdf')
	archiveClassifier.set('')
	archiveVersion.set('1.1')
	destinationDirectory = file("$rootDir/../mytargets") 
	
	//2. Relocate (shadow) old problematic transitive dependency com.sun.xml.ws:jaxws-rt:2.3.4
	relocate 'com.sun.xml.ws', 'com.sun.xml.ws234'
	
	//3. Discard not used libraries
	//minimize() //NO USAR

	//4. Include Sources
	from sourceSets.main.allSource
}
tasks.named('test') { // Use JUnit Platform for unit tests. useJUnitPlatform() }


3. Versionado "strictly" para fijar la version correcta (FALLA)

Con el tema de la migracion de javax a jakarta, hay liobrerias que tienen dependencias a versioes antiguas y otras a las nuevas.

En concreto tengo el error:

java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

Y según se dice en stackoverflow las dependencias "org.glassfish.jaxb:jaxb-runtimealudidas" indirectamente són:

jakarta.xml.bind:jakarta.xml.bind-api
org.glassfish.jaxb:jaxb-runtime

Si intentamos ver las dependencias tal y como se indica en la imagen, cuando elprograma funciona bien para localizar las versiones correctas:



Cuando le añadimos la version de hibernate-core-jakarta, hace referencia a las versiones 3.x.x de ambas dependencias, con lo que deja de funcionar aquellas partes del programa que referencia a versiones 2.x.x.

Para ello le indicamos en la parte de depencencias del gradle, estas dependencias con la clausula "strictly"

 /**********************************************************************/
/* STRICTLY VERSIONS !!!!!!!!!*/
//Avoid version 4.0.0'
implementation ('jakarta.xml.bind:jakarta.xml.bind-api') { version { strictly '2.3.3'} }
    
//Avoid version 3.0.0
implementation ('org.glassfish.jaxb:jaxb-runtime') { version { strictly '2.3.6'} } 	
/**********************************************************************/






jueves, 16 de diciembre de 2021

La API de JPA 2.1 (IX) JPA-JNDI sin persistence.xml

 0. Introducción

Continuamos del post anterior, pero ahora tenemos que utilizar JNDI en una aplicación web, en este caso Vaadin.

Veamos la estructura de ficheros ya vista en otro blog

src
   |->main
   |   |->webapp
   |   |   |->WEB-INF       Not used (can be deleted)
   |   |   |   |->beans.xml Not used 
   |   |   |->skins
   |   |   |   |->ui
   |   |   |   |->content
   |   |   |->META-INF
   |   |   |   |>context.xml (JNDI pool of connections)
   |   |   |->imgs
   |   |   |   |->enterprise (or any particular folder with images)
   |   |   |->icons
   |   |   |   |->flags (or any particular folder with icons)
   |   |->resources
   |   |   |->view (in yaml or any partiular folder with some info)
   |   |   |->reports (or any partiular folder with jasper reports)
   |   |   |->readme (or any partiular folder with some info)
   |   |   |->properties (property files)
   |   |   |   ->control_post.properties
| | |->META-INF | | | |->services | | | |->com.vaadin.flow.server.VaadinServiceInitListener | | | |->persistence.xml | | |->i18n (all teh internationalization resources) | | | |->file_en.properties ; file_es.properties | | |->docs (any doc ) | | |->simplelogger.properties | |->java | | |->ui | | |->openadmin |->test frontend |->tone-edu (test with js) | |->tone-test.js |->three-edu (test with js) | |->three-test.js |->apex-charts (test with js) | |->apex-charts-test.js |->styles (all the css defined) | |->my-defined.css.css |->src (empty) |->generated | |->vaadin.ts |->font-awesome | |->webfonts, svgs, sprites, scss, metadata, less, js, css.. gradle.properties build.gradle

En este caso com es lógico no utilizaremos el presistence.xml


1. Ficheros importantes


En src/main/webapp/META-INF tenemos context.xml. En este ejemplo solo utilizaremos solo el recurso "control_post"

 
<Context path="/openweb" docBase="openweb"
        debug="5" reloadable="true" crossContext="true">
    <Resource 
      name="control_post"
      auth="Container"
      type="javax.sql.DataSource"
      username="my_user"
      password="my_password"
      maxTotal="50"
      maxIdle="20"
      maxWait="10000"
      timeBetweenEvictionRunsMillis="180000"
      removeAbandonedOnMaintenance="true"
      removeAbandonedOnBorrow="true"
      driverClassName="org.postgresql.Driver"
      url="jdbc:postgresql://192.1.1.1:5432/openweb" 
    />
    
    <Resource 
      name="other-persistence-unit"
      auth="Container"
      type="javax.sql.DataSource"
      username="other_user"
      password="other_password"
      maxTotal="50"
      maxIdle="20"
      maxWait="10000"
      timeBetweenEvictionRunsMillis="180000"
      removeAbandonedOnMaintenance="true"
      removeAbandonedOnBorrow="true"
      driverClassName="org.postgresql.Driver"
      url="jdbc:postgresql://192.1.1.2:5432/other_db" 
    />
        
</Context>



En src/resources/properties metemos este fichero control_post.properties

#-----------------------------------------------------------------------------
#1. General Properties
persistence.unit.name=            control_post
persistence.provider.class.name=  org.hibernate.jpa.HibernatePersistenceProvider
jta.datasource.name=              control_post
#non.jta.datasource=               
#mapping.file.names=
#jar.file.urls=
#persistence.unit.root.url
managed.classes=                  openadmin.model.csv.AytosCSV;\
                                  openadmin.model.csv.CSVLog;\
                                  openadmin.model.sedipualba.Expedient;\
                                  openadmin.model.sedipualba.Document

exclude.unlisted.classes=         true	
#shared.cache.mode=
#-----------------------------------------------------------------------------
#Properties not included in datasource
hibernate.dialect=                org.hibernate.dialect.PostgreSQLDialect
#hibernate.hbm2ddl.auto=           update
hibernate.hbm2ddl.auto=           none
hibernate.show_sql=               true


En src/main/java/utils tenemos PersistenceUnitInfoEdu que es la clase que va a recoger todas las propiedades de la conexión e hibernate. Observar la línea con el fondo amarillento que es la que se encarga de recoger el recurso JNDI de Tomcat. Observar tambien la ruta en rojo para buscar el recurso que quedaría: "java:/comp/env/control_post"


package utils;

import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;

import lombok.Getter;
import lombok.Setter;
import openadmin.utils.basic.StringUtilsEdu;

public class PersistenceUnitInfoEdu implements PersistenceUnitInfo {
    
    public static String JPA_VERSION = "2.2";
    @Getter @Setter private String persistenceUnitName; //OK
    @Getter @Setter private PersistenceUnitTransactionType transactionType   = PersistenceUnitTransactionType.RESOURCE_LOCAL; //OK
    @Getter @Setter private String persistenceProviderClassName="org.hibernate.jpa.HibernatePersistenceProvider"; //OK
    @Getter @Setter private DataSource jtaDataSource=null; //OK a falta de JNI
    @Getter @Setter private DataSource nonJtaDataSource=null; //OK a falta del no JNI
    @Getter @Setter private List<String> mappingFileNames = new ArrayList<>(); //OK
    @Getter @Setter private List<URL> jarFileUrls=null; //OK
    @Getter @Setter private URL persistenceUnitRootUrl=null; //OK
    @Getter @Setter private List<String> managedClassNames = new ArrayList<>(); //OK
    @Getter @Setter private boolean excludeUnlistedClasses=false; //OK
    @Getter @Setter private SharedCacheMode sharedCacheMode=null; //OK
    @Getter @Setter private ValidationMode validationMode=ValidationMode.AUTO; //OK
    @Getter @Setter private Properties properties=null; //OK
    @Getter @Setter private String persistenceXMLSchemaVersion=JPA_VERSION; //OK
    @Getter @Setter private ClassLoader classLoader=null; //OK
    @Getter @Setter private List<ClassTransformer> transformers = new ArrayList<>(); //OK addTransformes
    @Getter @Setter private ClassTransformer transformer=null;
    @Getter @Setter private ClassLoader newTempClassLoader=null; //OK
    
    public PersistenceUnitInfoEdu(String persistenceUnitName, List<String> managedClassNames, boolean excludeUnlistedClasses, Properties properties) {
        this.persistenceUnitName = persistenceUnitName;
        this.managedClassNames = managedClassNames;
        this.excludeUnlistedClasses=excludeUnlistedClasses;
        this.properties = properties;
    }

	@Override
	public boolean excludeUnlistedClasses() {
		return excludeUnlistedClasses;
	}

	@Override
	public void addTransformer(ClassTransformer transformer) {
		// TODO Auto-generated method stub
	}

	public PersistenceUnitInfoEdu(Properties props) throws Exception {
        this.persistenceUnitName = props.getProperty("persistence.unit.name").trim();
        this.persistenceProviderClassName=props.getProperty("persistence.provider.class.name").trim();
        
        String dtSrc=props.getProperty("jta.datasource.name","").trim();
        /*
        if (dtSrc.length()>0) { 
        	Context initContext = new InitialContext();
        	Context envContext  = (Context)initContext.lookup("java:/comp/env");
        	//DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
        	this.jtaDataSource=(DataSource)envContext.lookup(dtSrc);
        }
        */	
        if (dtSrc.length()>0) { 
        	InitialContext cxt = new InitialContext();
        	if ( cxt == null ) {
        	   throw new Exception("Uh oh -- no context!");
        	}

        	this.jtaDataSource= (DataSource) cxt.lookup( "java:/comp/env/"+dtSrc );

        	if ( this.jtaDataSource == null ) {
        	   throw new Exception("Data source not found!");
        	}
        	
        }
        
        String[] managedCls=StringUtilsEdu.splitAndTrim(props.getProperty("managed.classes"),";");
        this.managedClassNames =  Arrays.asList(managedCls);
        
        this.excludeUnlistedClasses=Boolean.parseBoolean(props.getProperty("exclude.unlisted.classes").trim());
     
        this.properties = props;
    }
	
	
}


En src/main/java/utils tenemos JPANoPersistenceUtils que permite obtener las EntitymanagerFactory


package utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.spi.PersistenceUnitInfo;

import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;



public class JPANoPersistenceUtils {
	
	public static PersistenceUnitInfoEdu getPsUnitInfo(String persistenceUnitName, List<String> managedClassNames, boolean excludeUnlistedClasses, Properties properties) {
		return new PersistenceUnitInfoEdu(persistenceUnitName, managedClassNames, excludeUnlistedClasses, properties);
	}
	
	public static PersistenceUnitInfoEdu getPsUnitInfo (Properties properties) throws Exception {
		return new PersistenceUnitInfoEdu(properties);
	}
	
	public static EntityManagerFactory getEntityManagerFactory(PersistenceUnitInfo psUnitInfo) {
		Map<String, Object> configuration = new HashMap<>();
		return new EntityManagerFactoryBuilderImpl(
		          new PersistenceUnitInfoDescriptor(psUnitInfo), configuration)
		          .build();
	}
	
	public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, List<String> managedClassNames, boolean excludeUnlistedClasses, Properties properties) {
		PersistenceUnitInfo persistenceUnitInfo = getPsUnitInfo(persistenceUnitName,managedClassNames,excludeUnlistedClasses,properties);
		return getEntityManagerFactory(persistenceUnitInfo);
	}
	
	public static EntityManagerFactory getEntityManagerFactory(Properties properties) throws Exception {
		PersistenceUnitInfo persistenceUnitInfo = getPsUnitInfo(properties);
		return getEntityManagerFactory(persistenceUnitInfo);
	}
	
	

	public static void main(String[] args) {
		List<String>classes=new ArrayList<String>();
		classes.add("openadmin.utils.nopersistencexml.Test");
		EntityManagerFactory emf=getEntityManagerFactory("my-h2",classes,true,MyConnectionProps.getPropsH2());
		
		
		EntityManager em=emf.createEntityManager();
		
		//Query q=em.createNativeQuery("SELECT * FROM TEST");
		Query q=em.createQuery("SELECT t FROM Test t WHERE t.id<1000");
		List<Test> ltest=q.getResultList();
		for (Test t:ltest) System.out.println(t.getId()+"-"+ t.getName());
			
		em.close();
		emf.close();
	}

}


Veamos una clase de prueba para abrir una conexión.OJO, está clase se debe de llamar dentro de una aplicacion web en marcha. Observar como se obtiene la ruta al fichero de propiedades "control_post.properties" que se encuentra dentro del directorio "properties". Solamante se crea una EntityManagerFactory y a partir de esta una EntityManager. 


 package utils;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;


import openadmin.utils.nopersistencexml.JPANoPersistenceUtils;

public class Test {

  public static void main(String[] args) {
      String propsPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
      propsPath += File.separator + "properties"+File.separator+ "control_post.properties";
      Properties controlProps=new Properties();
      try {
          controlProps.load(new FileInputStream(propsPath));
          EntityManagerFactory factory = JPANoPersistenceUtils.getEntityManagerFactory(controlProps);
          EntityManager em = factory.createEntityManager();
          em.close();
          //Do some stuff
          factory.close();
      } catch (Exception e) {
          e.printStackTrace();
      }	
    }
}