Page 1 of 1

Importación y creación carpeta

PostPosted:Tue Aug 16, 2016 9:54 am
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"));

Re: Importación y creación carpeta

PostPosted:Tue Aug 16, 2016 6:18 pm
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.