lunes, 16 de agosto de 2010

Documentum: seleccionar documentos (todas las versiones) con la ruta

Esta es una modificación a una consulta anterior de DQL para seleccionar archivos, sus identificadores de objeto, etiqueta de versión y rutas completas.

Solamente tiene una modificación para seleccionar todas las versiones de un mismo documento, no solamente la versión actual. Esto me ha sido útil para automatizar unos borrados en masa, borrando no solamente la versión actual, sino todas las versiones asociadas del documento.


select d.r_object_id, d.object_name, d.r_version_label, f.r_folder_path,
d.r_modify_date
from dm_document d, dm_folder f
where d.i_folder_id = f.r_object_id and d.i_position = -1
and f.i_position = -1
and i_chronicle_id in (
select i_chronicle_id from dm_document where (
(
Folder('/') and ( object_name in ('a', 'b', 'c')))
or (Folder('/') and ( object_name in ('d', 'e', 'f')))
)
) enable(row_based)

viernes, 6 de agosto de 2010

Ejecutando comandos WIN/DOS en Java

Aquí va un código sencillo para ejecutar comandos de DOS en Java:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DosCommandExecutor {

public static String exec(String command) {
String cmdOutput = "";
try {
Process p = Runtime.getRuntime().exec( "cmd /c " + command);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s = null;

while ((s = stdInput.readLine()) != null) {
cmdOutput += s + "\n";
}
} catch (IOException e) {
e.printStackTrace();
}
return cmdOutput;
}

public static void main(String[] args) {
System.out.println( DosCommandExecutor.exec("dir") );
}
}

Salida:


Volume in drive C is OSDisk
Volume Serial Number is 901D-8590

Directory of C:\code

08/03/2010 01:57 PM <DIR> .
08/03/2010 01:57 PM <DIR> ..
07/30/2010 12:14 PM 301 .classpath
07/30/2010 12:14 PM 388 .project
07/30/2010 12:14 PM <DIR> .settings
08/03/2010 02:00 PM <DIR> back_up
08/06/2010 01:57 PM <DIR> bin
08/06/2010 01:57 PM <DIR> src
2 File(s) 689 bytes
6 Dir(s) 5,739,667,456 bytes free

viernes, 30 de julio de 2010

java.lang.IllegalThreadStateException

Esta excepción tuve el gusto de conocerla hace poco y pareciera que era lanzada, en mi caso particular, cuando intentaba correr un hilo dos veces.

public class IllegalThreadStateExceptionExample {

protected FooThread fooThread = new FooThread();

public class FooThread extends Thread {
@Override
public void run() {
System.out.println("Foo Thread run!");
}
}

public void runThread() {
fooThread.start();
}

public static void main(String[] args) {
IllegalThreadStateExceptionExample example =
new IllegalThreadStateExceptionExample();
example.runThread();
example.runThread();
}
}

Resultado:

Foo Thread run!
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at IllegalThreadStateExceptionExample.runThread(IllegalThreadStateExceptionExample.java:14)
at IllegalThreadStateExceptionExample.main(IllegalThreadStateExceptionExample.java:20)

Según la documentación de la clase:

"Lanzada para indicar que un hilo no está en un estado apropiado para la operación solicitada."

Al parecer cuando un hilo termina su ejecución en el método "run()", queda en un estado en el cual no puede volver a ejecutarse. Se puede solucionar rápidamente simplemente instanciando un nuevo hilo.

martes, 20 de julio de 2010

Autenticación en Tomcat para acceso de direcciones de tipo UNC

Estuve lideando con un problema que me tomó un par de días resolver. Tengo un código en Java que utilizó para listar los archivos dentro de una carpeta. Uno simplemente crea una instancia de la clase java.io.File pasando en el constructor la ruta de la carpeta. Después solamente se llama el método "listFiles" y te retorna un arreglo con los archivos encontrados.

La ruta que necesitaba listar era de tipo UNC. La sintaxis utilizada por Microsoft para accesar una localidad de red compartida. Esta ruta estaba protegida con usuario y contraseña en el servidor. No obstante estos ya estaban guardados por windows de manera que no me volvía a preguntar por ellos cada vez que accesaba la dirección de red.

El problema en sí era que la clase de abajo (no es la misma, solo para usos de ejemplificación) funcionaba correctamente si la ejecutaba en línea de comandos. Pero si la usaba en mi aplicación web corriendo en Tomcat, la misma carpeta no se podía encontrar.


import java.io.File;

public class FolderLister {

public File[]listFiles(String address) {
File folder = new File(address);

if(folder.exists()) {
return file.listFiles();
}
return null;
}

public static void main(String [] args) {

FolderLister folderLister = new FolderLister();

File[] listOfFiles = folderLister.listFiles("\\\\remote-host\\path");

for (File f : listOfFiles) {
System.out.println(f.getName());
}
}
}
Intenté probar con el "catalina.policy" pero me di cuenta que nada tenía que ver con mi problema. Después de googlear con las palabras correctas encontré un foro donde indicaban que el Tomcat tenía que ser arrancado con el usuario que tenía acceso a la carpeta compartida. Esto se puede configurar fácilmente en las propiedades del servicio en la pestaña de "Log On".