SlideShare una empresa de Scribd logo
1 de 76
Descargar para leer sin conexión
Alfresco ECM 4.2 
Tipos de contenidos personalizados 
Tipos de contenidos personalizados 
Índice del capítulo 
‣ Introducción. 
‣ Diccionario de datos. 
‣ Creación de un nuevo modelo de contenidos. 
‣ Despliegue de modelo de contenidos. 
‣ Configurar los clientes Web. 
‣ Búsquedas en Alfresco. 
‣ Custom Behaviors en Alfresco. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Alfresco trabaja con el concepto de MODELO DE CONTENIDOS para 
gestionar de los contenidos que maneja. 
‣ Alfresco incorpora un metamodelo en su estructura, es decir, la 
capacidad para que nosotros declaremos nuevos modelos de 
contenido. 
‣ Un modelo de contenido define la estructura de información que 
acompañará a nuestros documentos digitales. 
‣ Esta definición nos permite dotar de semántica al documento para que 
posteriormente se puedan implementar búsquedas y procesos más 
eficientes e “inteligentes”. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ Un modelo de contenidos es un conjunto de tipos de contenido y 
aspectos. Los modelos de contenidos definidos son identificados de 
forma unívoca mediante espacios de nombre (namespaces). 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ El modelo de contenidos por defecto se conoce en Alfresco como 
Diccionario de Datos o Data Dictionary y soporta ser extendido para 
que el repositorio pueda manejar nuevos modelos de contenido. 
‣ El Diccionario de Datos describe las estructuras del contenido a través 
de propiedades, asociaciones y reglas o restricciones. 
‣ El Diccionario de Datos es un metamodelo que permite describir uno o 
más modelos de contenido específicos. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Diccionario de datos 
‣ Define dos clases de estructuras: tipos de contenido y aspectos de 
contenido. Son conceptos que vamos a manejar de forma instensiva: 
TIPO y ASPECTO. 
‣ La diferencia entre Content Type y Content Aspect es que un contenido 
sólo tiene un tipo que es el que define su estructura fundamental. Sin 
embargo, un mismo contenido puede tener muchos aspectos que son 
conceptos transversales aplicables a cualquier tipo de contenido. 
‣ Un mismo nodo puede tener un aspecto en un momento temporal y 
posteriormente dejar de tenerlo. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Diccionario de datos 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Diccionario de datos 
‣ El diccionario de datos define los siguientes modelos: 
‣ System: describe conceptos a nivel del repositorio. http://www.alfresco.org/model/ 
system/1.0. Prefijo sys. 
‣ Content: describe el modelo de contenido del dominio estándar (ej. Carpeta, 
Fichero, Dublin-Core, ...). http://www.alfresco.org/model/content/1.0. Prefijo cm. 
‣ Application: describe el modelo de aplicación de Alfresco (ej. glosario, ...). http:// 
www.alfresco.org/model/application/1.0. Prefijo app. 
‣ Dictionary: describe el metamodelo del Diccionario de Datos (enteros, flotantes, 
fechas...). http://www.alfresco.org/model/dictionary/1.0. Prefijo d. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Diccionario de datos 
‣ El diccionario define un conjunto de tipos de datos soportados por 
defecto, es decir, vamos a poder manejar textos, números, fechas, 
booleanos, etc, sin necesidad de tener que definir nuevos tipos: 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Diccionario de datos 
‣ Los tipos de dato content, folder y person se encuentra en el modelo 
Content, es por eso que al referenciarlos se utiliza cm:content, 
cm:folder y cm:person. 
‣ Los tipos de dato int, boolean, double y date se encuentra en el modelo 
Dictionary, es por eso que al referenciarlos se utiliza d:int, d:boolean, 
d:double y d:date. 
‣ Todos los detalles en la wiki de Alfresco: 
‣ http://wiki.alfresco.com/wiki/Data_Dictionary_Guide. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Diccionario de datos 
‣ Alfresco almacena, por defecto, los documentos como nodos de tipo 
cm:content que están formados por un fichero binario y por los 
metadatos básicos (titulo, autor, fecha de modificación, etc.) 
‣ Podemos heredar de cm:content para hacer un nuevo tipo “Informe 
Técnico”. 
NODO DE ALFRESCO DE TIPO "INFORME TÉCNICO" 
INFORME TÉCNICO 
Preparado por Jesús Salinas Revelles 
INFORMACIÓN ESTRUCTURADA 
MANEJADA POR EL GESTOR DOCUMENTAL 
Número de informe : INF000XXX 
Título : XXXXX 
Autor : XXXXXXX 
Etiquetas o palabras clave: XXX , YYY, ZZZ 
Responsables: <Lista de usuarios del sistema o lista de 
nombres> 
Proceso: XXXX 
<<CUALQUIER OTRO METADATO QUE QUIERA 
DEFINIR EL CLIENTE>> 
InformeTecnico.doc 
Tipos de contenidos personalizados 
Diccionario de datos 
‣ Los tipos presentan un gran parecido a las clases en el mundo de 
orientación a objetos. 
‣ Un modelo de contenidos puede definir N tipos de contenido nuevos. 
‣ 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. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Creación de un nuevo modelo de contenidos 
‣ Paso 1: Declarar un nuevo modelo y definir los tipos de contenido 
personalizado. 
‣ Paso 2: Desplegar el nuevo modelo de contenidos 
‣ Paso 3: Configurar el/los cliente(s) Web para que sea capaz de 
reconocer los nuevos tipos de contenido. 
‣ Paso 4: Reiniciar Alfresco para que los cambios sean efectivos. (en 
caso de que sea necesario). 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Declarar un nuevo modelo y definir los tipos de 
contenido personalizado 
‣ Crear un nuevo modelo. 
‣ Declarar un nuevo modelo. 
‣ Declarar el espacio de nombres para el modelo. 
‣ Declarar un nuevo tipo de contenido. 
‣ Asociaciones. 
‣ Restricciones. 
‣ Aspectos. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Crear un nuevo modelo 
‣ Se declara en un fichero XML cuyo nodo principal es el elemento 
<model> del esquema “Data Dictionary XML Schema”. Dicho esquema 
está en el espacio de nombres referenciado por la URI 
http://www.alfresco.org/model/dictionary/1.0 
‣ Este fichero debe colocarse en la carpeta de extensión de Alfresco para 
despliegues estáticos y dentro del espacio “Company Home -> Data 
Dictionary -> Models”) para despliegues dinámicos. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Declarar un nuevo modelo 
<model name="prefijo:nuevoModelo" 
xmlns="http://www.alfresco.org/model/dictionary/1.0"> 
<description>Modelo Contenido Nuevo</description> 
<author>Formacion S.L.</author> 
<published>2011-01-01</published> 
<version>1.0</version> 
<imports> 
<!-- Importamos las definiciones del Diccionario de Datos --> 
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/> 
<!-- Importamos las definiciones del modelo de contenidos estandar --> 
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/> 
</imports> 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Declarar un nuevo modelo 
‣ El atributo name del elemento model define el nombre único del 
modelo. El prefijo debe usarse el que se declare en el espacio de 
nombres (ver siguiente transparencia). 
‣ xmlns declara el espacio de nombres del metamodelo como espacio 
de nombres por defecto. 
‣ La sección de imports hace que los modelos de contenido estándares 
así como el metamodelo y el diccionario de datos estén disponible 
para su uso y referencia en nuestro modelo. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Declarar un nuevo modelo 
‣ Se define el espacio de nombres asociado al nuevo modelo: 
... 
<!-- viene de la transparencia anterior --> 
<namespaces> 
<namespace 
uri="http://www.formacion.com/xmlns/modelo/1.0/" 
prefix="prefijo"/> 
</namespaces> 
... 
‣ uri: identificador único del espacio de nombres 
‣ prefix: prefijo que se usará en el resto del documento (debe coincidir también con el 
que usa el modelo en la transparencia anterior). 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Declarar un nuevo tipo de contenido 
‣ Los nuevos tipos de contenido se declaran dentro del modelo: 
<model ... > 
... 
<types> 
<type ...> 
... 
</type> 
</types> 
</model> 
‣ Generalmente querremos heredar de cm:content que es el tipo de 
contenido estándar de Alfresco. 
‣ cm es el prefijo del espacio de nombres http://www.alfresco.org/ 
model/content/1.0 definido para el esquema Content Domain Model. 
‣ Veamos un ejemplo: declarar un tipo de contenido “Documento de 
Agencia Tributaria” que tenga las propiedades (metadatos) 
“MailResponsable”, “Proyecto”, “EstaAprobadoPorDireccion”. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Tipo de contenido : Documento de Agencia Tributaria 
<types> 
<type name="aeat:documento"> 
<title>Documento de Agencia Tributaria</title> 
<parent>cm:content</parent> 
<properties> 
<property name="aeat:MailResponsable"> 
<title>eMail del responsable del documento</title> 
<type>d:text</type> 
</property> 
<property name="aeat:Proyecto"> 
<title>Proyecto al que pertenece</title> 
<type>d:text</type> 
</property> 
<property name="aeat:EstaAprobadoPorDireccion"> 
<title>Aprobado por direccion</title> 
<type>d:boolean</type> 
</property> 
</properties> 
</type> 
</types> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Declaración básica de propiedades 
‣ La declaración básica de una propiedad (metadato) de un tipo de 
contenido es : 
... 
<type ... > 
<property name="prefijo:nombrePropiedad"> 
<title>Titulo del metadato</title> 
<type>d:tipoDeDato</type> 
</property> 
... 
</type> 
... 
Preparado por Jesús Salinas Revelles 
Tipo de dato declarado por el Data 
Dictionary de Alfresco 
Tipos de contenidos personalizados 
Tipos de datos para las propiedades 
‣ Como ya hemos comentado antes, los tipos de datos soportados en el 
esquema Dictionary son: 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Opciones avanzadas de las propiedades 
‣ Elemento mandatory: 
‣ El cliente Web de Alfresco obliga a completar todas las propiedades mandatory. 
‣ El repositorio de Alfresco obliga a completar todas las propiedades cuya propiedad 
enforced del elemento mandatory esté a cierta. 
<mandatory enforced='true|false'>true|false</mandatory> 
‣ Ejemplo: 
<property name="prefijo:nombrePropiedad"> 
<title>Titulo del metadato</title> 
<type>d:tipoDeDato</type> 
<mandatory enforced='true'>true</mandatory> 
</property> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Opciones avanzadas de las propiedades 
‣ Valores por defecto: como su nombre indica, podemos asignar un valor 
por defecto a cualquier propiedad definida: 
<property name="prefijo:nombrePropiedad"> 
... 
<default>{valor}</default> 
</property> 
‣ Ejemplo: 
... 
<property name="vodafone:tipoFormacion"> 
... 
<default>presencial</default> 
</property> 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Asociaciones 
‣ Las asociaciones permiten definir punteros a otros contenidos, es 
decir, relaciones entre diferentes tipos de contenidos. 
‣ Por ejemplo, permitiría a un documento “Resumen anual de gastos” 
hacer referencia a varios “Resúmenes mensuales de gastos”. 
‣ Alfresco trabaja con dos tipos de asociaciones: 
‣ Child Associations: Asociación que funciona como un “cascade delete” en base de 
datos relacional, es decir, el hijo sólo existe si existe el padre (agregado en UML). 
‣ Peer Asociations: Asociaciones simples. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Asociaciones 
‣ El elemento associations define todas las asociaciones definidas para 
un tipo o aspeccto. 
‣ Sintaxis: 
... 
... 
<associations> 
<child-association > 
</child-association> 
<association> 
... 
</association> 
</associations> 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Asociaciones 
‣ Cualquier asociación define dos extremos: en Alfresco los llamaremos 
source y target. 
‣ Se define una cardinalidad: 1 a n, n a n, 1 a 1, etc. 
‣ ¿Cómo definimos este concepto a la hora de crear la asociación? 
Entidad 1 asociación 
Preparado por Jesús Salinas Revelles 
Entidad 2 
Tipos de contenidos personalizados 
Asociaciones 
‣ El elemento source define el origen de la asociación: mandatory indica 
si la existencia de este elemento es obligatoria y many si puede existir 
más de uno: 
<source> 
<mandatory>false</mandatory> 
<many>false</many> 
</source> 
‣ El elemento target define el otro extremo de la asociación: el elemento 
class define el tipo de dato. 
<target> 
<class>sys:base</class> 
<mandatory>false</mandatory> 
<many>true</many> 
</target> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Child Associations 
‣ Las operaciones de tipo child son algo especiales. La entidad padre es 
dueña de los hijos, es decir, las operaciones como el borrado se 
propagan a los hijos. 
‣ Ejemplo: 
<child-association name="cm:contains"> 
<source> 
<mandatory>false</mandatory> 
<many>false</many> 
</source> 
<target> 
<class>sys:base</class> 
<mandatory>false</mandatory> 
<many>true</many> 
</target> 
<duplicate>false</duplicate> 
</child-association> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Child Associations 
‣ Este tipo de asociaciones son fácilmente navegables usando 
Alfresco's XPath y los lenguajes de búsqueda de Lucene. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Child Associations 
‣ Ejemplo: Carpeta <-> Contenido 
<type name="cm:folder"> 
<title>Folder</title> 
<parent>cm:cmobject</parent> 
<associations> 
<child-association name="cm:contains"> 
<source> 
<mandatory>false</mandatory> 
<many>false</many> 
</source> 
<target> 
<class>sys:base</class> 
<mandatory>false</mandatory> 
<many>true</many> 
</target> 
<duplicate>false</duplicate> 
</child-association> 
</associations> 
</type> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Non-Child Associations 
‣ Las operaciones como el borrado NO se propagan a los hijos. 
‣ Los lenguajes de búsqueda de Alfresco NO soportan la navegación de 
este tipo de asociaciones. 
‣ El elemento association define este tipo de asociaciones. 
‣ Su sintaxis es muy similar a la definida anteriormente: source y target. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Non-Child Associations 
<aspect name="cm:subscribable"> 
<associations> 
<association name="cm:subscribedBy"> 
<source> 
<mandatory>false</mandatory> 
<many>true</many> 
</source> 
<target> 
<class>cm:person</class> 
<mandatory>false</mandatory> 
<many>true</many> 
</target> 
</association> 
</associations> 
</aspect> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Ejemplo 
‣ Si queremos que cualquier nodo forme parte de una asociación: 
... 
<target> 
<class>sys:base</class> 
</target> 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Restricciones 
‣ Introducción. 
‣ Tipos de restricciones. 
‣ Definición de restricciones. 
‣ Uso de restricciones. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ El concepto de restricción puede utilizarse opcionalmente para 
restringir los valores que Alfresco almacenará en nuestras 
propiedades. 
‣ Están definidas 4 tipos de restricciones: REGEX, LIST, MINMAX y 
LENGTH. 
‣ Las restricciones se definen una única vez y se reutilizan en todo el 
modelo. 
‣ Alfresco incorpora una restricción predefinida “cm:filename” que 
define una expresión regular para chequear que una cadena es un 
nombre de fichero válido. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Las restricciones se incluyen dentro del modelo de contenidos 
mediante los elementos xml constraints y constraint: 
<model name="test:dictionarydaotest" xmlns="http:// 
www.alfresco.org/model/dictionary/1.0"> 
<imports> ... </imports> 
<namespaces> ... </namespaces> 
<data-types> 
... 
</data-types> 
<constraints> 
... 
</constraints> 
</model> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Tipos de restricciones 
‣ Restricción REGEX: esta restricción nos permite restringir el valor de 
una propiedad mediante una expresión regular. 
‣ Debemos definir dos parámetros: 
‣ expression: la expresión regular. 
‣ requiresMatch: booleano que define si se requiere coincidencia o NO coincidencia. 
‣ Restricción LIST: esta restricción nos permite restringir el valor de una 
propiedad mediante una lista de valores. 
‣ Debemos definir dos parámetros: 
‣ allowedValues: lista de valores permitidos. 
‣ caseSensitive: booleano que define si tenemos en cuenta mayúscula y minúscula. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Tipos de restricciones 
‣ Restricción MINMAX: esta restricción nos permite restringir el valor de 
una propiedad mediante rango de valores. 
‣ Debemos definir dos parámetros: 
‣ minValue: valor mínimo. 
‣ maxValue: valor máximo. 
‣ Restricción LENGTH: esta restricción nos permite restringir la longitud 
una propiedad de tipo cadena. 
‣ Debemos definir dos parámetros: 
‣ minLength: longitud mínima. 
‣ maxLength: longitud máxima. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de restricciones 
‣ El elemento constraint permite definir una restricción. 
‣ Sintaxis: 
<constraint name="prefix:nombreRest" type="tipoDeRest"> 
<parameter ...> </parameter> 
</constraint> 
‣ Los atributos name y type definen el nombre de la restricción y el tipo. 
‣ Los elementos parameter nos permitirán parametrizar cada tipo de 
restricción. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de restricciones 
‣ Ejemplo de REGEX: 
‣ Cadenas que no contengan letras mayúsculas. 
<constraint name="test:regex1" type="REGEX"> 
<parameter name="expression"> 
<value>[A-Z]*</value> 
</parameter> 
<parameter name="requiresMatch"> 
<value>false</value> 
</parameter> 
</constraint> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de restricciones 
‣ Ejemplo de REGEX: 
‣ Cadenas que no contengan letras minúsculas. 
<constraint name="test:regex2" type="REGEX"> 
<parameter name="expression"> 
<value>[a-z]*</value> 
</parameter> 
<parameter name="requiresMatch"> 
<value>false</value> 
</parameter> 
</constraint> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de restricciones 
‣ Ejemplo: 
‣ Cadenas con longitud comprendida entre 0 y 256. 
<constraint name="test:stringLength1" type="LENGTH"> 
<parameter name="minLength"> 
<value>0</value> 
</parameter> 
<parameter name="maxLength"> 
<value>256</value> 
</parameter> 
</constraint> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de restricciones 
‣ Ejemplo: 
‣ Valores comprendidos entre 0 y 256. 
<constraint name="test:minMax1" type="MINMAX"> 
<parameter name="minValue"> 
<value>0</value> 
</parameter> 
<parameter name="maxValue"> 
<value>256</value> 
</parameter> 
</constraint> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de restricciones 
‣ Ejemplo: 
‣ Cadenas que sean “ABC” o “DEF” sensible a mayúsculas. 
<constraint name="test:list1" type="LIST"> 
<parameter name="allowedValues"> 
<list> 
<value>ABC</value> 
<value>DEF</value> 
</list> 
</parameter> 
<parameter name="caseSensitive"> 
<value>true</value> 
</parameter> 
</constraint> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Uso de restricciones 
‣ El elemento constraints hijo de property nos permite aplicar 
restricciones sobre cualquier propiedad. 
‣ Dentro del elemento constraints se pueden añadir tantas restricciones 
como sean necesarias mediante constraint: 
<property name="prefix:nombrePropiedad"> 
... 
<constraints> 
<constraint ref="prefix:nombreRestriccion"/> 
... 
</constraints> 
</property> 
‣ El atributo ref determina el nombre de la restricción a aplicar. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Uso de restricciones 
‣ Ejemplo: 
<property name="test:prop1"> 
<type>d:text</type> 
<protected>true</protected> 
<constraints> 
<constraint ref="test:regex1"/> 
<constraint ref="test:stringLength1"/> 
</constraints> 
</property> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
¡Cuidado con las restricciones! 
‣ IMPORTANTE: 
‣ ¡El orden en los ficheros de definición de nuevos modelos importa!. 
‣ Primero debe declararse la restricción y luego hacerle referencia. Si lo hacemos al 
contrario se producirá un error grave y Alfresco no se inicializará. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Aspectos 
‣ Introducción. 
‣ Definición de aspecto. 
‣ Aspectos por defecto. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ Los aspectos nos permiten aplicar conceptos transversales 
(propiedades o asociaciones) a cualquier pieza de contenido (sea cual 
sea su tipo) y en cualquier lugar. 
‣ Son fundamentales a la hora de diseñar buenos modelos reutilizables, 
flexibles y con buen rendimiento. 
‣ Se pueden aplicar a un nodo y posteriormente quitarle estas 
propiedades. Son de “quita y pon”. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de aspecto 
‣ El elemento aspect define un aspecto dentro del modelo de 
contenidos. 
<aspect name="prefix:aspectName"> 
<title>aspectTitle</title> 
<properties> 
<property > 
... 
</property> 
... 
</aspect> 
‣ Se define de forma similar a un tipo de contenido. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de aspecto 
‣ Ejemplo: 
<aspect name="cm:auditable"> 
<title>Auditable</title> 
<properties> 
<property name="cm:created"> 
<type>d:datetime</type> 
</property> 
<property name="cm:creator"> 
<type>d:text</type> 
</property> 
<property name="cm:modified"> 
<type>d:datetime</type> 
</property> 
... 
</properties> 
</aspect> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Alfresco nos ofrece un conjunto de aspectos, por defecto, que 
podemos utilizar en nuestros modelos de contenidos: 
‣ Classifiable Aspect: activa la categorización, por lo tanto se puede aplicar 
categorías sobre el documento. 
‣ Complianceable Aspect: se añade la propiedad para indicar cuándo debe borrarse. 
‣ Dublin Core Aspect: añade los metadatos de Dublic Core: publisher, Contributor, 
Subject y Rights. 
‣ Effectivity Aspect: añade las propiedades From y To al documento. 
‣ Emailed Aspect: añade un conjunto de propiedades de Email Data al documento. 
‣ Localizable Aspect: añade la propiedad Locale to the document. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Summarizable Aspect: añade la propiedad Summary al documento. 
‣ Templatable Aspect: añade la propiedad cm:template, que es la referencia a otro 
nodo, que será la plantilla. 
‣ Translatable Aspect: añade la propiedad Translations al documento. 
‣ Versionable Aspect: habilita el versionado de documentos. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Classifiable Aspect: 
<aspect name="cm:classifiable"><title>Classifiable</title></aspect> 
<aspect name="cm:generalclassifiable"> 
<title>General Classifiable</title> 
<parent>cm:classifiable</parent> 
<properties> 
<property name="cm:categories"> 
<title>Categories</title> 
<type>d:category</type> 
<mandatory>false</mandatory> 
<multiple>true</multiple> 
<index enabled="true"> 
<atomic>true</atomic> 
<stored>true</stored> 
<tokenised>false</tokenised> 
</index> 
</property> 
</properties> 
</aspect> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Complianceable Aspect: 
<aspect name="cm:complianceable"> 
<title>Complianceable</title> 
<properties> 
<property name="cm:removeAfter"> 
<title>Remove After</title> 
<type>d:datetime</type> 
</property> 
</properties> 
<mandatory-aspects> 
<aspect>cm:auditable</aspect> 
</mandatory-aspects> 
</aspect> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Dublin Core Aspect: 
<aspect name="cm:dublincore"> 
<title>Dublin Core</title> 
<parent>cm:titled</parent> 
<properties> 
<property name="cm:publisher"> 
<title>Publisher</title> 
<type>d:text</type> 
<mandatory enforced="false">true</mandatory> 
</property> 
... 
<mandatory-aspects> 
<aspect>cm:auditable</aspect> 
<aspect>cm:author</aspect> 
</mandatory-aspects> 
</aspect> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Effectivity Aspect: 
<aspect name="cm:effectivity"> 
<title>Effectivity</title> 
<properties> 
<property name="cm:from"> 
<title>Effective From</title> 
<type>d:datetime</type> 
... 
</property> 
<property name="cm:to"> 
<title>Effective To</title> 
<type>d:datetime</type> 
... 
</property> 
</properties> 
</aspect> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Aspectos por defecto 
‣ Translatable Aspect: 
<aspect name="cm:translatable"> 
<title>Translatable</title> 
<parent>cm:localizable</parent> 
<associations> 
<association name="cm:translations"><title>Translations</title> 
<source><role>cm:translationOf</role> 
<mandatory>false</mandatory> 
<many>false</many> 
</source> 
<target><class>cm:content</class> 
<role>cm:hasTranslation</role> 
<mandatory>false</mandatory> 
<many>true</many> 
</target> 
</association> 
</associations> 
</aspect> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Despliegue de modelo de contenidos 
‣ Introducción. 
‣ Crear el fichero de contexto. 
‣ Despliegue estático. 
‣ Despliegue dinámico. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Una vez que el modelo de contenidos ha sido definido, es decir, el 
fichero xml ha sido creado, tenemos que desplegarlo en nuestra 
instalación de Alfresco. 
‣ Para que Alfresco reconozca la definición de nuestro nuevo modelo 
debemos crear un fichero de contexto que haga de cargador de la 
definición. 
‣ El fichero de contexto debe llamarse como <nombreModelo>- 
context.xml y colocarse en el fichero de extensión para que Alfresco lo 
localice automáticamente. 
‣ Los modelos pueden instalarse en Alfresco de forma estática o 
dinámica. La primera necesitará el reinicio del sistema. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Crear el fichero de contexto 
‣ El fichero de contexto contiene uno o más bean de configuración de 
Spring. 
‣ Dependiendo de la distribución de Alfresco que hayamos descargado 
tendremos un conjunto de ficheros de contexto de ejemplo en el 
directorio de extensión que nos servirán como plantilla para los 
nuestros. 
‣ Nota: el directorio de extensión es ${alfresco}/tomcat/shared/classes. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Crear el fichero de contexto 
‣ Para la versión 4.2.c, la plantilla custom-model-context.xml.sample es: 
<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http:// 
www.springframework.org/dtd/spring-beans.dtd'> 
<beans> 
<!-- Registration of new models --> 
<bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" 
depends-on="dictionaryBootstrap"> 
<property name="models"> 
<list> 
<value>alfresco/extension/customModel.xml</value> 
</list> 
</property> 
</bean> 
</beans> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Crear el fichero de contexto 
‣ La ruta alfresco/extension/customModel.xml se define en relación a la 
carpeta de extensión de alfresco. 
‣ Resumiendo, si nuestro modelo se ha definido en un fichero llamado 
companyModel.xml, el fichero de contexto se llamará companyModel-context. 
xml 
... 
<beans> 
<!-- Registration of new models --> 
<bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" 
depends-on="dictionaryBootstrap"> 
<property name="models"> 
<list> 
<value>alfresco/extension/companyModel.xml</value> 
</list> 
</property> 
</bean> 
</beans> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Despliegue estático (Static model) 
‣ El despliegue estático obligatoriamente implica un reinicio del sistema 
para que los nuevos modelos de contenidos sean tenidos en cuenta. 
Este despliegue implica: 
‣ Copiar el fichero de contexto en la carpeta ${alfresco}/tomcat/shared/classes/ 
alfresco/extension. 
‣ Copiar el fichero del modelo de contenidos en la carpeta ${alfresco}/tomcat/ 
shared/classes/<rutaDefinidaFicheroContexto> 
‣ Reiniciar Alfresco. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Despliegue dinámico (Dynamic Model) 
‣ Con el método anterior (modelos estáticos) será necesario reiniciar el 
sistema para que lea los cambios de la carpeta de extensión. 
‣ Existe la posibilidad de usar modelos dinámicos, que no requieren 
parada del servicio. 
‣ Para ello, debemos subir el fichero con nuestro nuevo modelo (el XML 
que lo define, NO el que termina en -context.xml) al espacio “Company 
Home -> Data Dictionary -> Models”. 
‣ Cuando hagamos el upload del modelo al espacio previamente 
mencionado, nos saldrá un check-box 'Model Active' que debemos 
seleccionar si queremos desplegarlo. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configurar los clientes Web 
‣ Introducción. 
‣ Personalizaciones Alfresco Explorer. 
‣ Personalizaciones Alfresco Share. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ Generalmente queremos que los clientes Web Alfresco Explorer y 
Alfresco Share reconozcan el nuevo tipo de contenido para poder 
gestionar instancias de él. 
‣ En el directorio de extensión se encuentra el fichero web-client-config-custom. 
xml [es posible que haya que renombrarlo porque aparezca 
con extensión .sample] con el que podemos definir el comportamiento 
de Alfresco Explorer. 
‣ En el directorio web-extensión se encuentra el fichero share-config-custom. 
xml [es posible que haya que renombrarlo porque aparezca 
con extensión .sample] con el que podemos definir el comportamiento 
de Alfresco Share. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Si queremos trabajar con modelos estáticos, se dejará el web-client-config- 
custom.xml en la carpeta de extensión. 
‣ Si queremos trabajar con modelos dinámicos (no necesario reiniciar), 
entonces lo llevaremos al espacio Company Home -> Data Dictionary - 
> Web Client Extension. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Para configurar personalizaciones en Alfresco Explorer vamos a añadir 
un conjunto de claves de configuración que añadimos al web-client-config- 
custom.xml. 
‣ Las claves de configuración las debe “entender” la aplicación “Alfresco 
Explorer” por lo que deberán seguir un conjunto estricto de convenios 
que están especificados en la documentación de Alfresco y en las 
siguientes transparencias. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Property Sheet : Cuando un usuario observa las propiedades de una 
pieza de contenido de un tipo personalizado, debemos mostrar las 
propiedades personalizadas. 
Drawing 2: Custom properties on the 
properties sheet 
Preparado por Jesús Salinas Revelles 
!"#$%"&'(!"()"*# 
add properties to property sheets use the “aspect-name” evaluator for aspects and “node-type” for 
Tipos de contenidos personalizados 
content types. The snippet below shows the config for the sc:webable aspect. The sc:productRelated 
aspect would be similar. 
Personalizaciones de la interfaz de usuario del WC 
<!-- add webable aspect properties to property sheet --> 
<config evaluator="aspect-name" condition="sc:webable"> 
<property-sheet> 
‣ Para ello utiliza el evaluador “node-type” para tipos de contenido o 
“aspect-name” para aspectos: 
<config evaluator="node-type" 
<show-property name="sc:published" display-label-id="published" 
<show-property name="sc:isActive" display-label-id="isActive" 
read-only="true" /> 
<show-association name=”sc:relatedDocuments” /> 
</property-sheet> 
</config> 
Listing 4: Snippet from web-client-config-custom.xml 
the display-label-id attribute. You could specify the label in this file by using the label attribute, 
better practice is to externalize the string so the interface could be localized if needed. At the end 
this section we'll see where the localized strings reside. 
Create content/Add content 
a user clicks Create or Add Content, the custom types should be a choice in the list of content 
as shown below: 
Preparado por Jesús Salinas Revelles 
condition="prefijo:nombreTipo"> 
<property-sheet> 
<show-property name="prefijo:Propiedad1"/> 
<show-property name="prefijo:Propiedad2"/> 
</property-sheet> 
</config>
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Para ello utiliza el evaluador “node-type” para tipos de contenido o 
“aspect-name” para aspectos: 
<config evaluator="node-type" 
condition="prefijo:nombreTipo"> 
<property-sheet> 
<show-property name="prefijo:Propiedad1"/> 
<show-property name="prefijo:Propiedad2"/> 
</property-sheet> 
</config> 
Preparado por Jesús Salinas Revelles 
¡HAY UNA CLAVE DE CONFIGURACION 
DE ESTE TIPO en el web-client-config-custom. 
xml POR CADA TIPO DE 
CONTENIDO del modelo 
Hay una entrada de tipo show-property por 
cada propiedad específica del tipo que 
queremos mostrar en los formularios 
Hay que hacerlo coincidir con el nombre 
de un tipo que pusimos en el modelo de 
contenidos y con el prefijo que 
declaramos en su espacio de nombres. 
Sólo puede ser “node-type” o 
“aspect-name” 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Ejemplos: 
<config evaluator="node-type" condition="my:sop"> 
<property-sheet> 
<show-property name="mimetype" 
display-label-id="content_type" 
component-generator="MimeTypeSelectorGenerator" /> 
<show-property name="size" display-label-id="size" 
converter="org.alfresco.faces.ByteSizeConverter" 
show-in-edit-mode="false" /> 
<show-property name="my:publishedDate" /> 
<show-association name="my:signOff" /> 
<show-property name="my:authorisedBy" /> 
<show-child-association name="my:processSteps" /> 
</property-sheet> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Elemento show-property, atributos interesantes: 
‣ name: nombre de la propiedad a mostrar. 
‣ display-label-id: identificador de la etiqueta asociada a la propiedad. 
‣ show-in-edit-mode: booleano que identifica si la propiedad aparece en modo edit o 
no. 
‣ converter: proceso de coversión a aplicar. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Create content/add content: los tipos personalizados de contenido 
deben ser una opción de la lista de selección de tipos.!"#$%"&'(!"()"*# 
Drawing 3: Custom type in the add content 
dialog 
Preparado por Jesús Salinas Revelles 
To add content types to the list of available types in the create content and add content dialogs, use the 
string-compare” evaluator and the “Content Wizards” condition. 
<!-- add someco types to add content list -->
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Usamos el evaluador “string­compare” 
y la condición “Content 
Wizards”. 
<config evaluator="string­compare" 
condition="Content Wizards"> 
<content­types> 
<type name="prefijo:nombreNuevoTipo" /> 
<type name="prefijo:nombreNuevoTipo2" /> 
</content­types> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Usamos use el evaluador “string­compare” 
y la condición “Content 
Wizards”. 
<config evaluator="string­compare" 
condition="Content Wizards"> 
<content­types> 
<type name="prefijo:nombreNuevoTipo" /> 
<type name="prefijo:nombreNuevoTipo2" /> 
</content­types> 
</config> 
Preparado por Jesús Salinas Revelles 
No se cambia!
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Usamos use el evaluador “string­compare” 
y la condición “Content 
Wizards”. 
<!­­add 
someco types to add content list ­­> 
<config evaluator="string­compare" 
condition="Content Wizards"> 
<content­types> 
<type name="prefijo:nombreNuevoTipo" /> 
<type name="prefijo:nombreNuevoTipo2" /> 
</content­types> 
</config> 
Preparado por Jesús Salinas Revelles 
¡No se 
cambia! 
¡No se 
cambia! 
Hay que hacerlos coincidir con los 
nombres de los tipos que pusimos en el 
modelo de contenidos y con el prefijo 
que declaramos en su espacio de 
nombres. 
¡SOLO HAY UNA CLAVE DE 
CONFIGURACION DE ESTE TIPO 
en el web-client-config.xml! 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Para espacios personalizados, si queremos que nos aparezca un 
nuevo tipo de espacio en el asistente de creación de espacio, debemos 
incluir: 
<config evaluator="string-compare" 
condition="Space Wizards"> 
<folder-types> 
<type name="prefijo:nombreTipo"/> 
</folder-types> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ 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="prefijo:nombreTipo"/> 
</subtypes> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Personalizaciones Alfresco Explorer 
‣ Para espacios personalizados, si queremos tener la posibilidad de 
convertir los espacios existentes tendremos que añadir lo siguiente: 
<config evaluator="string-compare" 
condition="Action Wizards"> 
<specialize-types> 
<type name="prefijo:nombreTipo"/> 
</specialize-types> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Personalizar Alfresco Share 
‣ Introducción. 
‣ Nuevos tipos y aspectos. 
‣ Configuración de formularios. 
‣ Formulario de búsqueda avanzada. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ El diseño de nuevos modelos de datos en Alfresco es una operación 
muy habitual. Una vez diseñado dicho modelo podemos crear código 
que trabaje directamente contra él. 
‣ Ahora bien, para trabajar con el cliente web Alfresco Share, deberemos 
introducir alguna modificación. 
‣ El fichero donde se introducen dichas modificaciones es share-config-custom. 
xml que será creado en ${tomcat_home}/shared/classes/web-extension. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ ¿Dónde manejamos tipos de datos dentro de Alfresco Share? 
‣ Cuando un usuario configura una regla sobre un aspecto y usa un tipo de 
contenido como criterio. 
‣ Cuando un usuario configura una regla sobre un espacio y usa un aspecto como 
criterio. 
‣ Cuando un usuario ejecuta una acción “specialize type”, como parte de una regla 
de configuración o como una acción UI “Change Type” UI action, los tipos 
personalizados deben aparecer. 
‣ Cuando un usuario decide ejecutar Añadir Aspecto. 
‣ Cuando el usuario analiza el detalle de un documento. 
‣ Cuando el usuario edita los detalles de un documento. 
‣ Cuando el usuario realiza búsquedas avanzadas. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Informar a Alfresco Share de que existen nuevos tipos, aspectos, etc. 
Las modificaciones se incluyen dentro del siguiente elemento: 
<alfresco-config> 
... 
<!-- Document Library config section --> 
<config evaluator="string-compare" 
Preparado por Jesús Salinas Revelles 
condition="DocumentLibrary"> 
... 
</config> 
... 
</alfresco-config>
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Añadiendo aspectos: 
... 
<aspects> 
<visible> 
<aspect name="sc:webable" /> 
<aspect name="sc:productRelated" /> 
</visible> 
<addable> 
</addable> 
<removeable> 
</removeable> 
</aspects> 
... 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Añadiendo tipos: 
... 
<types> 
<type name="cm:content"> 
<subtype name="sc:doc" /> 
<subtype name="sc:whitepaper" /> 
</type> 
<type name="sc:doc"> 
<subtype name="sc:whitepaper" /> 
</type> 
</types> 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Estas entradas xml type y subtype permiten definir el concepto de 
herencia. 
‣ El mismo tipo puede aparecer varias veces en la lista. Una vez cómo 
subtipo de cm:content y otra como subtipo de sc:doc. Esto permite al 
usuario especializar directamente el tipo sc:whitepaper 
independientemente de si el original era cm:content o sc:doc. 
‣ Se reinicia Tomcat y vemos los cambios. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Reglas de contenidos: 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Nuevos tipos y aspectos 
‣ Cambiando el tipo de un nodo: 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Alfresco Share utiliza el servicio de formularios para decidir qué 
propiedades mostrar en cada caso. 
‣ El evaluador node-type permite definir los formularios. 
‣ Los nodos dentro de Alfresco Share se gestionan en formularios de 
diferentes formas: 
‣ View, Edit, Edit online. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Sintaxis: 
<config evaluator="node-type" condition="type"> 
<forms> 
<form [id="string"] [submission-url="url"]> 
<view-form template="path" /> 
<edit-form template="path" /> 
<create-form template="path" /> 
<field-visibility> 
... 
</field-visibility> 
<appearance> 
... 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Los tres formularios son: 
‣ Formulario por defecto (elemento form sin atributo id). Formulario cuando se abre 
los detalles de un documento. 
‣ Formulario con id doclib-simple-metadata. Formulario de edición de propiedades 
desde la biblioteca de documentos. 
‣ Formulario con id doclib-inline-edit. Este se utiliza cuando se accede a la edición 
Inline. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Cada formulario debe incluirse dentro de esta configuración: 
<config evaluator="node-type" condition="sc:whitepaper"> 
<forms> 
<form> 
... 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Formulario de edición: 
<form id="doclib-simple-metadata"> 
... 
</form> 
‣ Formulario de edición online: 
<form id="doclib-inline-edit"> 
... 
</form> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplo: 
<form id="doclib-inline-edit"> 
<field-visibility> 
<show id="cm:name" /> 
... 
</field-visibility> 
... 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Los elementos view-form, edit-form, create-form: permiten definir 
plantillas personalizadas para los formularios de creación, edición y 
visualización. 
‣ Ejemplo: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<create-form template="/path/to/custom/form1.ftl" /> 
</form> 
</forms> 
</config> 
‣ El atributo template define la ruta donde se encuentra la plantilla. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elementos field-visibility y appearance: 
... 
<form> 
<field-visibility> 
<show id="sc:published" /> 
<show id="sc:isActive" /> 
</field-visibility> 
<appearance> 
<field id="sc:published" 
label-id="prop.sc_published" /> 
<field id="sc:isActive" label-id="prop.sc_isActive"/> 
</appearance> 
</form> 
... 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ El elemento field-visibility se encarga de definir la visibilidad de los 
campos asociados al tipo de dato que se van a mostrar en el 
formulario. 
‣ Si este elemento no existe todos los campos del tipo de dato son 
visibles en todos los modos. 
‣ Ejemplo: 
<config evaluator="node-type" condition="sc:whitepaper"> 
<forms> 
<form> 
<field-visibility> 
<show id="cm:name" /> 
<show id="cm:title" force="true" /> 
<show id="cm:creator" for-mode="view" /> 
<show id="cm:taggable" for-mode="edit" 
Preparado por Jesús Salinas Revelles 
force="true" />
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Sintaxis field-visibility: 
<config evaluator="node-type" condition="type"> 
<forms> 
<form [id="string"] [submission-url="url"]> 
... 
<field-visibility> 
<show id="string" [for-mode="view|edit|create"] 
[force="boolean"] /> 
<hide id="string" [for-mode="view|edit|create"] /> 
</field-visibility> 
... 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento show: especifica si un campo aparece en un formulario. Sus 
atributos son: 
‣ Atributo id: (obligatorio) identificador único del campo, por ejemplo, "cm:name". 
‣ Atributo for-mode: (opcional, cadenas separadas por comas) especifica cuando 
debe aparecer el campo sobre el que se aplica. Sus valores válidos son "view", 
"edit" y "create". Si el atributo no se especifica, aparecerá en todos los modos. Si 
queremos que el campo sólo aparezca en modo view y edit su valor será 
"view,edit". 
‣ Atributo force: (opcional, booleano): hay campos que pueden ser opcionales para 
un item, por ejemplo, por defecto pueden no ser devueltos por el servidor. Cuando 
este atributo está a true informa al servicio de formularios (FormService) que debe 
hacer lo que sea para encontrar y devolver una definición de ese campo. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento hide: este elemento tiene sentido cuando varios ficheros de 
configuración trabajan de forma combinada haciendo que un campo 
no sea visible cuando previamente lo era. Sus atributos son: 
‣ id (obligatorio, string): identificador único del campo, por ejemplo, "cm:name". 
‣ Atributo for-mode: (opcional, cadenas separadas por comas) especifica cuando no 
debe aparecer el campo sobre el que se aplica. Sus valores válidos son "view", 
"edit" y "create". Si el atributo no se especifica, aparecerá en todos los modos. Si 
queremos que el campo sólo aparezca en modo view y edit su valor será 
"view,edit". 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<field-visibility> 
<hide id="cm:title" /> 
<hide id="cm:description" /> 
</field-visibility> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ El elemento appearance se encarga de definir la apariencia de los 
diferentes controles que aparecen en el formulario (look&feel). 
‣ Ejemplo: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<set id="dublin-core" appearance="bordered-panel" 
Preparado por Jesús Salinas Revelles 
label="Dublin Core" /> 
<field id="cm:publisher" set="dublin-core" /> 
<field id="cm:contributor" set="dublin-core" /> 
<field id="cm:type" set="dublin-core" /> 
... 
</appearance> 
</form> 
</forms> 
</config>
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento set: permite definir grupos de campos. Sus atributos son: 
‣ id (obligatorio, string): especifica el identificador único del conjunto. 
‣ parent (opcional, string): permite conjuntos anidados. 
‣ appearance (opcional, string): especifica cómo debe renderizarse en grupo. Los 
valores son "fieldset", "panel", "bordered-panel", "title" y "whitespace". Si este 
atributo no aparece no será renderizado. Si el campo aparece “” el conjunto se 
renderizará sin nada especial. 
‣ template (opcional, string): especifica la ruta de la plantilla usada para renderizar el 
grupo, permitiendo así personalización de los campos. 
‣ label-id (opcional, string): especifica la clave en resource bundle key asociado al 
campo. 
‣ label (opcional, string): especifica la etiqueta del conjunto. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento field: controla la apariencia de cada campo, desde la etiqueta 
al control que debemos usar. Sus atributos son: 
‣ id (obligatorio, string). 
‣ label-id (opcional, string). 
‣ label (opcional, string). 
‣ description-id (opcional, string). 
‣ description (opcional, string). 
‣ help-id (opcional, string). 
‣ help (opcional, string). 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento field (cont.): 
‣ read-only (opcional, boolean): informa al generador de formularios que el campo 
debe renderizarse como editable cuando el formulario esté en modo "edit" o 
"create". 
‣ mandatory (opcional, boolean): define el campo como obligatorio. 
‣ set (opcional, string): especifica el identificador único de un fieldset indicando que 
se encuentra dentro de él. Si el atributo se omite el campo pertenece al fieldset por 
defecto. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplos appearance: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:name" label="File Name" 
description="The file name of the content" /> 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplos appearance: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
Preparado por Jesús Salinas Revelles 
<field id="cm:name" label-id="label.name" 
description-id="description.name" /> 
</appearance> 
</form> 
</forms> 
</config> 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplos appearance: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:author" read-only="true" /> 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento control: este elemento es hijo de field y define el tipo de 
control a utilizar para un determinado campo. Sus atributos son: 
‣ template (opcional, string): Specifies the absolute path to the Freemarker template 
to use to represent the field. 
‣ Ejemplo: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:title"> 
<control template="/org/alfresco/components/form/controls/textfield.ftl" /> 
</field> 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento control-param: 
‣ Atributo name (obligatorio, string): nombre del parámetro que se pasa a control de 
la plantilla. 
‣ Ejemplo: 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:description"> 
<control> 
Preparado por Jesús Salinas Revelles 
<control-param name="rows">10</control-param> 
</control> 
</field> 
</appearance> 
</form> 
</forms> 
</config>
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplos: propiedad description 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:description"> 
<control> 
<control-param name="rows">10</control-param> 
</control> 
</field> 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Ejemplos: propiedad description renderizada en un campo rico. 
<config evaluator="node-type" condition="cm:content"> 
<forms> 
<form> 
<appearance> 
<field id="cm:description"> 
<control template="/org/alfresco/components/form/controls/richtext.ftl"> 
<control-param name="editorAppearance">full</control-param> 
</control> 
</field> 
</appearance> 
</form> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elementos constraint-handlers y constraint: el elemento constraint 
que función JS usar para chequear restricciones. Sus atributos son: 
‣ type (obligatorio, string): identificador de una restricción, por ejemplo, LIST. 
‣ validation-handler (obligatorio, string): nombre de la función JS llamada cuando el 
campo se valida. 
‣ message-id (opcional, string): clave asociada a resource bundle utilizado cuando la 
validación falla. Si este atributo existe reemplaza el mensaje por defecto. Tiene 
precedencia sobre el atributo message. 
‣ message (opcional, string): mensaje que se genera si la validación falla. 
‣ event (opcional, string): especifica qué evento activa al manejador de validación. 
Este string coincide con eventos DOM estándares: "keyup", "blur" etc. El valor por 
defecto es "blur". 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elementos constraint-handlers y constraint: 
‣ Ejemplo: 
<config> 
<forms> 
<constraint-handlers> 
<constraint type="MANDATORY" 
validation-handler="Alfresco.forms.validation.mandatory" 
event="keyup" /> 
</constraint-handlers> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Elemento dependencies: define la lista de ficheros JavaScript y CSS 
necesarios para el funcionamiento del formulario. 
‣ El elemento js representa un fichero js y css un fichero css. Su único atributo es: 
‣ src (obligatorio, string): especifica la ruta absoluta desde el raís de la aplicación web (no 
incluido el contexto de la web). 
<config> 
<forms> 
<dependencies> 
<css src="/fdk/accordion/accordion.css" /> 
<js src="/fdk/accordion/accordion-min.js" /> 
</dependencies> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Configuración de formularios 
‣ Más información 
‣ http://wiki.alfresco.com/wiki/Forms 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Formulario de búsqueda avanzada 
‣ Se define el formulario de búsqueda para cada tipo definiendo titulo y 
descripción: 
<config replace="true" evaluator="string-compare" 
condition="AdvancedSearch"> 
<advanced-search> 
<forms> 
... 
<form labelId="type.sc_whitepaper" 
descriptionId="search.form.desc.sc_whitepaper"> 
sc:whitepaper 
</form> 
</forms> 
</advanced-search> 
</config> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Formulario de búsqueda avanzada 
‣ Tenemos que especificar el detalle de cada formulario asociado a un 
determinado tipo: 
<config evaluator="model-type" condition="sc:whitepaper"> 
<forms> 
<form id="search"> 
<field-visibility> 
<show id="cm:name" /> 
... 
<appearance> 
</appearance> 
</forms> 
</config> 
Preparado por Jesús Salinas Revelles
Recargar Alfresco 
Tipos de contenidos personalizados 
Recargar Alfresco sin reiniciar 
‣ Para recargar los modelos que hayamos puesto en la carpeta de 
extensión sin parar el servidor podemos usar la consola 
‣ http://localhost:8080/alfresco/faces/jsp/admin/repoadmin-console. 
jsp 
‣ y ejecutar el comando 
‣ deploy model alfresco/extension/miModelo.xml 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Recargar Alfresco sin reiniciar 
‣ Para recargar las configuraciones de Alfresco Explorer (la interfaz Web) 
basta ir a la consola 
http://localhost:8080/alfresco/faces/jsp/admin/webclientconfig-console. 
jsp 
‣ y ejecutar el comando “reload”. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Recargar Alfresco con reinicio 
‣ Basta parar el proceso de Alfresco y volver a lanzarlo. 
‣ Múltiples mecanismos, depende del S.O. y del despliegue que se haya 
hecho. Normalmente... 
‣ sh alfresco.sh stop 
‣ sh alfresco.sh start 
Preparado por Jesús Salinas Revelles
Pruébalo 
Tipos de contenidos personalizados 
Probando las personalizaciones 
‣ Sube un nuevo documento. 
‣ Despliega en la primera pantalla el selector de tipos y comprueba que 
aparece tu nuevo tipo personalizado. Selecciónalo. 
‣ Comprueba que en el formulario de introducción de metadatos 
aparecen las nuevas propiedades que hemos agregado al tipo de 
contenido. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Búsquedas en Alfresco 
‣ Introducción. 
‣ Configurar búsquedas en Alfresco Explorer. 
‣ Indexación de propiedades. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ Con Alfresco podemos buscar en los contenidos y las propiedades de 
los mismos. Soporta búsqueda a texto completo en el contenido, 
independientemente del formato. 
‣ Podemos restringir las búsquedas a ciertos espacios, categorías o 
determinados tipos de contenido. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Búsquedas en Alfresco Explorer: 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ Búsqueda a texto completo: Por defecto, el contenido de Alfresco 
soporta búsquedas a texto completo. Cualquier contenido que se suba 
al repositorio es transformado internamente a texto y es indexado. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Configurar búsquedas en Alfresco Explorer 
<config evaluator="string-compare" condition="Advanced Search"> 
<advanced-search> 
<content-types> 
<type name="custom:pressrelease" /> 
</content-types> 
<custom-properties> 
<meta-data type="custom:pressrelease" 
Preparado por Jesús Salinas Revelles 
property="custom:PRDate" /> 
<meta-data aspect="custom:CustomerDetails" 
property="custom:CustomerName" /> 
<meta-data aspect="custom:CustomerDetails" 
property="custom:NewCustomer" /> 
</custom-properties> 
</advanced-search> 
</config> 
Tipo de contenido 
Propiedad para buscar 
Aspecto 
Propiedad para buscar 
Tipos de contenidos personalizados 
Indexación de propiedades 
‣ Introducción. 
‣ Definición de índices en propiedades. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Cuando un documento se sube a Alfresco, por defecto, los metadatos 
se extraen y se indexan en el acto, pero el contenido no tiene por qué 
ser indexado en ese momento (depende). 
<type name="cm:content"> 
<title>Content</title> 
<parent>cm:cmobject</parent> 
<properties> 
<property name="cm:content"> 
<type>d:content</type> 
<mandatory>false</mandatory> 
<index enabled="true"> 
<atomic>false</atomic> 
<stored>false</stored> 
<tokenised>true</tokenised> 
</index> 
</property> 
</properties> 
</type> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ El elemento index es el responsable de definir la indexación asociada a 
cada propiedad en nuestro modelo de contenidos: 
<type name="prefix:name"> 
... 
<properties> 
<property name="prefix:propertyName"> 
... 
<index ...> 
... 
</index> 
</property> 
</properties> 
</type> 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ Atributo enabled: determina si la propiedad se indexa o no 
... 
<index enabled=”true”> 
... 
</index> 
... 
... 
<index enabled=”false”> 
... 
</index> 
... 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ Elemento atomic: 
... 
<index enabled=”true”> 
<atomic> true|false </atomic> 
</index> 
... 
‣ Si está a true, esa propiedad es indexada en el momento de la transacción, si está a 
false, se indexará en background. 
‣ La indexación de contenidos que necesitan transformación antes de ser indexados 
(p. ej. PDF), solo serán atomic=true si la transformación tarda menos tiempo que el 
valor especificado en el atributo lucene.maxAtomicTransformationTime. Todos los 
transformadores por defecto están en la carpeta alfresco/WEB-INF/classes/ 
alfresco/services-context.xml. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ Elemento stored: 
... 
<index enabled=”true”> 
<stored> true|false </stored> 
</index> 
... 
‣ Si está a true, el valor de la propiedad se almacenará en el índice y debe ser 
consultado mediante la API de bajo nivel de Lucene. 
‣ Esto es útil para debugging si queremos saber qué es exactamente lo que se está 
indexando, pero no está recomendado en absoluto para producción ya que escribe 
mucha más información en disco. Recomendado false. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ Elemento tokenised: 
... 
<index enabled=”true”> 
<tokenised> true|false|both </tokenised> 
</index> 
... 
‣ Si está true, el valor de la cadena de la propiedad se tokeniza antes de ser 
indexado. 
‣ Si está a false, se indexará como una única cadena, 
‣ Si está a both se harán las dos opciones. 
‣ Valor recomendado true. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Definición de índices en propiedades 
‣ Por defecto, los contenidos se indexan atómicamente en background, 
no se almacenan en el índice y se dividen en distintos tokens antes de 
ser indexados (esta es la política definida en cm:content que puede ser 
sobreescrita). 
<type name="cm:content"> 
<title>Content</title> 
<parent>cm:cmobject</parent> 
<properties> 
<property name="cm:content"> 
<type>d:content</type> 
<mandatory>false</mandatory> 
<index enabled="true"> 
<atomic>false</atomic> 
<stored>false</stored> 
<tokenised>true</tokenised> 
</index> 
</property> 
</properties> 
</type> 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Custom Behaviors en Alfresco 
‣ Introducción. 
‣ Policies. 
‣ Implementación de custom behavior en Java. 
‣ Registro de custom behavior en Java. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Introducción 
‣ Hay ocasiones en las que queremos desarrollar código para que se 
encuentre altamente acoplado a un tipo de contenido. 
‣ Habitualmente, es así porque necesitamos estar seguros de que se 
ejecute cada vez que le ocurra algo a un determinado tipo de 
contenido. 
‣ Afortunadamente, Alfresco nos ofrece un mecanismo para resolver ese 
tipo de circunstancias, llamado behavior. 
‣ Behaviors se utilizan habitualmente en Alfresco. Los procesos de de 
auditoría y versionado son ejemplos claros de este mecanismo. 
‣ El desarrollo de estos elementos implica responder a dos preguntas: 
‣ ¿Qué trozo de código queremos ejecutar? 
‣ ¿Cuándo queremos ejecutar el trozo de código? 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Introducción 
‣ La entidad responsable de decidir cuándo se ejecuta un behavior se 
denomina Policy. 
‣ El trozo de código que se desea ejecutar puede ser programada en 
Java o JavaScript (dos alternativas equivalentes). 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Policies 
‣ Como ya hemos comentado anteriormente, estos componentes 
responsables de definir cuándo se ejecuta un behavior. 
‣ Cada policy se nombra extendiendo una de las siguientes interfaces: 
ClassPolicy, AssociationPolicy o PropertyPolicy. El contrato se define 
mediante la interface Java Policy. 
‣ Por ejemplo: 
‣ El componente Node puede definir policies tales como onCreateNode, 
beforeDeleteNode, onUpdateProperties, etc. 
‣ El componente CheckOutCheckIn puede definir policies como onCheckOut, 
onCheckIn, onCancelCheckOut, etc. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Policies 
‣ La implementación de componentes es diferente a los tipos de 
contenidos para permitir la inyección de comportamiento especiales 
en los procesos. 
‣ Los implementadores de componentes son responsable de definir el 
contrato que describe cómo inyectar y cuándo la funcionalidad. Este 
contrato se conoce como policy. 
‣ Por ejemplo, el componente Node puede definir policies tales como 
onCreateNode, beforeDeleteNode, onUpdateProperties, etc. 
‣ El componente CheckOutCheckIn puede definir policies como 
onCheckOut, onCheckIn, onCancelCheckOut, etc. 
‣ Cada policy se nombra extendiendo una de las siguientes interfaces: 
ClassPolicy, AssociationPolicy or PropertyPolicy. El contrato se define 
mediante la interface Java Policy. 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Policies 
‣ Existen diferentes policies: 
‣ CheckOutCheckInServicePolicies. 
‣ ContentServicePolicies. 
‣ CopyServicePolicies. 
‣ LockServicePolicies. 
‣ NodeServicePolicies. 
‣ TransferServicePolicies. 
‣ VersionServicePolicies. 
‣ Cada una de estas interfaces contienen interfaces internas que nos 
permiten puentear policies como necesitemos. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Policies 
‣ La interface NodeServicePolicies define un conjunto de interfaces 
internas y estáticas asociadas a los diferentes eventos: 
‣ NodeServicePolicies.BeforeAddAspectPolicy. 
‣ NodeServicePolicies.BeforeArchiveNodePolicy. 
‣ NodeServicePolicies.BeforeCreateNodePolicy. 
‣ NodeServicePolicies.BeforeCreateStorePolicy. 
‣ NodeServicePolicies.BeforeDeleteAssociationPolicy. 
‣ NodeServicePolicies.BeforeDeleteChildAssociationPolicy. 
‣ ... 
‣ http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/ 
repo/node/NodeServicePolicies.html 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Policies 
‣ Ejemplo BeforeAddAspectPolicy: 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Implementación de custom behavior en Java 
‣ Desarrollo de una clase: 
public class Rating implements 
‣ Implementará tantas interfaces como policies desee manejar. En este ejemplo se 
manejan dos tipos de eventos: 
‣ Borrado de nodos. 
‣ Creación de nodos. 
Preparado por Jesús Salinas Revelles 
NodeServicePolicies.OnDeleteNodePolicy, 
NodeServicePolicies.OnCreateNodePolicy { 
...
Tipos de contenidos personalizados 
Implementación de custom behavior en Java 
‣ Desarrollo de una clase (cont.): 
// Dependencies 
private NodeService nodeService; 
private PolicyComponent policyComponent; 
// Behaviours 
private Behaviour onCreateNode; 
private Behaviour onDeleteNode 
... 
‣ La clase tiene dos dependencias, éstas son gestionadas por Spring. El servicio de 
nodos NodeService se utilizará para manejar nodos y PolicyComponent que se 
utiliza which is used to bind the behavior to the policies. 
Preparado por Jesús Salinas Revelles 
Tipos de contenidos personalizados 
Implementación de custom behavior en Java 
‣ Desarrollo de una clase (cont.): 
public void init() { 
// Create behaviours 
this.onCreateNode = new JavaBehaviour(this, "onCreateNode", 
NotificationFrequency.TRANSACTION_COMMIT); 
this.onDeleteNode = new JavaBehaviour(this, "onDeleteNode", 
NotificationFrequency.TRANSACTION_COMMIT); 
// Bind behaviours to node policies 
this.policyComponent.bindClassBehaviour( 
Qname.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"), 
Qname.createQName(SomeCoModel.NAMESPACE_SOMECO_CONTENT_MODEL, 
SomeCoModel.TYPE_SC_RATING), 
this.onCreateNode 
); 
... 
Preparado por Jesús Salinas Revelles
Tipos de contenidos personalizados 
Registro de custom behavior en Java 
‣ Una vez diseñada la clase Java que implementa la lógica de negocio, 
debemos definirlo como un bean de Spring Framework. El 
procedimiento es totalmente estándar. 
‣ Se deben inyectar los servicios declarados previamente en la clase: 
nodeService y policyComponent. 
<bean id="ratingBehavior" class="com.someco.behavior.Rating" 
init-method="init"> 
<property name="nodeService"> 
<ref bean="NodeService" /> 
</property> 
<property name="policyComponent"> 
<ref bean="policyComponent" /> 
</property> 
</bean> 
Preparado por Jesús Salinas Revelles

Más contenido relacionado

La actualidad más candente

Containers and workload security an overview
Containers and workload security an overview Containers and workload security an overview
Containers and workload security an overview Krishna-Kumar
 
DNS hijacking using cloud providers – No verification needed
DNS hijacking using cloud providers – No verification neededDNS hijacking using cloud providers – No verification needed
DNS hijacking using cloud providers – No verification neededFrans Rosén
 
FIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to ElasticsearchRuslan Zavacky
 
Hunt for Domain Controller : Active Directory Pentesting Session
Hunt for Domain Controller : ActiveDirectory Pentesting SessionHunt for Domain Controller : ActiveDirectory Pentesting Session
Hunt for Domain Controller : Active Directory Pentesting Sessionhacknpentest
 
2.28.17 Introducing DSpace 7 Webinar Slides
2.28.17 Introducing DSpace 7 Webinar Slides2.28.17 Introducing DSpace 7 Webinar Slides
2.28.17 Introducing DSpace 7 Webinar SlidesDuraSpace
 
Alfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transitAlfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transitToni de la Fuente
 
FIWARE Tech Summit - FIWARE Cygnus and STH-Comet
FIWARE Tech Summit - FIWARE Cygnus and STH-CometFIWARE Tech Summit - FIWARE Cygnus and STH-Comet
FIWARE Tech Summit - FIWARE Cygnus and STH-CometFIWARE
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j FundamentalsMax De Marzi
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST APIJ V
 
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"ABES
 
FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE
 
Alfresco Share - Recycle Bin Ideas
Alfresco Share - Recycle Bin IdeasAlfresco Share - Recycle Bin Ideas
Alfresco Share - Recycle Bin IdeasAlfrescoUE
 
FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE
 
Introduction to RDF
Introduction to RDFIntroduction to RDF
Introduction to RDFNarni Rajesh
 
Moving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco RepositoryMoving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco RepositoryJeff Potts
 
FIWARE Training: API Umbrella
FIWARE Training: API UmbrellaFIWARE Training: API Umbrella
FIWARE Training: API UmbrellaFIWARE
 

La actualidad más candente (20)

Rego Deep Dive
Rego Deep DiveRego Deep Dive
Rego Deep Dive
 
Containers and workload security an overview
Containers and workload security an overview Containers and workload security an overview
Containers and workload security an overview
 
DNS hijacking using cloud providers – No verification needed
DNS hijacking using cloud providers – No verification neededDNS hijacking using cloud providers – No verification needed
DNS hijacking using cloud providers – No verification needed
 
FIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LD
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to Elasticsearch
 
Implementación del identificador persistente Handle en repositorios DSpace
Implementación del identificador persistente Handle en repositorios DSpaceImplementación del identificador persistente Handle en repositorios DSpace
Implementación del identificador persistente Handle en repositorios DSpace
 
Aleph
AlephAleph
Aleph
 
Hunt for Domain Controller : Active Directory Pentesting Session
Hunt for Domain Controller : ActiveDirectory Pentesting SessionHunt for Domain Controller : ActiveDirectory Pentesting Session
Hunt for Domain Controller : Active Directory Pentesting Session
 
2.28.17 Introducing DSpace 7 Webinar Slides
2.28.17 Introducing DSpace 7 Webinar Slides2.28.17 Introducing DSpace 7 Webinar Slides
2.28.17 Introducing DSpace 7 Webinar Slides
 
Alfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transitAlfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transit
 
FIWARE Tech Summit - FIWARE Cygnus and STH-Comet
FIWARE Tech Summit - FIWARE Cygnus and STH-CometFIWARE Tech Summit - FIWARE Cygnus and STH-Comet
FIWARE Tech Summit - FIWARE Cygnus and STH-Comet
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j Fundamentals
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST API
 
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"
Jabes 2021 - Session "Repenser le SI de l'Abes en période de transition(s)"
 
FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LD
 
Alfresco Share - Recycle Bin Ideas
Alfresco Share - Recycle Bin IdeasAlfresco Share - Recycle Bin Ideas
Alfresco Share - Recycle Bin Ideas
 
FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LD
 
Introduction to RDF
Introduction to RDFIntroduction to RDF
Introduction to RDF
 
Moving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco RepositoryMoving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco Repository
 
FIWARE Training: API Umbrella
FIWARE Training: API UmbrellaFIWARE Training: API Umbrella
FIWARE Training: API Umbrella
 

Destacado (11)

Alfresco Share, en español
Alfresco Share, en españolAlfresco Share, en español
Alfresco Share, en español
 
Tutorial alfresco
Tutorial alfrescoTutorial alfresco
Tutorial alfresco
 
Manual alfresco administradores
Manual alfresco administradoresManual alfresco administradores
Manual alfresco administradores
 
Gerenciamento de Documentos com Software Alfresco
Gerenciamento de Documentos com Software AlfrescoGerenciamento de Documentos com Software Alfresco
Gerenciamento de Documentos com Software Alfresco
 
Presentación Alfresco Radar Grupo Empresarial
Presentación Alfresco Radar Grupo EmpresarialPresentación Alfresco Radar Grupo Empresarial
Presentación Alfresco Radar Grupo Empresarial
 
Gestion de correspondencia con Alfresco Radar
Gestion de correspondencia con Alfresco  RadarGestion de correspondencia con Alfresco  Radar
Gestion de correspondencia con Alfresco Radar
 
Caso de Exito Alfresco
Caso de Exito AlfrescoCaso de Exito Alfresco
Caso de Exito Alfresco
 
Alfresco. La gestión de contenidos empresarial
Alfresco. La gestión de contenidos empresarialAlfresco. La gestión de contenidos empresarial
Alfresco. La gestión de contenidos empresarial
 
Presentacion alfresco
Presentacion alfrescoPresentacion alfresco
Presentacion alfresco
 
El core de Alfresco 4.2
El core de Alfresco 4.2El core de Alfresco 4.2
El core de Alfresco 4.2
 
Interfaz alfresco
Interfaz alfrescoInterfaz alfresco
Interfaz alfresco
 

Similar a Contenidos personalizados en alfresco ecm

Zenphp - Presentación de Septiembre en la Etsiit - Programador PHP
Zenphp - Presentación de Septiembre en la Etsiit - Programador PHPZenphp - Presentación de Septiembre en la Etsiit - Programador PHP
Zenphp - Presentación de Septiembre en la Etsiit - Programador PHPJuan Belón Pérez
 
Presentación Seminario Cleformación HTML5, El lenguaje del futuro
Presentación Seminario Cleformación HTML5, El lenguaje del futuroPresentación Seminario Cleformación HTML5, El lenguaje del futuro
Presentación Seminario Cleformación HTML5, El lenguaje del futuroCLEFormación
 
Tema 4 Repositorios De InformacióN
Tema 4 Repositorios De InformacióNTema 4 Repositorios De InformacióN
Tema 4 Repositorios De InformacióNsalgonsan
 
Guia para la_creacion_de_metadatos_octubre_pub_2009
Guia para la_creacion_de_metadatos_octubre_pub_2009Guia para la_creacion_de_metadatos_octubre_pub_2009
Guia para la_creacion_de_metadatos_octubre_pub_2009natalymoreno08
 
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)adriyana37
 
Desarrollo de aplicaciones en internet
Desarrollo de aplicaciones en internetDesarrollo de aplicaciones en internet
Desarrollo de aplicaciones en internetMaestros en Linea
 
Estándares que utilizamos en nuestra aplicación web
Estándares que utilizamos en nuestra aplicación webEstándares que utilizamos en nuestra aplicación web
Estándares que utilizamos en nuestra aplicación webluis20132014
 
Introduccion Portafolioweb
Introduccion PortafoliowebIntroduccion Portafolioweb
Introduccion PortafoliowebT T
 
Microsoft access-2000-7042
Microsoft access-2000-7042Microsoft access-2000-7042
Microsoft access-2000-7042Ruben Salgado
 
¿Qué es drupal?
¿Qué es drupal? ¿Qué es drupal?
¿Qué es drupal? Atenea tech
 
kbee.spaces
kbee.spaceskbee.spaces
kbee.spacesatolomei
 
Curso mysql modificado
Curso mysql modificadoCurso mysql modificado
Curso mysql modificadoYusef Yamel
 

Similar a Contenidos personalizados en alfresco ecm (20)

Templating OpenCms 9
Templating OpenCms 9Templating OpenCms 9
Templating OpenCms 9
 
Tutor javawebparte2
Tutor javawebparte2Tutor javawebparte2
Tutor javawebparte2
 
Cms
CmsCms
Cms
 
Zenphp - Presentación de Septiembre en la Etsiit - Programador PHP
Zenphp - Presentación de Septiembre en la Etsiit - Programador PHPZenphp - Presentación de Septiembre en la Etsiit - Programador PHP
Zenphp - Presentación de Septiembre en la Etsiit - Programador PHP
 
Presentación Seminario Cleformación HTML5, El lenguaje del futuro
Presentación Seminario Cleformación HTML5, El lenguaje del futuroPresentación Seminario Cleformación HTML5, El lenguaje del futuro
Presentación Seminario Cleformación HTML5, El lenguaje del futuro
 
Tema 4 Repositorios De InformacióN
Tema 4 Repositorios De InformacióNTema 4 Repositorios De InformacióN
Tema 4 Repositorios De InformacióN
 
CMS
CMSCMS
CMS
 
Temario
Temario Temario
Temario
 
Guia para la_creacion_de_metadatos_octubre_pub_2009
Guia para la_creacion_de_metadatos_octubre_pub_2009Guia para la_creacion_de_metadatos_octubre_pub_2009
Guia para la_creacion_de_metadatos_octubre_pub_2009
 
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)
Guia para la_creacion_de_metadatos_octubre_pub_2009 (1)
 
Desarrollo de aplicaciones en internet
Desarrollo de aplicaciones en internetDesarrollo de aplicaciones en internet
Desarrollo de aplicaciones en internet
 
Introducción a la Web Semántica
Introducción a la Web SemánticaIntroducción a la Web Semántica
Introducción a la Web Semántica
 
Estándares que utilizamos en nuestra aplicación web
Estándares que utilizamos en nuestra aplicación webEstándares que utilizamos en nuestra aplicación web
Estándares que utilizamos en nuestra aplicación web
 
Introduccion Portafolioweb
Introduccion PortafoliowebIntroduccion Portafolioweb
Introduccion Portafolioweb
 
Microsoft access-2000-7042
Microsoft access-2000-7042Microsoft access-2000-7042
Microsoft access-2000-7042
 
Drupal Workshop
Drupal WorkshopDrupal Workshop
Drupal Workshop
 
¿Qué es drupal?
¿Qué es drupal? ¿Qué es drupal?
¿Qué es drupal?
 
kbee.spaces
kbee.spaceskbee.spaces
kbee.spaces
 
curso_mysql.pdf
curso_mysql.pdfcurso_mysql.pdf
curso_mysql.pdf
 
Curso mysql modificado
Curso mysql modificadoCurso mysql modificado
Curso mysql modificado
 

Más de Ematiz Tecnología, S.L.

Más de Ematiz Tecnología, S.L. (10)

Perfiles en maven
Perfiles en mavenPerfiles en maven
Perfiles en maven
 
Filtrado de recursos en Maven
Filtrado de recursos en MavenFiltrado de recursos en Maven
Filtrado de recursos en Maven
 
Estructura de un informe en JasperReports
Estructura de un informe en JasperReportsEstructura de un informe en JasperReports
Estructura de un informe en JasperReports
 
Introducción a JasperReports
Introducción a JasperReportsIntroducción a JasperReports
Introducción a JasperReports
 
Liferay 6 1, Internacionalización en nuestros desarrollos
Liferay 6 1, Internacionalización en nuestros desarrollosLiferay 6 1, Internacionalización en nuestros desarrollos
Liferay 6 1, Internacionalización en nuestros desarrollos
 
Liferay 6.1 Service Builder
Liferay 6.1  Service BuilderLiferay 6.1  Service Builder
Liferay 6.1 Service Builder
 
Liferay 6.1 Campos personalizados desde el panel de control
Liferay 6.1  Campos personalizados desde el panel de controlLiferay 6.1  Campos personalizados desde el panel de control
Liferay 6.1 Campos personalizados desde el panel de control
 
Liferay versión 6.1 Trabajando con LDAP, introducción
Liferay versión 6.1  Trabajando con LDAP, introducciónLiferay versión 6.1  Trabajando con LDAP, introducción
Liferay versión 6.1 Trabajando con LDAP, introducción
 
Liferay 6.1 Campos personalizados
Liferay 6.1 Campos personalizadosLiferay 6.1 Campos personalizados
Liferay 6.1 Campos personalizados
 
Trabajando con imagenes en liferay 6.1
Trabajando con imagenes en liferay 6.1Trabajando con imagenes en liferay 6.1
Trabajando con imagenes en liferay 6.1
 

Último

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 

Último (20)

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 

Contenidos personalizados en alfresco ecm

  • 1. Alfresco ECM 4.2 Tipos de contenidos personalizados Tipos de contenidos personalizados Índice del capítulo ‣ Introducción. ‣ Diccionario de datos. ‣ Creación de un nuevo modelo de contenidos. ‣ Despliegue de modelo de contenidos. ‣ Configurar los clientes Web. ‣ Búsquedas en Alfresco. ‣ Custom Behaviors en Alfresco. Preparado por Jesús Salinas Revelles
  • 2. Tipos de contenidos personalizados Introducción ‣ Alfresco trabaja con el concepto de MODELO DE CONTENIDOS para gestionar de los contenidos que maneja. ‣ Alfresco incorpora un metamodelo en su estructura, es decir, la capacidad para que nosotros declaremos nuevos modelos de contenido. ‣ Un modelo de contenido define la estructura de información que acompañará a nuestros documentos digitales. ‣ Esta definición nos permite dotar de semántica al documento para que posteriormente se puedan implementar búsquedas y procesos más eficientes e “inteligentes”. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ Un modelo de contenidos es un conjunto de tipos de contenido y aspectos. Los modelos de contenidos definidos son identificados de forma unívoca mediante espacios de nombre (namespaces). Preparado por Jesús Salinas Revelles
  • 3. Tipos de contenidos personalizados Introducción ‣ El modelo de contenidos por defecto se conoce en Alfresco como Diccionario de Datos o Data Dictionary y soporta ser extendido para que el repositorio pueda manejar nuevos modelos de contenido. ‣ El Diccionario de Datos describe las estructuras del contenido a través de propiedades, asociaciones y reglas o restricciones. ‣ El Diccionario de Datos es un metamodelo que permite describir uno o más modelos de contenido específicos. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Diccionario de datos ‣ Define dos clases de estructuras: tipos de contenido y aspectos de contenido. Son conceptos que vamos a manejar de forma instensiva: TIPO y ASPECTO. ‣ La diferencia entre Content Type y Content Aspect es que un contenido sólo tiene un tipo que es el que define su estructura fundamental. Sin embargo, un mismo contenido puede tener muchos aspectos que son conceptos transversales aplicables a cualquier tipo de contenido. ‣ Un mismo nodo puede tener un aspecto en un momento temporal y posteriormente dejar de tenerlo. Preparado por Jesús Salinas Revelles
  • 4. Tipos de contenidos personalizados Diccionario de datos Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Diccionario de datos ‣ El diccionario de datos define los siguientes modelos: ‣ System: describe conceptos a nivel del repositorio. http://www.alfresco.org/model/ system/1.0. Prefijo sys. ‣ Content: describe el modelo de contenido del dominio estándar (ej. Carpeta, Fichero, Dublin-Core, ...). http://www.alfresco.org/model/content/1.0. Prefijo cm. ‣ Application: describe el modelo de aplicación de Alfresco (ej. glosario, ...). http:// www.alfresco.org/model/application/1.0. Prefijo app. ‣ Dictionary: describe el metamodelo del Diccionario de Datos (enteros, flotantes, fechas...). http://www.alfresco.org/model/dictionary/1.0. Prefijo d. Preparado por Jesús Salinas Revelles
  • 5. Tipos de contenidos personalizados Diccionario de datos ‣ El diccionario define un conjunto de tipos de datos soportados por defecto, es decir, vamos a poder manejar textos, números, fechas, booleanos, etc, sin necesidad de tener que definir nuevos tipos: Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Diccionario de datos ‣ Los tipos de dato content, folder y person se encuentra en el modelo Content, es por eso que al referenciarlos se utiliza cm:content, cm:folder y cm:person. ‣ Los tipos de dato int, boolean, double y date se encuentra en el modelo Dictionary, es por eso que al referenciarlos se utiliza d:int, d:boolean, d:double y d:date. ‣ Todos los detalles en la wiki de Alfresco: ‣ http://wiki.alfresco.com/wiki/Data_Dictionary_Guide. Preparado por Jesús Salinas Revelles
  • 6. Tipos de contenidos personalizados Diccionario de datos ‣ Alfresco almacena, por defecto, los documentos como nodos de tipo cm:content que están formados por un fichero binario y por los metadatos básicos (titulo, autor, fecha de modificación, etc.) ‣ Podemos heredar de cm:content para hacer un nuevo tipo “Informe Técnico”. NODO DE ALFRESCO DE TIPO "INFORME TÉCNICO" INFORME TÉCNICO Preparado por Jesús Salinas Revelles INFORMACIÓN ESTRUCTURADA MANEJADA POR EL GESTOR DOCUMENTAL Número de informe : INF000XXX Título : XXXXX Autor : XXXXXXX Etiquetas o palabras clave: XXX , YYY, ZZZ Responsables: <Lista de usuarios del sistema o lista de nombres> Proceso: XXXX <<CUALQUIER OTRO METADATO QUE QUIERA DEFINIR EL CLIENTE>> InformeTecnico.doc Tipos de contenidos personalizados Diccionario de datos ‣ Los tipos presentan un gran parecido a las clases en el mundo de orientación a objetos. ‣ Un modelo de contenidos puede definir N tipos de contenido nuevos. ‣ 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. Preparado por Jesús Salinas Revelles
  • 7. Tipos de contenidos personalizados Creación de un nuevo modelo de contenidos ‣ Paso 1: Declarar un nuevo modelo y definir los tipos de contenido personalizado. ‣ Paso 2: Desplegar el nuevo modelo de contenidos ‣ Paso 3: Configurar el/los cliente(s) Web para que sea capaz de reconocer los nuevos tipos de contenido. ‣ Paso 4: Reiniciar Alfresco para que los cambios sean efectivos. (en caso de que sea necesario). Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Declarar un nuevo modelo y definir los tipos de contenido personalizado ‣ Crear un nuevo modelo. ‣ Declarar un nuevo modelo. ‣ Declarar el espacio de nombres para el modelo. ‣ Declarar un nuevo tipo de contenido. ‣ Asociaciones. ‣ Restricciones. ‣ Aspectos. Preparado por Jesús Salinas Revelles
  • 8. Tipos de contenidos personalizados Crear un nuevo modelo ‣ Se declara en un fichero XML cuyo nodo principal es el elemento <model> del esquema “Data Dictionary XML Schema”. Dicho esquema está en el espacio de nombres referenciado por la URI http://www.alfresco.org/model/dictionary/1.0 ‣ Este fichero debe colocarse en la carpeta de extensión de Alfresco para despliegues estáticos y dentro del espacio “Company Home -> Data Dictionary -> Models”) para despliegues dinámicos. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Declarar un nuevo modelo <model name="prefijo:nuevoModelo" xmlns="http://www.alfresco.org/model/dictionary/1.0"> <description>Modelo Contenido Nuevo</description> <author>Formacion S.L.</author> <published>2011-01-01</published> <version>1.0</version> <imports> <!-- Importamos las definiciones del Diccionario de Datos --> <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/> <!-- Importamos las definiciones del modelo de contenidos estandar --> <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/> </imports> ... Preparado por Jesús Salinas Revelles
  • 9. Tipos de contenidos personalizados Declarar un nuevo modelo ‣ El atributo name del elemento model define el nombre único del modelo. El prefijo debe usarse el que se declare en el espacio de nombres (ver siguiente transparencia). ‣ xmlns declara el espacio de nombres del metamodelo como espacio de nombres por defecto. ‣ La sección de imports hace que los modelos de contenido estándares así como el metamodelo y el diccionario de datos estén disponible para su uso y referencia en nuestro modelo. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Declarar un nuevo modelo ‣ Se define el espacio de nombres asociado al nuevo modelo: ... <!-- viene de la transparencia anterior --> <namespaces> <namespace uri="http://www.formacion.com/xmlns/modelo/1.0/" prefix="prefijo"/> </namespaces> ... ‣ uri: identificador único del espacio de nombres ‣ prefix: prefijo que se usará en el resto del documento (debe coincidir también con el que usa el modelo en la transparencia anterior). Preparado por Jesús Salinas Revelles
  • 10. Tipos de contenidos personalizados Declarar un nuevo tipo de contenido ‣ Los nuevos tipos de contenido se declaran dentro del modelo: <model ... > ... <types> <type ...> ... </type> </types> </model> ‣ Generalmente querremos heredar de cm:content que es el tipo de contenido estándar de Alfresco. ‣ cm es el prefijo del espacio de nombres http://www.alfresco.org/ model/content/1.0 definido para el esquema Content Domain Model. ‣ Veamos un ejemplo: declarar un tipo de contenido “Documento de Agencia Tributaria” que tenga las propiedades (metadatos) “MailResponsable”, “Proyecto”, “EstaAprobadoPorDireccion”. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Tipo de contenido : Documento de Agencia Tributaria <types> <type name="aeat:documento"> <title>Documento de Agencia Tributaria</title> <parent>cm:content</parent> <properties> <property name="aeat:MailResponsable"> <title>eMail del responsable del documento</title> <type>d:text</type> </property> <property name="aeat:Proyecto"> <title>Proyecto al que pertenece</title> <type>d:text</type> </property> <property name="aeat:EstaAprobadoPorDireccion"> <title>Aprobado por direccion</title> <type>d:boolean</type> </property> </properties> </type> </types> Preparado por Jesús Salinas Revelles
  • 11. Tipos de contenidos personalizados Declaración básica de propiedades ‣ La declaración básica de una propiedad (metadato) de un tipo de contenido es : ... <type ... > <property name="prefijo:nombrePropiedad"> <title>Titulo del metadato</title> <type>d:tipoDeDato</type> </property> ... </type> ... Preparado por Jesús Salinas Revelles Tipo de dato declarado por el Data Dictionary de Alfresco Tipos de contenidos personalizados Tipos de datos para las propiedades ‣ Como ya hemos comentado antes, los tipos de datos soportados en el esquema Dictionary son: Preparado por Jesús Salinas Revelles
  • 12. Tipos de contenidos personalizados Opciones avanzadas de las propiedades ‣ Elemento mandatory: ‣ El cliente Web de Alfresco obliga a completar todas las propiedades mandatory. ‣ El repositorio de Alfresco obliga a completar todas las propiedades cuya propiedad enforced del elemento mandatory esté a cierta. <mandatory enforced='true|false'>true|false</mandatory> ‣ Ejemplo: <property name="prefijo:nombrePropiedad"> <title>Titulo del metadato</title> <type>d:tipoDeDato</type> <mandatory enforced='true'>true</mandatory> </property> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Opciones avanzadas de las propiedades ‣ Valores por defecto: como su nombre indica, podemos asignar un valor por defecto a cualquier propiedad definida: <property name="prefijo:nombrePropiedad"> ... <default>{valor}</default> </property> ‣ Ejemplo: ... <property name="vodafone:tipoFormacion"> ... <default>presencial</default> </property> ... Preparado por Jesús Salinas Revelles
  • 13. Tipos de contenidos personalizados Asociaciones ‣ Las asociaciones permiten definir punteros a otros contenidos, es decir, relaciones entre diferentes tipos de contenidos. ‣ Por ejemplo, permitiría a un documento “Resumen anual de gastos” hacer referencia a varios “Resúmenes mensuales de gastos”. ‣ Alfresco trabaja con dos tipos de asociaciones: ‣ Child Associations: Asociación que funciona como un “cascade delete” en base de datos relacional, es decir, el hijo sólo existe si existe el padre (agregado en UML). ‣ Peer Asociations: Asociaciones simples. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Asociaciones ‣ El elemento associations define todas las asociaciones definidas para un tipo o aspeccto. ‣ Sintaxis: ... ... <associations> <child-association > </child-association> <association> ... </association> </associations> ... Preparado por Jesús Salinas Revelles
  • 14. Tipos de contenidos personalizados Asociaciones ‣ Cualquier asociación define dos extremos: en Alfresco los llamaremos source y target. ‣ Se define una cardinalidad: 1 a n, n a n, 1 a 1, etc. ‣ ¿Cómo definimos este concepto a la hora de crear la asociación? Entidad 1 asociación Preparado por Jesús Salinas Revelles Entidad 2 Tipos de contenidos personalizados Asociaciones ‣ El elemento source define el origen de la asociación: mandatory indica si la existencia de este elemento es obligatoria y many si puede existir más de uno: <source> <mandatory>false</mandatory> <many>false</many> </source> ‣ El elemento target define el otro extremo de la asociación: el elemento class define el tipo de dato. <target> <class>sys:base</class> <mandatory>false</mandatory> <many>true</many> </target> Preparado por Jesús Salinas Revelles
  • 15. Tipos de contenidos personalizados Child Associations ‣ Las operaciones de tipo child son algo especiales. La entidad padre es dueña de los hijos, es decir, las operaciones como el borrado se propagan a los hijos. ‣ Ejemplo: <child-association name="cm:contains"> <source> <mandatory>false</mandatory> <many>false</many> </source> <target> <class>sys:base</class> <mandatory>false</mandatory> <many>true</many> </target> <duplicate>false</duplicate> </child-association> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Child Associations ‣ Este tipo de asociaciones son fácilmente navegables usando Alfresco's XPath y los lenguajes de búsqueda de Lucene. Preparado por Jesús Salinas Revelles
  • 16. Tipos de contenidos personalizados Child Associations ‣ Ejemplo: Carpeta <-> Contenido <type name="cm:folder"> <title>Folder</title> <parent>cm:cmobject</parent> <associations> <child-association name="cm:contains"> <source> <mandatory>false</mandatory> <many>false</many> </source> <target> <class>sys:base</class> <mandatory>false</mandatory> <many>true</many> </target> <duplicate>false</duplicate> </child-association> </associations> </type> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Non-Child Associations ‣ Las operaciones como el borrado NO se propagan a los hijos. ‣ Los lenguajes de búsqueda de Alfresco NO soportan la navegación de este tipo de asociaciones. ‣ El elemento association define este tipo de asociaciones. ‣ Su sintaxis es muy similar a la definida anteriormente: source y target. Preparado por Jesús Salinas Revelles
  • 17. Tipos de contenidos personalizados Non-Child Associations <aspect name="cm:subscribable"> <associations> <association name="cm:subscribedBy"> <source> <mandatory>false</mandatory> <many>true</many> </source> <target> <class>cm:person</class> <mandatory>false</mandatory> <many>true</many> </target> </association> </associations> </aspect> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Ejemplo ‣ Si queremos que cualquier nodo forme parte de una asociación: ... <target> <class>sys:base</class> </target> ... Preparado por Jesús Salinas Revelles
  • 18. Tipos de contenidos personalizados Restricciones ‣ Introducción. ‣ Tipos de restricciones. ‣ Definición de restricciones. ‣ Uso de restricciones. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ El concepto de restricción puede utilizarse opcionalmente para restringir los valores que Alfresco almacenará en nuestras propiedades. ‣ Están definidas 4 tipos de restricciones: REGEX, LIST, MINMAX y LENGTH. ‣ Las restricciones se definen una única vez y se reutilizan en todo el modelo. ‣ Alfresco incorpora una restricción predefinida “cm:filename” que define una expresión regular para chequear que una cadena es un nombre de fichero válido. Preparado por Jesús Salinas Revelles
  • 19. Tipos de contenidos personalizados Introducción ‣ Las restricciones se incluyen dentro del modelo de contenidos mediante los elementos xml constraints y constraint: <model name="test:dictionarydaotest" xmlns="http:// www.alfresco.org/model/dictionary/1.0"> <imports> ... </imports> <namespaces> ... </namespaces> <data-types> ... </data-types> <constraints> ... </constraints> </model> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Tipos de restricciones ‣ Restricción REGEX: esta restricción nos permite restringir el valor de una propiedad mediante una expresión regular. ‣ Debemos definir dos parámetros: ‣ expression: la expresión regular. ‣ requiresMatch: booleano que define si se requiere coincidencia o NO coincidencia. ‣ Restricción LIST: esta restricción nos permite restringir el valor de una propiedad mediante una lista de valores. ‣ Debemos definir dos parámetros: ‣ allowedValues: lista de valores permitidos. ‣ caseSensitive: booleano que define si tenemos en cuenta mayúscula y minúscula. Preparado por Jesús Salinas Revelles
  • 20. Tipos de contenidos personalizados Tipos de restricciones ‣ Restricción MINMAX: esta restricción nos permite restringir el valor de una propiedad mediante rango de valores. ‣ Debemos definir dos parámetros: ‣ minValue: valor mínimo. ‣ maxValue: valor máximo. ‣ Restricción LENGTH: esta restricción nos permite restringir la longitud una propiedad de tipo cadena. ‣ Debemos definir dos parámetros: ‣ minLength: longitud mínima. ‣ maxLength: longitud máxima. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de restricciones ‣ El elemento constraint permite definir una restricción. ‣ Sintaxis: <constraint name="prefix:nombreRest" type="tipoDeRest"> <parameter ...> </parameter> </constraint> ‣ Los atributos name y type definen el nombre de la restricción y el tipo. ‣ Los elementos parameter nos permitirán parametrizar cada tipo de restricción. Preparado por Jesús Salinas Revelles
  • 21. Tipos de contenidos personalizados Definición de restricciones ‣ Ejemplo de REGEX: ‣ Cadenas que no contengan letras mayúsculas. <constraint name="test:regex1" type="REGEX"> <parameter name="expression"> <value>[A-Z]*</value> </parameter> <parameter name="requiresMatch"> <value>false</value> </parameter> </constraint> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de restricciones ‣ Ejemplo de REGEX: ‣ Cadenas que no contengan letras minúsculas. <constraint name="test:regex2" type="REGEX"> <parameter name="expression"> <value>[a-z]*</value> </parameter> <parameter name="requiresMatch"> <value>false</value> </parameter> </constraint> Preparado por Jesús Salinas Revelles
  • 22. Tipos de contenidos personalizados Definición de restricciones ‣ Ejemplo: ‣ Cadenas con longitud comprendida entre 0 y 256. <constraint name="test:stringLength1" type="LENGTH"> <parameter name="minLength"> <value>0</value> </parameter> <parameter name="maxLength"> <value>256</value> </parameter> </constraint> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de restricciones ‣ Ejemplo: ‣ Valores comprendidos entre 0 y 256. <constraint name="test:minMax1" type="MINMAX"> <parameter name="minValue"> <value>0</value> </parameter> <parameter name="maxValue"> <value>256</value> </parameter> </constraint> Preparado por Jesús Salinas Revelles
  • 23. Tipos de contenidos personalizados Definición de restricciones ‣ Ejemplo: ‣ Cadenas que sean “ABC” o “DEF” sensible a mayúsculas. <constraint name="test:list1" type="LIST"> <parameter name="allowedValues"> <list> <value>ABC</value> <value>DEF</value> </list> </parameter> <parameter name="caseSensitive"> <value>true</value> </parameter> </constraint> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Uso de restricciones ‣ El elemento constraints hijo de property nos permite aplicar restricciones sobre cualquier propiedad. ‣ Dentro del elemento constraints se pueden añadir tantas restricciones como sean necesarias mediante constraint: <property name="prefix:nombrePropiedad"> ... <constraints> <constraint ref="prefix:nombreRestriccion"/> ... </constraints> </property> ‣ El atributo ref determina el nombre de la restricción a aplicar. Preparado por Jesús Salinas Revelles
  • 24. Tipos de contenidos personalizados Uso de restricciones ‣ Ejemplo: <property name="test:prop1"> <type>d:text</type> <protected>true</protected> <constraints> <constraint ref="test:regex1"/> <constraint ref="test:stringLength1"/> </constraints> </property> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados ¡Cuidado con las restricciones! ‣ IMPORTANTE: ‣ ¡El orden en los ficheros de definición de nuevos modelos importa!. ‣ Primero debe declararse la restricción y luego hacerle referencia. Si lo hacemos al contrario se producirá un error grave y Alfresco no se inicializará. Preparado por Jesús Salinas Revelles
  • 25. Tipos de contenidos personalizados Aspectos ‣ Introducción. ‣ Definición de aspecto. ‣ Aspectos por defecto. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ Los aspectos nos permiten aplicar conceptos transversales (propiedades o asociaciones) a cualquier pieza de contenido (sea cual sea su tipo) y en cualquier lugar. ‣ Son fundamentales a la hora de diseñar buenos modelos reutilizables, flexibles y con buen rendimiento. ‣ Se pueden aplicar a un nodo y posteriormente quitarle estas propiedades. Son de “quita y pon”. Preparado por Jesús Salinas Revelles
  • 26. Tipos de contenidos personalizados Definición de aspecto ‣ El elemento aspect define un aspecto dentro del modelo de contenidos. <aspect name="prefix:aspectName"> <title>aspectTitle</title> <properties> <property > ... </property> ... </aspect> ‣ Se define de forma similar a un tipo de contenido. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de aspecto ‣ Ejemplo: <aspect name="cm:auditable"> <title>Auditable</title> <properties> <property name="cm:created"> <type>d:datetime</type> </property> <property name="cm:creator"> <type>d:text</type> </property> <property name="cm:modified"> <type>d:datetime</type> </property> ... </properties> </aspect> Preparado por Jesús Salinas Revelles
  • 27. Tipos de contenidos personalizados Aspectos por defecto ‣ Alfresco nos ofrece un conjunto de aspectos, por defecto, que podemos utilizar en nuestros modelos de contenidos: ‣ Classifiable Aspect: activa la categorización, por lo tanto se puede aplicar categorías sobre el documento. ‣ Complianceable Aspect: se añade la propiedad para indicar cuándo debe borrarse. ‣ Dublin Core Aspect: añade los metadatos de Dublic Core: publisher, Contributor, Subject y Rights. ‣ Effectivity Aspect: añade las propiedades From y To al documento. ‣ Emailed Aspect: añade un conjunto de propiedades de Email Data al documento. ‣ Localizable Aspect: añade la propiedad Locale to the document. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Aspectos por defecto ‣ Summarizable Aspect: añade la propiedad Summary al documento. ‣ Templatable Aspect: añade la propiedad cm:template, que es la referencia a otro nodo, que será la plantilla. ‣ Translatable Aspect: añade la propiedad Translations al documento. ‣ Versionable Aspect: habilita el versionado de documentos. Preparado por Jesús Salinas Revelles
  • 28. Tipos de contenidos personalizados Aspectos por defecto ‣ Classifiable Aspect: <aspect name="cm:classifiable"><title>Classifiable</title></aspect> <aspect name="cm:generalclassifiable"> <title>General Classifiable</title> <parent>cm:classifiable</parent> <properties> <property name="cm:categories"> <title>Categories</title> <type>d:category</type> <mandatory>false</mandatory> <multiple>true</multiple> <index enabled="true"> <atomic>true</atomic> <stored>true</stored> <tokenised>false</tokenised> </index> </property> </properties> </aspect> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Aspectos por defecto ‣ Complianceable Aspect: <aspect name="cm:complianceable"> <title>Complianceable</title> <properties> <property name="cm:removeAfter"> <title>Remove After</title> <type>d:datetime</type> </property> </properties> <mandatory-aspects> <aspect>cm:auditable</aspect> </mandatory-aspects> </aspect> Preparado por Jesús Salinas Revelles
  • 29. Tipos de contenidos personalizados Aspectos por defecto ‣ Dublin Core Aspect: <aspect name="cm:dublincore"> <title>Dublin Core</title> <parent>cm:titled</parent> <properties> <property name="cm:publisher"> <title>Publisher</title> <type>d:text</type> <mandatory enforced="false">true</mandatory> </property> ... <mandatory-aspects> <aspect>cm:auditable</aspect> <aspect>cm:author</aspect> </mandatory-aspects> </aspect> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Aspectos por defecto ‣ Effectivity Aspect: <aspect name="cm:effectivity"> <title>Effectivity</title> <properties> <property name="cm:from"> <title>Effective From</title> <type>d:datetime</type> ... </property> <property name="cm:to"> <title>Effective To</title> <type>d:datetime</type> ... </property> </properties> </aspect> Preparado por Jesús Salinas Revelles
  • 30. Tipos de contenidos personalizados Aspectos por defecto ‣ Translatable Aspect: <aspect name="cm:translatable"> <title>Translatable</title> <parent>cm:localizable</parent> <associations> <association name="cm:translations"><title>Translations</title> <source><role>cm:translationOf</role> <mandatory>false</mandatory> <many>false</many> </source> <target><class>cm:content</class> <role>cm:hasTranslation</role> <mandatory>false</mandatory> <many>true</many> </target> </association> </associations> </aspect> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Despliegue de modelo de contenidos ‣ Introducción. ‣ Crear el fichero de contexto. ‣ Despliegue estático. ‣ Despliegue dinámico. Preparado por Jesús Salinas Revelles
  • 31. Tipos de contenidos personalizados Introducción ‣ Una vez que el modelo de contenidos ha sido definido, es decir, el fichero xml ha sido creado, tenemos que desplegarlo en nuestra instalación de Alfresco. ‣ Para que Alfresco reconozca la definición de nuestro nuevo modelo debemos crear un fichero de contexto que haga de cargador de la definición. ‣ El fichero de contexto debe llamarse como <nombreModelo>- context.xml y colocarse en el fichero de extensión para que Alfresco lo localice automáticamente. ‣ Los modelos pueden instalarse en Alfresco de forma estática o dinámica. La primera necesitará el reinicio del sistema. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Crear el fichero de contexto ‣ El fichero de contexto contiene uno o más bean de configuración de Spring. ‣ Dependiendo de la distribución de Alfresco que hayamos descargado tendremos un conjunto de ficheros de contexto de ejemplo en el directorio de extensión que nos servirán como plantilla para los nuestros. ‣ Nota: el directorio de extensión es ${alfresco}/tomcat/shared/classes. Preparado por Jesús Salinas Revelles
  • 32. Tipos de contenidos personalizados Crear el fichero de contexto ‣ Para la versión 4.2.c, la plantilla custom-model-context.xml.sample es: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http:// www.springframework.org/dtd/spring-beans.dtd'> <beans> <!-- Registration of new models --> <bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap"> <property name="models"> <list> <value>alfresco/extension/customModel.xml</value> </list> </property> </bean> </beans> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Crear el fichero de contexto ‣ La ruta alfresco/extension/customModel.xml se define en relación a la carpeta de extensión de alfresco. ‣ Resumiendo, si nuestro modelo se ha definido en un fichero llamado companyModel.xml, el fichero de contexto se llamará companyModel-context. xml ... <beans> <!-- Registration of new models --> <bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap"> <property name="models"> <list> <value>alfresco/extension/companyModel.xml</value> </list> </property> </bean> </beans> Preparado por Jesús Salinas Revelles
  • 33. Tipos de contenidos personalizados Despliegue estático (Static model) ‣ El despliegue estático obligatoriamente implica un reinicio del sistema para que los nuevos modelos de contenidos sean tenidos en cuenta. Este despliegue implica: ‣ Copiar el fichero de contexto en la carpeta ${alfresco}/tomcat/shared/classes/ alfresco/extension. ‣ Copiar el fichero del modelo de contenidos en la carpeta ${alfresco}/tomcat/ shared/classes/<rutaDefinidaFicheroContexto> ‣ Reiniciar Alfresco. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Despliegue dinámico (Dynamic Model) ‣ Con el método anterior (modelos estáticos) será necesario reiniciar el sistema para que lea los cambios de la carpeta de extensión. ‣ Existe la posibilidad de usar modelos dinámicos, que no requieren parada del servicio. ‣ Para ello, debemos subir el fichero con nuestro nuevo modelo (el XML que lo define, NO el que termina en -context.xml) al espacio “Company Home -> Data Dictionary -> Models”. ‣ Cuando hagamos el upload del modelo al espacio previamente mencionado, nos saldrá un check-box 'Model Active' que debemos seleccionar si queremos desplegarlo. Preparado por Jesús Salinas Revelles
  • 34. Tipos de contenidos personalizados Configurar los clientes Web ‣ Introducción. ‣ Personalizaciones Alfresco Explorer. ‣ Personalizaciones Alfresco Share. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ Generalmente queremos que los clientes Web Alfresco Explorer y Alfresco Share reconozcan el nuevo tipo de contenido para poder gestionar instancias de él. ‣ En el directorio de extensión se encuentra el fichero web-client-config-custom. xml [es posible que haya que renombrarlo porque aparezca con extensión .sample] con el que podemos definir el comportamiento de Alfresco Explorer. ‣ En el directorio web-extensión se encuentra el fichero share-config-custom. xml [es posible que haya que renombrarlo porque aparezca con extensión .sample] con el que podemos definir el comportamiento de Alfresco Share. Preparado por Jesús Salinas Revelles
  • 35. Tipos de contenidos personalizados Introducción ‣ Si queremos trabajar con modelos estáticos, se dejará el web-client-config- custom.xml en la carpeta de extensión. ‣ Si queremos trabajar con modelos dinámicos (no necesario reiniciar), entonces lo llevaremos al espacio Company Home -> Data Dictionary - > Web Client Extension. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Para configurar personalizaciones en Alfresco Explorer vamos a añadir un conjunto de claves de configuración que añadimos al web-client-config- custom.xml. ‣ Las claves de configuración las debe “entender” la aplicación “Alfresco Explorer” por lo que deberán seguir un conjunto estricto de convenios que están especificados en la documentación de Alfresco y en las siguientes transparencias. Preparado por Jesús Salinas Revelles
  • 36. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Property Sheet : Cuando un usuario observa las propiedades de una pieza de contenido de un tipo personalizado, debemos mostrar las propiedades personalizadas. Drawing 2: Custom properties on the properties sheet Preparado por Jesús Salinas Revelles !"#$%"&'(!"()"*# add properties to property sheets use the “aspect-name” evaluator for aspects and “node-type” for Tipos de contenidos personalizados content types. The snippet below shows the config for the sc:webable aspect. The sc:productRelated aspect would be similar. Personalizaciones de la interfaz de usuario del WC <!-- add webable aspect properties to property sheet --> <config evaluator="aspect-name" condition="sc:webable"> <property-sheet> ‣ Para ello utiliza el evaluador “node-type” para tipos de contenido o “aspect-name” para aspectos: <config evaluator="node-type" <show-property name="sc:published" display-label-id="published" <show-property name="sc:isActive" display-label-id="isActive" read-only="true" /> <show-association name=”sc:relatedDocuments” /> </property-sheet> </config> Listing 4: Snippet from web-client-config-custom.xml the display-label-id attribute. You could specify the label in this file by using the label attribute, better practice is to externalize the string so the interface could be localized if needed. At the end this section we'll see where the localized strings reside. Create content/Add content a user clicks Create or Add Content, the custom types should be a choice in the list of content as shown below: Preparado por Jesús Salinas Revelles condition="prefijo:nombreTipo"> <property-sheet> <show-property name="prefijo:Propiedad1"/> <show-property name="prefijo:Propiedad2"/> </property-sheet> </config>
  • 37. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Para ello utiliza el evaluador “node-type” para tipos de contenido o “aspect-name” para aspectos: <config evaluator="node-type" condition="prefijo:nombreTipo"> <property-sheet> <show-property name="prefijo:Propiedad1"/> <show-property name="prefijo:Propiedad2"/> </property-sheet> </config> Preparado por Jesús Salinas Revelles ¡HAY UNA CLAVE DE CONFIGURACION DE ESTE TIPO en el web-client-config-custom. xml POR CADA TIPO DE CONTENIDO del modelo Hay una entrada de tipo show-property por cada propiedad específica del tipo que queremos mostrar en los formularios Hay que hacerlo coincidir con el nombre de un tipo que pusimos en el modelo de contenidos y con el prefijo que declaramos en su espacio de nombres. Sólo puede ser “node-type” o “aspect-name” Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Ejemplos: <config evaluator="node-type" condition="my:sop"> <property-sheet> <show-property name="mimetype" display-label-id="content_type" component-generator="MimeTypeSelectorGenerator" /> <show-property name="size" display-label-id="size" converter="org.alfresco.faces.ByteSizeConverter" show-in-edit-mode="false" /> <show-property name="my:publishedDate" /> <show-association name="my:signOff" /> <show-property name="my:authorisedBy" /> <show-child-association name="my:processSteps" /> </property-sheet> </config> Preparado por Jesús Salinas Revelles
  • 38. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Elemento show-property, atributos interesantes: ‣ name: nombre de la propiedad a mostrar. ‣ display-label-id: identificador de la etiqueta asociada a la propiedad. ‣ show-in-edit-mode: booleano que identifica si la propiedad aparece en modo edit o no. ‣ converter: proceso de coversión a aplicar. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Create content/add content: los tipos personalizados de contenido deben ser una opción de la lista de selección de tipos.!"#$%"&'(!"()"*# Drawing 3: Custom type in the add content dialog Preparado por Jesús Salinas Revelles To add content types to the list of available types in the create content and add content dialogs, use the string-compare” evaluator and the “Content Wizards” condition. <!-- add someco types to add content list -->
  • 39. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Usamos el evaluador “string­compare” y la condición “Content Wizards”. <config evaluator="string­compare" condition="Content Wizards"> <content­types> <type name="prefijo:nombreNuevoTipo" /> <type name="prefijo:nombreNuevoTipo2" /> </content­types> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Usamos use el evaluador “string­compare” y la condición “Content Wizards”. <config evaluator="string­compare" condition="Content Wizards"> <content­types> <type name="prefijo:nombreNuevoTipo" /> <type name="prefijo:nombreNuevoTipo2" /> </content­types> </config> Preparado por Jesús Salinas Revelles No se cambia!
  • 40. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Usamos use el evaluador “string­compare” y la condición “Content Wizards”. <!­­add someco types to add content list ­­> <config evaluator="string­compare" condition="Content Wizards"> <content­types> <type name="prefijo:nombreNuevoTipo" /> <type name="prefijo:nombreNuevoTipo2" /> </content­types> </config> Preparado por Jesús Salinas Revelles ¡No se cambia! ¡No se cambia! Hay que hacerlos coincidir con los nombres de los tipos que pusimos en el modelo de contenidos y con el prefijo que declaramos en su espacio de nombres. ¡SOLO HAY UNA CLAVE DE CONFIGURACION DE ESTE TIPO en el web-client-config.xml! Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Para espacios personalizados, si queremos que nos aparezca un nuevo tipo de espacio en el asistente de creación de espacio, debemos incluir: <config evaluator="string-compare" condition="Space Wizards"> <folder-types> <type name="prefijo:nombreTipo"/> </folder-types> </config> Preparado por Jesús Salinas Revelles
  • 41. Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ 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="prefijo:nombreTipo"/> </subtypes> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Personalizaciones Alfresco Explorer ‣ Para espacios personalizados, si queremos tener la posibilidad de convertir los espacios existentes tendremos que añadir lo siguiente: <config evaluator="string-compare" condition="Action Wizards"> <specialize-types> <type name="prefijo:nombreTipo"/> </specialize-types> </config> Preparado por Jesús Salinas Revelles
  • 42. Tipos de contenidos personalizados Personalizar Alfresco Share ‣ Introducción. ‣ Nuevos tipos y aspectos. ‣ Configuración de formularios. ‣ Formulario de búsqueda avanzada. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ El diseño de nuevos modelos de datos en Alfresco es una operación muy habitual. Una vez diseñado dicho modelo podemos crear código que trabaje directamente contra él. ‣ Ahora bien, para trabajar con el cliente web Alfresco Share, deberemos introducir alguna modificación. ‣ El fichero donde se introducen dichas modificaciones es share-config-custom. xml que será creado en ${tomcat_home}/shared/classes/web-extension. Preparado por Jesús Salinas Revelles
  • 43. Tipos de contenidos personalizados Introducción ‣ ¿Dónde manejamos tipos de datos dentro de Alfresco Share? ‣ Cuando un usuario configura una regla sobre un aspecto y usa un tipo de contenido como criterio. ‣ Cuando un usuario configura una regla sobre un espacio y usa un aspecto como criterio. ‣ Cuando un usuario ejecuta una acción “specialize type”, como parte de una regla de configuración o como una acción UI “Change Type” UI action, los tipos personalizados deben aparecer. ‣ Cuando un usuario decide ejecutar Añadir Aspecto. ‣ Cuando el usuario analiza el detalle de un documento. ‣ Cuando el usuario edita los detalles de un documento. ‣ Cuando el usuario realiza búsquedas avanzadas. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Informar a Alfresco Share de que existen nuevos tipos, aspectos, etc. Las modificaciones se incluyen dentro del siguiente elemento: <alfresco-config> ... <!-- Document Library config section --> <config evaluator="string-compare" Preparado por Jesús Salinas Revelles condition="DocumentLibrary"> ... </config> ... </alfresco-config>
  • 44. Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Añadiendo aspectos: ... <aspects> <visible> <aspect name="sc:webable" /> <aspect name="sc:productRelated" /> </visible> <addable> </addable> <removeable> </removeable> </aspects> ... Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Añadiendo tipos: ... <types> <type name="cm:content"> <subtype name="sc:doc" /> <subtype name="sc:whitepaper" /> </type> <type name="sc:doc"> <subtype name="sc:whitepaper" /> </type> </types> ... Preparado por Jesús Salinas Revelles
  • 45. Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Estas entradas xml type y subtype permiten definir el concepto de herencia. ‣ El mismo tipo puede aparecer varias veces en la lista. Una vez cómo subtipo de cm:content y otra como subtipo de sc:doc. Esto permite al usuario especializar directamente el tipo sc:whitepaper independientemente de si el original era cm:content o sc:doc. ‣ Se reinicia Tomcat y vemos los cambios. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Reglas de contenidos: Preparado por Jesús Salinas Revelles
  • 46. Tipos de contenidos personalizados Nuevos tipos y aspectos ‣ Cambiando el tipo de un nodo: Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Alfresco Share utiliza el servicio de formularios para decidir qué propiedades mostrar en cada caso. ‣ El evaluador node-type permite definir los formularios. ‣ Los nodos dentro de Alfresco Share se gestionan en formularios de diferentes formas: ‣ View, Edit, Edit online. Preparado por Jesús Salinas Revelles
  • 47. Tipos de contenidos personalizados Configuración de formularios ‣ Sintaxis: <config evaluator="node-type" condition="type"> <forms> <form [id="string"] [submission-url="url"]> <view-form template="path" /> <edit-form template="path" /> <create-form template="path" /> <field-visibility> ... </field-visibility> <appearance> ... </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Los tres formularios son: ‣ Formulario por defecto (elemento form sin atributo id). Formulario cuando se abre los detalles de un documento. ‣ Formulario con id doclib-simple-metadata. Formulario de edición de propiedades desde la biblioteca de documentos. ‣ Formulario con id doclib-inline-edit. Este se utiliza cuando se accede a la edición Inline. Preparado por Jesús Salinas Revelles
  • 48. Tipos de contenidos personalizados Configuración de formularios ‣ Cada formulario debe incluirse dentro de esta configuración: <config evaluator="node-type" condition="sc:whitepaper"> <forms> <form> ... </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Formulario de edición: <form id="doclib-simple-metadata"> ... </form> ‣ Formulario de edición online: <form id="doclib-inline-edit"> ... </form> Preparado por Jesús Salinas Revelles
  • 49. Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplo: <form id="doclib-inline-edit"> <field-visibility> <show id="cm:name" /> ... </field-visibility> ... Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Los elementos view-form, edit-form, create-form: permiten definir plantillas personalizadas para los formularios de creación, edición y visualización. ‣ Ejemplo: <config evaluator="node-type" condition="cm:content"> <forms> <form> <create-form template="/path/to/custom/form1.ftl" /> </form> </forms> </config> ‣ El atributo template define la ruta donde se encuentra la plantilla. Preparado por Jesús Salinas Revelles
  • 50. Tipos de contenidos personalizados Configuración de formularios ‣ Elementos field-visibility y appearance: ... <form> <field-visibility> <show id="sc:published" /> <show id="sc:isActive" /> </field-visibility> <appearance> <field id="sc:published" label-id="prop.sc_published" /> <field id="sc:isActive" label-id="prop.sc_isActive"/> </appearance> </form> ... Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ El elemento field-visibility se encarga de definir la visibilidad de los campos asociados al tipo de dato que se van a mostrar en el formulario. ‣ Si este elemento no existe todos los campos del tipo de dato son visibles en todos los modos. ‣ Ejemplo: <config evaluator="node-type" condition="sc:whitepaper"> <forms> <form> <field-visibility> <show id="cm:name" /> <show id="cm:title" force="true" /> <show id="cm:creator" for-mode="view" /> <show id="cm:taggable" for-mode="edit" Preparado por Jesús Salinas Revelles force="true" />
  • 51. Tipos de contenidos personalizados Configuración de formularios ‣ Sintaxis field-visibility: <config evaluator="node-type" condition="type"> <forms> <form [id="string"] [submission-url="url"]> ... <field-visibility> <show id="string" [for-mode="view|edit|create"] [force="boolean"] /> <hide id="string" [for-mode="view|edit|create"] /> </field-visibility> ... </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Elemento show: especifica si un campo aparece en un formulario. Sus atributos son: ‣ Atributo id: (obligatorio) identificador único del campo, por ejemplo, "cm:name". ‣ Atributo for-mode: (opcional, cadenas separadas por comas) especifica cuando debe aparecer el campo sobre el que se aplica. Sus valores válidos son "view", "edit" y "create". Si el atributo no se especifica, aparecerá en todos los modos. Si queremos que el campo sólo aparezca en modo view y edit su valor será "view,edit". ‣ Atributo force: (opcional, booleano): hay campos que pueden ser opcionales para un item, por ejemplo, por defecto pueden no ser devueltos por el servidor. Cuando este atributo está a true informa al servicio de formularios (FormService) que debe hacer lo que sea para encontrar y devolver una definición de ese campo. Preparado por Jesús Salinas Revelles
  • 52. Tipos de contenidos personalizados Configuración de formularios ‣ Elemento hide: este elemento tiene sentido cuando varios ficheros de configuración trabajan de forma combinada haciendo que un campo no sea visible cuando previamente lo era. Sus atributos son: ‣ id (obligatorio, string): identificador único del campo, por ejemplo, "cm:name". ‣ Atributo for-mode: (opcional, cadenas separadas por comas) especifica cuando no debe aparecer el campo sobre el que se aplica. Sus valores válidos son "view", "edit" y "create". Si el atributo no se especifica, aparecerá en todos los modos. Si queremos que el campo sólo aparezca en modo view y edit su valor será "view,edit". <config evaluator="node-type" condition="cm:content"> <forms> <form> <field-visibility> <hide id="cm:title" /> <hide id="cm:description" /> </field-visibility> </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ El elemento appearance se encarga de definir la apariencia de los diferentes controles que aparecen en el formulario (look&feel). ‣ Ejemplo: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <set id="dublin-core" appearance="bordered-panel" Preparado por Jesús Salinas Revelles label="Dublin Core" /> <field id="cm:publisher" set="dublin-core" /> <field id="cm:contributor" set="dublin-core" /> <field id="cm:type" set="dublin-core" /> ... </appearance> </form> </forms> </config>
  • 53. Tipos de contenidos personalizados Configuración de formularios ‣ Elemento set: permite definir grupos de campos. Sus atributos son: ‣ id (obligatorio, string): especifica el identificador único del conjunto. ‣ parent (opcional, string): permite conjuntos anidados. ‣ appearance (opcional, string): especifica cómo debe renderizarse en grupo. Los valores son "fieldset", "panel", "bordered-panel", "title" y "whitespace". Si este atributo no aparece no será renderizado. Si el campo aparece “” el conjunto se renderizará sin nada especial. ‣ template (opcional, string): especifica la ruta de la plantilla usada para renderizar el grupo, permitiendo así personalización de los campos. ‣ label-id (opcional, string): especifica la clave en resource bundle key asociado al campo. ‣ label (opcional, string): especifica la etiqueta del conjunto. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Elemento field: controla la apariencia de cada campo, desde la etiqueta al control que debemos usar. Sus atributos son: ‣ id (obligatorio, string). ‣ label-id (opcional, string). ‣ label (opcional, string). ‣ description-id (opcional, string). ‣ description (opcional, string). ‣ help-id (opcional, string). ‣ help (opcional, string). Preparado por Jesús Salinas Revelles
  • 54. Tipos de contenidos personalizados Configuración de formularios ‣ Elemento field (cont.): ‣ read-only (opcional, boolean): informa al generador de formularios que el campo debe renderizarse como editable cuando el formulario esté en modo "edit" o "create". ‣ mandatory (opcional, boolean): define el campo como obligatorio. ‣ set (opcional, string): especifica el identificador único de un fieldset indicando que se encuentra dentro de él. Si el atributo se omite el campo pertenece al fieldset por defecto. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplos appearance: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:name" label="File Name" description="The file name of the content" /> </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles
  • 55. Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplos appearance: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> Preparado por Jesús Salinas Revelles <field id="cm:name" label-id="label.name" description-id="description.name" /> </appearance> </form> </forms> </config> Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplos appearance: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:author" read-only="true" /> </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles
  • 56. Tipos de contenidos personalizados Configuración de formularios ‣ Elemento control: este elemento es hijo de field y define el tipo de control a utilizar para un determinado campo. Sus atributos son: ‣ template (opcional, string): Specifies the absolute path to the Freemarker template to use to represent the field. ‣ Ejemplo: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:title"> <control template="/org/alfresco/components/form/controls/textfield.ftl" /> </field> </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Elemento control-param: ‣ Atributo name (obligatorio, string): nombre del parámetro que se pasa a control de la plantilla. ‣ Ejemplo: <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:description"> <control> Preparado por Jesús Salinas Revelles <control-param name="rows">10</control-param> </control> </field> </appearance> </form> </forms> </config>
  • 57. Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplos: propiedad description <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:description"> <control> <control-param name="rows">10</control-param> </control> </field> </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Ejemplos: propiedad description renderizada en un campo rico. <config evaluator="node-type" condition="cm:content"> <forms> <form> <appearance> <field id="cm:description"> <control template="/org/alfresco/components/form/controls/richtext.ftl"> <control-param name="editorAppearance">full</control-param> </control> </field> </appearance> </form> </forms> </config> Preparado por Jesús Salinas Revelles
  • 58. Tipos de contenidos personalizados Configuración de formularios ‣ Elementos constraint-handlers y constraint: el elemento constraint que función JS usar para chequear restricciones. Sus atributos son: ‣ type (obligatorio, string): identificador de una restricción, por ejemplo, LIST. ‣ validation-handler (obligatorio, string): nombre de la función JS llamada cuando el campo se valida. ‣ message-id (opcional, string): clave asociada a resource bundle utilizado cuando la validación falla. Si este atributo existe reemplaza el mensaje por defecto. Tiene precedencia sobre el atributo message. ‣ message (opcional, string): mensaje que se genera si la validación falla. ‣ event (opcional, string): especifica qué evento activa al manejador de validación. Este string coincide con eventos DOM estándares: "keyup", "blur" etc. El valor por defecto es "blur". Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Elementos constraint-handlers y constraint: ‣ Ejemplo: <config> <forms> <constraint-handlers> <constraint type="MANDATORY" validation-handler="Alfresco.forms.validation.mandatory" event="keyup" /> </constraint-handlers> </forms> </config> Preparado por Jesús Salinas Revelles
  • 59. Tipos de contenidos personalizados Configuración de formularios ‣ Elemento dependencies: define la lista de ficheros JavaScript y CSS necesarios para el funcionamiento del formulario. ‣ El elemento js representa un fichero js y css un fichero css. Su único atributo es: ‣ src (obligatorio, string): especifica la ruta absoluta desde el raís de la aplicación web (no incluido el contexto de la web). <config> <forms> <dependencies> <css src="/fdk/accordion/accordion.css" /> <js src="/fdk/accordion/accordion-min.js" /> </dependencies> </forms> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Configuración de formularios ‣ Más información ‣ http://wiki.alfresco.com/wiki/Forms Preparado por Jesús Salinas Revelles
  • 60. Tipos de contenidos personalizados Formulario de búsqueda avanzada ‣ Se define el formulario de búsqueda para cada tipo definiendo titulo y descripción: <config replace="true" evaluator="string-compare" condition="AdvancedSearch"> <advanced-search> <forms> ... <form labelId="type.sc_whitepaper" descriptionId="search.form.desc.sc_whitepaper"> sc:whitepaper </form> </forms> </advanced-search> </config> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Formulario de búsqueda avanzada ‣ Tenemos que especificar el detalle de cada formulario asociado a un determinado tipo: <config evaluator="model-type" condition="sc:whitepaper"> <forms> <form id="search"> <field-visibility> <show id="cm:name" /> ... <appearance> </appearance> </forms> </config> Preparado por Jesús Salinas Revelles
  • 61. Recargar Alfresco Tipos de contenidos personalizados Recargar Alfresco sin reiniciar ‣ Para recargar los modelos que hayamos puesto en la carpeta de extensión sin parar el servidor podemos usar la consola ‣ http://localhost:8080/alfresco/faces/jsp/admin/repoadmin-console. jsp ‣ y ejecutar el comando ‣ deploy model alfresco/extension/miModelo.xml Preparado por Jesús Salinas Revelles
  • 62. Tipos de contenidos personalizados Recargar Alfresco sin reiniciar ‣ Para recargar las configuraciones de Alfresco Explorer (la interfaz Web) basta ir a la consola http://localhost:8080/alfresco/faces/jsp/admin/webclientconfig-console. jsp ‣ y ejecutar el comando “reload”. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Recargar Alfresco con reinicio ‣ Basta parar el proceso de Alfresco y volver a lanzarlo. ‣ Múltiples mecanismos, depende del S.O. y del despliegue que se haya hecho. Normalmente... ‣ sh alfresco.sh stop ‣ sh alfresco.sh start Preparado por Jesús Salinas Revelles
  • 63. Pruébalo Tipos de contenidos personalizados Probando las personalizaciones ‣ Sube un nuevo documento. ‣ Despliega en la primera pantalla el selector de tipos y comprueba que aparece tu nuevo tipo personalizado. Selecciónalo. ‣ Comprueba que en el formulario de introducción de metadatos aparecen las nuevas propiedades que hemos agregado al tipo de contenido. Preparado por Jesús Salinas Revelles
  • 64. Tipos de contenidos personalizados Búsquedas en Alfresco ‣ Introducción. ‣ Configurar búsquedas en Alfresco Explorer. ‣ Indexación de propiedades. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ Con Alfresco podemos buscar en los contenidos y las propiedades de los mismos. Soporta búsqueda a texto completo en el contenido, independientemente del formato. ‣ Podemos restringir las búsquedas a ciertos espacios, categorías o determinados tipos de contenido. Preparado por Jesús Salinas Revelles
  • 65. Tipos de contenidos personalizados Introducción ‣ Búsquedas en Alfresco Explorer: Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ Búsqueda a texto completo: Por defecto, el contenido de Alfresco soporta búsquedas a texto completo. Cualquier contenido que se suba al repositorio es transformado internamente a texto y es indexado. Preparado por Jesús Salinas Revelles
  • 66. Tipos de contenidos personalizados Configurar búsquedas en Alfresco Explorer <config evaluator="string-compare" condition="Advanced Search"> <advanced-search> <content-types> <type name="custom:pressrelease" /> </content-types> <custom-properties> <meta-data type="custom:pressrelease" Preparado por Jesús Salinas Revelles property="custom:PRDate" /> <meta-data aspect="custom:CustomerDetails" property="custom:CustomerName" /> <meta-data aspect="custom:CustomerDetails" property="custom:NewCustomer" /> </custom-properties> </advanced-search> </config> Tipo de contenido Propiedad para buscar Aspecto Propiedad para buscar Tipos de contenidos personalizados Indexación de propiedades ‣ Introducción. ‣ Definición de índices en propiedades. Preparado por Jesús Salinas Revelles
  • 67. Tipos de contenidos personalizados Introducción ‣ Cuando un documento se sube a Alfresco, por defecto, los metadatos se extraen y se indexan en el acto, pero el contenido no tiene por qué ser indexado en ese momento (depende). <type name="cm:content"> <title>Content</title> <parent>cm:cmobject</parent> <properties> <property name="cm:content"> <type>d:content</type> <mandatory>false</mandatory> <index enabled="true"> <atomic>false</atomic> <stored>false</stored> <tokenised>true</tokenised> </index> </property> </properties> </type> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de índices en propiedades ‣ El elemento index es el responsable de definir la indexación asociada a cada propiedad en nuestro modelo de contenidos: <type name="prefix:name"> ... <properties> <property name="prefix:propertyName"> ... <index ...> ... </index> </property> </properties> </type> Preparado por Jesús Salinas Revelles
  • 68. Tipos de contenidos personalizados Definición de índices en propiedades ‣ Atributo enabled: determina si la propiedad se indexa o no ... <index enabled=”true”> ... </index> ... ... <index enabled=”false”> ... </index> ... Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de índices en propiedades ‣ Elemento atomic: ... <index enabled=”true”> <atomic> true|false </atomic> </index> ... ‣ Si está a true, esa propiedad es indexada en el momento de la transacción, si está a false, se indexará en background. ‣ La indexación de contenidos que necesitan transformación antes de ser indexados (p. ej. PDF), solo serán atomic=true si la transformación tarda menos tiempo que el valor especificado en el atributo lucene.maxAtomicTransformationTime. Todos los transformadores por defecto están en la carpeta alfresco/WEB-INF/classes/ alfresco/services-context.xml. Preparado por Jesús Salinas Revelles
  • 69. Tipos de contenidos personalizados Definición de índices en propiedades ‣ Elemento stored: ... <index enabled=”true”> <stored> true|false </stored> </index> ... ‣ Si está a true, el valor de la propiedad se almacenará en el índice y debe ser consultado mediante la API de bajo nivel de Lucene. ‣ Esto es útil para debugging si queremos saber qué es exactamente lo que se está indexando, pero no está recomendado en absoluto para producción ya que escribe mucha más información en disco. Recomendado false. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Definición de índices en propiedades ‣ Elemento tokenised: ... <index enabled=”true”> <tokenised> true|false|both </tokenised> </index> ... ‣ Si está true, el valor de la cadena de la propiedad se tokeniza antes de ser indexado. ‣ Si está a false, se indexará como una única cadena, ‣ Si está a both se harán las dos opciones. ‣ Valor recomendado true. Preparado por Jesús Salinas Revelles
  • 70. Tipos de contenidos personalizados Definición de índices en propiedades ‣ Por defecto, los contenidos se indexan atómicamente en background, no se almacenan en el índice y se dividen en distintos tokens antes de ser indexados (esta es la política definida en cm:content que puede ser sobreescrita). <type name="cm:content"> <title>Content</title> <parent>cm:cmobject</parent> <properties> <property name="cm:content"> <type>d:content</type> <mandatory>false</mandatory> <index enabled="true"> <atomic>false</atomic> <stored>false</stored> <tokenised>true</tokenised> </index> </property> </properties> </type> Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Custom Behaviors en Alfresco ‣ Introducción. ‣ Policies. ‣ Implementación de custom behavior en Java. ‣ Registro de custom behavior en Java. Preparado por Jesús Salinas Revelles
  • 71. Tipos de contenidos personalizados Introducción ‣ Hay ocasiones en las que queremos desarrollar código para que se encuentre altamente acoplado a un tipo de contenido. ‣ Habitualmente, es así porque necesitamos estar seguros de que se ejecute cada vez que le ocurra algo a un determinado tipo de contenido. ‣ Afortunadamente, Alfresco nos ofrece un mecanismo para resolver ese tipo de circunstancias, llamado behavior. ‣ Behaviors se utilizan habitualmente en Alfresco. Los procesos de de auditoría y versionado son ejemplos claros de este mecanismo. ‣ El desarrollo de estos elementos implica responder a dos preguntas: ‣ ¿Qué trozo de código queremos ejecutar? ‣ ¿Cuándo queremos ejecutar el trozo de código? Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Introducción ‣ La entidad responsable de decidir cuándo se ejecuta un behavior se denomina Policy. ‣ El trozo de código que se desea ejecutar puede ser programada en Java o JavaScript (dos alternativas equivalentes). Preparado por Jesús Salinas Revelles
  • 72. Tipos de contenidos personalizados Policies ‣ Como ya hemos comentado anteriormente, estos componentes responsables de definir cuándo se ejecuta un behavior. ‣ Cada policy se nombra extendiendo una de las siguientes interfaces: ClassPolicy, AssociationPolicy o PropertyPolicy. El contrato se define mediante la interface Java Policy. ‣ Por ejemplo: ‣ El componente Node puede definir policies tales como onCreateNode, beforeDeleteNode, onUpdateProperties, etc. ‣ El componente CheckOutCheckIn puede definir policies como onCheckOut, onCheckIn, onCancelCheckOut, etc. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Policies ‣ La implementación de componentes es diferente a los tipos de contenidos para permitir la inyección de comportamiento especiales en los procesos. ‣ Los implementadores de componentes son responsable de definir el contrato que describe cómo inyectar y cuándo la funcionalidad. Este contrato se conoce como policy. ‣ Por ejemplo, el componente Node puede definir policies tales como onCreateNode, beforeDeleteNode, onUpdateProperties, etc. ‣ El componente CheckOutCheckIn puede definir policies como onCheckOut, onCheckIn, onCancelCheckOut, etc. ‣ Cada policy se nombra extendiendo una de las siguientes interfaces: ClassPolicy, AssociationPolicy or PropertyPolicy. El contrato se define mediante la interface Java Policy. Preparado por Jesús Salinas Revelles
  • 73. Tipos de contenidos personalizados Policies ‣ Existen diferentes policies: ‣ CheckOutCheckInServicePolicies. ‣ ContentServicePolicies. ‣ CopyServicePolicies. ‣ LockServicePolicies. ‣ NodeServicePolicies. ‣ TransferServicePolicies. ‣ VersionServicePolicies. ‣ Cada una de estas interfaces contienen interfaces internas que nos permiten puentear policies como necesitemos. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Policies ‣ La interface NodeServicePolicies define un conjunto de interfaces internas y estáticas asociadas a los diferentes eventos: ‣ NodeServicePolicies.BeforeAddAspectPolicy. ‣ NodeServicePolicies.BeforeArchiveNodePolicy. ‣ NodeServicePolicies.BeforeCreateNodePolicy. ‣ NodeServicePolicies.BeforeCreateStorePolicy. ‣ NodeServicePolicies.BeforeDeleteAssociationPolicy. ‣ NodeServicePolicies.BeforeDeleteChildAssociationPolicy. ‣ ... ‣ http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/ repo/node/NodeServicePolicies.html Preparado por Jesús Salinas Revelles
  • 74. Tipos de contenidos personalizados Policies ‣ Ejemplo BeforeAddAspectPolicy: Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Implementación de custom behavior en Java ‣ Desarrollo de una clase: public class Rating implements ‣ Implementará tantas interfaces como policies desee manejar. En este ejemplo se manejan dos tipos de eventos: ‣ Borrado de nodos. ‣ Creación de nodos. Preparado por Jesús Salinas Revelles NodeServicePolicies.OnDeleteNodePolicy, NodeServicePolicies.OnCreateNodePolicy { ...
  • 75. Tipos de contenidos personalizados Implementación de custom behavior en Java ‣ Desarrollo de una clase (cont.): // Dependencies private NodeService nodeService; private PolicyComponent policyComponent; // Behaviours private Behaviour onCreateNode; private Behaviour onDeleteNode ... ‣ La clase tiene dos dependencias, éstas son gestionadas por Spring. El servicio de nodos NodeService se utilizará para manejar nodos y PolicyComponent que se utiliza which is used to bind the behavior to the policies. Preparado por Jesús Salinas Revelles Tipos de contenidos personalizados Implementación de custom behavior en Java ‣ Desarrollo de una clase (cont.): public void init() { // Create behaviours this.onCreateNode = new JavaBehaviour(this, "onCreateNode", NotificationFrequency.TRANSACTION_COMMIT); this.onDeleteNode = new JavaBehaviour(this, "onDeleteNode", NotificationFrequency.TRANSACTION_COMMIT); // Bind behaviours to node policies this.policyComponent.bindClassBehaviour( Qname.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"), Qname.createQName(SomeCoModel.NAMESPACE_SOMECO_CONTENT_MODEL, SomeCoModel.TYPE_SC_RATING), this.onCreateNode ); ... Preparado por Jesús Salinas Revelles
  • 76. Tipos de contenidos personalizados Registro de custom behavior en Java ‣ Una vez diseñada la clase Java que implementa la lógica de negocio, debemos definirlo como un bean de Spring Framework. El procedimiento es totalmente estándar. ‣ Se deben inyectar los servicios declarados previamente en la clase: nodeService y policyComponent. <bean id="ratingBehavior" class="com.someco.behavior.Rating" init-method="init"> <property name="nodeService"> <ref bean="NodeService" /> </property> <property name="policyComponent"> <ref bean="policyComponent" /> </property> </bean> Preparado por Jesús Salinas Revelles