En alfresco cómo en otros gestores documentales o gestores
de contenidos para realizar cambios es posible sustituir ficheros o añadir
contenido a algún fichero. Y claro que funciona incluso en algunos casos de
esta forma detectaremos que lo que está mal es el mapeo pero no es una buena práctica. La Regla de oro es Nunca poner nuestros archivos
personalizados sobre el despliegue.
¿Qué qué es el despliegue y a que me refiero?
Cuando arrancamos Alfresco por primera vez, lo que realmente está haciendo es
coger el alfresco.war y el share.war que hay dentro de la carpeta webapps
los abre y descomprime el primero en la carpeta alfresco y el segundo en
la carpeta share. Esas carpetas son el despliegue.
Cada vez que arranquemos nuestro Alfresco
leerá y cargará los archivos que haya en ambas carpetas, es decir \webapps\alfresco\* para alfresco, o si
accedemos al share \webapps\share\*
Normalmente las personas hacen una mala práctica en
base a esto que os estoy explicando y el razonamiento erróneo suele ser: Si lo
primero que carga es lo que hay en el despliegue, voy a copiar mi archivo y lo
sustituyo por el que haya ahí así cuando arranque alfresco lo carga.
MAL HECHO, imaginaros que os tiráis horas y horas de curro y vais
metiendo dentro de esas carpetas vuestros archivos modificados. Imaginad que
tenéis que actualizar por el motivo que sea… Cuando pongáis el alfresco.war y
el share.war nuevo para actualizar, al arrancar los descomprimirá y los cargará
en \webapps\alfresco\* y \webapps\share\*
borrando todo lo que hubiera en ellas y con ello todo vuestro trabajo.
¿Entonces no hay alternativa? Sí que la hay. La
solución a ello (y con ello la buena práctica) es copiar vuestros archivos
modificados dentro de
$ALF_HOME/shared/classes/alfresco/extension para las personalizaciones de alfresco y $ALF_HOME/shared/classes/alfresco/web-extension
para las personalizaciones del share
Creo que esto os ayudará a más de uno y además
me da que es uno de los pilares básicos para cuando queramos hacer nuestras
propias personalizaciones.
Sabiendo esto lo que haremos será instalarnos
eclipse y crearemos un proyecto que mediante una tarea ant empaquetará en un jar
los cambios que realizaremos para cada uno de los ejercicios.
1.-Vamos a estructurar de está forma:
Por lo tanto crearemos las carpetas partiendo de la carpeta
alfresco que alojaremos en C:/.
-Carpeta
alfresco34:
Se trata de la instalación de alfresco34d como NO SERVICIO
para ello modificaremos:
-la
ruta de %ALF_HOME% en el archivo alfresco.bat, en la ruta
C:/alfresco/alfresco34
set ALF_HOME=c:\alfresco\alfresco34\
-la ruta de la carpeta java en el archivo setenv.bat en la ruta C:\alfresco\alfresco34\tomcat\bin
set
JAVA_HOME=C:\alfresco\alfresco34\java
-Cambiar todas las rutas en el
archivo de propiedades alfresco-global.properties, en la ruta C:\alfresco\alfresco34\tomcat\shared\classes
dir.root=C:/alfresco/alfresco34/alf_data
ooo.exe=C:/alfresco/alfresco34/openoffice/App/openoffice/program/soffice.exe
img.root=C:/alfresco/alfresco34/imagemagick
swf.exe=C:/alfresco/alfresco34/swftools/pdf2swf.exe
jodconverter.officeHome=C:/alfresco/alfresco34/openoffice/App/openoffice
-Carpeta eclipse:
En esta carpeta descomprimiremos el programa eclipse su ruta
es C:/alfresco/eclipse
-Carpeta java:
En esta carpeta alojaremos los proyectos
-Crear un proyecto:
Ahora vamos a extender alfresco a través de un proyecto en
eclipse. Cómo bien hicimos referencia anteriormente, para extender alfresco
deberemos reproducir en la carpeta extensión la estructura de la carpeta
alfresco de despliegue. En el caso que nos desviemos de reproducir dicha
estructura deberemos de reflejar los cambios
cambiando las rutas de mapeado. Empezamos, creamos un proyecto java en
eclipse y renombramos la carpeta src a source. Añadimos
las carpetas built ,dist y lib.
-Carpeta source
:Es la carpeta en la que reproduciremos la estructura de despliegue de la
carpeta alfresco
-Carpeta dist: En
está carpeta se alojará el jar creado en el deploy de la tarea ant.
-Carpeta
lib: en está carpate alojaremos las
librerías que se necesiten para realizar extenxiones de alfresco.
Alfresco es una plataforma
flexible para desarrollar aplicaciones de gestión de
Contenidos. El primer paso en el proceso para
el diseño de una aplicación con alfresco
es diseñar el espacio y el contenido de este. No es preciso que espacio y
contenido estén vinculados pudiendo existir un contenido sin necesidad de
definir un espacio para éste. Aunque la más común sería definir espacio y
contenido.
El modelo
de contenido provisto por Alfresco
es bastante detallado. De hecho, para
necesidades de gestión documental básicas
probablemente sea suficiente. No obstante,
se estaría desaprovechando la potencia y
funcionalidad de tener un modelo
personalizado a las necesidades del negocio. Tanto espacio como contenido
nacen de la idea de definir metadatos propios.
¿Qué son metadatos
asociados a un archivo o carpeta?
Son los
datos sobre los datos. Un sencillo ejemplo: las fichas de una biblioteca (metadatos) y los libros (datos). Mientras que las fichas tienen
toda la información relacionada con el autor, el título, el ISBN, el año, la
editorial, en el libro está el contenido que normalmente un usuario buscará.
Así mismo
sucede con otros elementos digitales, por ejemplo las fotografías digitales y
las canciones en formato MP3. Seguramente tú tienes una cámara digital con la
que tomas fotografías. Lo que pocas veces nos enteramos es que a la vez que la
cámara captura las imágenes, va guardando en forma de metadatos, información muy
interesante de cómo fue tomada la fotografía: fecha, hora, diafragma,
velocidad, uso de flash, modo de captura, entre otros datos, uno de ellos
próximo a llegar: geoposicionamiento satelital.
¿Qué es un espacio?
Un espacio
en alfresco viene a ser una carpeta .Un tipo de carpeta determinada, ya que al
extender el espacio podremos definir los metadatos asociados a ella, aplicarle
reglas, permisos... Puede Contener ficheros o
sub-espacios organizados por jerarquías.
¿Qué es un tipo de contenido?
Los tipos presentan un gran parecido a las clases en el mundo de orientación a
objetos. Pueden usarse para representar objetos de nuestro modelo de negocio:
Tienen propiedades y pueden heredar de un tipo base. Contenido (cm:content) , Persona (cm:person) o Carpeta (cm:folder) son tres tipos importantes
definidos por Alfresco. Los tipos
personalizados están limitados únicamente por nuestra imaginación y
requerimientos de negocio. Factura, Receta médica o Película serían ejemplos de
tipos personalizados.
¿Cómo se crean?
Los pasos a realizar cada vez que queramos
incorporar un nuevo tipo de contenido en
Alfresco son:
1. Definición el tipo de contenido personalizado.
2. Extender
el modelo de contenido con el nuevo tipo de contenido.
3. Configurar
el cliente Web para que sea capaz de reconocer el nuevo tipo de
contenido.
4. Reiniciar
Alfresco para que los cambios sean efectivos.
5. Crear
contenido basado en el nuevo tipo de contenido
1.- Definición del tipo de contenido
personalizado.
Consiste en determinar qué propiedades, aspectos y asociaciones conforman
nuestro tipo de contenido personalizado. En nuestro caso, nuestra “carpeta”
además de las propiedades básicas de un espacio, queremos que tenga las
siguientes:
Tipo*************Nombre****************Etiqueta
Texto (text)****** nombre **************** Nombre
Texto (text)****** apellido1 **************** Apellido1
Texto (text)****** apellido2 **************** Apellido2
Texto (text)****** direccion *************** Direccion
Fecha (date)****** fecha de Nacimiento***** FechaNacimiento
Texto (text)****** mail******************* eMail
Texto(text)****** teléfono **************** Telefono
Podemos reutilizar aspectos existentes en el modelo de contenido de Alfresco,
para incorporar por defecto propiedades que ya están encapsuladas en dichos
aspectos.
2.- Extender el modelo de contenido con el nuevo tipo de contenido.
Una vez definido nuestro tipo de contenido, lo siguiente es extender el modelo
de contenido con una representación XML de nuestro tipo de contenido.
Los tipos de
propiedades son los siguientes:
Any -
Undefined
Name -
Name qualified by Namespace
Guid -
Globally unique ID
Text -
Content -
Date -
DateTime
-
Boolean -
Int -
Long -
Float -
Double –
Category
- Location within Classification
Noderef –
Node reference
Path -path
Ir a: C:\%ALF_HOME%\tomcat\shared\classes\alfresco\extension
Copiar y renombrar el customModel.xml.sample a ejemploModel.xml y dejar así en primer término:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Custom Model -->
<!-- Note: This model is pre-configured to load at startup of the Repository. So, all custom -->
<!-- types and aspects added here will automatically be registered -->
<modelname="ejercicio1:modeloPersonalizado" xmlns="http://www.alfresco.org/model/dictionary/1.0">
<!-- Optional meta-data about the model -->
<description>Ejemplo Model</description>
<author>alfresco</author>
<version>1.0</version>
<imports>
<!-- Import Alfresco Dictionary Definitions -->
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
<!-- Import Alfresco Content Domain Model Definitions -->
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
</imports>
<!-- Introduction of new namespaces defined by this model -->
<!-- NOTE: The following namespace custom.model should be changed to reflect your own namespace -->
<namespaces>
<namespaceuri="http://www.ejemplo.model/alfresco/demo" prefix="ejercicio1"/>
Después vamos a crear nuestro tipo de verdad (hasta ahora
sólo hemos definido nuestro modelo personalizado "types")
En el archivo contentModel.xml
dentro de C:\%ALF_HOME%\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\model
(
están definidas todas las propiedades y tipos de nodos que soporta
alfresco por defecto:
-Podemos
usar este fichero como referencia
<types>
<!--
Definicion de los tipos de contenido personalizados -->
<!-- Definicion del tipo de
contenido ejercicio1:carpeta -->
<type
name="ejercicio1:espacio">
<title>Ejercicio
1: nuevo tipo de espacio </title>
<parent>cm:folder</parent>
<properties>
<property
name="ejercicio1: Nombre">
<title>Nombre</title>
<type>d:text</type>
</property>
<property
name="ejercicio1 :Apellido1">
<title>Apellido
1</title>
<type>d:text</type>
</property>
<property
name="ejercicio1:Apellido2">
<title>Apellido
2</title>
<type>d:text</type>
</property>
<property
name="ejercicio1:FechaNacimiento">
<title>Fecha
de nacimiento</title>
<type>d:date</type>
</property>
<property
name="ejercicio1 :Direccion">
<title>Direccion</title>
<type>d:text</type>
</property>
<property
name="ejercicio1 :FechaNacimiento">
<title>Fecha
de nacimiento</title>
<type>d:date</type>
</property>
<property name="ejercicio1 :eMail
">
<title>Mail</title>
<type>d:text</type>
</property>
<property
name="ejercicio1 :Telefono ">
<title>Telefóno</title>
<type>d:text</type>
</property>
</properties>
</type>
</types>
<aspects>
<!-- Definicion de los aspectos
personalizados -->
</aspects>
</model>
Si nos fijamos, el tipo que hemos definido
hereda del tipo cm:folder
(<parent>cm:folder</parent>), es decir,
contiene todas las propiedades y funcionalidad
de un espacio, pero además contiene las
propiedades que hemos especificado nosotros.
Este fichero lo llamaríamos como quisiéramos,
por ejemplo ejemploModelo.xml, y lo
guardaríamos en el directorio extension
Hay que tener en cuenta que el XML que hemos
creado para definir nuestro modelo de
contenido, debe ir acompañado de un fichero de
contexto que se encargue de incluir en
la lista modelos el fichero que acabamos de
crear.
Para ello, en el mismo directorio extension debemos crear un fichero de
contexto similar
a este:
Fichero ejemploModelo-context.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD
BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>
<beans>
<!-- Registro de nuevos
modelos -->
<bean id="extension.dictionaryBootstrap"
parent="dictionaryModelBootstrap"
depends-on="dictionaryBootstrap">
<property name="models">
<list>
<value>alfresco/extension/model/ejemploModelo.xml</value>
</list>
</property>
</bean>
</beans>
Como se observa, incluimos el modelo ejemploModelo.xml en la lista de
modelos
(models) para que se cargue
en el diccionario de Alfresco al arrancar.
Este fichero es importante que termine en –context.xml ya que es la terminación
que
Alfresco reconoce para interpretar los ficheros de contexto.
3.- Configurar el cliente Web para que sea
capaz de reconocer el nuevo tipo de contenido.
Ahora debemos asegurarnos que el cliente Web reconoce el nuevo tipo de
contenido y visualiza las propiedades en la pantalla pertinente. Para ello,
debemos ir al fichero
web-client-config-custom.xml que se encuentra en el mismo directorio extension.
Debemos incluir los siguientes fragmentos:
3.a) Si queremos que el nuevo tipo
aparezca como opción de tipo de contenido en el wizard de reglas de contenido, deberemos incluir lo siguiente:
<config evaluator="string-compare"
condition="Action Wizards">
<subtypes>
<type
name="ejercicio1:espacio"></type>
</subtypes>
</config>
Esto hará que cuando queramos crear una regla
de contenido cuya condición se base en
el tipo de contenido del objeto que dispara la
regla, nos aparezca nuestro tipo
personalizado como una posible condición.
3.b) Si queremos tener
la posibilidad de convertir los espacios existentes tendremos que
añadir
lo siguiente:
<config evaluator="string-compare"
condition="Action Wizards">
<subtypes>
<type
name="ejercicio1:espacio"></type>
</subtypes>
</config>
3.c) Si queremos que nos aparezca el nuevo tipo de espacio en el asistente de creación
de espacio, debemos incluir las siguientes líneas en web-client-config-custom.xml:
<config evaluator="string-compare" condition="Space
Wizards">
<folder-types>
<type
name="ejercicio1:espacio"></type>
</folder-types>
</config>
3.d) Por último, lo más probable es que nos interese editar las propiedades que hemos
definido (si no, para qué íbamos a crear un tipo de contenido con propiedades nuevas?).
Para ello:
<config
evaluator="node-type" condition="ejercicio1:espacio">
<property-sheet>
<show-property
name="ejercicio1:Nombre"></show-property>
<show-property
name="ejercicio1:Apellido1"></show-property>
<show-property
name="ejercicio1:Apellido2"></show-property>
<show-property name="ejercicio1:
Direccion
"></show-property>
<show-property name="ejercicio1:
FechaNacimiento
"></show-property>
<show-property name="ejercicio1:
eMail
"></show-property>
<show-property name="ejercicio1:
Telefono"></show-property>
</property-sheet>
</config>
Con lo que el fichero web-client-config-custom.xml queda de la siguiente
manera:
<alfresco-config>
<config evaluator="string-compare"
condition="Action Wizards">
<subtypes>
<type
name="ejercicio1:espacio"></type>
</subtypes>
</config>
<config evaluator="string-compare"
condition="Action Wizards">
<especialise-types>
<type
name="ejercicio1:espacio"></type>
</especialise-types>
</config>
<config evaluator="string-compare"
condition="Space Wizards">
<folder-types>
<type
name="ejercicio1:espacio"></type>
</folder-types>
</config>
<config evaluator="node-type"
condition="ejercicio1:espacio">
<property-sheet>
<show-property
name="ejercicio1:Nombre"></show-property>
<show-property
name="ejercicio1:Apellido1"></show-property>
<show-property
name="ejercicio1:Apellido2"></show-property>
<show-property name="ejercicio1:
Direccion
"></show-property>
<show-property name="ejercicio1:
FechaNacimiento
"></show-property>
<show-property name="ejercicio1:
eMail "></show-property>
<show-property name="ejercicio1:
Telefono"></show-property>
</property-sheet>
</config>
</alfresco-config>
4.- Reiniciar
Alfresco.
5.‐ Crear un
espacio basado en el nuevo tipo de contenido.
Para crear un
nuevo espacio.
Vamos a Espacio de empresa en el espacio de
trabajo
O a través de la opción Examinar
elementos en su espacio personal
Crear / Asistente Avanzado de Espacio
Escoger desde cero
‐ A la hora de seleccionar qué tipo de espacio
queremos, nos debería aparecer un
nuevo tipo de espacio llamado “Ejercicio1:nuevo tipo de espacio” (que
es el título que le hemos dado a nuestro tipo de contenido).
‐ Introducimos las propiedades básicas del
espacio y pulsamos Finalizar.
Para editar las propiedades específicas de
nuestro espacio:
‐ Ver detalles del espacio.
-Escogemos la opción de detalle (el tercer icono) .Podemos ver las
propiedades especificas de espacio que introdujimos antes. Ahora vamos a editar
los demás valores introducidos para ello damos en el icono indicado con una
flecha.
NOTAS
Lo más habitual no es crear un tipo
de contenido que herede de cm:folder, sino que
herede de tipo cm:content. Generalmente,
los espacios que vienen en Alfresco
satisfacen todas las necesidades de
los usuarios. Es más usual que nos encontremos
con la necesidad de definir un nuevo
tipo de contenido que encapsule propiedades
adicionales. Lo veremos en el siguiente ejercicio.
alfrescoexplorer
dispone de una consola para poder gestionar los modelos nuevos para
poder utilizarla tendremos que llevar a cabo unos cuantos pasos.
Una vez introducidos todos
los ficheros xml en sus rutas correspondientes ejecutar por consola en la ruta:
C:\Alfresco\tomcat\shared\classes esto:
java -cp
".;C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\lib\*;C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes"
org.alfresco.repo.dictionary.TestModelalfresco/extension/ejemploModel.xml
Por consola veremos:
C:\alfresco\alfresco34\tomcat\shared\classes>java
-cp ".;C:\alfresco\alfresco34\
tomcat\webapps\alfresco\WEB-INF\lib\*;C:\alfresco\alfresco34\tomcat\webapps\alfr
esco\WEB-INF\classes"
org.alfresco.repo.dictionary.TestModel alfresco/extension/
ejemploModel.xml
Testing
dictionary model definitions...
alfresco/model/dictionaryModel.xml
alfresco/model/systemModel.xml
org/alfresco/repo/security/authentication/userModel.xml
alfresco/model/contentModel.xml
alfresco/model/wcmModel.xml
alfresco/model/applicationModel.xml
alfresco/model/bpmModel.xml
alfresco/model/wcmAppModel.xml
alfresco/extension/ejemploModel.xml
Models
are valid.
Reiniciando alfresco ya tenemos disponible el nuevo tipo de
dato, al darle a Añadir contenido.
Consola para ver modelos definidos:
http://127.0.0.1:8080/alfresco/faces/jsp/admin/repoadmin-console.jsp
Desde el alfrescoexplorer,
se pueden subir los modelos desde Diccionario
de datos > Modelos. Habría que darle el fichero xml ejemploModel.xml
que generamos antes, creo que usando la opción Añadir contenido.
Ahora vamos a
hacer el mismo ejercicio pero empaquetando en un jar mediante un proyecto creado en el eclipse con una tarea ant, apropiada para este caso.
Creamos un
proyecto java en el eclipse como indicamos anteriormente.
Con la siguiente
estructura:
Tarea ant:
<?xml version="1.0"?>
<project name="alfresco-Ejercicio1" default="dist" basedir=".">
<property name="build.dir" value="build"/>
<property name="dist.dir" value="dist"/>
<property name="source.dir" value="source"/>
<property name="lib.dir" value="lib"/>
<property name="file.jar" value="alfresco-Ejercicio1.jar"/>
<property name="deploy.local.dir" value="C:\alfresco\alfresco34\tomcat\webapps\alfresco\WEB-INF\lib"/>
<target name ="clean">
<echo message = "Creando directorios de
construccion y distribucion..."/>
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<target name="compile" depends="clean" description="compilation process started">
<echo message="Compilando
fuentes..."/>
<javac srcdir="${source.dir}" destdir="${build.dir}">
<classpath>
<path refid="project.classpath"/>
</classpath>
<include name="**/*.java" />
</javac>
</target>
<target name="build" depends="compile">
<echo message = "Copiando fuentes al
directorio de construccion..."/>
<copy todir="${build.dir}">
<fileset dir="${source.dir}" excludes=".svn" includes="**/*.xml,**/*.properties"/>
</copy>
</target>
<target name="jar" depends="build">
<echo message = "Construyendo
jar..."/>
<jar jarfile="${dist.dir}/${file.jar}">
<fileset dir="${build.dir}"/>
</jar>
<echo message = "Borrando directorio de
construccion..."/>
</target>
<target name="dist" depends="clean,compile,build,jar" />
<target name="deploy-local" depends="dist">
<echo message = "Desplegando libreria
en local..."/>
<copy file="${dist.dir}/${file.jar}" todir="${deploy.local.dir}" />
</target>
</project>
Al ejecutar la tarea ant en la ruta C:\alfresco\alfresco34\tomcat\webapps\alfresco\WEB-INF\lib
.Se nos cargará un jar con nombre alfresco-Ejercicio1.jar.
De ahora en adelante la idea irá en esta línea.
Fuentes: