• Automatizacion

  • Hemos intentado hacer de OpenKM una aplicación lo más intuitiva posible, sin embargo siempre viene bien algún consejo.
Hemos intentado hacer de OpenKM una aplicación lo más intuitiva posible, sin embargo siempre viene bien algún consejo.
Forum rules: Por favor, antes de preguntar algo consulta el wiki de documentación o utiliza la función de búsqueda del foro. Recuerda que no tenemos una bola de cristal ni poderes mentales, o sea que que para informar sobre un error es necesario que nos indiques tanto la versión de OpenKM que usas como la del navegador y sistema operativo. Para más información consulta Cómo informar de fallos de forma efectiva.
 #28505  by gcosta
 
Buenso días, estoy utilizando la versión 6.2.5 Community. Estoy programando alguna que otra automatización.
El problema esta en cuanta genero una que añada una palabra clave al mover un documento a una carpeta. En cambio si hago el mismo proceso pero al crear un documento en vez de al mover funciona a la perfección.

Se trata de una limitacion de la versión Community?

Gracias.
 #28510  by gcosta
 
Gracias, desafortunadamente no veo que especifique ninguna limitación. a ver si alguien me puede echar una mano.

Gracias.
 #28528  by jllort
 
No hay ninguna limitación entre la version 6.2 professional y la community al respecte de funcionamiento, simplemente que algunas acciones / validaciones no vienen por defecto.

Por lo que entiendo. Al crear el documento + añadir palabra clave te va bien. Pero el mover + palabra clave falla. En el caso del mover lo haces en el post verdad. Puedes compartir aquí el código fuente y le hechamos un ojo.
 #28544  by gcosta
 
Buenas tardes os dejo el codigo que tengo echo. Como ya comente si lo uso al importar un documento de nuevo funciona perfectamente. ("add"). si lo uso al mover un documento no funciona.

Pavila si tengo creado la automatizacion en el "post". También he probado a realizar la automatizacion sin codigo usando las opciones que nos permite openKm. (Desplegable i seleccionar opción "addKeyword") pero tampoco funciona.

Gracias.
Code: Select all
import com.openkm.api.*;
import com.openkm.automation.*;
Status status = new Status();
status.state = "rebuda";
OKMProperty.getInstance().addKeyword(null,OKMRepository.getInstance().getNodePath(null, uuid),"factura");
OKMProperty.getInstance().addKeyword(null,OKMRepository.getInstance().getNodePath(null, uuid),"pendent");
OKMPropertyGroup.getInstance().addGroup(null, OKMRepository.getInstance().getNodePath(null, uuid), "okg:factura");
Map properties = new HashMap();
properties.put("okp:factura.state", status.state);
OKMPropertyGroup.getInstance().setPropertiesSimple(null, OKMRepository.getInstance().getNodePath(null, uuid), "okg:factura", properties);
 #28568  by jllort
 
Lo que comentas es un poco raro, me refiero al post del move. No té aparece ningún error en el log ?

Tendrías que asegurarte a ver si realmente el código se esta ejecutando.
 #28632  by gcosta
 
Buenos días, he realizado el "move" del documento y eso es lo que me aparece en el log. No entiendo que es lo que no funciona.
Code: Select all
2014-05-21 11:36:52,685 [http-bio-0.0.0.0-8080-exec-20] INFO  com.openkm.module.db.stuff.SetPropertiesFieldBridge - Added field 'okp:factura.pagada' with value 'false'
2014-05-21 11:36:52,685 [http-bio-0.0.0.0-8080-exec-20] INFO  com.openkm.module.db.stuff.SetPropertiesFieldBridge - Added list field 'okp:factura.state' with value 'rebuda'
2014-05-21 11:36:52,724 [http-bio-0.0.0.0-8080-exec-20] ERROR com.openkm.automation.validation.PathContains - 
java.lang.NullPointerException
	at com.openkm.automation.validation.PathContains.isValid(PathContains.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.openkm.util.cl.ClassLoaderUtils.invokeAutomationMethod(ClassLoaderUtils.java:159)
	at com.openkm.automation.AutomationManager.getValidActions(AutomationManager.java:104)
	at com.openkm.automation.AutomationManager.fireEvent(AutomationManager.java:58)
	at com.openkm.module.db.DbDocumentModule.move(DbDocumentModule.java:1053)
	at com.openkm.api.OKMDocument.move(OKMDocument.java:292)
	at com.openkm.servlet.frontend.DocumentServlet.move(DocumentServlet.java:370)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
	at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
 #28682  by jllort
 
En que versión de OpenKM te pasa esto ?
 #28690  by gcosta
 
La versión OpenKM Community Edition 6.2.5
 #28726  by gcosta
 
Gracias, la automatizacion ya las tengo configuradas y activadas ya que me aparecen al crear cualquier automatización. Me queda migrar a la versión 6.3 pero por ahora no me funciona tal y como he comentado en el hilo que tengo abierto en el apartado de instalación.

Gracias.
 #28908  by gcosta
 
Buenas tardes, finalmente he podido volver arrancar el hilo de la automatización. Después de migrar a la versión Community 6.3 y volver a probar sigue sin funcionar. Eso si he avanzado un poco más.

Os comento:
* Se trata de una automatización que añade una palabra clave al mover un documento dentro de una carpeta. Configurado como "Post"!

Bien si utilizo las validaciones de "ContainsFolder", "NameContains", "PathContains", ... es decir todas las que pueden hacer referencia al nombre de la carpeta no hay manera de que funcione, si funciona como ya comente si hago lo mismo en "create Document" en vez de "Move document".

Bien dicho eso que es lo que he descubierto, que si por ejemplo uso la validacion "HasKeyword" y le pongo una Keyword que tiene el documento, al hacer el "Move" si funciona y me añade la palabra clave que yo le he especificado en el apartado "Actions".

Dicho eso creo que el problema es que cualquier validación de path o name folder no funciona. He activado la automatizacion tal y como indica la documentación "http://wiki.openkm.com/index.php/Enable_automation" ya que de no ser asi no tendria todas las opciones de "Validation" y "Action".

Por favor a ver si alguien me puede decir que es lo que puedo hacer ya que me interesa mucho poder realizar esa acción segun la carpeta donde muevo el documento y no según la keyword que ese contenga.

Os dejo una imagen donde podeis ver que hay dos validaciones, más que nada para que tengais un ejemplo de las que uso, no me hace falta usar las dos. Y como ya he dicho la validación "HasKeyword" funciona y la "PathContains" no funciona con el "move" pero si con el "create".

Gracias.
Attachments
automation.jpg
automation.jpg (54.88 KiB) Viewed 4910 times
 #28924  by jllort
 
Ya me imagino lo que pasa. Esto tiene su historia. En la versión community ahora mismo tiene un pequeño defecto en relación al path contains, el tema en que el pathcontains y el resto esta evaluando el path origen no el path destino. Por eso te funciona con un create pero no te funciona al realizar el move. Este y otros pequeños problemas de este estilo no han sido "bien" solucionados hasta lo que será la versión 6.5.

Aun así lo puedes solucionar implementando tu propio PathContains, esta es la implementación actual:
Code: Select all
/**
 * OpenKM, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2014 Paco Avila & Josep Llort
 * 
 * No bytes were intentionally harmed during the development of this application.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.openkm.automation.validation;

import java.util.Map;

import net.xeoh.plugins.base.annotations.PluginImplementation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.openkm.api.OKMRepository;
import com.openkm.automation.AutomationUtils;
import com.openkm.automation.Validation;
import com.openkm.dao.bean.Automation;

/**
 * Check if the current parent path contains a designed one. The only
 * parameter is a path and will test if this one is included in the
 * actual parent.
 * 
 * @author pavila
 */
@PluginImplementation
public class PathContains implements Validation {
	private static Logger log = LoggerFactory.getLogger(PathContains.class);
	
	@Override
	public boolean isValid(Map<String, Object> env, Object... params) {
		try {
			String uuid = AutomationUtils.getString(0, params);
			String parentPath = AutomationUtils.getParentPath(env);
			String path = OKMRepository.getInstance().getNodePath(null, uuid);
			
			if (parentPath.startsWith(path)) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return false;
	}
	
	@Override
	public boolean hasPost() {
		return true;
	}
	
	@Override
	public boolean hasPre() {
		return false;
	}
	
	@Override
	public String getName() {
		return "PathContains";
	}
	
	@Override
	public String getParamType00() {
		return Automation.PARAM_TYPE_TEXT;
	}
	
	@Override
	public String getParamSrc00() {
		return Automation.PARAM_SOURCE_FOLDER;
	}
	
	@Override
	public String getParamDesc00() {
		return "String";
	}
	
	@Override
	public String getParamType01() {
		return Automation.PARAM_TYPE_EMPTY;
	}
	
	@Override
	public String getParamSrc01() {
		return Automation.PARAM_SOURCE_EMPTY;
	}
	
	@Override
	public String getParamDesc01() {
		return "";
	}
	
	@Override
	public String getParamType02() {
		return Automation.PARAM_TYPE_EMPTY;
	}
	
	@Override
	public String getParamSrc02() {
		return Automation.PARAM_SOURCE_EMPTY;
	}
	
	@Override
	public String getParamDesc02() {
		return "";
	}
}
Fíjate como el parentPath se esta pillando de una variable de entorno String parentPath = AutomationUtils.getParentPath(env); , esta parte es la que te interesa, porque el parentPath que se ha almacenado es el del documento antes de que se moviese con lo cual aqui realmente lo que te interesa es obtener el path actual:
Code: Select all
String docUuid = AutomationUtils.getUuid(env); 
String parentPath = OKMRepository.getInstance().getNodePath(null, docUuid);
El move es un caso complicado porque no sabes si tienes que valorar el origen o el destino o ambos. Al final llegamos a la conclusión que tiene mas sentido evaluar el destino que no el origen en el caso del PathContains y en la 6.5 la lógica ya tiene en cuenta muchas mas cosas, como el tipo de evento que ha disparado la validación etc.., pero vamos que todo forma parte de la acción.

Simplemente compila la clase -> crea un jar -> crear una carpeta plugins dentro de tomcat/plugin , lo pones ahí y al reiniciar el tomcat ya te aparecerá.
 #28952  by gcosta
 
Buenos días, he modificado el codigo pero creo que si no tengo montado el entorno para desenvolupar OpenKM no podré compilar el .jar

He probado de descargar el entorno y configurar y por ahora tengo problemas con las dependencias del conector del Maven. Hay alguna otra forma de compilar el archivo .jar?

Seria posible me mandaran el fichero por correo? o adjunto al forum?

Asi podria continuar trabajando sin tener que esperar a solucionar el problema del Maven que me trae de cabeza.

Gracias.
 #28964  by jllort
 
Hay una forma mas fácil, te comento los pasos con eclipse:
- Coge el OpenKM.war ( winrar ) y lo descomprimes en la carpeta OpenKM.
- Te creas un proyecto java vacio.
- Propiedades del proyecto -> java build path
pestaña source -> add folder -> añade el folder OpenKM/WEB-INF/classes
pestaña libraries -> add library -> User Library -> Botón user libraries -> new -> le pones un nombre ( add jars -> selecciona todos los jar de OpenKM/WEB-INF/lib)

Con esta simple configuración puedes crear clases para el automation, arrancar el tomcat y debugarlas si hace falta.

Nota: El maven puede tardar un par de horas en bajar todos los ficheros de todos los repositorios, es algo normal.

About Us

OpenKM is part of the management software. A management software is a program that facilitates the accomplishment of administrative tasks. OpenKM is a document management system that allows you to manage business content and workflow in a more efficient way. Document managers guarantee data protection by establishing information security for business content.