Recursos Útil

Descripción funcional

Módulo que nos ofrece una API para manejar recursos XML de OpenCms. Entre las acciones que nos permite hacer tenemos:

  • Crear un contenido XML
  • Editar un contenido existente
  • Crear una carpeta
  • Subir ficheros a OpenCms
  • Crear Sibling

 

La ventaja de esta API frente a la de OpenCms es su simplicidad, ya que para manejar la información XML utiliza un simple HashMap en lugar de un objeto XML por lo tanto es más fácil para editar la información del contenido.

Por ejemplo, un contenido que tenga los campos: Title, Teaser, Date, Text

El objeto que tendríamos que crear para editarlo sería:

HashMap data = new HashMap();
data.put("Title","VALOR DEL CAMPO");
data.put("Teaser","VALOR DEL CAMPO");
data.put("Date","VALOR DEL CAMPO");
data.put("Text","VALOR DEL CAMPO");

Según el tipo de campo que estemos editando, el campo a pasar en el valor será distinto:

  • String para OpenCmsString, OpenCmsVfsFile.
  • Boolean para campos OpenCmsBoolean
  • List para campos múltiples
  • HashMap para campos anidados compuestos (nested)

 

 Compatibilidad Actual: OpenCms 9.5.3

 

Versiones

Version 1.7 (Enero 2016)

  • Modificado el módulo de edición de contenido para que, cuando no haya cambios entre el HashMap enviado y el contenido actual del recurso no se edite el recurso. Hasta el momento siempre se estaba editando sin verificar si había cambios o no.
  • Añadida JSP de prueba con ejemplos de generación de HashMap.
  • Añadida funcionalidad para llamar a una API Rest que devuelva un JSON con la lista de recursos a actualizar.
  • Añadida tarea programada (cron) que permite realizar una llamada a un WS para actualizar contenido automáticamente.

Versión 1.6 (Diciembre 2015)

Añadida compatibilidad con recursos en múltiples idiomas. Hasta esta versión, el módulo solo permitía editar el recurso en un solo idioma. A partir de ahora, podremos indicar que idioma queremos editar. En el caso que queramos editar el mismo recurso en dos idiomas tendremos que hacer como si editaramos 2 veces el mismo recurso, modificando el HashMap enviado y el locale correspondiente.

Versión 1.5 (Julio 2015)

Por problemas de compilación, hemos tenido que realizar 2 versiones distintas para las versiones de OpenCmsç.

  • OpenCms 9.5.X -> Recursos Útil 1.5
  • OpenCms 9.0.X -> Recursos Útil 1.2

 

Versión 1.2 (Mayo 2015)

En la versión 1.2 se ha añadido una nueva funcionalidad con la que podremos dar de alta recursos en OpenCms a través de un objeto JSON.

El formato correcto de este JSON debe ser:

  • Resource:
    • title
    • path
    • resourceTypeName
    • fields (Lista de Field)
      • name
      • value
      • type
      • fields (Lista de Field)

 

Posibles tipos de los Field:

  • simple: campo simple correspondiente a un OpenCmsString, OpenCmsHtml, OpenCmsVfsFile, OpenCmsVarLink, OpenCmsDateTime, OpenCmsBoolean
  • nested: campo anidado que lo forma una lista de fields. Este tipo de Field no deben tener value
  • multiplesimple: Campos múltiples de tipo simple, por lo tanto no tendrán value, solamente una lista de fields hijo.
  • multiplenested: Campos múltiples anidados, de forma que no tendrán value, solamente una lista de fields de tipo nested.
  • choice: Campos de tipo Choice donde el nodo hijo puede ser a su vez de distintos tipos.

Json de ejemplo:

//Ejemplo campos simple
String jsonDemo = "[{\"title\":\"Recurso 1\",\"path\":\"/.content/test/test-00001.html\",\"resourceType\":\"uahtest\","
                + "\"fields\":[{\"name\":\"Title\",\"value\":\"Test Value\",\"type\":\"simple\",\"fields\":null},"
                + "{\"name\":\"Text\",\"value\":\"Test Value\",\"type\":\"simple\",\"fields\":null},"
                + "{\"name\":\"Date\",\"value\":\"1432137605587\",\"type\":\"simple\",\"fields\":null}"   
               + "}]"        
            + "}]";
//Ejemplo con campos nested multiples
String jsonDemo = "[{\"title\":\"Recurso 1\",\"path\":\"/.content/test/test-00001.html\",\"resourceType\":\"uahtest\","
                + "\"fields\":[{\"name\":\"Title\",\"value\":\"Test Value\",\"type\":\"simple\",\"fields\":null},"
                + "{\"name\":\"Text\",\"value\":\"Test Value\",\"type\":\"simple\",\"fields\":null},"
                + "{\"name\":\"Date\",\"value\":\"1432137605587\",\"type\":\"simple\",\"fields\":null},"
                + "{\"name\":\"Image\",\"value\":null,\"type\":\"multiplenested\",\"fields\":"
                    + "[{\"name\":\"Image\",\"value\":null,\"type\":\"nested\",\"fields\":"
                        + "[{\"name\":\"Width\",\"value\":\"4\",\"type\":\"simple\",\"fields\":null},"
                        + "{\"name\":\"Position\",\"value\":\"right\",\"type\":\"simple\",\"fields\":null},"
                        + "{\"name\":\"Image\",\"value\":\"/.galleries/demo.jpg\",\"type\":\"simple\",\"fields\":null}]},"
                    + "{\"name\":\"Image\",\"value\":null,\"type\":\"nested\",\"fields\":"
                        + "[{\"name\":\"Width\",\"value\":\"4\",\"type\":\"simple\",\"fields\":null},"
                        + "{\"name\":\"Position\",\"value\":\"right\",\"type\":\"simple\",\"fields\":null},"
                        + "{\"name\":\"Image\",\"value\":\"/.galleries/demo.jpg\",\"type\":\"simple\",\"fields\":null}]"
                    + "}]"
                + "}]"
            + "}]";

 

Versiones anteriores

Versión actual: Recursos Util 1.2 (Junio de 2015)

  • Nueva clase de ayuda para la creación / edición de recursos: ResourceJsonManager que permite editar o crear una lista de recursos en OpenCms a partir de un objeto Json o lista de objetos Resource / Field
  • Deprecados algunos métodos de ResourceManager que ya no se deberían usar
  • Permitido paso de parámetro del nombre del recurso mediante su nombre en lugar de su ID. OpenCms 9.5 está deprecando el uso del ID

Versión 1.1 (Noviembre de 2014)

  • Añadido método que realiza los mapeos del recurso configurados en XSD, indexa en solr offline y asigna las categorías seleccionadas.
  • Pasado de maven a gradle

Versión 1.0

  • Versión inicial del módulo

 

Guía de Instalación

La instalación de esta libreria es muy fácil.

Usando fichero .jar:

  1. Descargar fichero .jar
  2. Subir el fichero descargado a la carpeta lib del opencms (se puede usar la exportación a disco desde OpenCms)
  3. Reiniciar servidor.

Usando módulo .zip:

  1. Descargar fichero .zip
  2. Ir a la vista de administración e instalar módulo desde la Gestión de Módulos
  3. Reiniciar servidor

Métodos y funciones

Crear Siblings:

boolean createSibling(String fuente, String destino)
  • fuente: path del recurso original del cual vamos a crear el hermano
  • destino: path del nuevo recurso hermano que vamos a crear

Editar un recurso existente

boolean editResource (HashMap data, String resource, boolean publish)
  • data: Datos del xml a guardar
  • resource: path del recurso a editar
  • publish: true si queremos que tras la edición se publique el recurso o false para que se quede sin publicar

Copiar recurso

boolean copyResource(String fuente, String destino)
  • fuente: path del recurso original del cual vamos a copiar
  • destino: path del nuevo recurso que vamos a crear

Copiar locale

boolean copyToLocale(String resource,Locale fromLocale, Locale toLocales,boolean publicar)
  • resource: path del recurso al cual queremos copiar el locale
  • fromLocale: Locale origen
  • toLocale: Locale destino
  • publicar: indica si deseamos publicar una vez realizada la copia.

 

 

Ejemplos

Crear o editar un recurso básico

<%@page buffer="none" session="false" import="java.util.*,org.opencms.jsp.*,org.opencms.main.*,org.opencms.file.*,org.opencmshispano.module.resources.manager.*,
org.opencms.xml.*,org.opencms.xml.content.*,org.opencms.xml.types.*,org.opencms.util.*,
org.opencmshispano.module.resources.bean.*,org.opencms.file.types.CmsResourceTypeXmlContent" trimDirectiveWhitespaces="true"%>
<%
//Inicializamos variables necesarias:
CmsJspActionElement cms = new CmsJspActionElement(pageContext, request, response);
CmsObject cmso = cms.getCmsObject();
Locale locale = cms.getRequestContext().getLocale();
ResourceManager rm = new ResourceManager(cms,cmso);
//Creamos el HashMap
HashMap data = new HashMap();
data.put("Title", "Título");
data.put("Date", ""+(new Date()).getTime()); //El campo fecha será un string con la fecha en milisegundos
data.put("Teaser", "TEXTO");
data.put("Text", "TEXTO");


CmsResource r = rm.saveCmsResource(data, "/vfs/path/opencms/resource.xml", type);


//Mostramos por pantalla la informacion del recurso

CmsXmlContent resourceDocument = CmsXmlContentFactory.unmarshal(cmso, cmso.readFile(r));
/** Get all element names for the given locale */
List elementNames = resourceDocument.getNames(locale);
Iterator elementNamesItr = elementNames.iterator();
String elementName = null;
out.println("<ul>");
while (elementNamesItr.hasNext()) {
out.print("<li>");
elementName = (String)elementNamesItr.next();
out.print(elementName);
try {
I_CmsXmlContentValue elementValue = resourceDocument.getValue(elementName, locale);
out.println("\t- Value:\t" + CmsStringUtil.escapeHtml(elementValue.getStringValue(cmso)));
} catch (Exception e) {
out.print("\t- No value:\t" + e.getMessage().substring(0, 40));
}
out.print("</li>");
}
out.println("</ul>");

%>

Recursos con campos múltiples

ResourceManager rm = new ResourceManager(cms,cmsObjectAdmin);
HashMap data = new HashMap();
data.put("Title", "Enlaces de interes");
List<String,HashMap> enlaces = new ArrayList<String,HashMap>();
//Enlace 1
HashMap linkdata1 = new HashMap();
linkdata1.put("Title", "Google");
linkdata1.put("Href", "http://www.google.es");
enlaces.add(linkdata1);
//Enlace 2
HashMap linkdata2 = new HashMap();
linkdata2.put("Title", "OpenCms Hispano");
linkdata2.put("Href", "http://www.opencmshispano.com");
enlaces.add(linkdata2);
data.put("Links", enlaces);
rm.saveResource(documentoData, PATH_RESOURCE, type);

Edición de un campo Choice

<%

/* Campo de Contenido */

HashMap<String,String> dataText = new HashMap<String,String>();
dataText.put("Text", "Texto de pruebas por código mod4");

//Hashmap de TextBlock
HashMap dataTextPrin = new HashMap();
dataTextPrin.put("TextBlock",dataText);

//Lista de bloques de contenido
ArrayList listText = new ArrayList();
listText.add(dataTextPrin);

//Creamos el choice donde la lista será los subelementos del Choice
Choice contentChoice = new Choice("Content",listText);

//Añadimos el objeto Choice al data principal
data.put("Content", contentChoice);

%>