Alfresco upgrade

Előbb utóbb mindenhol eljön a verzió-váltás ideje, érdemes előre felkészülni, – akár egy erre kialakított demó rendszeren gyakorlatozva – hogy ne érjen túl nagy meglepetés ha élesben kell elvégezni…

Alfresco LogoEzt a frissítést az Alfresco esetében több módon is elvégezhetjük, de minden esetben fokozottan ügyeljünk arra, hogy mindig legyen lehetőségünk visszaállítani az eredeti állapotot.

Ha az első installáció óta megfogadtuk a dokumentációban leírtakat és a “tomcat/shared” alatt végeztük el a személyre szabást, azaz ott hoztuk létre a “custom” konfigurációs file-okat, akkor egyszerűbb a dolgunk. Ha ezt nem tettük meg eddig, legyen ez a frissítés előtti első feladatunk…

Klasszikus upgrade folyamat:

  • 1. A frissítendő Alfresco rendszer leállítása (pl. “/opt/alfresco-3.0b”)
  • 2. A “custom-repository.properties” konfigurációs file-ban az aktív “db.url” változóval definiált adatbázis backup-ja (file dump)
  • 3. A “repository.properties” konfigurációs file-ban definiált “dir.root” változó szerinti könyvtár mentése (alkönyvtárakkal együtt) (pl.: “alf_data/*”)
  • 4. A “tomcat/shared/classes/alfresco/extension” könyvtárban található, saját konfigurációs file-ok mentése (csak azokat kell és szabad menteni és visszaállítani, amit saját magunk hoztunk létre!)
  • 5. A “tomcat/conf” könyvtárban található, saját Tomcat paraméter file-ok mentése
  • 6. A “tomcat/webapps” könyvtárban található, saját programok mentése
  • 7. A “tomcat/webapps/alfresco/WEB-INF/lib” könyvtárban található, saját class-ok mentése
  • 8. A “tomcat/webapps/alfresco/WEB-INF/classes” könyvtárban található, saját beállítások mentése
  • 9. Az új Alfresco installációja egy új könyvtárba (“/opt/alfresco-3.1”)
  • 10. Az új Alfresco installáció ellenőrzése (start, log ellenőrzés, stop)
  • 11. A 2,3,5,6 pontokban elkészített mentés visszaállítása az új Alfresco installációba (adatbázis, repository)
  • 12. Az “extension” könyvtárban található, saját konfigurációs file-ok visszaállítása
  • 13. Az Alfresco bővítmények (AMP-ok, stb.) telepítése
  • 14. Az új Alfresco installáció elindítása és a log ellenőrzése (“tomcat/logs/catalina.out”)
  • 15. Sikeres indulás után a rendszer funkcióinak ellenőrzése, illetve az adatbázis tartalmának (dokumentumok, leírók, stb.) ellenőrzése

Egyszerű upgrade folyamat:

  • 1. Leállítjuk az Alfresco-t és mentést készítünk az adatbázisról
  • 2. A régi rendszerből kimásoljuk a “tomcat/webapps/alfresco” könyvtár tartalmát egy másik könyvtárba (hátha módosítottunk valamit benne, amit majd vissza kell állítani)
  • 3. Eltöröljük a “tomcat/webapps” könytárból az alfresco.war-t és a share.war-t
  • 4. Az új csomagból kiszedjük az alfresco.war-t és a share.war-t, majd bemásoljuk a “tomcat/webapps” könyvtárba
  • 5. Újraindítjuk az Alfresco-t és ellenőrizzük a log bejegyzéseket (“tomcat/logs/catalina.out”) és az adatbázis tartalmát

Az upgrade folyamat egy hosszadalmas schema frissítéssel is szokott járni, melynek eredményéről a log-ban az “Alfresco started” üzenet utáni “Current version” értéke árulkodik. Ennél a rendszernél sajnos teljes mértékben megszokott, hogy a 3.1-es verziót 3.0.0-val jelölik…

    17:02:07,817 User:System INFO [service.descriptor.DescriptorService] Alfresco started (Labs): Current version 3.0.0 (Stable 1526) schema 1002 – Installed version 3.0.0 (b 1164) schema 131

Mindkét – vagy akár vegyes – megoldás is alkalmazható, de az adatbázis konzisztenciája, a rendszerben tárolt adatok értéke legyen mindig az irányadó a folyamat minden egyes lépésénél.

Alfresco WEB client customization

Two tricks to set up a better view of Alfresco WEB client…

Find, or create “web-client-config-custom.xml” file in directory “tomcat/shared/classes/alfresco/extension” and update with following sections:

Change walk-history like breadcrumb to location in repository:

    
        
            
            location
        
    

Set default view to details mode and increase number of items to 50:

    
        
        
            
            
                
                    
                    details
                    
                        50
                        
50
50

My Eclipse installation

Just for a reminder…

Requirements, Features:
– Support for Alfresco development (javascript and java webscripts, actions, properties XMLs)
– HTML editor and preview (Firefox and Safari)
– JavaScript editor (with code formatter, and syntax checker)
– Freemarker editor (with syntax checker)
– PHP editor (with syntax checker and help)
– XML editor
– Shell script editor
– SVN client (projects by checkout)

Eclipse:
Eclipse IDE for Java Developers (3.4 GANYMEDE): download

Tools update site links:
Aptana update for Eclipse 3.4: http://update.aptana.com/update/studio/3.4
– Window menu: My Aptana
Utilities / Subclipse SVN client plugin (with SVNKit)
Platform / Aptana PHP
Platform / Aptana Adobe AIR 1.5 Development
Platform / Aptana Apple iPhone Development
FreeMarker syntax: http://www.freemarker.org/eclipse/update/ (don’t forget to update freemarker.jar in eclipse/plugins/org.visigoths.freemarker_2.3.2)
TRAC plugin for Mylin
Graphviz plugin: http://abstratt.com/update/
– JBOSS jBPM graphical workflow/process designer: unzip “jbpm-jpdl-designer-site.zip” in folder “designer”, then select “Help/Software Updates/Find and Install”, and use “Search for new features to install” to add with “New Local Site”
JSON editor (local site install)
ShellEd – shell script editor (download zip and copy contents into Eclipse directory)

Eclipse with Aptana

Alfresco: ObjID already in use

What a wonderful day, after hours of installation and customization procedure (Alfresco backend on Debian Linux host) i’ve got a killer error message in console.

Alfresco 3.0 startup error, with difficult to understand message about some object what is already in use:

18:46:21,943 ERROR [web.context.ContextLoader.initWebApplicationContext:203] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.remoting.rmi.RmiServiceExporter' defined in class path resource [alfresco/emailserver/email-service-context.xml]: Invocation of init method failed; nested exception is java.rmi.server.ExportException: internal error: ObjID already in use

The next section of the error log, with network realated messages:

Caused by: java.rmi.server.ExportException: internal error: ObjID already in use
at sun.rmi.transport.ObjectTable.putTarget(ObjectTable.java:169)
at sun.rmi.transport.Transport.exportObject(Transport.java:74)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:229)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:393)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:129)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:190)

And what is the solution? Very simple, just check your network and host – in /etc/hosts file – names and IP addresses, and correct to real values, what is showed by ifconfig command.

Java application wants to bind an IP address, but this address isn’t exists on system…

Alfresco OpenOffice plugin for Mac OSX

I wasted my weekend with a wrong way to use Alfresco OOo-plugin on Mac OSX platform.

This plugin (ooo-plugin at Alfresco Forge) works on Linux and Windows, but not on OSX. I’ve tried with NeoOffice 2.x and 3.x, OpenOffice.org 3.0.1 and 3.1-dev without any success.

Plugin compiled – custom script below -, and able to install into OpenOffice/NeoOffice by script or Tools/Extension Manager menu directly – and no more activity.

alfresco_ooo-plugin_mac

OOo-Plugin build script for OSX:

#!/bin/sh
#
# Build script for Mac OSX
# by LouiSe@louise.hu

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home
export PATH=$PATH:System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin

export CLASSPATH=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/javaws.jar

ant

chmod +x dist/bin/inst_mac.sh
chmod +x dist/bin/uninst_mac.sh
echo "Just run dist/bin/inst_mac.sh for OpenOffice, and web/inst_mac.sh for backend installation..."

Three possible reasons for this that does not work:

1. OpenOffice 3.0.x bug (Apple AWT Java VM was loaded on first thread — can’t start AWT): Issue: 92926

2. NeoOffice 2.x Java Extension loading bug:

soffice.bin[23825]: JavaNativeFoundation: GetGlobalVM: JNI_GetCreatedJavaVMs() failed to get any VM.

3. JDIC incompatibility with Mac OSX 10.5 and Safari4 (works with Safari3) WebKit:

louise$ java -Xbootclasspath/p:/Library/Java/Home/lib/plugin.jar:/Library/Java/Home/lib/deploy.jar -cp .:jdic.jar:demo/Browser/ Browser
ERROR : Failed to create WebKitView
Invalid memory access of location 00000000 eip=00000000
Bus error

Coredump:

Java information:
 Version: Java HotSpot(TM) Client VM (1.5.0_16-133 mixed mode, sharing)
 Virtual Machine version: Java HotSpot(TM) Client VM (1.5.0_16-133) for macosx-x86, built on Aug 27 2008 11:00:20 by root with gcc 4.0.1 (Apple Inc. build 5465)
 Exception type: Bus Error (0xa) at pc=0x00000000

Current thread (0x01001370):  JavaThread "main" [_thread_in_native, id=-1333784576]
Stack: [0xb0001000,0xb0801000)
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.jdesktop.jdic.browser.WebKitWebBrowser.createNSView1()I+0
j  org.jdesktop.jdic.browser.WebKitWebBrowser.createNSView()I+2
j  com.apple.eawt.CocoaComponent.createNSViewLong()J+1
j  apple.awt.CToolkit.createCanvas(Ljava/awt/Canvas;)Ljava/awt/peer/CanvasPeer;+33
j  java.awt.Canvas.addNotify()V+20
j  org.jdesktop.jdic.browser.WebKitWebBrowser.addNotify()V+1
j  java.awt.Container.addNotify()V+56
j  javax.swing.JComponent.addNotify()V+1
...
j  Browser.main([Ljava/lang/String;)V+62
v  ~StubRoutines::call_stub
Java Threads: ( => current thread )
  0x0100f7a0 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=9080832]
  0x0100e2c0 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=9070592]
  0x0100ce20 JavaThread "Image Fetcher 0" daemon [_thread_blocked, id=9051648]
  0x0100be50 JavaThread "AWT-Shutdown" [_thread_blocked, id=8866816]
  0x0100b9e0 JavaThread "AWT-AppKit" daemon [_thread_in_native, id=-1606609120]
  0x01008f10 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=8501760]
  0x01008460 JavaThread "CompilerThread0" daemon [_thread_blocked, id=8498176]
  0x01008010 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=8494592]
  0x01007870 JavaThread "Finalizer" daemon [_thread_blocked, id=8476160]
  0x010074b0 JavaThread "Reference Handler" daemon [_thread_blocked, id=8470016]
=>0x01001370 JavaThread "main" [_thread_in_native, id=-1333784576]
...
Thread 1 Crashed:
0   ???                           	0000000000 0 + 0
1   com.apple.Foundation          	0x90418231 _NSRemoveHandler2 + 33
2   libjdic.jnilib                	0x1b0bb622 Java_org_jdesktop_jdic_browser_WebKitWebBrowser_createNSView1 + 588
...
29  libclient.dylib               	0x005cf760 JNI_CreateJavaVM_Impl + 132240
30  java                          	0x000022b3 0x1000 + 4787
...

The right way is NeoOffice 3.x and Safari 3

Main preference panel (with hungarian localization) works with Safari 3.x in NeoOffice 3.0 release:
alfresco-ooo_plugin-setup-hungarian

Browser view (navigation) failed with a white background without content, plugin log is here:

2009-04-06 08:22:44,445 [DEBUG] [com.westernacher.openoffice.alfresco.server.ServerConfig : loadFromRegistry] loadFromRegistry() end, state=com.westernacher.openoffice.alfresco.server.ServerConfig@258c74[defaultWebClientURL=http://127.0.0.1:8080/alfresco/,defaultWebDAVClientURL=http://127.0.0.1:8080/alfresco/webdav/,defaultCifsServer=,serverName=127.0.0.1,webClientURL=http://127.0.0.1:8080/alfresco/,webDAVURL=http://127.0.0.1:8080/alfresco/webdav/,cifsServer=,username=admin,password=admin,authenticationTicket=,documentPhysicalPath=,documentAlfrescoPath=,defaultToCIFS=true]
...
2009-04-06 08:22:44,472 [DEBUG] [com.westernacher.openoffice.alfresco.ui.AlfrescoPane : initializePanel] web browser panel initialized
...
2009-04-06 08:22:44,568 [DEBUG] [com.westernacher.openoffice.alfresco.configuration.WindowPositionPersisterImpl : getWindowPosition] getWindowPosition() begin
2009-04-06 08:22:44,568 [DEBUG] [com.westernacher.openoffice.alfresco.configuration.ConfigurationServiceImpl : getPropertyInteger] getPropertyInteger(name=WindowTop, defaultValue=-1)
...
2009-04-06 08:22:44,574 [DEBUG] [com.westernacher.openoffice.alfresco.ui.PopupControllerImpl : loadWindowPosition] loadWindowPosition(frame=javax.swing.JFrame[frame5,486,89,292x706,hidden,layout=java.awt.BorderLayout,title=Alfresco,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,292x684,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=449,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]) end, result=true
...
2009-04-06 08:22:44,667 [DEBUG] [com.westernacher.openoffice.alfresco.ui.PopupControllerImpl : loadWindowPosition] loadWindowPosition(frame=javax.swing.JFrame[frame6,66,87,292x708,hidden,layout=java.awt.BorderLayout,title=Alfresco,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,292x686,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=449,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]) begin
...
2009-04-06 08:22:44,722 [DEBUG] [com.westernacher.openoffice.alfresco.ui.PopupControllerImpl.webBrowser : windowActivated] windowActivated: event=java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=com.sun.star.vcl.VCLFrame$NoPaintFrame[frame3,335,246,128x57,invalid,layout=java.awt.BorderLayout,title=Add-On - Alfresco Fenster Offnen / schlieen,resizable,normal],oldState=0,newState=0] on frame5
...
2009-04-06 08:22:44,732 [DEBUG] [com.westernacher.openoffice.alfresco.ui.PopupControllerImpl.webBrowser : windowOpened] windowOpened: event=java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on frame5
...
2009-04-06 08:22:44,754 [DEBUG] [com.westernacher.openoffice.alfresco.server.ServerConfig : getAuthenticationTicket] ticket=
...
2009-04-06 08:22:44,754 [DEBUG] [com.westernacher.openoffice.alfresco.ui.AlfrescoPane : setNavigation] setNavigation(url=http://127.0.0.1:8080/alfresco/wcservice/openoffice/myAlfresco?p=&e=odt)
...
2009-04-06 08:22:45,831 [DEBUG] [com.westernacher.openoffice.alfresco.ui.PopupControllerImpl.webBrowser : windowDeactivated] windowDeactivated: event=java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on frame5

Java console log:

*** Jtrace: Msg Client new once!
Exception in thread "EventThread" java.lang.IllegalArgumentException: Null charset name
	at java.nio.charset.Charset.lookup(Charset.java:430)
	at java.nio.charset.Charset.forName(Charset.java:497)
	at org.jdesktop.jdic.browser.internal.MsgClient.(Unknown Source)
	at org.jdesktop.jdic.browser.internal.NativeEventThread.run(Unknown Source)
*** Jtrace: 
MyFocusListener: focusGained

After a small hack (replacing WebBroser declaration and browser init code with IWebBrowser) in AlfrescoPane.java file, browser view works, but the layout is wrong:
alfresco-ooo_plugin-browser

Follow forum thread for release: OpenOffice.org plugin @ Alfreso Forge

Alfresco 3.0 – magyar lokalizáció

Ékes nyelvünk immár az Alfresco WEB felületén is megjelenik, bár nem rajongok az efféle lokalizációért, de úgy gondoltam a vevőkért és a felhasználókért mindent…

Magyarországon dokumentumkezelő rendszert magyar nyelvű felület nélkül nem lehet bevezetni, lásd: http://broadbit.hu/dokumentumkezelo-rendszer-bevezetese/

alfresco-hungarian-login

alfresco-hungarian-browser

Alfresco – kérdések és válaszok

Az egyik Alfresco tréningemhez készült a csatolt prezentáció, melyben általános kérdések és az azokra adott válaszok olvashatók.

Azt hiszem, valahol ott kezdődik a jó oktatás, ahol megjelennek a kérdések. Kérdések nélkül beülni egy órára, egy előadásra nem az igazi…

Ahol a hallgatók már előre képesek összeszedni a kérdéseket, a jó eredmény szinte garantált! Mondom ezt jónéhány tréninggel és eredményes projekttel a hátam mögött. Meg vélhetőleg sok-sok hasonlóval magam előtt…

Letöltés: LouiSe-Alfresco_kerdese_es_valaszok.pdf

Alfresco Virus Checker action

What do you think about a missing feature in Alfresco – a working document Virus Checker action?

Alfresco Virus Checker Action, select action

Features:
– Java based Alfresco action
– Configurable, scriptable virus checker backend interface (works with ClamAV too)

Alfresco Virus Checker Action, result

Let see an example Action Executer:

/*
 * Copyright (C) 2009 louise@louise.hu
 */

package hu.louise.VirusChecker;

import java.io.*;
import java.io.IOException;
import java.io.Serializable;
import java.io.File;
import java.io.BufferedWriter;
import java.util.List;
import java.io.InputStream;
import java.util.Locale;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import java.lang.Runtime;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.content.*;

import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.QName;

import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.ActionImpl;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.BaseSpringTest;
import org.alfresco.util.GUID;
import org.alfresco.service.cmr.repository.ChildAssociationRef;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * Alfresco Action executer.
 * 
 * @version 1.62
 */

public class VirusCheckerActionExecuter extends ActionExecuterAbstractBase {
    /** The name of the action */
    public static final String NAME = "VirusChecker-action";

    /** shell script name with full path */
    public static final String VirusCheckerScript = "/opt/clamav/check_clamav.sh";
    
    /** parameter's name */
    public static final String PARAM_TESTMODE = "param-testmode";

    /** name space */
    public static final String NAMESPACE = "???";

    /** test mode flag */
    // private boolean VirusCheckerTestMode = false;

    /** The logger */
    private static Log logger = LogFactory.getLog("hu.louise.VirusCheckerAction");

    /** node service object */
    private NodeService nodeService;

    /** content service object */
    private ContentService contentService;

    /**
     * set the node's service (Alfresco internal use)
     * 
     * @param nodeService
     */
    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

    /**
     * set the content's service (Alfresco internal use)
     * 
     * @param contentService
     */
    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }

    /**
     * This action will check node for Virus infection
     */
    @Override
    protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {
        // check for valid node
        if (actionedUponNodeRef != null && // check node
                this.nodeService.exists(actionedUponNodeRef))                                            // aspect
        {
            Serializable plainFileName = this.nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_NAME);
            logger.debug("*** NodeName: " + plainFileName);

            String pfname = plainFileName.toString();
            String baseName = pfname.substring(0, pfname.lastIndexOf("."));

            // get the content of the document
            ContentReader reader = this.contentService.getReader(actionedUponNodeRef, ContentModel.PROP_CONTENT);
            //reader.setEncoding("UTF-8");
            
            InputStream data=null;
            data=reader.getContentInputStream();

            /* Write content to temp file */
            String tempFileName = null;
            File f = null;
            try {
	            // File f = new File(tempFileName);
	            f = File.createTempFile("VCA_", "_"+pfname);
	            tempFileName = f.getCanonicalPath();
	            
	            // f.deleteOnExit();	// Removing when alfresco exists...

	            OutputStream out=new FileOutputStream(f);
	            
	            byte buf[]=new byte[1024];
	            int len;
	            while((len=data.read(buf))>0) {
	            	out.write(buf,0,len);
	            }
	            out.close();
            } catch(Exception e) {
                System.out.println("Write content to file: " + e);
            }

            try {
            	data.close();
            } catch(Exception e) {
                System.out.println("Close input stream: " + e);
            }
                        
            /* Execute shell script to virus check */
            int retCode = -1;
            Runtime rtime = Runtime.getRuntime();
            try {
                logger.info("*** VirusCheck shell script: " + VirusCheckerScript + " " + tempFileName);
            	Process child = rtime.exec(VirusCheckerScript + " " + tempFileName);

                /* To get the return code from the shell script */
                retCode = child.waitFor();

                logger.info("*** VirusCheck result code: " + retCode);
            }
            catch(Exception e) {
                System.out.println("Executing script: " + e);
            }

            /* Set content aspect/name by result of virus check */
            logger.info("*** TODO: set return value to node and timestamp of checking procedure");
            if(retCode == 1) {
                logger.info("*** Document is infected: " + pfname);
                this.nodeService.setProperty(actionedUponNodeRef,
                		ContentModel.PROP_NAME,
						"VIRUS_INFECTED-"+pfname);
            } else {
            	if(retCode == 0) {
            		logger.info("*** Document is clean: " + pfname);
            	} else {
            		// other answer code from virus checker
            		// TODO: ???
            	}
            }
            
            /* Remove temp file */
            logger.info("*** Remove temp file: " + tempFileName);
            if(f!=null) {
            	f.delete();
            }
        } else {
            logger.error("Something is wrong with node reference (not exists or missing signable aspect!");
        }
    }

    /**
     * @see org.alfresco.repo.action.
     *      ParameterizedItemAbstractBase#addParameterDefinitions(java.util.List)
     */
    @Override
    protected void addParameterDefinitions(List paramList) {
        // Specify the parameters
        paramList.add(new ParameterDefinitionImpl(PARAM_TESTMODE, DataTypeDefinition.BOOLEAN, false,
                getParamDisplayLabel(PARAM_TESTMODE)));
    }
    
    /**
     * Log trace into logger.error.
     * 
     * @param exception
     *            exception
     */
    protected static void LogBackTrace(Exception exception) {
        LogBackTrace(exception, exception.getLocalizedMessage());
    }

    /**
     * Log trace into logger.error with customized message.
     * 
     * @param exception
     *            exception
     * @param message
     *            error message
     */
    protected static void LogBackTrace(Exception exception, String message) {
        logger.error(message);
        for (StackTraceElement element : exception.getStackTrace())
            message += "\n\tat " + element;
        logger.debug(message);
    }

 
    /**
     * 
     * Convert InputStream to byte[] 
     *
     * @param in
     * @return
     * @throws IOException
     */
    public static byte[] ConvertInputStreamtoByteArray(InputStream in) throws IOException {
	    StringBuffer out = new StringBuffer();
	    byte[] b = new byte[4096];
	    
	    for (int n; (n = in.read(b)) != -1;) {
	    	out.append(new String(b, 0, n));
	    }
	    
	    return out.toString().getBytes();
    }
    
    public static final String DATE_FORMAT_NOW = "yyyyMMddHHmmss";

    /**
     * returns with the current date
     * 
     * 
     * @return Date and Time of Now
     */
    public static String now() {
      Calendar cal = Calendar.getInstance();
      
      SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
      
      return sdf.format(cal.getTime());
    }
}