330 likes | 454 Views
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 Marmonti Febrero 2010 emarmonti@gmail.com. Que es el engine de EmpWeb?.
E N D
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 Marmonti Febrero 2010 emarmonti@gmail.com
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 ew15db mySql SOAP SOAP edbWS GUI
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 Préstamo engine Devolución Reserva Loan.xml (pipeline) Cancelación . . . SOAP GUI Transacción n
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) Rollback Begin Commit See if there are reservations confirmed Unlock Steps Begin of transaction End of transaction Lock User See if the user is suspended or not Lock Object Update DB New steps (rules or processes) in the pipeline could be inserted
Pr1 Pr2 Pr3 Rule 1 Pr4 Lectura / Escritura Finalización transacción. Informe al usuario Espacio común de memoria Funcionamiento de los pipelines Reglas o procesos ProcessResult
Ejemplo del uso del espacio intermedio de memoria. Clase GetUser Status pre-getUser TransactionContext.USER_ID=01 TransactionContext.USER_DB=* TransactionContext.COPY_ID=10012 TransactionContext.OBJECT_DB=objetos TransactionContext.OPERATOR_ID=1 Invocación a GetUser Status post-getUser TransactionContext.USER_ID=01 TransactionContext.USER_DB=isis TransactionContext.COPY_ID=10012 TransactionContext.OBJECT_DB=objetos TransactionContext.OPERATOR_ID=1 TransactionContext.USER_DOM=”…<user><name>Guilárte, Rosa…” TransactionContext.USER_CLASS=Directores …. Parámetros Del proceso Webservice DB
Tipos de pipeline implementados por empweb. Configuración, Transacciones y Estadísticos.
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 usa • Clases compiladas como parte del engine • (Ej: • GetUser • ExtractUserClass • GetObject • ExtractObjectCategory • … • ) usa Groovy script
¿Cómo es una clase compilada de reglas o procesos en EmpWeb? publicclass 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? returnnew ProcessResult(true); } // execute } // GetObjectStatus
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 La misma clase usada en diferentes pipes, se puede parametrizar Loan.xml <params> <param name="transactionKeys">paymentFine,pendingFine</param><param name="ignoreTransactionNotFound">true</param><param name="storeUserStatus">true</param><param name="storeObjectStatus">false</param> </params> usa Groovy script 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
¿Como se compone el espacio intermedio de memoria? Transaction Context
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; }elsereturn true; //Siempre debe devolver un valor por la salida positiva ]]></param></params>
Políticas Complejas en EmpwebMundo de Objetos Transaction Context The object Loans Reserves The user Current Loans Suspensions Fees Reserves The location (library) The calendar Fees, Suspensions Scripting solutions Using each object we can make a new step In a pipeline that checks for complex rules or add new objects (fee, suspensions) to the Transaction Context
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.