• Importación y creación carpeta

  • 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.
 #42166  by gcosta
 
Buenos días, tengo un script que lo que hace es crear una carpeta si no existe y importar los ficheros del servidor al OpenKM.

Bien, si la carpeta existe la importación funciona correctamente, si la carpeta no existe me encuentro con lo siguiente:

1. Si ejecuto la tarea del crontab desde el OpenKM manualmente todo funciona correctamente, crea la carpeta y realiza la importación.
2. si la tarea se ejecuta automaticamente desde el crontab y la carpeta no existe no la crea y no realiza la importación.

Alguien sabe a que puede ser debido que no cree la carpeta si la tarea es ejecutada automaticament y si si es ejecutada manualmente? es la misma tarea!

Gracias.
Code: Select all
import com.openkm.core.*;
import com.openkm.api.*;
import java.io.*;
import com.openkm.module.db.stuff.DbSessionManager;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
 
String token = DbSessionManager.getInstance().getSystemToken();
OKMDocument document = OKMDocument.getInstance();
OKMFolder folder = OKMFolder.getInstance();
String mes = "";
String ano = "";
 
public void autoImport(String okmPath, File fldpath){
  try {
    print("Scanning " + fldpath.getName() + "<br>");
	Date now = new Date();
	String dateString = now.toString();
	System.out.println(" 1. " + dateString);
	SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
	System.out.println(" 2. " + format.format(now));
	SimpleDateFormat format = new SimpleDateFormat("MM");
	System.out.println(" MES. " + format.format(now));
	mes = format.format(now);
	SimpleDateFormat format = new SimpleDateFormat("yyyy");
	System.out.println(" ANY. " + format.format(now));
	ano = format.format(now);

    for (File file : fldpath.listFiles()) {
      print("Importing " + file.getName() + "<br>");
	try {
	  if (file.isDirectory()) {
	    try {
	      folder.createSimple(token, okmPath + file.getName());
	    } catch (ItemExistsException ie) {
	      print("folder already exists<br>");
	      // Folder already exists - just ignore exception
	    }
	    autoImport( okmPath + file.getName() + "/", file);
	  } else {
	    // Check if file is still being written to
	    long length = file.length();
	    Thread.sleep(1000);
	    if (file.length() > length) continue;  // Skip file this time
	    document.createSimple(token, okmPath + file.getName(), new FileInputStream(file));
		
		//iniciem Workflow accepthours
		List formElements = new ArrayList();
		String UUID = document.getProperties(token, okmPath + file.getName()).getUuid(); //agafem uuid del document a iniciar Workflow
		System.out.println("UUID: " + UUID); 
		int idWorflow = 19; //id del workflow que volem arrancar
		OKMWorkflow.getInstance().runProcessDefinition(token, new Double(idWorflow).longValue(), UUID, formElements); //iniciem Workflow

	  }
	  print("Created " + okmPath + file.getName() + "<br>");
	} catch (Exception e) {
	  print ("Exception:" + e + "<br>");
	  // Something bad happened to prevent import. Skip to next file.
	 continue;
	}
       file.delete();
     }
  } catch (Exception e) {
    print("Exception: " + e + "<br>");
  }

}
    public void month_folder(String path) {
	try {
		Date now = new Date();
		String dateString = now.toString();
		System.out.println(" 1. " + dateString);
		SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
		System.out.println(" 2. " + format.format(now));
		SimpleDateFormat format = new SimpleDateFormat("MM");
		System.out.println(" MES. " + format.format(now));
		mes = format.format(now);
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		System.out.println(" ANY. " + format.format(now));
		ano = format.format(now);

		
		//creem carpeta mes
		String pathc = path + ano + "/" + mes;
		OKMFolder.getInstance().createSimple(null, pathc);
		//OKMPropertyGroup.getInstance().addGroup(null, path, "okg:ROLE_USER");
		//okmPath =  path + "/" + ano + "/" + mes + "/";
	} catch (Exception e) {
	    print("Exception: " + e + "<br>");
	}
	
}

month_folder("/okm:root/carpeta/carpeta/carpeta/");
autoImport("/okm:root/carpeta/carpeta/carpeta/" +  ano + "/" + mes + "/", new File("/var/carpeta/carpeta"));
 #42171  by jllort
 
El problema es claro, si te fijas estas utilizando algún metodo con el token null:
Code: Select all
OKMFolder.getInstance().createSimple(null, pathc);
Cuando el token es null, a la aplicación se le esta indicando que utilice la sesión bajo la que se esta ejecutando el crontab. En el caso de la ejecución manual, la sesión es la sesión del usuario, en el caso de la ejecución automática, la sesión no existe y esta dando un error. Como el crontab se ejecuta en un thread a parte, este error no queda logeado en el catalina.log y no sabes que esta pasando.

Aquí te apunto 2 consejos:
1- Yo no soy muy fan de los scripts, porque no los puedes debugar, mi consejo es crear clases de crontab en java -> jar ( si no recuerdo mal en el entorno portable tenemos un ejemplo de tarea de crontab https://sourceforge.net/projects/openkmportabledev/ ).
2- Meter siempre un try {} catch (Exception e ) y enviar la excepción o algun tipo de mensaje por correo electronico ( MailUtils.send etc.... ). No me acuerdo si en la versión community existe la clase StackTraceUtils -> que te permite convertir la excepción a la típica traza de texto, para que lo recibas por mail sea lo mas verbose posible.

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.