Monthly Archives: March 2010

Compilar Alfresco Community en MacOS X


Instalar Eclipse:

Lo primero es instalar Eclipse de http://www.eclipse.org siguiendo el instalador para MacOS X.

Instalar Alfresco desde el instalador:

Lo segundo, como recomendación para copiar todas las utilidades que necesitamos sin necesidad de bajarselas de las respectivas webs, es instalar la versión de Alfresco con instalador que haya para MacOS X desde http://www.alfresco.com

Luego, copiamos el directorio tomcat que hay en el Alfresco instalado en la ubicación donde queremos dejar el resultado de la compilación, en mi caso en /Users/fegor/Documents/workspace/tomcat

Para la configuración podemos aprovechar para copiar un fichero de configuración de ejemplo que es desplegado en el primer arranque (por cierto, en la instalación se puede usar la base de datos por defecto que es Derby ya que la que usaremos posteriormente es MySQL)

cd /Users/fegor/Documents/workspace/tomcat
cp webapps/alfresco/WEB-INF/classes/alfresco-global.properties.sample shared/classes/alfresco-global.properties

Se modifica este fichero con los valores correspondientes:

dir.root=/Users/fegor/Documents/workspace/tomcat/alf_data
db.username=alfresco
db.password=alfresco
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost/alfresco

Y se añaden las líneas para localizar las diferentes herramientas necesarias (hay que verificar que los paths son los correctos)

ooo.exe=/Applications/OpenOffice.org.app
ooo.user=${dir.root}/oouser
img.root=/Users/fegor/Documents/workspace/tomcat/ImageMagick-6.5.9
swf.exe=/Users/fegor/Documents/workspace/tomcat/pdf2swf

Instalando OpenOffice:

Si se va a utilizar OpenOffice para más cosas que la conversión de documentos en Alfresco, lo mejor es instalarlo de forma estándar descargándolo de http://porting.openoffice.org/mac/

Instalando pdf2swf:

La forma que he visto más sencilla es instalar la versión full para MacOS X (por ejemplo la versión 3.1 SP2 tiene instalador para MacOS X) y luego copiar el ejecutable a nuestra compilación:

cp /Users/fegor/Alfresco/bin/pdf2swf /Users/fegor/Documents/workspace/tomcat

Instalando ImageMagick:

Para la instalación de ImageMagick se puede copiar también el directorio de la instalación full de Alfresco o bien descargarlo de http://www.imagemagick.org/script/binary-releases.php

En esta página existen dos formas de instalarlo, una mediante MacPorts (http://www.macports.org/) y otra bajándose directamente el paquete en tar.gz (http://www.imagemagick.org/download/binaries/ImageMagick-x86_64-apple-darwin10.2.0.tar.gz). He preferido bajar el paquete, descomprimirlo y ponerlo directamente dentro de la instalación de tomcat (Alfresco) ya que solo va a usarse para esto.

Por tanto:

tar xvzf ImageMagick-x86_64-apple-darwin10.2.0.tar.gz
mv ImageMagick-6.5.9/ /Users/fegor/Documents/workspace/tomcat/

Instalando MySQL para Mac:

Se puede descargar de la propia http://www.mysql.com y usar las instrucciones de instalación siguientes: http://dev.mysql.com/doc/refman/5.0/es/mac-os-x-installation.html

Una vez instalada y arrancada hay que crear la base de datos alfesco con usuario alfresco y password alfresco.

mysqladmin -u root create alfresco
mysql -u root -e “grant all on alfresco.* to ‘alfresco’@’localhost.localdomain’ identified by ‘alfresco’ with grant option;”
mysql -u root -e “grant all on alfresco.* to ‘alfresco’@’localhost’ identified by ‘alfresco’ with grant option;”

Bajar los fuentes de Alfresco:

Se puede seguir el siguiente enlace en caso de problemas, http://wiki.alfresco.com/wiki/Alfresco_SVN_Development_Environment y en concreto para eclipse el siguiente http://wiki.alfresco.com/wiki/Alfresco_on_Eclipse

Instalar Sysdeo para usar (arrancar y parar) los servidores de aplicaciones tomcat, desde http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV321.zip.

Solo hay que descomprimirlo dentro del directorio plugins, en mi caso en /Applications/eclipse/plugins

Ejecutar eclipse y configurar en Eclipse -> Preferences -> Tomcat el lugar donde está el tomcat, la JVM y añadir los siguientes parámetros a la JVM (JVM Settings):

-server
-Xss256k
-Xms256m
-Xmx512m
-XX:NewSize=128M
-XX:MaxPermSize=128M

Y en Classpath: hay que introducir el camino a las classes de tomcat:

/Users/fegor/Documents/workspace/tomcat/shared/classes

Ahora configuramos Ant desde Eclipse -> Preferencias -> Ant -> Runtime -> Properties

Y añadir las siguientes propiedades:

env.TOMCAT_HOME = /Users/fegor/Documents/workspace/tomcat
env.APP_TOMCAT_HOME = /Users/fegor/Documents/workspace/tomcat
env.VIRTUAL_TOMCAT_HOME = /Users/fegor/Documents/workspace/tomcat/virtual-tomcat

Instalar Subclipse:

En nuestro eclipse: Help -> Install new software… (botón Add)

Name: Subclipse 1.6.x (Eclipse 3.2+)
Location: http://subclipse.tigris.org/update_1.6.x

Y proceder a marcar las casillas e instalar (botón Next…).

Configurar el proyecto de Alfresco en SVN:

1) Ir a File -> New -> Project
2) Seleccionar el asistente SVN y “Checkout Projects with Subversion”
3) En “Create a new repository location”
4) Seleccionar la URL: “svn://svn.alfresco.com” (*)
5) Por último la carpeta Alfresco y pulsar Finish.

Importar el proyecto Alfresco siguiendo los siguientes pasos:

1) File -> Import
2) General -> Existing Projects Into Workspace -> Next
3) Seleccionar HEADrootproyecto
4) Finish

Crear el proyecto Ant:

1) Seleccionar New -> Project. Bajo “General” elegir “Project” y en el nombre poner “ant”
2) Pulsar botón derecho del ratón en el proyecto y seleccionar New -> File
3) Cuando aparezca el nuevo diálogo, pulsar en el botón de Advanced y seleccionar “Link to file in the file system”
4) Ir al fichero build.xml localizado en el directorio HEADroot
5) Para construir el proyecto, ponerse encima de Build.xml con el botón derecho del ratón y seleccionar Run As… -> Ant Build

Nota: Si se reciben errores en la compilación, hay que elegir java-6-sun en lugar de java-6-opensdk en Preferences -> Java -> Installed JREs.

…y eso es todo. Para muestra “un botón”, digo unas imágenes 😉

Resultado de la compilación:


Y la versión resultante:

(*) Me confundí con la URL, la siguiente funciona correctamente: http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco

Crear una acción para enviar documentos a un ContentStore distinto

Tras la conversación con Toni (blyx) sobre el aspecto storeSelector en Alfresco ECM 3.2 y las distintas posibilidades que podemos usar para automatizar el movimiento de documentos. Se me ocurre una que puede ser crear una acción para que mueva determinados documentos a, por ejemplo, una NAS, pero de forma interactiva.

Lo primero es configurar el nuevo “storeNAS” donde estará montada la NAS:

Fichero: storeNAS-content-store-selector-context.xml (siempre dentro de alfresco/extension)



<?xml version=’1.0′ encoding=’UTF-8′?>

<!DOCTYPE beans PUBLIC ‘-//SPRING//DTD BEAN//EN’ ‘http:// www.springframework.org/dtd/spring-beans.dtd’>

<!– Define the new file stores —>

<beans>

<bean id=”fileContentStoreNAS” class=”org.alfresco.repo.content.filestore.FileContentStore”>

<constructor-arg>

<value>${dir.root}/storeNAS</value>

</constructor-arg>

</bean>

<!– Declare the mapping between store names and store instances —>

<bean id=”storeSelectorContentStore” parent=”storeSelectorContentStoreBase”>

<property name=”defaultStoreName”>

<value>default</value>

</property>

<property name=”storesByName”>

<map>

<entry key=”default”>

<ref bean=”fileContentStore” />

</entry>

<entry key=”storeNAS”>

<ref bean=”fileContentStoreNAS” />

</entry>

</map>

</property>

</bean>

<!– Point the ContentService to the ‘selector’ store —>

<bean id=”contentService” parent=”baseContentService”>

<property name=”store”>

<ref bean=”storeSelectorContentStore” />

</property>

</bean>

<!– Add the other stores to the list of stores for cleaning —>

<bean id=”eagerContentStoreCleaner” class=”org.alfresco.repo.content.cleanup.EagerContentStoreCleaner” init-method=”init”>

<property name=”eagerOrphanCleanup” >

<value>${system.content.eagerOrphanCleanup}</value>

</property>

<property name=”stores” >

<list>

<ref bean=”fileContentStore” />

<ref bean=”fileContentStoreNAS” />

</list>

</property>

<property name=”listeners” >

<ref bean=”deletedContentBackupListeners” />

</property>

</bean>

</beans>

Ahora necesitamos configurar nuestra acción, eso lo realizamos en el fichero web-client-config-custom.xml y además de la acción configuramos también el aspecto:

Fichero: web-client-config-custom.xml



<config evaluator=”aspect-name” condition=”cm:storeSelector”>

<property-sheet>

<show-property name=”cm:storeName” />

</property-sheet>

</config>



<config evaluator=”string-compare” condition=”Action Wizards”>

<aspects>

<aspect name=”cm:storeSelector”/>

</aspects>

</config>

<config>

<actions>

<!– Launch Add Aspect Dialog —>

<action id=”add_store”>

<label>Add Store</label>

<image>/images/icons/add.gif</image>

<action>dialog:addStore</action>

</action>

<!– Add action to more actions menu for each space —>

<action-group id=”space_browse_menu”>

<action idref=”add_store” />

</action-group>

</actions>

</config>

Para crear nuestra propia acción asignamos al mismo fichero web-client-config-custom.xml la acción con la llamada al script:

<config>

<actions>

<action id=”sendStoreNAS”>

<label>Enviar a NAS</label>

<image>/images/icons/new_edition_icon.gif</image>

<script>/Company Home/Data Dictionary/Scripts/ContentStoreNAS.js</script>

<params>

<param name=”id”>#{actionContext.id}</param>

</params>

</action>

<action-group id=”document_browse_menu”>

<action idref=”sendStoreNAS” />

</action-group>

</actions>

</config>

Y por último el código en jscript que subiremos a Empresa/Diccionario de datos/Scripts:

Fichero: ContentStoreNAS.js

var document = search.findNode( “workspace://SpacesStore/” + args[“id”]);

document.addAspect(“cm:storeSelector”);

document.properties[“cm:storeName”] = “storeNAS”;

document.save();

var ret = “<html>” +

<title></title>” +

<body>” +

<script>history.back();</script>” +

</body>” +

</html>“;

ret;

Ahora para cada documento podemos enviarlo al ContentStore desde el menú emergente de más acciones.



Todavía queda alguna forma más para tratar los documentos con distintos almacenes, según las necesidades y requisitos, todo es cuestión de ponerse…