miércoles, 28 de abril de 2010

Rich Faces 3.0 con Eclipse y Tomcat


RICH FACES EN ECLIPSE

INSTALACION DE PLUGINS

El ambiente que estoy utilizando es: Eclipse Galileo, JDK1.6, Ubuntu 9.10, Tomcat 6.0.20(instalado y funcionando en eclipse).
Para empezar abrimos Eclipse.

Una vez hecho esto, tenemos que realizar 3 instalaciones o actualizaciones en Eclipse, para esto vamos a Help/Install new Software
En "work with", seleccionamos The Eclipse Project Updates - http://download.eclipse.org/eclipse/updates/3.5, en donde seleccionamos todos los componentes


Una vez instalado/actualizado. tenemos que actualizar BIRT Update Site - http://download.eclipse.org/birt/update-site/2.5


Finalmente tenemos que descargar JBossTools-Update-3.1.0.v201003050540R-H56-GA.zip de
http://downloads.sourceforge.net/jboss/JBossTools-Update-3.1.0.v201003050540R-H56-GA.zip


Para instalar este zip en eclipse tenemos que seleccionar help/Install new Software, luego click en Add. En el nombre ponemos JBoss Tools y en Location apuntamos al zip que descargamos.
Una vez instalado todo esto deberemos reiniciar Eclipse





CONFIGURACION DEL PROYECTO
Para crear un nuevo proyecto, vamos por File/New/Other y creamos un proyecto del tipo JSF.


Le damos un nombre, para este caso el nombre proyectoJSF, el resto lo dejamos igual y damos click en Next.

En la siguiente pantalla en el RunTime seleccionamos Apache Tomcat 6.0. Si no tenemos este RunTime, damos click sobre nuevo y lo creamos.
Al final damos click en Finish.


Tenemos que hacer una configuracion extra para empezar a trabajar con nuestro proyecto, este cambio consiste en agregar librerias. Para esto, descargamos 1.2_14 binary de https://javaserverfaces.dev.java.net/download.html.



Descomprimimos el archivo zip(mojarra-1.2_14-binary.zip)

y copiamos las librerias jsf-api.jar y jsf-impl.jar (que se encuentran en la carpeta lib) en /ProyectoJSF/WebContent/WEB-INF/lib. Luego regresamos a Eclipse, seleccionamos el proyecto y damos click en "Refresh"
Tenemos que instalar el soporte para RichFaces 3.0, para esto damos click con el botón derecho sobre el proyecto seleccionamos Configure/Add Custom Capabilities. de ahi marcamos JBossRichFaces 3.0 y damos click en Finish.






CREACION DEL GUI

Damos doble click sobre faces-config.xml que esta en WebContent/WEB_INF, damos click en view template(que esta junto al area de dibujo) y damos click en el area blanca.



En la ventana que se abre para From View ID: colocamos jsp/primero y en el Template seleccionamos JSFBasePage y damos click en Finish.



Sobre el icono de la pagina que esta en el area de dibujo damos click boton derecho y seleccionamos Open Page.
Abrimos JSF HTML y arrastramos un form dentro de view
Dentro del form arrastramos un input text(de JSF HTML)
Luego arrastramos un command button de JBoss Ajax4Jsf bajo el input text
Finalmente arrastramos un outputText luego del anterior command button



CREACION DE MANAGED BEANS
Damos click con el boton derecho sobre la carpeta source y seleccionamos New/Class. En el package colocamos com.ejemplo y en el name colocamos Saludo y marcamos "Constructors from superclass".


Luego creamos la variable privada de tipo String mensaje con su respectivo get y set



Damos otra vez doble click en faces-config.xml, seleccionamos el tab llamado tree, seleccionamos ManagedBeans y damos click en Add.



Seleccionamos como scope: session y la clase que creamos en el paso anterior, además le damos un nombre a la variable que utilizaremos.




Luego damos click en Next marcamos mensaje y damos click en Finish.


GUI Y MANAGED BEANS
Para unir la GUI al manager beans, lo hacemos por medio de binding. Para esto en primero.jsp damos click sobr el inputtext y en las propiedades bajo attributes buscamos value, damos click el boton(...) De managedbeans, seleccionamos saludo y mensaje. Posterior a esto damos click sobre el outputtext, buscamos la propiedad id y le damos un nombre por ejemplo salida y en el value damos click sobre el boton (...) y de managedbeans, seleccionamos saludo y mensaje. Luego damos click en el command button y seleccionamos la propiedad reRender y damos click sobre el boton(...) de ComponentsIDS seleccionamos salida.

Este el código de primero.jsp

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<head>
<title></title>
</head>
<body>
<f:view>
<h:form>
<h:inputText value="#{saludo.mensaje}"/>
<a4j:commandButton reRender="salida" >
</a4j:commandButton>
<h:outputText value="#{saludo.mensaje}" id="salida"/>
</h:form>
</f:view>
</body>
</html>



EJECUCION DEL PROYECTO.
Para ejecutar el proyecto debemos crear una pagina de indice en nuestra carpeta JSP.Para damos click con el boton derecho y seleccionamos New, luego de JBossToolWeb seleccionamos JSP File. Le ponemos de name "index" y de Template JSPRedirect y damos click en finish. En el codigo del forward colocamos
Para terminar en web.xml(WebContent/WEB_INF) seleccionamos source y agregamos lo siguiente antes de
</web.app>

<welcome-file-list>
<welcome-file>jsp/index.jsp</welcome-file>
</welcome-file-list>


A continuación pongo el código de index.jsp

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head></head>
<body>
<jsp:forward page="/jsp/primero.jsf" />
</body>
</html>


Finalmente ejecutamos le proyecto, dando boton derecho sobre el mismo, seleccionando RUN y luego Tomcat.





ACTION A OTRA PAGINA.
Para este action vamos a crear otro view template desde faces-config.xml. lo vamos a llamar segundo (jsp/segundo)


Una vez hecho esto, creemos la pagina con el siguiente código

Desde faces-config.xml, usemos un conector desde primero a segundo

en saludos creamos la función proceso, con el siguiente código.



Modificamos el boton de primero.jsp a la siguiente forma.

Este es el nuevo código de primero.jsp
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<head>
<title></title>
</head>
<body>
<f:view>
<h:form>
<h:inputText value="#{saludo.mensaje}"/>
<a4j:commandButton reRender="salida" action="#{saludo.proceso}" value="CLICK">

</a4j:commandButton>
<h:outputText value="#{saludo.mensaje}" id="salida"/>
</h:form>
</f:view>
</body>
</html>



Este es el código de segundo.jsp
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<head>
<title></title>
</head>
<body>
<f:view>
<h:outputText value="#{saludo.mensaje}"/>
</f:view>
</body>
</html>


Ejecutamos el proyecto nuevamente




lunes, 26 de abril de 2010

Alfresco: Instalar, Crear,Consultar y Limpiar Contenido

Para este ejemplo, estoy utilizando:
Ubuntu 9.10,JDK1.6,Eclipse(Galileo),Maven 2.2.1,Alfresco V3.3,AlFresco SDK v3.3


INSTALACION DE ALFRESCO
Primeramente instalaremos Alfresco-Community-3.3-Linux-x86-Install, para estos descargamos el instalador desde:
http://wiki.alfresco.com/wiki/Download_Community_Edition?utm_source=www.alfresco.com&utm_medium=banner&utm_campaign=Community Edition 3.3

Una vez descargado, abrimos una consola de comandos y ejecutamos:
Para dar los permisos
sudo chmod 775 Alfresco-Community-3.3-Linux-x86-Install
sudo chown tuusuario:users Alfresco-Community-3.3-Linux-x86-Install

Luego para iniciar la instalacion, ejecutamos:
./Alfresco-Community-3.3-Linux-x86-Install









Para mi caso Open Office esta instaldo en :/usr/lib/openoffice




Una vez instalado, tenemos que hacer startup de Alfresco, para esto desde una consola de comandos vamos al lugar de instalacion de Alfresco y ejecutamos el comando sh alf_start.sh

Luego de esto vamos a http://localhost:8080/alfresco
Esperamos un momento

si damos click en login o vamos http://localhost:8080/alfresco/faces/jsp/login.jsp
Ingresamos nuestro nombre de usuario y clave (admin/root) podremos ingresar al menu de opciones


Ahora vamos a crear un Space, para eso, damos click sobre company_home(si no aparece se puede hacer logout y login de nuevo)
Ahi damos click en Create y luego "Create Space"



Creamos el Space con la siguiente información:



CONFIGURACION DE JAVA PARA TRABAJAR CON ALFRESCO
Para crear contenido en Alfresco, tenemos que descargar el SDK de: http://sourceforge.net/projects/alfresco/files/SDK/3.3%20Community%20Edition/alfresco-community-sdk-3.3.tar.gz/download
Descomprimimos el archivo y tenemos que registrar dos librerias en el repositorio de maven(Estas librerias se encuentran en el directorio lib del SDK de Alfresco)


mvn install:install-file -Dfile=/lib/server/alfresco-web-client-3.3.jar -DgroupId=com.Alfresco -DartifactId=Alfresco-web-client -Dversion=3.3 -Dpackaging=jar -DgeneratePom=true

mvn install:install-file -Dfile=/lib/server/alfresco-repository-3.3.jar -DgroupId=com.Alfresco -DartifactId=Alfresco-repository -Dversion=3.3 -Dpackaging=jar -DgeneratePom=true

Una vez hecho esto, abrimos Eclipse e importamos los proyectos del SDK, es decir




Luego creamos un nuevo proyecto llamado Proyecto1, hacemos que este proyecto dependa de SDK AlfrescoEmbedded y de SDKAlfrescoRemote.



CREACION DE CONTENIDO CON ALFRESCO DESDE JAVA
Creamos una nueva clase llamada ClienteCrearContenido
Esta clase lee un archivo del disco, le coloca ciertas propiedades(aspectos) y lo sube al space llamado Primero, que le debimos crear previamente en Alfresco.


con el siguiente código:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.alfresco.repo.webservice.CMLUtil;
import org.alfresco.webservice.content.ContentServiceSoapBindingStub;
import org.alfresco.webservice.repository.UpdateResult;
import org.alfresco.webservice.types.CML;
import org.alfresco.webservice.types.CMLAddAspect;
import org.alfresco.webservice.types.CMLCreate;
import org.alfresco.webservice.types.ContentFormat;
import org.alfresco.webservice.types.NamedValue;
import org.alfresco.webservice.types.ParentReference;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.types.Store;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.Utils;
import org.alfresco.webservice.util.WebServiceFactory;

public class ClienteCrearContenido {

private static final String USERNAME = "admin";
private static final String PASSWORD = "root";
private static final String url = "http://localhost:8080/alfresco/api";
private static final String ruta = "/app:company_home/cm:Primero";
private static final String rutaDocumentoOriginal = "/home/santiago/DOC123.doc";
private static final String titulo = "ESTA ES UNA PRUEBA EN ALFRESCO";
private static final String descripcion = "ESTA ES UNA PRUEBA DE LA SUBIDA DE UN DOCUMENTO DESDE UNA APLICACION JAVA EN ALFRESCO";
public static void main(String[] args) throws Exception {
Long inicio = new Long(System.currentTimeMillis());
String nombreArchivoEnAlFresco = "DOC123"+inicio+".doc";
WebServiceFactory.setEndpointAddress(url);
AuthenticationUtils.startSession(USERNAME, PASSWORD);
try {
// Esta es una referencia al nodo donde se subirá el contenido
Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
ParentReference companyHomeParent = new ParentReference(storeRef,
null, ruta, Constants.ASSOC_CONTAINS, null);
// Asignamos un nombre para el nodo que vamos a crea en company_home
companyHomeParent.setChildName("cm:" + nombreArchivoEnAlFresco);
// Construcción del Nodo
NamedValue[] contentProps = new NamedValue[1];
contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME,
nombreArchivoEnAlFresco);
CMLCreate create = new CMLCreate("1", companyHomeParent, null,
null, null, Constants.TYPE_CONTENT, contentProps);
// Añadimos aspectos al nodo
NamedValue[] titledProps = new NamedValue[2];
titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE,
titulo);
titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION,
descripcion);
CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED,
titledProps, null, "1");
// Construccion de bloque CML
CML cml = new CML();
cml.setCreate(new CMLCreate[] { create });
cml.setAddAspect(new CMLAddAspect[] { addAspect });
// Creación y recuperación de contenido usando Web Services
UpdateResult[] result = WebServiceFactory.getRepositoryService()
.update(cml);
Reference content = result[0].getDestination();
// Creación del contenido
ContentServiceSoapBindingStub contentService = WebServiceFactory
.getContentService();
ContentFormat contentFormat = new ContentFormat(
"application/msword", "UTF-8");
contentService.write(content, Constants.PROP_CONTENT,
transformarBytes(rutaDocumentoOriginal), contentFormat);
} finally {
AuthenticationUtils.endSession();
}
AuthenticationUtils.endSession();
System.out.println("Tiempo de subida de archivo:"
+ (new Long(System.currentTimeMillis()) - inicio) + " MS");
}

private static byte[] transformarBytes(String ruta) {
byte[] b = null;
try {
File f = new File(ruta);
int length = (int) f.length();
b = new byte[length];
FileInputStream fin = new FileInputStream(f);
DataInputStream din = new DataInputStream(fin);
din.read(b);
} catch (Exception ex) {
ex.printStackTrace();
}
return b;
}
}



y si entramos al Space llamado Primero, encontraremos el archivo que subimos




CONSULTA DE CONTENIDO
Para este ejemplo vamos a crear un Space llamado ContenidoTXT en company_home.

En nuestro equipo vamos a crear un archivo de texto llamado mensaje.txt


Subimos este archivo en el space ContenidoTXT



Luego en Eclipse creamos una clase llamada ClienteConsulta, con el siguiente código fuente:
import org.alfresco.webservice.types.Predicate;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.content.Content;
import org.alfresco.webservice.content.ContentServiceSoapBindingStub;
import org.alfresco.webservice.types.Store;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.ContentUtils;
import org.alfresco.webservice.util.WebServiceFactory;

public class ClienteConsulta {

private static final String USERNAME = "admin";
private static final String PASSWORD = "root";
private static final String url = "http://localhost:8080/alfresco/api";
private static final String ruta = "/app:company_home/cm:ContenidoTXT/cm:mensaje.txt";


public static void main(String[] args) throws Exception {

WebServiceFactory.setEndpointAddress(url);
AuthenticationUtils.startSession(USERNAME, PASSWORD);
Store STORE = new Store(Constants.WORKSPACE_STORE, "SpacesStore");

// vamos a leer contenido del repositorio
ContentServiceSoapBindingStub contentService = WebServiceFactory
.getContentService();
Reference ref = new Reference();

ref.setStore(STORE);
//Podemos tambien usar el Uuid del documeto //ref.setUuid("3b5b8116-46c0-403f-a721-d3552eeb2cf0");
ref.setPath(ruta);
Content[] readResult = contentService.read(new Predicate(
new Reference[] { ref }, STORE, null), Constants.PROP_CONTENT);

System.out.println(readResult.length);
Content content = readResult[0];
System.out.println("Contenido:");
System.out.println(ContentUtils.getContentAsString(content));
System.out.println(content.getProperty());
System.out.println(content.getNode().getPath());
System.out.println(content.getUrl());
AuthenticationUtils.endSession();
}
}

Al ejecutar tenemos la siguiente salida:
1
Contenido:
ESTA ES UNA PRUEBA DE
UN ARCHIVO DE TEXTO SIMPLE
PARA PROBAR LA CONSULTA DE ARCHIVOS
DESDE ALFRESCO :)

{http://www.alfresco.org/model/content/1.0}content
/app:company_home/cm:ContenidoTXT/cm:mensaje.txt
http://localhost:8080/alfresco/download/direct/workspace/SpacesStore/fca946a9-b9dc-45b7-88b2-8492571c5016/mensaje.txt


BORRADO DE CONTENIDO
Vamos a borrar el mensaje.txt de el space ContenidoTXT, que hicimos en la sección anterior
Para borrar contenido debemos utilizar el siguiente código:

import org.alfresco.webservice.repository.QueryResult;
import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.repository.UpdateResult;
import org.alfresco.webservice.types.CML;
import org.alfresco.webservice.types.CMLDelete;
import org.alfresco.webservice.types.Predicate;
import org.alfresco.webservice.types.Query;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.types.ResultSet;
import org.alfresco.webservice.types.ResultSetRow;
import org.alfresco.webservice.types.Store;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.WebServiceFactory;

public class ClienteLimpiar {

private static final String USERNAME = "admin";
private static final String PASSWORD = "root";
private static final String url = "http://localhost:8080/alfresco/api";
private static final String ruta = "PATH:\"/app:company_home/cm:ContenidoTXT/cm:mensaje.txt\"";

/**
* @param args
*/
public static void main(String[] args) throws Exception {
String timeStamp = new Long(System.currentTimeMillis()).toString();
WebServiceFactory.setEndpointAddress(url);
AuthenticationUtils.startSession(USERNAME, PASSWORD);

try {
Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory
.getRepositoryService();
String queryString = ruta;
Query query = new Query(Constants.QUERY_LANG_LUCENE, queryString);
QueryResult queryResult = repositoryService.query(storeRef, query,
false);
ResultSet resultSet = queryResult.getResultSet();
ResultSetRow[] rows = resultSet.getRows();
if (rows != null) {
System.out.println("Encontradas " + rows.length
+ " coincidencias a borrar.");
CMLDelete[] deleteCMLArray = new CMLDelete[rows.length];
for (int index = 0; index < rows.length; index++) {
ResultSetRow row = rows[index];
deleteCMLArray[index] = new CMLDelete(new Predicate(
new Reference[] { new Reference(storeRef, row
.getNode().getId(), null) }, null, null));
}
CML cml = new CML();
cml.setDelete(deleteCMLArray);
UpdateResult[] results = WebServiceFactory
.getRepositoryService().update(cml);
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
AuthenticationUtils.endSession();
}
AuthenticationUtils.endSession();
}
}