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
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
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)
Ya hemos hecho algunas entradas al respecto. Pero ahora está un poco mas actualizado connuevas verswiones de SafeSign.
1. Instalar el prerequisitos
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
wget https://s3-sa-east-1.amazonaws.com/shared-www.validcertificadora.com.br/Downloads/Safesign/Safesign.zip
unzip Safesign*
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
sudo dpkg -i SafeSign.deb
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.!
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
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)
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á.
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 |
Si intentamos ver las dependencias tal y como se indica en la imagen, cuando elprograma funciona bien para localizar las versiones correctas:
/**********************************************************************/ /* 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'} } /**********************************************************************/
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
<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(); } } }