sábado, 21 de junio de 2014

APLICACIÓN DE ‘SSL’ [HTTPs], PARA EL CONSUMO DE WS CON JAXWS.

SSL: (Secure Sockets Layer) es un protocolo que proporciona autenticación y privacidad de la información sobre Internet mediante el uso de criptografía. Habitualmente, sólo el servidor es autenticado (es decir, se garantiza su identidad) mientras que el cliente se mantiene sin autenticar.
Así mismo, tanto el cliente y el servidor negocian qué algoritmos criptográfico se va a usar. Actualmente se proporcionan las siguientes opciones:

  • Para criptografía de clave pública: RSA, Diffie-Hellman, DSA (Digital Signature Algorithm) o Fortezza.
  • Para cifrado simétrico: RC2, RC4, IDEA (International Data Encryption Algorithm), DES (Data Encryption Standard), Triple DES y AES (Advanced Encryption Standard).
  • Funciones de hash: MD5 o de la familia SHA.
El tutorial preparado muestra el manejo para consumir Web Service sobre Weblogic de tipo HTTPs, aplicando dos formas: aplicando la autenticación respectiva (certificado digital) y también, obviando dicha autenticación (saltándola):

El índice de contenido del tutorial es el siguiente:

1.   CONFIGURACIÓN WEBLOGIC SERVER.
2.   CONFIGURACIÓN PARA: [CERTIFICADOS DE CONFIANZA].
3.   CONSUMO DE WEBSERVICE [HTTPs].
      A.   Consumo de WS con Autenticación.
      B.  Consumo de WS SIN Autenticación.


  • Para DESCARGAR el tutorial pulsar: Aquí.
  • Así mismo, para descargar la fuente de cliente WS aplicando todo lo detallado en el tutorial, pulsar: Aquí

Espero haberlos ayudado, hasta la próxima.

domingo, 28 de abril de 2013

MANEJO WEBLOGIC SHARED LIBRARIES PARA SPRING 3.

El empaquetado de las librerías en JAVA normalmente se realiza de la siguiente manera:

1. Introduciendo los JARs dentro del WEB-INF/lib de la aplicación.
2. Referenciando la ubicación de los JARs a una ruta externa y especifica del servidor de aplicaciones.

Ambas modalidades son aceptadas pero a medida que el número de aplicaciones aumenta se debe de realizar mejoras en cuanto al manejo del número de librerías debido a que muchos de los frameworks que son manejados e integrados requieren de un gran número de JARs diferenciados por versión y muchas veces se puede perder el control de dichas versiones y a la vez se llegar a la sobrecarga del servidor de aplicaciones debido al gran tamaño de los EARs desplegados ya que se insiste en tener los todos JARs embebidos en las aplicaciones.

Para solucionar esto se requiere detallar concepto de las Weblogic Shared Libraries que en si consiste en compartir librerías (grandes cantidades) con las aplicaciones desplegadas en el servidor (EARs y WARs). Esta característica es muy buena que nos permite referenciar entre aplicaciones las librerías desplegadas en el servidor y así no utilizarlas sin la necesidad de recargar las aplicaciones embebiendo todo en WEB-INF/lib.

En esta oportunidad mostraré un ejemplo completo de cómo:

1- Crear una Weblogic Shared Library (Utilizaremos el Framework Spring 3).
2- Desplegar una Weblogic Shared Library.
3- Configurar y referenciar una Weblogic Shared Library usando ECLIPSE y JDEVELOPER.
4- Probar la solución mediante una APP con SOAPUI.


Debido que el tutorial es bien extension he visto conveniente mejor adjuntar el tutorial para que se aprecio mejor el detalle paso a paso de cada configuración:

- Para DESCARGAR el "Tutorial paso a paso", dar click: AQUÍ
- Para DESCARGAR las 3 version es de "Shared Libraries" (WARs) para Spring 3, dar click: Lib_Spring 3.0.5, Lib_Spring 3.1, Lib_Spring 3.2.2


 

domingo, 21 de abril de 2013

CREACIÓN DE SERVICIO WEB CON ‘SERVICE CONTROL’ BASADO EN ‘JAX-RPC’

Hola en esta oportunidad brindaré el siguiente tutorial que mostrará el manejo de SERVICE CONTROLs relacionado a servicios Web con JAX-RPC, desplegados en Servidores de Aplicación Oracle WebLogic 10 y sobre una IDE “Oracle WorkShop  10.4 for Weblogic”.

El escenario a simular es el desarrollo de un WebService que internamente contendrá un flujo para completar la información requerida consumiendo dos servicios web de tipo Proxy.

Estos servicios Proxy son los siguientes y serán iniciados vía un Mock Services con SoapUI:

- http://localhost:8088/mockObtenerDatosBinding?wsdl
- http://localhost:8088/mockObtenerTecnologiaBinding?wsdl

PASOS
:


1. DESPLEGAR SERVICIOS EXTERNOS:

Iniciamos los Mock Services del SoapUI:

•    ObtenerDatosBinding_PROXY.wsdl   (WSDL)
•    obtenerDatos_lib.xsd  (XSD)
•    ObtenerTecnologiaBinding_PROXY.wsdl    (WSDL)
•    obtenerTecnologia_lib.xsd   (XSD)

Con los WS externos ya iniciados procedemos a crear el WS project.


2.  CREAR UN WEB SERVICE PROJECT EN WORKSHOP:

- Abrir la IDE: Oracle workshop for Web Logic.
- Hacer  clic derecho en el explorador de proyectos y seleccionar: 
File/New/Other/Web Service/WebService Project

- Ingresar el nombre del proyecto: DummyExceptionWS, luego en las de la pantalla seleccionar   ‘Annotated Web Service Facets JAX-RPC’  y haga click en el botón siguiente, siguiente y luego Finalizar.
- Vamos a Crear a WebService en modo: Top-Down (Teniendo el .WSDL ya creado), ya que es una buena práctica. Para ello sobre el .WSDL del damos:
click derecho/WebServices/Generate Web Service

Asignamos el nombre del paquete donde se creará la clase pública del  WS: pe.com.dummyException.ws

Se creará la clase:  ControlExceptionPortTypeImpl tendrá una interfaz GRÁFICA donde se mostraran los métodos de dicho WS.

Las librerías COMPARTIDAS (Shared), solo deberán apreciarse 2:  beehide-control y weblogic-controls

Así mismo dentro de:  DummyExceptionWS\WebContect\WEB-INF\lib, se creará un .jar que contendrá  las clases no públicas y no modificables del     WebService creado.


3.  CREANDO UN WEB SERVICE CONTROL:
 En el sourceFolder src creamos 2 paquetes:

 pe.com.dummyException.proxy 
(Dentro se ubicaran los .WSDL y .XSD de los proxy externos)   
 pe.com.dummyException.control  (Dentro de ubicaran los SERVICE CONTROL de cada proxy externo)
 Ahora ubicamos los .WSDL y .XSD de los PROXY externos dentro del paquete: pe.com.dummyException.proxy    

 En base a cada .wsdl de los WS externos, generamos las clases SERVICE CONTROL: Click derecho sobre el:  wsdl/WebService/Generate Service Control
- Asignamos los Types de tipo JAX-RPC:
- Se creará dentro de la carpeta .lib un .jar:
  ObtenerDatosBinding_PROXY_JAXRPC.jar


Dentro del sourceFolder: pe.com.dummyException.control, creamos la clase controladora:  ObtenerDatosControl.java


"Este paso hacerlo para cada WS Externo que se tenga".
       
 4. CREANDO LA CLASE HELPER:
Crearemos una clase Helper de ayuda que contendrá los setters y getters del objeto de control de servicios.

Para ello creamos un SourceFolder llamado:  pe.com.dummyException.helper

Las clases las llamaremos:
•    ObtenerDatosHelper
•    ObtenerTecnologiaHelper



5.  IMPLEMENTAR EL WEB SERVICE:
Con los WebService Externos (Proxy), ya mapeados, con sus Service Control y Hepers ya creados, procedemos a implementar el flujo del ServicioWeb:

Ingresamos a la clase: ControlExceptionPortTypeImpl.java y al método:  controlException y dentro ingresamos toda la lógica:


6.  DESPLEGAMOS EL WEB SERVICE:
- Generamos el .EAR llamado: DummyExceptionWS_EAR.ear
- Ingresamos a la CONSOLA ADMINISTRATICA Weblogic:

http://192.168.1.33:7001/console/login/LoginForm.jsp
-    USER:             weblogic
-    PASSWORD:  weblogic

Ingresamos en el árbol en: Deployments, pulsamos Instalar y buscamos la ruta del .EAR, luego Next:

- Pulsamos Next:
- Pulsamos Finish:
- Ingresamos dentro del .EAR y entramos al Web Service:
- Ingresamos a la pestaña:  Testing:

Mostramos la URL del WS creado es la siguiente:

http://192.168.1.33:7001/DummyExceptionWS/ControlExceptionPortTypeImpl?wsdl



7.    PROBAR EL WEB SERVICE DESPLEGADO:
       Ingresamos los dos datos requeridos y ejecutamos.

       Finalmente, mostramos los LOGs respectivos de los PROXYs consumidos:
--------------- DENTRO DEL MÉTODO: [controlException] - [INICIO] ---------------
vIdTransaccion: [5214952]
vTelefono: [41816133]
--------------- DENTRO DEL MÉTODO: [getObtenerTecnologiaPROXY] - [INICIO] ---------------
URL: [http://localhost:8088/mockObtenerTecnologiaBinding?wsdl]
TIMEOUT: [10000]
XML 'ObtenerTecnologia' [REQUEST]: [externalcompany.com.pe.bean.obtenertecnologiaws.ObtenerTecnologiaInput@ed301f]
XML 'ObtenerTecnologia' [RESPONSE]: [externalcompany.com.pe.bean.obtenertecnologiaws.ObtenerTecnologiaInput@ed301f]
--------------- DENTRO DEL MÉTODO: [getObtenerTecnologiaPROXY] - [FIN] ---------------

--------------- DENTRO DEL MÉTODO: [getObtenerDatosPROXY] - [INICIO] ---------------
URL: [http://localhost:8088/mockObtenerDatosBinding?wsdl]
TIMEOUT: [10000]
XML 'ObtenerDatos' [REQUEST]: [externalcompany.com.pe.bean.obtenerdatosws.ObtenerDatosInput@109efc2]
XML 'ObtenerDatos' [RESPONSE]: [externalcompany.com.pe.bean.obtenerdatosws.ObtenerDatosOutput@10aef1d]
--------------- DENTRO DEL MÉTODO: [getObtenerDatosPROXY] - [FIN] ---------------
--------------- DENTRO DEL MÉTODO: [controlException] - [FIN] ---------------


- Para descargar el tutorial completo paso a paso dar click: AQUÍ
- Para descargar las fuentes del dummy dar click: AQUÍ


martes, 26 de febrero de 2013

MANEJO DE 'SCRIPTS' CON 'WLST'.

 
Buen día en esta oportunidad mostrare una solución para la administración de SERVERs en este escenario de automatización de tareas en Oracle WebLogic, en si de los problemas de tiempo en la instalación y eliminación de .EARs y .WARs mediante la interface que Servidor de Aplicación nos brinda. Otro problema encontrado es que para las instalaciones y eliminación solo permite una aplicación a la vez y esto quita aún más el tiempo de administración por parte de los administradores del server.


La solución que vengo a mostrar es el control en si por medio de Scripts, estos Script son de tipo Jython con WSLT a modo Online (conexión con el servidor). Estos funcionan ya que el lenguaje maneja métodos internos que simulan y ejecutan las acciones conocidas que uno como administrador del server realiza: INSTALL, DEPLOY, ACTIVE, EDIT, SAVE, etc. Y al ponerlos todos dentro de un Script se ejecutan de manera ordenada y rápida.


Básicamente, lo que WLST nos ofrece es un entorno de scripting para gestionar los dominios de WebLogic basado en Jython (implementación de python en java).  Al ejecutar la consola de WLST tendremos un intérprete de Jython con una serie de funciones predefinidas para administrar WebLogic, de forma que podremos arrancar o parar servidores, crear JDBC pools…lo que sea.



REQUERIMIENTOs:

Para poder probar este ejemplo preparado requieren:


     -    IDE ECLIPSE v3.7
-   
PLUGIN PyDev  for ECLIPSE:
     (FIND and INSTALL: '
http://org.python.pydev.jython')
-   
Oracle Enterprise Pack for Eclipse:
      (
FIND and INSTALL: http://download.oracle.com/otn_software/oepe/juno )


El Dummy preparado consta de lo siguiente:


1-      TRES ARCHIVOS (SCRIPT) CON EXTENSIÓN .py:
Estos archivos son los que contienen la lógica para la ejecución de los procesos de INSTALL, DELETE, ALL_IN_ONE (UPDATE) a ejecutar.


·  allinOneAppWLST.py
·  deleteAppWLST.py
·  installAppWLST.py


2-    TRES ARCHIVOS (SHELLS) CON EXTENSIÓN .sh:
Estos archivos son los que requerieren los .py para su ejecución via un entorno UNIX (Los .sh llaman y ejecutan a los .py)


·  allinOneAppWLST.sh
·  deleteAppWLST.sh
·  installAppWLST.sh


3-    UN ARCHIVO (PROPERTIES) CON EXTENSIÓN .properties:
Este archivo en el archivo de configuración de parámetros comunes a reutilizar por los archivos .py.


·   parametros.properties

PASOS:
Los pasos realizados para la prueba desde la IDE, son los mostrados a continuación:

- Importar proyecto a ECLIPSE:
- Verificar Scripts .py:
- Verificar Scripts .sh:

- Verificar el Servidor Weblogic (Que no existan los EAR, para mostrar el ejemplo):

- Ejecutar el Script .py:

- Verificar la traza del LOG  ejecutado correctamente:

- Verificar los .WAR o .EAR desplegados correctamente:

Para descargar el dummy dar click:  AQUÍ
Es todo por el momento.

Saludos.

domingo, 26 de agosto de 2012

PMD: 'MEJORA DE CÓDIGO JAVA'


En esta oportunidad mostraré el manejo de una muy buena herramienta para la validación y mejora de código JAVA llamada PMD.

PMD es una herramienta que comprueba que nuestra aplicación cumpla una serie de reglas que nos ayudan a obtener un código más elegante, sencillo y mantenible. Estas reglas se agrupan por conjuntos y pueden ser reglas de complejidad, como que la complejidad ciclomática no sea demasiado alta; de diseño, como no usar interfaces como meros contenedores de constantes; de optimización, como procurar usar ArrayList en lugar de Vector; etc.

PMD se puede utilizar desde linea de comandos, o puede integrarse con multitud de IDEs y herramientas, como Eclipse, NetBeans, Maven o JEdit. Y aunque algunos de los casos que comprueba PMD ya se tengan en cuenta en Eclipse, sigue siendo una utilidad muy interesante para añadir a nuestra caja de herramientas.

El ejemplo mostrado detalla el manejo paso a paso de esta herramienta tanto para las IDEsEclipse, JDeveloper.

Para descargar el tutorial dar click:  AQUI

Para descargar las fuentes ECLIPSE del tutorial, dar click: AQUI

Para descargar las fuentes JDEVELOPER del tutorial, dar click: AQUI


Saludos.




FINDBUGs: 'MEJORA DE CÓDIGO JAVA'



En esta oportunidad mostraré el manejo de manera EXTERNA y como PLUGIN de una muy buena herramienta para la validación y mejora de código JAVA llamada FINDBUGS

FINDBUGS es un programa de tipo código abierto creado por William Pugh que busca errores en programas escritos en código Java. Utiliza análisis estático para identificar cientos de tipos de errores potenciales en programas Java. FINDBUGS opera en Java ByteCode, en lugar de por código fuente.

El ejemplo mostrado detalla el manejo paso a paso ya se por PLUGIN y EXTERNA (independientemente de la IDE: Eclipse, JDeveloper, etc):

Para descargar el tutorial dar click:  AQUI

Para descargar las fuentes ECLIPSE del tutorial, dar click: AQUI

Para descargar las fuentes JDEVELOPER del tutorial, dar click: AQUI


Saludos.

martes, 21 de agosto de 2012

MAPPING 'JMS' & 'MDP' CON 'SPRING3'


En esta oportunidad mostraré como realizar un Mapping mediante SPRING, para el manejo de lanzamiento de mensajes 'JMS' y para su respectiva recepción de dichos mensajes 'JMS' mediante 'MDP' (Message Driven Pojos).

El mapping mostrado a continuación hace referencia al manejo de dos colas JMS para ello es requerido crea lo siguiente:
  • 1  JNDI TEMPLATE
  • JNDI FACTORY
  • JDNI DESTINATION RESOLVER
  • JDNI DESTINATION (por cada cola)
  • JMS TEMPLATE
Y para la recepción del mensaje JMS se deberá crear:
  • JMS MDP
  • JMS LISTENER
(Para fines del ejemplo, se ha cambiado LLAVES por CORCHETES):

[?xml version="1.0" encoding="UTF-8" ?]
[beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
      http://www.springframework.org/schema/jee
      http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util-3.0.xsd" ]
        
    [!-- ************** [JNDI TEMPLATE] ************** --]            
    [bean id="idTemplateJDNI" 
          class="org.springframework.jndi.JndiTemplate" ]
     [property name="environment" ] 
         [props]
             [prop key="java.naming.factory.initial" ]weblogic.jndi.WLInitialContextFactory[/prop]
             [prop key="java.naming.provider.url" ]t3://localhost:7001[/prop]
         [/props]
     [/property]
    [/bean]    
    
    [!-- **************** [JNDI FACTORY] *************** --]     
    [bean id="idConnectionFactoryJDNI" 
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiTemplate"        ref="idTemplateJDNI" /]
          [property name="lookupOnStartup" value="false" /]
  [property name="cache"                 value="true" /]
          [property name="jndiName"            value="dummy.javaman.jms.factory" /]
          [property name="proxyInterface"     value="javax.jms.ConnectionFactory" /]
    [/bean]
        
    [!-- ********* [JDNI DESTINATION RESOLVER] ********* --]  
    [bean id="idDestinationResolverJNDI"
          class="org.springframework.jms.support.destination.JndiDestinationResolver" ]
          [property name="jndiTemplate" ref="idTemplateJDNI" /]
          [property name="cache"           value="true" /]
    [/bean]    
    
    [!-- ************* [JDNI DESTINATION] ************** --]      
    [bean id="idDestination_01"
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiName" value="jms.jndi.queue" /]
    [/bean]
    
    [bean id="idDestination_02"
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiName" value="jms.jndi.auxiliar" /]
    [/bean]
        
    [!-- **************** [JMS TEMPLATE] *************** --]     
    [bean id="idTemplateJMS_01" 
          class="org.springframework.jms.core.JmsTemplate" ]
          [property name="connectionFactory"          ref="idConnectionFactoryJDNI" /]
          [property name="destinationResolver"        ref="idDestinationResolverJNDI" /]
          [property name="defaultDestination"          ref="idDestination_01" /]      [!-- COLA #1 --]
          [property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /]
          [property name="sessionTransacted"         value="true" /]
    [/bean]    
   
    [bean id="idTemplateJMS_02" 
          class="org.springframework.jms.core.JmsTemplate" ]
          [property name="connectionFactory"          ref="idConnectionFactoryJDNI" /]
          [property name="destinationResolver"        ref="idDestinationResolverJNDI" /]
          [property name="defaultDestination"          ref="idDestination_02" /]      [!-- COLA #2 --]
          [property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /]
          [property name="sessionTransacted"        value="true" /]
    [/bean]
    
 [!-- ****************** [JMS MDP] ****************** --]  
[bean id="idClaseJmsMessageListener_01"
     class="pe.com.javaman.dummy.servicioLlamadasWS.jms.ServicioLlamadasMDP_A" ]  [!-- PARA RECEPCIÓN [ASINCRONA] DE LA COLA --]   
[/bean] 
   
[bean id="idClaseJmsMessageListener_02"
     class="pe.com.javaman.dummy.servicioLlamadasWS.jms.ServicioLlamadasMDP_B" ]  [!-- PARA RECEPCIÓN [ASINCRONA] DE LA COLA --]   
[/bean] 
   
 [!-- **************** [JMS LISTENER] *************** --]      
[bean id="idListenerJMS_01" 
     class="org.springframework.jms.listener.SimpleMessageListenerContainer" ]
     [property name="connectionFactory" ref="idConnectionFactoryJDNI" /]
     [property name="destination"            ref="idDestination_01" /]                 [!-- COLA #1 --]
     [property name="messageListener"   ref="idClaseJmsMessageListener_01" /]
[/bean] 
    
[bean id="idListenerJMS_02" 
     class="org.springframework.jms.listener.SimpleMessageListenerContainer" ]
     [property name="connectionFactory" ref="idConnectionFactoryJDNI" /]
     [property name="destination"            ref="idDestination_02" /]                 [!-- COLA #2 --]
     [property name="messageListener"   ref="idClaseJmsMessageListener_02" /]
[/bean]                                
 [/beans]  

Esto sería todo nos vemos.