EmpWeb – ABCD plugin
Curso de capacitación para transferencia tecnológica
Sección explicativa sobre el engine, secciones de código fuente, pipelines y groovy
Emiliano MarmontiFebrero [email protected]
Que es el engine de EmpWeb?
Un conjunto de servlets que implementan la lógica de negocio del proceso de circulación y efectúa de pegamento entre todas las piezas de las que empweb se compone.
engine engineconf.xml
GUI
SOAP
edbWS
SOAPmySql
ew15db
Análisis de engineconf.xml
<transactions>
<transaction name="loan" path="/engine/WEB-INF/conf/trans-pipes/loan.xml" /> <transaction name="return" path="/engine/WEB-INF/conf/trans-pipes/return.xml" /> <transaction name="renewal" path="/engine/WEB-INF/conf/trans-pipes/renewal.xml" /> <transaction name="suspension" path="/engine/WEB-INF/conf/trans-pipes/suspension.xml" /> <transaction name="fine" path="/engine/WEB-INF/conf/trans-pipes/fine.xml" /> <transaction name="wait" path="/engine/WEB-INF/conf/trans-pipes/wait.xml" /> <transaction name="cancelwait" path="/engine/WEB-INF/conf/trans-pipes/cancelwait.xml" /> <transaction name="cancelsuspension" path="/engine/WEB-INF/conf/trans-pipes/cancelsuspension.xml" /> <transaction name="cancelfine" path="/engine/WEB-INF/conf/trans-pipes/cancelfine.xml" />
<!-- config pipelines --> <transaction name="globalenvironment" path="/engine/WEB-INF/conf/conf-pipes/globalenvironment.xml" /> <transaction name="conf-getLibraries" path="/engine/WEB-INF/conf/conf-pipes/conf-getLibraries.xml" />
<!-- statistic pipelines --> <transaction name="stat-status-counts" path="/engine/WEB-INF/conf/stat-pipes/stat-status-counts.xml" /> <transaction name="stat-trans-by-ids" path="/engine/WEB-INF/conf/stat-pipes/stat-trans-by-ids.xml" />
…
</transactions>Listado de transacciones reconocidas y el path al XML que define las mismas, simil interface e implementation
Análisis de engineconf.xml
engine
Préstamo
Devolución
Reserva
Cancelación
.
.
.
Transacción nGUI
SOAP
Loan.xml(pipeline)
Análisis de engineconf.xml
<base name="corporate" type="users"> <uri>http://localhost:9090/central/bridge/endpointusers.php</uri> <wsdlFile>/dbws/users/v1/empweb-users-service-1-0.wsdl</wsdlFile> </base>
<base name="isis" type="users"> <uri>http://127.0.0.1:8085/ewdbws/services/ABCDUsersService</uri> <wsdlFile>/dbws/users/v1/empweb-users-service-1-0.wsdl</wsdlFile> </base>
<base name="objetos" type="objects"> <uri>http://127.0.0.1:8085/ewdbws/services/ABCDMarcObjectsService</uri> <wsdlFile>/dbws/objects/v1/empweb-objects-service-1-0.wsdl</wsdlFile> </base>
URL de atención de ewdbWS para usuarios
URL de atención de ewdbWS para objetos
Análisis de engineconf.xml
<empweb class="net.kalio.empweb.engine.db.ew15db.Empweb15DB">
<base name="TRANSA" type="transa"> <uri>jdbc:mysql://localhost/transa</uri> <user>root</user> <password>Emi1802</password> <schema>ew15db-schema.sql</schema> <!-- It's a resource inside ew15db.jar --> <backupDir>C:/ABCD/empweb/db</backupDir> <poolSettings> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <minPoolSize>3</minPoolSize> <maxPoolSize>20</maxPoolSize> <initialPoolSize>3</initialPoolSize> <acquireIncrement>2</acquireIncrement> <idleConnectionTestPeriod>30</idleConnectionTestPeriod> <testConnectionOnCheckin>false</testConnectionOnCheckin> <automaticTestTable>ew_test_table</automaticTestTable> <maxIdleTime>30</maxIdleTime> </poolSettings> <collation></collation> </base>
Definición del pool de conexiones JDBC con mysql para el storage de las transacciones
Transacciones como Pipelines
Pipeline concept (example simplified)
End of transaction
Lock User Lock
Object
See if there are reservations confirmed
See if the user is suspended or not
Update DB
Unlock
New steps (rules or processes) in the pipeline could be inserted
Steps
Begin CommitRollback
Begin of transaction
Funcionamiento de los pipelines
Pr1 Pr2 Pr3 Rule 1 Pr4
Finalización transacción. Informe al usuarioEspacio común de memoria
Lectura / Escritura
Reglas o procesos
ProcessResult
Ejemplo del uso del espacio intermedio de memoria. Clase GetUser
TransactionContext.USER_ID=01TransactionContext.USER_DB=*TransactionContext.COPY_ID=10012TransactionContext.OBJECT_DB=objetosTransactionContext.OPERATOR_ID=1
Invocación a GetUser
Webservice DBParámetrosDel proceso
TransactionContext.USER_ID=01TransactionContext.USER_DB=isisTransactionContext.COPY_ID=10012TransactionContext.OBJECT_DB=objetosTransactionContext.OPERATOR_ID=1TransactionContext.USER_DOM=”…<user><name>Guilárte, Rosa…”TransactionContext.USER_CLASS=Directores….
Status pre-getUser
Status post-getUser
Tipos de pipeline implementados por empweb. Configuración, Transacciones y Estadísticos.
Ubicación de los Pipelines
Análisis del pipeline de Préstamos (loan.xml)
<rule class="net.kalio.empweb.engine.rules.GetUser" name="GetUser"> <doc>Get User DOM from (userId, userDb)</doc> <params> <!-- checks for expired or disabled user --> <param name="checkValidity">true</param> </params></rule>
<rule class="net.kalio.empweb.engine.rules.ExtractUserClass" name="ExtractUserClass"> <doc>Extract the user class from the user XML and store it in the TransactionContext.</doc> <params> <!-- If "useDefault" is true, it will return "*" when a user class can't be found --> <!--<param name="useDefault">true</param>--> </params></rule>
<rule> …</rule>
<process>…</process>
Cada una de las divisiones en rules o procesos definen una “casilla” del pipeline. Si en la clase se define algo distinto de Groovy, es que la clase se halla precompilada y no es alterable. Caso contrario es posible modificarla
Análisis del pipeline de Préstamos (loan.xml)
Loan.xml
Groovy script
Clases compiladas como parte del engine(Ej: • GetUser• ExtractUserClass• GetObject• ExtractObjectCategory•…)
usa
usa
¿Cómo es una clase compilada de reglas o procesos en EmpWeb?
public class GetObjectStatus implements Process{ public ProcessResult execute(TransactionContext tc) throws EngineException, Exception { String objectDb= (String)tc.get(TransactionContext.OBJECT_DB); String recordId= (String)tc.get(TransactionContext.RECORD_ID); EmpwebDB ewdb= WSBroker.getEwdb();
ObjectStatus oStat= ewdb.getRecordStatus(recordId, objectDb); tc.put(TransactionContext.OBJECT_STATUS, oStat);
// Nothing special to return, should always get OserStatus object, or an EngineException. BBB right? return new ProcessResult(true); } // execute
} // GetObjectStatus
Paso 1. Creación de una nueva regla o proceso
Paso 2. Ubicación de la regla o proceso en el lugar adecuado de la lista que compone el pipe
Paso 3. Edición de la regla o proceso
Documentación
Límites del proceso
Parámetros
Diferencia entre Límites y parámetros
Límites publican un valor en particular para un perfil, es decir que una regla o proceso que usa límites generará un nuevo valor profile-dependent
<limits> <limit name="nombre">valor por defecto</limit></limits>
Donde se cargan los valores de los límites publicados en las distintas reglas o procesos?
Parámetros
Loan.xml
Groovy script
usa
<params><param name="transactionKeys">paymentFine,pendingFine</param><param name="ignoreTransactionNotFound">true</param><param name="storeUserStatus">true</param><param name="storeObjectStatus">false</param></params>
La misma clase usada en diferentes pipes, se puede parametrizar
Caso especial de parametrización
¿Que es Groovy?
Groovy...
is an agile and dynamic language for the Java Virtual Machine builds upon the strengths of Java but has additional power features
inspired by languages like Python, Ruby and Smalltalk makes modern programming features available to Java developers
with almost-zero learning curve supports Domain-Specific Languages and other compact syntax so
your code becomes easy to read and maintain makes writing shell and build scripts easy with its powerful processing
primitives, OO abilities and an Ant DSL increases developer productivity by reducing scaffolding code when
developing web, GUI, database or console applications simplifies testing by supporting unit testing and mocking out-of-the-
box seamlessly integrates with all existing Java objects and libraries compiles straight to Java bytecode so you can use it anywhere you can
use Java
Ejemplo de un script en Groovy<rule class="net.kalio.empweb.engine.rules.GroovyInterpreter" name="PucvObjetoEsDeBiblioteca"> <doc>Verifica si el objeto pertenece a la biblioteca donde se estra realizando la transaccion. La biblioteca viene en el elemento "copyLocation" del holdingsInfo y lo compara contra el "operatorLocation" que viene en el transactionExtras. </doc> <params> <param name="script"><![CDATA[
copyId= tc.get(TransactionContext.COPY_ID);biblioteca= tc.getObjectValue("//hold:copy[hold:copyId='${copyId}']/hold:copyLocation");
transExtras= tc.get(TransactionContext.TRANSACTION_EXTRAS);operatorLocation= transExtras != null ? transExtras.get("operatorLocation") : "";
if (operatorLocation != biblioteca) { msg.setText("Este objeto no pertenece a la biblioteca, sino que pertenece a la biblioteca:"+biblioteca); return false; }else return true;]]> </param> </params></rule>
¿Como se compone el espacio intermedio de memoria? Transaction Context
Clave Tipo de valor
LOCAL_ENV Entorno de parámetros locales al proceso. Lista de valores.
GLOBAL_ENV Entorno de parámetros globales al proceso. Lista de valores.
USER_DOM DOM del usuario. Objeto.
OBJECT_DOM DOM del objeto. Objeto.
USER_ID ID del usuario corriente. String.
USER_DB Base de datos del usuario corriente. String.
COPY_ID Identificación de la copia del objeto corriente. String.
VOLUME_ID Volúmen de copia corriente. String.
RECORD_ID Identificación del registro corriente. String.
OBJECT_DB Base de datos de objetos corriente. String.
OPERATOR_ID Identificación del operador que realiza la transacción. String.
DESK_OR_WS Solo para reservas. Si proviene la transacción desde empWeb o desde el mySite
OBJECT_LOCATION Identificación de la biblioteca de la copia corriente
¿Como se compone el espacio intermedio de memoria? Transaction Context
OBS Observaciones ingresadas por el usuario en el formulario. Solo aplicable a transacciones tales como Suspensiones o multas.
FINE_AMOUNT Monto de multa corriente. Valor real.
PAID_AMOUNT Monto ingresado por el operador para el pago de la multa. Valor real.
DAYS_SUSPENDED Cantidad de días de suspensión para el usuario.
USER_CLASS Tipo del usuario sobre el cual se va a realizar la transacción.
OBJECT_CATEGORY Tipo de objeto sobre el cual se va a realizar la transacción.String.
USER_STATUS
USER_CLASS Tipo de usuario para la transacción corriente. String.
OBJECT_STATUS
PROFILE Contiene el objeto de la clase Profile de la transacción corriente. Define la categoría del usuario y el tipo de objeto para la transacción corriente.
Objetos usables desde EmpWeb
Objetos usables desde EmpWeb
Variables mágicas con las que contamos en el marco de un script de Groovy
…. Binding binding= new Binding();
binding.setVariable("tc", tc);
/* transaction context , desde groovy invocado como tc.getValue(“”);
*/
binding.setVariable("ewdb", WSBroker.getEwdb());
binding.setVariable("params", params); binding.setVariable("defaultLimits", defaultLimits); binding.setVariable("msg", msg); binding.setVariable("result", result);
…
net.kalio.empweb.engine.rules.GroovyInterpreter.java
Ejemplo de una regla simple en Groovy
<params><param name="script"><![CDATA[ copyId= tc.get(TransactionContext.COPY_ID); biblioteca= tc.getObjectValue ("//hold:copy[hold:copyId='${copyId}']/hold:copyLocation");
transExtras= tc.get(TransactionContext.TRANSACTION_EXTRAS); operatorLocation= transExtras != null ? transExtras.get("operatorLocation") : "";
if (operatorLocation != biblioteca) { msg.setText("Este objeto no pertenece a la biblioteca"); return false; } else return true; //Siempre debe devolver un valor por la salida positiva]]></param></params>
Políticas Complejas en EmpwebMundo de Objetos
The userCurrent LoansSuspensionsFeesReserves
The objectLoans Reserves
Transaction Context
Fees, SuspensionsThe calendar
The location(library)
Using each object we can make a new stepIn a pipeline that checks for complex rulesor add new objects (fee, suspensions) to the Transaction Context
Scripting solutions
Actividad con ayuda
Crear una regla para que todo aquel usuario cuyo nombre incluya el substring ‘Josefa’ se le emita un mensaje impidiendo el préstamo.
La biblioteca de Ingeniería quiere implementar una regla por la cual los CDs solo se prestan a alumnos de esa facultad. Aprovechando los ejercicios anteriores de inclusión del dato de facultad del usuario, implementar esta regla.
Ayuda
<rule class="net.kalio.empweb.engine.rules.GroovyInterpreter" name="CheckValidityDateIsNotNull"> <doc>Check null values in User cards</doc> <params><param name="script"> <![CDATA[ username= tc.getUserValue("//u:name"); if (username.indexOf(“Josefa”)>=0) { msg.addText('en', “I don’t make loans to Josefas"); msg.addText('es', “No le presto a Josefas"); return false; } ]]> </param> </params> </rule>
Actividad
La biblioteca de AGR no acepta reservas en línea para aquellos usuarios cuya expiración del carnet se produce en los próximos tres meses.
Ante la cancelación de una reserva, todas las bibliotecas acuerdan imponer una regla de funcionamiento por la que si la publicación tiene otras reservas, se le imputa una multa de $5 a excepción que la categoría del usuario sea Coordinadores en cuyo caso se impone una multa de $10.
Actividad En el análisis de funcionamiento de EmpWeb, la
biblioteca de ING detecta que las suspensiones no aplican ningún efecto multiplicador. Esto es decir que se suspende con igual cantidad de días a alguien que devuelve con 1 día de atraso que a alguien que se atrasa 2 meses. Solicita entonces implementar la siguiente tabulación para suspensiones:
1-10 días, hasta 3 suspensiones anteriores -> 4 dias 1-10 días, mas de 3 suspensiones anter -> 10 dias 11-40 días, hasta 3 suspensiones anter -> 25 dias 11-40 días, mas de 3 suspensiones anter -> 90 días 41 -60 días de atraso, multa de $200 y suspensión por
un año. Mas de 60 días, costo de la publicación como multa y
suspensión permanente.