Professional Documents
Culture Documents
Seguimiento de documentacin
Revisin : 1.0
Documentos relacionados: <se indican los documentos relacionados: Ejemplo Especificacin
Funcional, Especificacin de Diseo, Presupuesto>
Lista de distribucin: <se indican las personas a quienes se debe entregar copia del documento. Se
enviar siempre una copia a Servicios al Cliente, Calidad>
Fecha
01/12/2005
Paso
Redactor
Ejecut
Observaciones
Damian Maller
Autorizante
05/05/2008
Modificador
Alejandro
Albiero
Perez
Tratamiento Exceptions
Introduccin
Arquitectura de n-Capas
El Finnegans Application Framework (FAF) esta desarrollado utilizando una arquitectura de n-Capas, lo que nos permite
gran versatilidad y escalabilidad.
El cliente puede ser tanto un cliente fino (Internet browser) que accede a la aplicacin a travs de un web Server, como un
cliente grueso (Fat client) accediendo directamente al FAF, utilizando los mismos recursos pero en una interfaz rica.
El middle tier esta compuesto por el Web Server y por el servidor de aplicaciones. Estas funciones pueden estar albergadas
en el mismo equipo o en varios, incluso el servidor de aplicaciones y Web Server, pueden federarse en varios equipos,
permitiendo una gran escalabilidad.
La capa de datos (Data Server) puede ser cualquier base de datos transaccional (MS Sql Server, Oracle, IBM DB2, etc.) que
cumpla con el estndar SQL ANSI 92.
Pero el FAF no se detiene all, sino que tambin puede interactuar con cualquier data source externo para mostrar o
actualizar informacin y tambin con cualquier otro sistema (cualquiera sea) a travs de un repositorio XML que comparten
ambas aplicaciones y es administrado por el framework.
Web Server
El Web Server actua como conector entre el browser y el framework. Para realizar esta funcin se basa en varios pilares
que se ocupan de generar el cdigo HTML (combinado con CSS y funciones de JavaScript) basndose en definiciones
abstractas intermedias, almacenadas en XML en el servidor.
Esta estructura permite la generacin de diferente cdigo, segn el cliente que lo acceda y tambin estar preparado para
futuras tecnologas en la presentacin de datos.
Soporte Multilenguaje
Este modulo es el responsable de la administracin de los diferentes lenguajes en el front-end HTML.
El framework soporta ilimitada cantidad de lenguajes. Cada lenguaje tiene configurado su diccionario que puede ser
modificado en run-time por el usuario de la aplicacin. Cada usuario puede ingresar al sistema utilizando su propio
lenguaje, es decir que una empresa distribuida globalmente puede permitir a sus usuarios utilizar el sistema en su lenguaje
de origen.
DynamicForm
Los formularios que utiliza el framework para dar de alta, modificar o eliminar registros es generado dinmicamente en
run-time, tomando su estructura de archivo XML que define los elementos de la interfaz (llamados widgets) y su vinculacin
con una clase de la lgica de negocios.
El DynamicForm, permite al implementador o desarrollador realizar cambios en la interfaz sin modificar la lgica de
negocios y concentrando su tarea en la resolucin del problema.
Tambin permite tener mltiples interfaces, personalizada para cada usuario o sector, para una misma entidad en la lgica
de negocios.
La integridad de los datos nunca es comprometida, ya que estos son controlados por la clase de negocios que administra el
formulario y solo son ingresados en la base de datos si estn conformes a la lgica de negocios.
Otras
prestaciones destacadas:
Soporte de carga de datos mltiples de lnea sin recarga de la pgina
Soporte de mltiples solapas
Multilenguaje
Bsqueda e impresin de registros.
Validacin de datos en el servidor y en cliente
Acciones adicionales
Pre-validacin y auto-completar de datos
FAFReport
Los informes son mostrados al cliente utilizando el FAFreport. Esta herramienta permite manipular la informacin
permitiendo filtrarla, agruparla, ordenarla, graficarla, resumirla, etc.
Los esquemas de los informes son almacenados tambin en formato XML, brindando la posibilidad de realizar cambios al
usuario, modificando los filtros, columnas o formatos y dejando esta configuracin almacenada, para un uso futuro.
WebParts
Las WebParts, son porciones de pantalla que pueden albergar en su interior otros WebParts o algn otro tem como un
FAFReport, un DynamicForm, un link, un grafico, etc.
Esta funcionalidad nos permite crear paneles con mltiple informacin relacionada (por ejemplo Paneles de Control),
configurada directamente por el usuario.
Los WebParts pueden estar relacionados entre si, para dar informacin en forma sincronizada.
Widgets
Los Widgets son porciones pequeas de software que tiene como funcionalidad capturar informacin ingresada por el
usuario. Los widgets pueden ser referenciados por otros elementos de la interfaz para crear formularios de ingreso de
datos (por ejemplo DynamicForm).
Encapsulamiento
Al abstraer la creacin de los formularios del cdigo fuente HTML, permite crear fcilmente interfaces complejas que
pueden ir evolucionando en futuras versiones, enriqueciendo toda la aplicacin.
Cada widget es responsable de mostrar la informacin en pantalla, en la superficie que se le asigna y de capturarla
nuevamente, una vez que esta es modificada.
Lgica de la aplicacin
El framework brinda la estructura y servicios de base a la aplicacin que hostea, permitiendo a esta solo focalizarse en el
problema a resolver y dejar que el framework resuelva las tareas comunes, como acceso a la base de datos, auditoria de
accesos, seguridad, etc.
Facade
Es la puerta de entrada a la lgica de negocios de la aplicacin y a las herramientas del framework
Cada llamada es analizada para determinar si fue solicitada desde un cliente autentificado y si ese cliente tiene permisos
suficientes para ejecutar la operacin.
Gestor de Sesiones
Cada ingreso a la aplicacin es validada por las polticas de seguridad y posteriormente es administrada por el Gestor de
sesiones. Este gestor permite determinar los clientes que se encuentran conectados, desconectarlos, crear reglas de
permiso de conexin, etc.
Seguridad
La seguridad esta basada en roles y prestaciones. El administrador del sistema puede decidir, de manera muy atmica, los
permisos que tendr cada uno de los roles y los usuarios.
Personalizacin
El motor de personalizacin permite a cada usuario guardar el esquema en el cual desea ver la informacin como as
tambin el estilo de visualizacin de la misma.
Auditoria
Los procesos de negocio son auditados con el nivel de detalle que requiera el administrador del mismo. Esta auditoria
permite conocer en detalle que operaciones fueron realizadas por cada usuario en un periodo de fecha determinado.
Gestor de errores
Una administracin cuidadosa de los errores es muy importante durante el ciclo de vida del sistema. Los errores son
calificados en dos tipos: funcionales y operativos
Funcionales: Son aquellos errores que son arrojados por el sistema al no cumplirse alguna regla del negocio. Estos errores
son predecibles y controlados.
Operativos: Son errores que no esperan y que son arrojados por alguna anormalidad en el software o en los sistemas de
base (Sistema operativo, hardware, base de datos, etc.)
Messaging Services
Estos servicios encapsulan los diferentes servicios de mensajeria (email, SMS, fax, etc) y brindan un modelo nico y sencillo
de acceder a estos servicios.
Multilenguaje
El framework soporta ilimitada cantidad de lenguajes. Cada lenguaje tiene configurado su diccionario que puede ser
modificado en run-time por el usuario de la aplicacin. Cada usuario puede ingresar al sistema utilizando su propio
lenguaje, es decir que una empresa distribuida globalmente puede permitir a sus usuarios utilizar el sistema en su lenguaje
de origen.
Plataforma
El framework est desarrollado en Java, por lo que es multiplataforma. Para el desarrollo se eligi a Eclipse como IDE de
desarrollo, con la extensin de MyEclipse para mayor flexibilidad y poder de desarrollo.
Base de datos
El framework est pensado para soportar mltiples bases de datos, para ello la solucin provee una serie de
herramientas que nos va a permitir acceder a los datos independientemente del motor de base de datos que se est
utilizando.
Diccionario de Datos
Un concepto importante es el del Diccionario de Datos. Mediante el diccionario de datos se podrn definir el mapeo
entre una tabla y la clase que la representa y permitir definir el origen de datos del cual tomar la informacin. Adems
ser posible agregar campos adicionales en tiempo de ejecucin, sin necesidad de tener que recompilar nada, siendo esta
una caracterstica muy importante para el desarrollo rpido de aplicaciones, ya que muchos campos sern agregados
dinmicamente por un implementador.
Cada una de las empresas estar asociada a un origen de datos, de esta manera, se podr configurar cada entrada en
el diccionario de datos dependiendo de la empresa a la que se quiera acceder. Esta abstraccin es importante ya que no
estamos ligando una prestacin a una base de datos en particular, de esta manera, podemos hacer que la empresa apunte
a otra base de datos y la aplicacin tomar los datos de el nuevo origen sin necesidad de hacer otros cambios. Adems es
posible tener prestaciones que tomen los datos de diferentes empresas, lo que nos permitira por ej. Ver un reporte de la
empresa A y dentro de la misma aplicacin, poder editar los empleados de la empresa B.
Query Builder
El mecanismo para efectuar consultas a la base de datos es a travs del query builder, sta es una clase que nos va a
permitir componer una sentencia sql para su posterior ejecucin sin que nos estemos ligando a un proveedor de base de
datos en especial.
ste es un ejemplo de una consulta usando el query builder:
import
import
import
import
java.sql.ResultSet;
java.sql.Types;
java.sql.PreparedStatement;
faf.app.base.data.db.iface.QueryBuilder;
dbh = DBHelperManager.getInstance().getDBHelper(session.getEmpresaDatos());
qb = dbh.getNewQueryBuilder();
qb.addField("Codigo");
qb.addField("Nombre");
qb.addTable("Producto");
PreparedStatement prep = qb.getSelectStatement();
ResultSet rs = prep.executeQuery();
FAFDataEngine y FAFDataSet
Un FAFDataSet es una abstraccin de un Resultset, que nos va a permitir buscar elementos dentro del conjunto de datos,
agrupar, sumarizar, paginar, etc.
Al crear un FAFDataSet se deber indicar la clase y el mtodo que conformarn el origen de los datos y luego el
FAFDataEngine ser el encargado de ejecutar dicho mtodo y llenar de el FAFDataSet.
FafDataSetVO dataSet = new FafDataSetVO("faf.client.Tree","getHojas");
dataSet.setSessionID(sessionID);
Collection fields = new Vector();
FieldVO fieldID = new FieldVO("ID","system","","ID",true);
fields.add(fieldID);
FieldVO fieldName = new FieldVO("Nombre","visible","","Nombre ",false);
fieldName.setURL("FAF:JAVASCRIPT:opener.document.form1:ID;ID");
fields.add(fieldName);
dataSet.setFields(fields);
dataSet.execute();
Para obtener ms informacin acerca de sta o mas clases ver la documentacin completa de las clases del framework.
Interoperabilidad
El framework permite que las aplicaciones montadas sobre l operen con otros sistemas, sin importar la naturaleza de
los mismos. Es decir, podemos construir una aplicacin que interacte con un sistema hecho en Clipper, Visual Basic, C#,
Cobol, etc. Y a su vez que resida en un servidor Windows, Unix, una Palm, etc.
Hay cuatro modelos de interoperabilidad que describiremos brevemente:
1.
2.
El modelo de Interoperabilidad basado en XML: nuestra aplicacin genera un archivo XML con la informacin
que se desea grabar, siendo tarea del otro sistema leer el XML y guardar los datos.
Conexin con otros sistemas a travs de XML: la comunicacin se realiza por medio de web-services
utilizando xml para transportar la informacin.
3.
4.
Conexin directa con bases de datos de otros sistemas: en este mtodo se accede directamente a la base
de datos del otro sistema.
Interoperabilidad COM: la comunicacin se realiza por medio de una dll, que ser la encargada de tomar los
datos de nuestra aplicacin y operar con el sistema en cuestin.
Funcionamiento general
Round-trip de una llamada al servidor
Sesiones de usuarios
Seguridad
TransaccionVO
EntidadVO
EntidadPrimariaVO
AtributoVO
EntidadSecundariaVO
ForeignKeyVO
ParentVO
EntidadHLP
EntidadVO: Es la clase que se encarga de mapear la estructura de la tabla en la base de datos con la representacin en
Java. Bsicamente definir a los atributos junto con las operaciones para acceder a los mismos.
PrimaryKey: Es una abstraccin de una PrimaryKey.
AtributoVO: Esta clase sirve para representar a un atributo de la entidad.
algunos
atributos
que
son
generales
para
cualquier
entidad,
como
TransaccionVO: Define atributos propios de una transaccin, como Fecha, Nmero Interno, Comprobante, Observaciones,
etc.
EntidadSecundariaVO: Se utiliza para representar listas de entidades que formarn parte de otras entidades. Por ejemplo
si tenemos la clase Persona y queremos asociarle una lista de telfonos, debemos definir la clase TelefonoVO como una
entidad secundaria.
ParentVO: Se utiliza para vincular a la entidad secundaria con la entidad primaria que la contiene.
EntidadHLP: Es la otra clase clave en el modelo. Se encarga de operar sobre las entidades, e implementar las operaciones
para crear, modificar, borrar, buscar, etc.
Para crear una entidad sencilla, por ejemplo Provincia, es necesario construir dos clases: ProvinciaVO y ProvinciaHLP.
ProvinciaVO definir el mapeo de la clase con la estructura de la tabla, mientras que la clase helper ProvinciaHLP tendr
los mtodos que trabajan sobre los datos, como por ejemplo, buscar, crear, modificar, listar, etc. Siempre que hablemos de
una entidad tenemos que tener presentes estas dos clases, la clase VO y la clase Helper.
Por ejemplo, para construir la clase ProvinciaVO deberamos hacer algo como:
public class ProvinciaVO extends EntidadPrimariaVO implements Serializable {
public ProvinciaVO(String sessionID) throws FunctionalException {
//Se envia el identificador de la pk y el nombreFisico
super("ProvinciaID", "Provincia", sessionID);
try {
atributosPropios.add(new AtributoVO(20,"PaisId", "Pais", new FafInteger(),
"", true, new ForeignKeyVO("PaisID", "Nombre", "Pais"),false, true));
} catch (Exception e) {
ExceptionUtil.write(e);
throw new FunctionalException();
}
}
. . .
Ntese que el mtodo constructor deber recibir el identificador de la sesin en curso.
Se deben generar as mismo, los correspondientes mtodos setters y getters para la clase en cuestin, dichos mtodos son
utilizados para interactuar con los atributos propios de la clase definidos previamente.
. . .
public Integer getPaisId() {
return Integer.valueOf( atributosPropios.getAtributo("PaisID").getValor().toString());
}
public ForeignKeyVO getPais() {
return atributosPropios.getAtributo("PaisID").getForeignKey();
}
public String getPaisNombre() {
return atributosPropios.getAtributo("PaisID").getForeignKey().getNombre();
}
public void setPaisId(Integer newId) {
try {
atributosPropios.setAtributo("PaisID", newId);
} catch (Exception e) {
ExceptionUtil.write(e);
}
}
public void setPaisNombre(String newNom) {
try {
AtributoVO atrib = atributosPropios.getAtributo("PaisID");
ForeignKeyVO fk = atrib.getForeignKey();
fk.setNombre(newNom);
atrib.setForeignKey(fk);
atributosPropios.setAtributo("PaisID", atrib);
} catch (Exception e) {
ExceptionUtil.write(e);
}
}
. . .
Ahora bien, supongamos que estamos construyendo la entidad Persona y deseamos que tenga una lista de telfonos. Para
ello necesitamos crear la entidad Telfono, pero la definiremos como una entidad secundaria.
public class TelefonoVO extends EntidadSecundariaVO implements Serializable {
public TelefonoVO(String sessionID)throws FunctionalException {
super(null, "Telefono", sessionID, new ParentVO("PersonaID", "Persona", "PersonaID"));
try {
atributosPropios.add(new AtributoVO("PersonaID",
FafInteger(),true, false, true));
"PersonaID",
new
Facade
La interaccin entre el framework y los clientes, se realiza a travs del facade o los facade, es decir los facade son la
puerta de entrada al framework, siendo necesario para un correcto funcionamiento que el facade defina los mtodos
necesarios para negociar, con los clientes.
Aqu representaremos con un ejemplo sencillo como agregar un nuevo mtodo al facade, teniendo especial cuidado en
esta etapa, dado que el facade se compone de 3 archivos.
Ahora bien, supongamos para nuestro ejemplo que deseamos agregar un mtodo al facade que nos devuelva la suma de 2
cantidades enteras.
Es decir definiremos el mtodo suma(int a, int b) : int
Un bean en este caso se compone de los siguientes archivos.
ejb-jar.xml
- Xml de configuracin del bean.
NombreBeanEJB.java -Definicin de los mtodos
NombreBeanEJBBean.java -Implementacin de los mtodos.
NombreBeanEJBHome.java -Inteface Home del Bean.
1) Archivo ejb-jar.xml
Un ejemplo de dicho archivo puede ser el siguiente:
<?xml version = '1.0' encoding = 'windows-1252'?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<description>Session Bean ( Stateless )</description>
<display-name>NombreBeanEJB</display-name>
<ejb-name>NombreBeanEJB</ejb-name>
<home>faf.app.resources.facade.NombreBeanEJBHome</home>
<remote>faf.app.resources.facade.NombreBeanEJB </remote>
<ejb-class>faf.app.resources.facade.impl.NombreBeanEJBBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
2) Archivo NombreBeanEJB.java
Dicho archivo es la interfaz remota, es donde definimos los mtodos que se dejarn acceder por los clientes, es decir que
en nuestro ejemplo aqu deberamos agregar una lnea como la siguiente:
3) Archivo NombreBeanEJBBean.java
Dicho archivo es donde implementamos los mtodos que previamente agregamos en el archivo de interfaz, en nuestro caso
agregaramos una definicin del mtodo suma de la siguiente manera:
4) Archivo NombreBeanEJBHome.java
Dicho archivo es la interfaz home de la bean, es donde se tienen los mtodos que son propios de la bean tales como create.
Es decir en dicho archivo se pueden encontrar mtodos como el siguiente:
Sesiones
Modelo de sesiones
Tiempo de vida
Encriptacin
Seguridad
El framework provee un modelo de seguridad por prestaciones basado en usuarios y roles.
Un usuario puede pertenecer a uno o mas roles. De esta manera, es posible, para una prestacin dada, asignar permisos a
algunos usuarios en particular o bien a uno o ms roles.
Existen cuatro polticas de seguridad bsicas:
Auditoria
Seguimiento de una transaccin
Modelo de datos
Errores
Diferentes tipos de errores
Manipulacin de errores
Multilenguaje
Cdigos de lenguaje
Como manipular los mensajes del framework en multiples lenguajes
Creacin de nuevos mensajes
Framework Web
Introduccin
Arquitectura global
Manejo de estilos a travs de CSS
Multilenguaje
Mensajes propios de la UI son administrados por el framework Web
Manejos de lenguaje en formularios, informes y paginas ad hoc
Widgets
Un widget es una abstraccin de un componente de una ventana. Actualmente tenemos implementados los siguientes
widgets:
WidgetButton
WidgetTextBox
WidgetCheckBox
WidgetSelectBox
WidgetMemo
WidgetFecha
WidgetSelector
WidgetLine
WidgetButtonServerAction
WidgetPassword
WidgetSelectorTree
Un widget puede tener diferentes implementaciones, por ejemplo, puede tener una implementacion HTML y otra utilizando
AWT, pero la idea es que a un widget siempre le vamos a poder asignar o pedir su valor. A su vez, un widget puede tener
acciones asociadas, que servirn para efectuar las validaciones que sean necesarias del lado del cliente.
Las propiedades mas comunes de los widgets son las siguientes:
Propiedad
Descripcin
Name
Type
Tipo de widget
ClassProperty
JavaType
Visible
ReadOnly
Required
Cols
Numero de columna
Rows
Numero de fila
Caption
OnEnter
OnExit
Value
FillMethodType
FillMethodOptions
ExtraProperties
En el caso de los selectores es el codigo de la entrada en el diccionario de datos del selector que
se desea ver.
Ahora vamos a ver una definicin XML correspondiente a un widget cualquiera, para ver cuales son las propiedades
comunes que tienen, y analizar su uso. Un widget no necesita estar representado por un XML, pero este ejemplo nos ser
til mas adelante, para definir formularios basados en widgets, en el que s estarn definidos por un XML.
<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
Definicin XML de un widget.
DynamicForm
Para implementar un formulario el framework nos provee del DynamicForm.
El DynamicForm toma una definicin de un XML y genera una interfaz basada en solapas y widgets.
El DynamicForm es esencial cuando queremos implementar la interfaz para un ABM, en este caso la definicin del XML se
asemeja a un mapeo de los atributos de la entidad con la que estamos trabajando, es decir, cada uno de los widgets de la
intefaz corresponder a un atributo de la entidad. En este caso podramos hablar de un EntityForm (Los trminos
DinamicForm y EntityForm se utilizarn indistintamente cuando estemos hablando de DinamicForms de entidades), sin
embargo, un DinamicForm no necesariamente tiene que estar ligado a una entidad, por lo que se transforma en una
herramienta poderosa para crear pginas adhoc con la simple definicin de un XML.
En el caso de un EntityForm, tendr asociada una Toolbar con las acciones tpicas que se pueden aplicar sobre una entidad.
Adems existe la posibilidad de agregar acciones adicionales.
<widgetTab name="General">
Y agregamos nuestro primer widget, que representa la primarykey de la entidad:
<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
Ahora agregamos un widget para definir el cdigo:
<widget
name="Nombre"
type="WidgetTextBox"
classProperty="nombre"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="true"
cols="1"
rows="1"
operation=""
caption="Nombre:SP;Name:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
de la misma manera definimos los widgets para el cdigo, activo y descripcin, finalmente, cerramos los tags de la solapa y
el formulario:
</widgetTab>
</widgetForm>
El EntityForm tambin permite generar un HTML con formato imprimible, presionando el botn Imprimir desde la toolbar.
Por Ejemplo:
Impresin de un Laboreo.
Pintado del dinamicForm
DinamicForm.js
editor.jsp
Toolbar
DinamicFormVO
XMLParser
DinamicForm.java
ActionRefresh
Tab
Widget
openWindowInLine
Crea
Obtiene
parse(xml)
execute
doIt
getHTML
*getHtml
*getHtml
FAFReport
El FAFReport o WebReport, provee la implementacin HTML de una grilla, y se usa principalmente para generar reportes o
para listar tems antes de su edicin.
El FAFReport puede utilizar una definicin XML para dar formato a la vista. En esta definicin se pueden establecer las
columnas a mostrar, el ttulo de las columnas (soporta multilenguaje), las agrupaciones, sumarizaciones, grficos, etc.
Por ejemplo, una definicin sencilla sera:
<?xml version = '1.0' encoding = 'windows-1252' ?>
<root name="default">
<fields>
<field
name="Nombre"
type="visible"
url="FAF:EDIT:EstablecimientoVO:establecimiento;primaryKey=LF_ID"
caption="Nombre:SP;Name:EN" order ="1" />
<field name="Codigo" type="visible" order ="3" caption="Codigo:SP;Code:EN"/>
<field name="Calle" type="visible" order ="4" caption="Calle:SP;Street:EN"/>
<field name="CalleNumero" type="visible" order ="5" caption="Numero:SP;Number:EN"/>
<field name="Localidad" type="visible" order ="6"caption="Localidad:SP;Place:EN"/>
<field name="CodPostal" type="visible" order ="7" caption="Cod. Postal:SP;Zip:EN"/>
<field name="Provincia" type="visible" order ="8" caption="Provincia:SP;Province:EN"/>
<field name="Superficie" type="visible" order ="9"caption="Superficie:SP;Surface:EN"/>
<field name="CentroCosto" type="visible" order ="10" caption="Centro Costo:SP;Cost
Centre:EN"/>
<field name="LF_ID" type="system" order ="11" caption="ID:SP;ID:EN"/>
</fields>
<chartInfo title="Establecimientos" ancho="600" alto="400">
<col1 name="NOMBRE"/>
<col2 name="SUPERFICIE"/>
</chartInfo>
</root>
Y el FAFReport resultante es:
En la barra inferior, se muestran las acciones adicionales, configuradas en el AppItem. Como en este caso estamos listando
una entidad, automticamente aparecen las acciones de Borrar y Nuevo. Adems si el FAFReport lista entidades, se
mostrarn checks para poder marcar varias filas, y de esta forma, ejecutar acciones sobre varias entidades.
Si observamos nuevamente el FAFReport, podemos ver que el nombre del establecimiento es un link, al entrar al mismo nos
conduce al EntityForm asociado:
<groupsBy>
<groupBy name="Centro_de_Costo" type="" />
</groupsBy>
<summaries>
<summary name="Movimiento" type="SUM" />
</summaries>
Adems es posible agregarle parmetros al FAFReport, para poder filtrar los datos a mostrar. Los parmetros se deben
configurar en la definicin del AppItem.
Veamos un ejemplo:
Explotacin de grillas
Es posible definir que, al hacer clic sobre una grilla de un webReport, la aplicacin se dirija a una vista de destino
pasndole automticamente:
1)
2)
Los valores de ciertos campos de fila de la grilla sobre la cual se hizo clic. Dichos campos son definidos por el usuario,
junto al nombre con el cual desea que cada uno de ellos llegue a la vista de destino.
La vista de destino recibir estos parmetros. En caso de que la misma posea parmetros con el mismo nombre de los
enviados, entonces los parmetros de esta vista adquirirn el valor de los parmetros pasados desde la vista de origen.
Veamos un ejemplo de definicin de XML de webReport:
<?xml version = '1.0' encoding = 'windows-1252'?>
<root name='default' allowGroups='true' hidePageNumbers='false' captionGeneralSummary='TOTAL
GENERAL' maxRows='20' showCheckBoxes='true' printOrientation='Portrait' linkedView="206">
<fields>
<field name="TRANSACCIONTIPONOMBRE" type="NOTVISIBLE" width="50" order="0" caption="Tipo"
printable="true"
mask=""
truncable="true"
url="FAF:EDIT:OperacionVO:operacion;primaryKey=TransaccionId"/>
<field name="NUMEROINTERNO" type="NOTVISIBLE" width="50" order="0" caption="Nmero Interno"
printable="true" mask="" truncable="true"/>
<field name="FECHA" type="VISIBLE" width="50" order="3" caption="Fecha" printable="true"
mask="" truncable="false"/>
<field
name="DESCRIPCION"
type="VISIBLE"
width="50"
order="7"
caption="Descripcin"
printable="true" mask="" truncable="true" linkedParameter="Desc"/>
<field
name="NUMERODOCUMENTO"
type="VISIBLE"
width="50"
order="5"
caption="Nmero
Comprobante"
printable="true"
mask=""
truncable="true"
url="FAF:EDIT:OperacionVO:operacion;primaryKey=TransaccionId"/>
<field
name="ORGANIZACIONNOMBRE"
type="VISIBLE"
printable="false" mask="" truncable="true"/>
</fields>
.
.
. Etc.
width="0"
order="6"
caption="Cliente"
Lo importante aqu son dos cosas, las cuales en el ejemplo estn marcadas en negrita:
1) El atributo linkedView del tag root, el cual indica el id de la vista a la cual la aplicacin se dirigir al hacer clic
sobre una fila de la grilla.
2) El atributo linkedParameter en cada uno de los fields cuyo valor deseamos trasladar a la vista de destino. El valor
de este atributo ser el nombre del parmetro de la vista de destino para el cual queremos que tome como valor el
valor de este field.
Si no creamos una entrada en el diccionario de datos, el SP SP_Presupuestos ser buscado y ejecutado en el datasource
de la empresa logueada.
Para definir un datasource distinto, deberemos creer una entrada en el diccionario de datos como por ejemplo la siguiente:
Lo importante aqu es que el campo Nombre clase de la entrada del diccionario de datos coincida con el campo
Metodo de la view. De este modo, segn el ejemplo, el SP ser buscado y ejecutado en el origen de datos BSA2.
Como puede apreciarse, no es necesario definir una referencia a un diccionario de datos determinado en la view, como as
tampoco es necesario definir el campo Nombre Tabla en el diccionario.
Web Chart
Este proyecto se encarga de la generacin de grficos. Para la impresin de los grficos se utilizan objetos flash,
provistos por www.fusioncharts.com
La clase principal de ste mdulo es FAFChart, que implementa el mtodo getHtml, que dado un FAFDataset y las
columnas a graficar, devuelve el cdigo html del grfico generado.
FafChart
FactoryCharts
+
getChart(String) : FafChart
titulo: String
request: HttpServletRequest
ancho: int
alto: int
dataset: FafDataSetVO = null
column1: String
column2: String
+*
+
+
#
#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
PieChart3D
+
AreaChart
PieChart
BarChart
+
LineChart
+
Contenido Web
BarChart3D
+
La funcin de este mdulo es la de mostrar contenidos (artculos, notas, videos de youTube, blogs, etc) Los
contenidos se administran a travs de la clase ContenidoVO y ContenidoHLP de openFrame, y se almacenan en las tablas
FAFContenido, FAFContenidoArchivos y FAFContenidosRelacionados.
Existe adems el concepto de Canal que identifica a una view de tipo ContentView. Los contenidos se asocian a un
canal principal y a posibles canales relacionados. Por ejmplo, podemos tener un Contenido que sea una noticia, que est
asociado a un canal novedades home y a los canales novedades Ceres y novedades Agropuerto.
Los contenidos se cargan desde el administrador de contenidos, cuando se guardan, se genera un xml con la
informacin de dicho contenido y se guarda en un campo de la tabla FAFContenido.
Ya que la visualizacin de un contenido, es muy dinmica y depende del tipo de contenido que se est mostrando,
estilos del sitio, etc. se utiliza un XSLT para transformar el xml que representa al contenido (el que se guarda en el
campo de FAFContenido) en cdigo HTML. Este XSL se configura en el xml de la vista (o canal) correspondiente. Se
utilizan dos XSL, uno para mostrar un contenido en forma completa (la noticia entera) y otro para mostrar una lista de
contenidos (TOP 5 de noticias por ej)
Indicador Web
Los Indicadores (gauges) son componentes grficos que permiten mapear un valor dentro de una escala definida. La
implementacin es bastante parecida a la de los grficos, y se utiliza una solucin provista por el mismo fabricante
www.fusioncharts.com
La clase IndicadorVO (Framework) representa a la entidad indicador, que se mapea con la tabla FAFIndicador.
Bsicamente lo que definimos en el indicador es indicar un mecanismo para obtener un valor, que luego se mapear en
una escala.
Cuando definimos el indicador, podemos decir que el valor del mismo estar dado por una constante, la ejecucin de
un mtodo, o un stored procedure. En el caso de que se trate de stos dos ltimos, se podrn indicar parmetros.
Cuando se define una view de tipo Gauge, se debe indicar que indicador tendr asociado.
Hay tres tipos de indicadores: Velocmetros, Semforos y Termmetros. Una view de tipo Indicador, tiene un xml de
configuracin asociado a la vista, donde se configuran las escalas, el tipo de indicador a mostrar, etc.
Un ejemplo de un xml para una vista de tipo indicador es:
<Indicador>
<Config Nombre="Rentabilidad Resultados Operativos/Capital de Trabajo"
="4" Tipo ="Velocimetro" Accion ="openAppItem(33)" NumberSuffix=" "/>
Valor_Estandar
<Escalas>
<Escala name="Horrible" Desde="0" Hasta="15" Image="" Status="Critical"/>
<Escala name ="Cuidado!" Desde="15" Hasta="20" Image="" Status="Warning"/>
<Escala name="Ok" Desde="20" Hasta="50" Image="" Status="Low"/>
</Escalas>
</Indicador>
model::EscalaVO
Indicador
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
Indicador(IndicadorVO)
getAplicacion() : String
setAplicacion(String) : void
getConfig() : HashMap
setConfig(Collection) : void
isAutoRefresh() : boolean
setAutoRefresh(boolean) : void
getEmpresa() : String
setEmpresa(String) : void
getEscalas() : Collection
setEscalas(Collection) : void
getFacade() : Object
setFacade(Object) : void
getFormDefinition() : String
setFormDefinition(String) : void
getFormName() : String
setFormName(String) : void
getIdioma() : String
setIdioma(String) : void
getSessionID() : String
setSessionID(String) : void
getSessionIDExterna() : String
setSessionIDExterna(String) : void
getUserLogicViewList() : HashMap
setUserLogicViewList(HashMap) : void
getUserViewList() : Collection
setUserViewList(Collection) : void
getViewID() : String
setViewID(String) : void
getHashRequest() : HashMap
setHashRequest() : void
getOutput() : PrintWriter
setOutput(PrintWriter) : void
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
getResponse() : HttpServletResponse
setResponse(HttpServletResponse) : void
getHtml() : String
getData() : HashMap
setData(Collection) : void
+
+
+
+
+
+
+
getImage() : String
setImage(String) : void
getNombre() : String
setNombre(String) : void
getStatus() : String
setStatus(String) : void
compareTo(EscalaVO, EscalaVO) : Integer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
model::IndicadorVO
*
helper::IndicadorHLP
+
+
+
+
setFormDefinition(String) : void
getFormDefinition() : String
getIndicadorData(FAFContentEJB, HttpServletRequest, HttpServletResponse, String, PrintWriter, long) : IndicadorVO
processException(HttpServletRequest, PrintWriter, Exception) : void
Gauge
-
escala: EscalaVO
valor: String
escalas: Collection
statusColor: HashMap
config: HashMap
+
+*
+
+
+
+
+
+
#
#
+
+
+
+
Velocimetro
Semaforo
Termometro
+
+
-
+
+
-
+
+
-
parsear el xml de la vista, para obtener la configuracin de las escalas, tipo de gauge, etc.
Obtener el valor asociado al indicador, desde el mtodo, sp u constante correspondiente.
Obtener una instancia del gauge correspondiente (Velocmetro, Semforo, Termmetro) y llamar al mtodo
para pintarlo, pasandole el valor a mapear y las escalas.
Definir la entrada de tipo clase en el diccionario de datos, indicando: clase VO, nombre de tabla, origen de
datos y los atributos adicionales.
Agregar el campo a la tabla por SQL.
Agregar el widget al XML usando el nombre del campo como classProperty.
JasperReports
El FAFReport es una alternativa para mostrar reportes, sin embargo puede haber algunos casos en el que se necesite mas
poder a la hora de generar un reporte, como por ejemplo, la impresin de un balance. Para ello es posible armar un
reporte utilizando la herramienta Jasper Reports e invocarlo desde la aplicacin.
El formato de este tipo de reportes queda almacenado en un XML, que puede generarse utilizando alguna herramienta para
editar reportes Jasper, como por ejemplo iReport o Jasper Assistant.
Estos reportes tomarn los datos desde un CustomDatasource, de esta manera ser posible mostrar informacin que est
almacenada en una base de datos, un archivo XML, etc.
Veamos un ejemplo de cmo implementar un reporte sencillo, para ello es necesario definir una clase que obtenga los
datos a mostrar.
package app.ceres.reportes;
import
import
import
import
import
import
import
import
import
import
import
import
java.sql.ResultSet;
java.sql.*;
faf.app.base.security.session.SessionHLP;
faf.app.base.security.session.model.SessionVO;
java.util.Collection;
java.util.Hashtable;
java.util.Map;
java.util.Vector;
faf.app.base.data.db.DBHelperManager;
faf.app.base.data.db.iface.DBHelper;
faf.app.base.data.db.iface.QueryBuilder;
faf.app.base.exceptions.FunctionalException;
parameters)
throws
ps = qb.getSelectStatement();
rs = ps.executeQuery();
datos = new Vector();
for (;rs.next();){
Hashtable registro = new Hashtable();
for (int i=1;i<=rs.getMetaData().getColumnCount();i++){
String col = rs.getMetaData().getColumnName(i).toUpperCase();
String valor = rs.getString(i);
if (valor==null) valor = "sin asignar";
registro.put( col,valor);
}
datos.add(registro);
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
return datos;
}
}
Ntese que fue necesario definir el mtodo getData() para obtener la coleccin que contendr la informacin a
mostrar. En esta implementacin en particular tomamos la informacin desde la base de datos, pero podramos haberla
tomado desde un archivo, o cargar la coleccin con datos generados en runtime por algn proceso especfico.
Luego es necesario crear un XML que describa el diseo del reporte. En este punto se puede utilizar alguna
herramienta como iReports o Jasper Assistant para facilitar el diseo del mismo.
Nota: es necesario que el XML se llame igual que la clase, por ej. Para la clase EstablecimientosDS el XML debera
llamarse EstablecimientosDS.jrxml
Finalmente, es necesario ver cmo le indicamos al Framework que muestre el reporte. Para ello debemos hacer dos
cosas:
Crear una entrada en el diccionario de datos configurando el origen de datos segn corresponda.
AppItems
Un AppItem es una abstraccin de una prestacin del sistema. Los AppItems se pueden categorizar dependiendo del tipo de
presentacin:
Vista: muestra un FAFReport. Se utiliza mas que nada para la generacin de ABMs y reportes.
Link Interno: carga una pgina dentro del dominio de la aplicacin. Algunas veces es necesario armar alguna
pgina adhoc dentro de la aplicacin, para poder acceder a esa pgina se debe configurar el appitem como
Link Interno.
WebPart: sirve para combinar varios appItems, de forma tal que en una misma pantalla podamos ver, por
ejemplo, un FAFReport, un reporte, y una pagina web.
Report: muestra un reporte jasper. Cuando se tiene un reporte complejo, y que no se desea analizar el
resultado en una grilla, podemos construir un reporte jasper que tendr mas potencia para realizar saltos de
pginas, frmulas, sumarizaciones, etc.
Campos generales
En la primer solapa se carga la informacin general de un AppItem. Veamos con mayor detalle algunos de los campos:
Tipo de Presentacin: Se deber elegir entre algunos de los tipos anteriormente mencionados.
Mtodo: Indica el origen de los datos. En el caso de los AppItems de tipo Link o Report, es el mtodo que se ejecutar para
obtener la informacin a mostrar. Para los dems tipos, indica la pgina que se desea acceder.
Tipo: Puede ser Link o mtodo remoto. No se utiliza actualmente.
Accin Principal: permite especificar la accin que se ejecutar por defecto.
Soporta Orden: sirve para indicar si el mtodo que se encargar de obtener los datos soporta orden o no.
Entidad: Indica si lo que se est mostrando es una entidad. Cuando El AppItem es de tipo Vista se utilizar este campo para
agregar las acciones de Nuevo y Borrar al FAFReport, como as tambin la posibilidad de editar el registro seleccionado.
ClaseVO y ClaseFacade: Se utilizan cuando el AppItem es de tipo Vista y se trata de una Entidad. Estas clases sirven para
indicarle al framework la naturaleza de la clase con la que est operando, es decir, de que entidad se trata y cual es el
facade utilizado para acceder a las reglas de negocio.
Parmetros
Es posible indicar parmetros para un AppItem. De esta manera, por ejemplo, cuando estemos en un AppItem de tipo Vista,
podremos seleccionar los parmetros de la consulta que estamos viendo.
Si analizamos la solapa de parmetros puede ser que nos resulten familiares algunas de los campos a cargar. En realidad
cada parmetro se corresponde con la definicin de un widget, por lo que los campos que debemos llenar no son mas que
algunos datos relevantes que necesitamos para mostrar cada uno de los widgets.
Acciones
Tambin se pueden indicar acciones adicionales para un determinado AppItem. En este caso, cuando el AppItem sea de tipo
Vista, se mostrarn las acciones aqu definidas en la toolbar de acciones adicionales.
Link: la ejecucin de la accin implica la redireccin hacia la pgina indicada en el campo Accin.
Mtodo Remoto: Al disparar esta accin se proceder a ejecutar el mtodo indicado dentro del campo accin.
Es necesario indicar el facade donde residir el mtodo en la solapa general.
Tree Grid
Este tipo de view permite mostrar una grilla arborizada. A diferencia de una view de tipo DataSetView, la TreeGrid muestra
la grilla a partir de una consulta sql indicada en una entrada en el diccionario de datos y no de un mtodo o sp.
Entonces, al dar de alta una view de tipo TreeGrid, es necesario indicar la entrada en el diccionario de datos que
representar. En dicha entrada, sern mandatarios los siguientes campos: Nombre de clase, Nombre de tabla y SQL para
grillas.
model::TreeGridVO
TreeGrid
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
TreeGrid(WebReportVO)
getCampoPK(String) : String
getHtml() : String
getHtmlGrilla(Long, Long, String, String, String) : String
getActions() : Collection
setActions(Collection) : void
getAlerts() : Collection
setAlerts(Collection) : void
getAtribs() : HashMap
setAtribs(Collection) : void
getFields() : Collection
setFields(Collection) : void
getGroupsBy() : Collection
setGroupsBy(Collection) : void
getModel() : WebReportVO
setModel(WebReportVO) : void
getOrdersBy() : Collection
setOrdersBy(Collection) : void
getReports() : Collection
setReports(Collection) : void
getWidgets() : Collection
setWidgets(Collection) : void
getWidgetsAdic() : Collection
setWidgetsAdic(Collection) : void
getIdNavMenu() : String
getFAFViewId() : String
getAppItemID() : String
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
setAppItemID(String) : void
getModoDisplayDF() : String
getT oolbar() : Toolbar
setToolbar(Toolbar) : void
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
toolbar::Toolbar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
getAppItemID() : String
setAppItemID(String) : void
setVisible(boolean) : void
isVisible() : boolean
Toolbar(String)
setIdioma(String) : void
getIdioma() : String
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
getName() : String
toHtml(PrintWriter, Collection) : void
getHTML(Collection) : String
getEmpresa() : String
setEmpresa(String) : void
getHtmlDivActionList(Collection) : String
getCaption(ActionVO) : String
getURLDynamicForm(String, String, String, String, HttpServletRequest) : String
TreeGrid: Es la clase principal, tiene asociado un model y una toolbar. sta clase tiene la lgica para generar el cdigo
html a mostrar.
TreeGridVO: Se utiliza para guardar configuracin, datos de la session, request, xml, etc.
Toolbar: Especifica la toolbar para el TreeGrid. Implementa el mtodo getHtml().
Cuando se accede a una view de tipo TreeGrid, se realizan las siguientes acciones:
A partir de la entrada en el diccionario de datos, el mtodo getHojas sabe el Query que debe ejecutar para
llenar la grilla.
En este punto, tenemos definida la toolbar y el widgetGrid, con ambos se genera el cdigo html a imprimir en
la pgina.
Para imprimir el rbol, se agrega el llamado a la funcin TREEGRIDLoadTree, que se ejecutar cuando se cargue
la pgina (Mediante la funcin addLoadEvent).
WebPart
El proyecto WebPart permite configurar paneles basados en views preexistentes.
Un panel se configura mediante un xml asociado a la vista. Este xml se construye de una manera muy simple, en base a
rows, cells y tabs.
Tags relativos al panel
Behavior: El tag behavior = boxed indica que se mostrarn barras de scroll.
Toolbar: El tag toolbar =true/false indica si se muestra o no la toolbar del panel.
Vinculacin de parmetros
Es posible vincular parmetros en el panel, de esta manera, se pueden tener parmetros generales que se trasladarn
a las views contenidas en el mismo.
Tags relativos a las celdas
ID: Especifica el ID de la View a mostrar
ColSpan: indica si la celda se va a expandir en varias celdas.
Width: especifica el ancho, puede ser indicado en porcentaje o pixels
Height: especifica el alto, puede ser indicado en porcentaje o pixels
Tipo: En el caso de una DataSet View, permite indicar si se ver como Grilla, Grfico o Cubo
Scrollbars: Indica si se muestrar scrollbars en la celda
MostrarControles: Permite indicar si se muestra o no la toolbar principal de la view
MostrarToolbarAdicional: Permite indicar si se muestra o no la toolbar adicional principal de la view
LinkRelacionado: Permite indicar una View relacionada que se acceder al hacer clic sobre el mas en el ttulo de la
celda.
<param
Name="fechaDesde"
Caption="Fecha
Desde"
Visible="true"
Value=""
Type="WidgetFecha"
ClassReference=""
FillMethodType=""
DefaultValue="[faf.app.base.util.ClientFunctions.getCurrentDate]"
FillMethodOptions=""
OnChange="alert(document.formParams.scriptVinculacion);"
ExtraProperties=""
/>
<param
Name="fechaHasta"
Caption="Fecha
Hasta"
Visible="true"
Value=""
Type="WidgetFecha"
ClassReference=""
FillMethodType=""
DefaultValue="[faf.app.base.util.ClientFunctions.getCurrentDate]"
FillMethodOptions=""
OnChange="alert(document.formParams.scriptVinculacion);"
ExtraProperties=""
/>
</params>
<rows>
<row>
<col
id="208"
colspan="1"
width="33%"
height="150px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="">
</col>
<col
id="207"
rowspan="2"
colspan="1"
width="67%"
height="400px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
<row>
<col
id="241"
colspan="1"
width="33%"
height="150px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
<row>
<col
id="187"
colspan="2"
width="100%"
height="600px"
tipo="Grid"
scrollbars="true"
mostrarControles="true"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
</rows>
</panel>
helper::WebPartHLP
+
+
+
setFormDefinition(String) : void
getFormDefinition() : String
getWebPartData(FAFContentEJB, HttpServletRequest, HttpServletResponse, String, PrintWriter) : WebPartVO
WebPart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
setSessionID(String) : void
getSessionID() : String
setIdioma(String) : void
getIdioma() : String
setValuedWidgets(Collection) : void
getBehavior() : String
setBehavior(String) : void
setFormMethod(String) : void
getFormMethod() : String
hasToolbar() : boolean
hasToolbarActions() : boolean
setToolbar(boolean) : void
setToolbarActions(boolean) : void
getFacade() : Object
setXmlFormDefintion(String) : void
getXmlFormDefinition() : String
setFields(Collection) : void
WebPart(WebPartVO)
doIt() : void
toHtml() : void
getHtml() : String
model::WebPartVO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Row Container
toolbar::Toolbar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
setIsSelector(boolean) : void
isSelector() : boolean
setCurrentPage(int) : void
Toolbar(String)
getViewUserList() : Collection
setViewUserList(Collection) : void
getLogicViewList() : HashMap
setUserLogicViewList(HashMap) : void
setOptionSelected(String) : void
getOptionSelected() : String
setIdioma(String) : void
getIdioma() : String
toHtml(PrintWriter) : void
getHTML() : String
getAplicacion() : String
setAplicacion(String) : void
getEmpresa() : String
setEmpresa(String) : void
getAppItemID() : String
setAppItemID(String) : void
+
+
+
+
+
+
+
+
+
+
+
getBehavior() : String
setBehavior(String) : void
RowContainer()
addAppItem(CellContainer) : void
getWebPartWidgets() : Collection
setWebPartWidgets(Collection) : void
isCurrent() : boolean
setCurrent(boolean) : void
getAppItems() : Collection
setAppItems(Collection) : void
getHtml(PrintWriter, Object, HttpServletRequest, HttpServletResponse, Collection) : String
CellContainer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
getBehavior() : String
setBehavior(String) : void
CellContainer()
CellContainer(String, String, String, String, String, String)
setID(String) : void
setWIDTH(String) : void
setHEIGHT(String) : void
setTITLE(String) : void
getTITLE() : String
setTIPO(String) : void
setMOSTRARCONTROLES(String) : void
getMOSTRARCONT ROLES() : boolean
setPARAMETERS(Vector) : void
setROWSPAN(String) : void
setCOLSPAN(String) : void
setCLASSSTYLE(String) : void
setSCROLLBARS(String) : void
setSHOWINFRAME(String) : void
getId() : String
getWidth() : String
getColSpan() : String
getRowSpan() : String
getClassStyle() : String
getScrollBars() : boolean
getShowInFrame() : boolean
getHtml(PrintWriter, Object, HttpServletRequest, HttpServletResponse, Collection) : String
getWebPartWidgets() : Collection
setWebPartWidgets(Collection) : void
calculaWidth(String, String) : String
Flujo de Acciones
En la siguiente tabla vemos una lista de los pasos a seguir para construir un nuevo ABM.
Paso
Accin
Generar un nuevo AppItem del tipo vista, para el manejo de la nueva entidad creada.
Definir las prestaciones y permisos para los usuarios y grupos que se deseen.
Generar el xml para el Entity form encargado de mapear un widget con un atributo de una EntidadVO.
Para nuestro caso de estudio vamos a desarrollar el ABM de frmulas, que es un ejemplo sencillo, para la aplicacin Ceres
Frutales
1. Implementacin de la clase VO
package app.ceres.formula.model;
import faf.app.base.entidad.model.EntidadPrimariaVO;
import faf.app.base.exceptions.FunctionalException;
public class FormulaVO extends EntidadPrimariaVO {
public FormulaVO(String sessionID)
throws FunctionalException {
super("FM_ID","vFormula",sessionID);
//no hay atributos propios para agregar
}
}
java.util.Collection;
app.ceres.formula.model.FormulaVO;
faf.app.base.data.FafResultSet;
faf.app.base.entidad.EntidadHLP;
faf.app.base.exceptions.FunctionalException;
faf.app.base.exceptions.SecurityException;
faf.app.base.exceptions.TechnicalException;
faf.app.base.security.session.model.SessionVO;
app.ceres.integration.Integration;
faf.app.base.util.SerializeUtil;
public
static
void
eliminar(FormulaVO
formula)
throws
SecurityException,
FunctionalException {
Integration.dispatch(formula,SerializeUtil.DELETE_METHOD);
}
public
static
void
modificar(FormulaVO
formula)
throws
SecurityException,
FunctionalException {
Integration.dispatch(formula,SerializeUtil.UPDATE_METHOD);
}
public static Collection findByString(String sessionID, String searchString) throws
SecurityException, FunctionalException, TechnicalException {
FormulaVO formula = null;
if (formula == null)
formula = new FormulaVO(sessionID);
else
formula.setSessionID(sessionID);
return findBySearchString(formula, searchString);
}
public
static
FafResultSet
findAll(SessionVO
session,
Collection
orders)
FunctionalException{
return findAll(new FormulaVO(session.getCryptedSessionID()));
}
public String getSelectorDescription(Integer pk,String sessionID){
String description = new String("");
try{
description = getSelectorDescription(new FormulaVO(sessionID),pk);
}catch(Exception e){}
return description;
}
}
<fafClass>
<atribute name="name" value="FORMULAVO"/>
<atribute name="className" value="FORMULAVO"/>
<atribute name="FullClassName" value="app.ceres.formula.model.FormulaVO"/>
</fafClass>
En el archivo clasesHLP.xml:
<fafClass>
<atribute name="name" value="FORMULAVO"/>
<atribute name="className" value="FORMULAVO"/>
<atribute name="FullClassName" value="app.ceres.formula.FormulaHLP"/>
</fafClass>
4. Generar un nuevo AppItem para el manejo de la entidad.
throws
caption="Activo:SP;Active:EN"
onEnter=""
onExit=""
valueName=""
value="0"
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Codigo"
type="WidgetTextBox"
classProperty="Codigo"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="true"
cols="1"
rows="1"
operation=""
caption="Codigo:SP;Code:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Descrip"
type="WidgetMemo"
classProperty="Descripcion"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="false"
cols="1"
rows="1"
colSpan="4"
width="100%"
operation=""
caption="Descripcin:SP;Description:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
</widgetTab>
</widgetForm>
type="visible"
caption="Nombre:SP;Name:EN"
type="visible"
order
="3"
'windows-1252'?><widgetForm
<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="AsientoTipo"
type="WidgetTextBox"
classProperty="AsientoTipoID"
classReference="faf.client.selector.helpers.SelectorGenericoHLP"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="AsientoTipo:SP;AsientoTipo:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType="1"
fillMethodOptions="findAll"
extraProperties=""/>
<widget
name="DocumentoTipo"
type="WidgetSelector"
classProperty="DocumentoTipoID"
classReference="faf.client.selector.helpers.SelectorGenericoHLP"
javaType="java.lang.Integer"
visible="true"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="DocumentoTipo:SP;DocumentoTipo:EN"
onEnter=""
onExit=""
onClick="clearfilterSelector;filterSelectorText('AsientoTipo')"
valueName=""
value=""
fillMethodType="1"
fillMethodOptions="findAll"
extraProperties="DocumentoTipo"/>
library="laboreo"
. . .
</widgetTab>
<widgetTab name="Insumos" caption="Insumos:ES;Insumes:EN">
. . .
<widget
name="LaboreoItem"
type="WidgetLine"
classProperty="LaboreoItem"
javaType="java.util.Collection"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
fillMethodType=""
fillMethodOptions=""
extraProperties="">
<lines
cantRowsMin="3"
mappingClass="faf.app.fxi.laboreo.model.LaboreoItemVO">
<widget
name="Laboreo"
type="WidgetTextBox"
classProperty="LaboreoID"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="LaboreoID"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties="" width="150"/>
</lines>
</widget>
</widgetTab>
</widgetForm>
cantRowsExtra="2"
Tratamiento de Exceptions
Introduccin
El tratamiento de errores y situaciones fuera de lo previsto, en JAVA se realiza mediante el mecanismo de Exceptions. El
Framework de Finnegans tiene declaradas cuatro clases que heredan de la clase nativa de JAVA Exception:
FafException extends Exception
FunctionalException extends FafException
TechnicalException extends FafException
SecurityException extends FafException
En general, nunca deberamos lanzar Exception, ni capturar Throwable. Exception es muy genrico como para lanzarlo, no
informa mucho que tipo de exception tira el mtodo, y dicha informacin puede usarse en tiempo de compilacin.
Throwable, tambin representa Errores de la mquina virtual, por ej. OutOfMemoryError, por lo que nunca deberamos
capturarlos, ya que por lo general son irrecuperables.
El compilador no obliga a lanzar explicitamente las Exceptions que hereden de Runtime Exception, es equivalente a que la
clusula throws RuntimeException est en cada declaracin de mtodo.
}
}
}
}
}
}
}
*
*
*
*
*
*
*
*/
catch (FunctionalException fex){
throw fex;
catch (TechnicalException tex){
throw tex;
catch (SecurityException sex){
throw sex;
catch (CualquierOtraException cex){
String [] parametros = new String[]{"",""};
//usar alguna de estas opciones, en este rden de prioridad o preferencia.
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL,"Detalle", parametros, cex);
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL, "Detalle", cex);
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL, cex);
catch (InvocationTargetException itex){
//el mensaje debe indicar el mdulo donde se produjo..
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, itex.getTargetException());
catch (Exception ex){
//el mensaje debe indicar el mdulo donde se produjo..
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, ex);
finally {//en el caso que se hubiere creado un dbh localmente.
try {
dbh.close();
} catch (Exception ex){
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, ex);
}
}
}
Los bloques throws y catch de FunctionalException, TechnicalException, SecurityException y CualquierOtraException no
pueden colocarse en el caso de que el cdigo contenido en el bloque try, no lance FunctionalException,
TechnicalException, SecurityException, o CualquierOtraException, respectivamente.
El throw del ltimo bloque catch, el mensaje debe indicar el mdulo donde fall el sistema. El bloque finally debe ir luego
de todos los catch, en el caso de que queramos hacer algo siempre, haya ocurrido o no una Excepcin. Este es el caso de
cerrar el DBHelper antes de terminar la llamada a la funcin.
Si los mensajes de Exceptions no llegan correctamente a la pantalla, el programador deber corregir en los lugares donde
no estn tratadas de manera correcta las exceptions, para que el caso funcione. Incluir informacin en el informe del
objetivo, de las clases involucradas en dichas modificaciones, en todos los casos. Tambin debe revisar que no afecte otras
funcionalidades.
Si el impacto es demasiado grande, debe discutirse la creacin de un objetivo nuevo para realizar dicha correccin.
*
*
*
*
*
*
*
*
*
*/
} catch (InvocationTargetException itex){
%>
<%@ include file="./InvocationTargetExceptionManager.jsp"%>
<%
} catch (FafException fex){
%>
<%@ include file="./FunctionalExceptionManager.jsp"%>
<%
} catch (Exception cex){
%>
<%@ include file="./NativeExceptionManager.jsp"%>
<%
}
%>
</body >
</html>
Si los mensajes de Exceptions no llegan correctamente a la pantalla, el programador deber corregir en los lugares donde
no estn tratadas de manera correcta las exceptions, para que el caso funcione. Incluir informacin en el informe del
objetivo, de las clases involucradas en dichas modificaciones, en todos los casos. Tambin debe revisar que no afecte otras
funcionalidades.
Si el impacto es demasiado grande, debe discutirse la creacin de un objetivo nuevo para realizar dicha correccin.
Llamadas AJAX.
Siempre al recibir una respuesta AJAX, en todas las funciones callBack debemos verificar si no hubo un error. Para
realizar este chequeo se cre la funcin AJAXFinishWithNoErrors(xmlObj), la cual pasandole el xml recibido nos devolver
true si no se recibi un error. En el caso de que un error se haya recibido, la funcin devuelve false, y muestra una
ventana de alerta para mostrar al usuario la informacin del error recibido.
var
valor2
xmlObj.getElementsByTagName("ResponseData")
[0].getAttribute("value2");
if
(xmlObj.getElementsByTagName("formName")!=null
&&
xmlObj.getElementsByTagName("formName")[0]!=null)
formName
=
xmlObj.getElementsByTagName("formName")
[0].childNodes[0].nodeValue;
var form = document.forms[formName];
setearValorWidget(form,'FechaDesde',valor1);
setearValorWidget(form,'FechaHasta',valor2);
}
}
getLoading().style.display = 'none';
}catch (ex){
jsExceptionAlert(ex);
throw ex;
}
}
JasperReports
Introduccin
Es una poderosa herramienta Open Source de reportes en Java que puede exportar sus reportes en un visualizador propio,
PDF, HTML, XLS, CSV y archivos XML.
Est totalmente escrita en java y puede ser usuado en cualquier aplicacin Java, incluyendo J2EE y Web Applications para
generar contenidos dinamicos.
URL:
http://jasperreports.sourceforge.net
Requerimientos
JDK 1.2.2+
SAX 2.0 XML Parser
Jakarta Commons Digester Component (v1.1+)
Jakarta Commons BeanUtils Component (v1.1+)
Jakarta Commons Collections Component (v1.0+)
Jakarta Commons Logging Component (v1.0+)
JDBC 2.0 Driver
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
Jakarta POI (v1.5.1+)
Funcionamiento
La definicin del reporte se aloja en un XML (ver Definicin XML). Para que pueda ser ejecutado el reporte este tiene
que estar compilado por la herramienta Jasper, se puede hacer en el momento (on the fly) o guardar el archivo ya
compilado (.jasper).
Instalacin
Usa la libreria que se encuentran en el directorio \Dist
jasperreports-0.6.1.jar que es la libreria de la aplicacin. Y las que se encuentran en el directorio \Lib que incluye
las librerias de XML Parsers, iText (para exportar a PDF), las de Yakarta, las de JDBC, etc.
iReports
Es una herramienta visual para desarrollar/armar/ejecutar reportes para JasperReports. Esta GUI nos permite
armar de una forma sencilla el XML que utilizar el Jasper. Tambin sirve para compilar el xml en un .jasper y
adems nos permite ejecutar el reporte y exportarlo en cualquiera de los formatos que de jasper. Es un free
software y est publicado bajo la licencia GNU GENERAL PUBLIC LICENSE.
http://ireport.sourceforge.net/
Requerimientos:
Ant (required if you want recompile sources, but strongly reccomended to lunch iReport too)
SAX 2.0 XML Parser (Apache Xerces 1.3 or later recommended) (*)
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares (*)
Ejemplos:
Codigo comn:
//Se lee la definicin del reporte que est alojada en el xml
JasperDesign
jasperDesign
=
JasperManager.loadXmlDesign("path-to-your-jrxmlfile\\sample.jrxml");
//Se compila el XML
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);
//Si se necesitan pasar parmetros se crea el Hash y se incluyen
Map parameters = new HashMap();
parameters.put("desde", varDesde);
parameters.put(hasta,varHasta);
//se le pasa los datos de la coneccion, si la necesita el datasource
Connection conn = Database.getConnection();
"','"
Definicin XML:
El documento XML que contiene la definicin del reporte define exactamente como, donde y que va a aparecer en el reporte, escribir este
documento manualmente no es muy prctico, aca es donde aparece la utilidad del iReport (entorno que crea el XML con un entorno
WYSIWYG). De todas formas este documento se puede editar con cualquier editor de textos, como el NotePad.
Este XML a su vez est definido con una estructura especial declarada en un DTD provisto por JasperReports.
El documento tiene que estar organizado de la siguiente forma:
<?xml version="1.0"?>
<!DOCTYPE jasperReport
PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="name_of_the_report" ... >
...
//Elementos
...
</jasperReport>
Elementos:
Parmetros:
Son referencias a objetos que son pasados para operaciones de filling del reporte.
Ejemplo:
<parameter name="ReportTitle" class="java.lang.String"/>
<parameter name="MaxOrderID" class="java.lang.Integer"/>
Data Source:
Soporta varios tipos de data sources usando la interface JRDataSource.
Ejemplo:
<queryString>
<![CDATA[ select pres_id,pres_form from prestacion order by pres_alias]]>
</queryString>
Fields
Los Report Fields sirven para mapear los datos desde el data source en el reporte.
Ejemplo:
Para los siguientes datos:
Column Name
Datatype
Length
-------------------------------------EmployeeID
int
4
LastName
varchar
20
FirstName
varchar
10
HireDate
datetime
8
Pgina 53 de 57
name="EmployeeID" class="java.lang.Integer"/>
name="LastName" class="java.lang.String"/>
name="FirstName" class="java.lang.String"/>
name="HireDate" class="java.util.Date"/>
Expressions
Las Expressions son Java Expressions que son usadas para declarar variables del reporte que sirven para ejecutar calculos, por ejemplo
para un Data Group en el reporte, etc.
Hay varios elementos que definen las Expresiones:
<variableExpression>,
<initialValueExpression>,
<groupExpression>,
<printWhenExpression>,
<imageExpression> and <textFieldExpression>.
Ejemplo:
<textFieldExpression>
$F{FirstName} + " " + $F{LastName}
</textFieldExpression> <!-- el $F{} significa el valor de un field -->
<textFieldExpression> "Total quantity : " + $V{QuantitySum} + " kg." </textFieldExpression> <!el $V{}
significa el valor de una variable -->
Variables
<variable name="QuantitySum" class="java.lang.Double"
resetType="Page" calculation="Sum">
<variableExpression>$F{Quantity}</variableExpression>
<initialValueExpression>new Double(0) </initialValueExpression>
</variable>
Existen varias variables built-in del sistema listas para usar sin definir en el reporte:
PAGE_NUMBER
COLUMN_NUMBER
REPORT_COUNT
PAGE_COUNT
COLUMN_COUNT
GroupName_COUNT
Report Sections
Existen las siguientes seccines:
<title>,
<pageHeader>,
<pageFooter>, <summary>.
<columnHeader>,
<groupHeader>,
<detail>,
<groupFooter>,
<columnFoter>,
Ejemplo:
<pageHeader>
Pgina 54 de 57
<band height="30">
<rectangle>
<reportElement x="0" y="0" width="555" height="25"/>
<graphicElement/>
</rectangle>
<staticText>
<reportElement x="0" y="0" width="555" height="25"/>
<textElement textAlignment="Center">
<font fontName="Helvetica" size="18"/>
</textElement>
<text>Northwind Order List</text>
</staticText>
</band>
</pageHeader>
Groups
<group name="pres_alias" isStartNewColumn="false" sStartNewPage="false">
<groupExpression>
<![CDATA[ $F{pres_alias}]]>
</groupExpression>
<groupHeader>
...
</groupHeader>
<groupFooter>
...
</groupFooter>
</group>
Pgina 55 de 57
Seguimiento de documentacin.........................................................................................................................................1
Introduccin.............................................................................................................................................2
Arquitectura de n-Capas..................................................................................................................................................2
Web Server...............................................................................................................................................................3
Soporte Multilenguaje..................................................................................................................................................3
DynamicForm............................................................................................................................................................3
FAFReport.................................................................................................................................................................4
WebParts..................................................................................................................................................................4
Widgets................................................................................................................................................................... 4
Lgica de la aplicacin....................................................................................................................................................5
Facade....................................................................................................................................................................5
Business Logic Layer....................................................................................................................................................5
Gestor de Sesiones......................................................................................................................................................6
Seguridad.................................................................................................................................................................6
FAF Data Engine.........................................................................................................................................................6
Personalizacin..........................................................................................................................................................6
Auditoria..................................................................................................................................................................6
Gestor de errores........................................................................................................................................................6
Messaging Services......................................................................................................................................................6
Multilenguaje............................................................................................................................................................6
Introduccin................................................................................................................................................................7
Plataforma................................................................................................................................................................7
Base de datos............................................................................................................................................................7
Diccionario de Datos.................................................................................................................................................8
Query Builder..........................................................................................................................................................8
FAFDataEngine y FAFDataSet........................................................................................................................................8
Interoperabilidad........................................................................................................................................................8
Clientes ricos y finos....................................................................................................................................................9
Funcionamiento general...............................................................................................................................................9
Componentes del framework............................................................................................................................................9
Entidades.................................................................................................................................................................9
Facade...................................................................................................................................................................11
1) Archivo ejb-jar.xml.................................................................................................................................................11
2) Archivo NombreBeanEJB.java....................................................................................................................................12
3) Archivo NombreBeanEJBBean.java..............................................................................................................................12
4) Archivo NombreBeanEJBHome.java.............................................................................................................................12
Sesiones.................................................................................................................................................................12
Seguridad................................................................................................................................................................12
Auditoria................................................................................................................................................................13
Errores...................................................................................................................................................................13
Multilenguaje...........................................................................................................................................................13
Interfaz del usuario....................................................................................................................................................13
Framework Web...........................................................................................................................................................13
Introduccin............................................................................................................................................................13
Multilenguaje...........................................................................................................................................................13
Widgets..................................................................................................................................................................14
DynamicForm...........................................................................................................................................................15
FAFReport...............................................................................................................................................................18
Explotacin de grillas....................................................................................................................................................21
Vincular un webReport a un datasource distinto al de la empresa logueada................................................................................22
Web Chart...............................................................................................................................................................23
Contenido Web.........................................................................................................................................................23
Indicador Web..........................................................................................................................................................24
Diccionario de Datos - Campos adicionales........................................................................................................................26
JasperReports..........................................................................................................................................................27
AppItems................................................................................................................................................................28
Pgina 56 de 57
WebPart.................................................................................................................................................................... 31
Construccin de paginas Adhoc......................................................................................................................................34
Construccin de aplicaciones (workshop)............................................................................................................................34
Especificacin de implementacin ABM...............................................................................................................................34
Descripcin breve......................................................................................................................................................34
Flujo de Acciones......................................................................................................................................................34
Tratamiento de Exceptions.........................................................................................................................42
Introduccin...............................................................................................................................................................42
Templates de Exceptions para cdigo JAVA........................................................................................................................42
Templates de Exceptions para cdigo JSP..........................................................................................................................43
Templates de Exceptions para cdigo JavaScript................................................................................................................45
Mensajes Funcionales en JavaScript................................................................................................................................45
Llamadas AJAX.........................................................................................................................................................45
JasperReports.........................................................................................................................................47
Introduccin...............................................................................................................................................................47
Requerimientos.........................................................................................................................................................47
Funcionamiento........................................................................................................................................................47
Instalacin..............................................................................................................................................................48
iReports..................................................................................................................................................................49
Requerimientos:.........................................................................................................................................................49
Instalacion:...............................................................................................................................................................49
Ejemplos:.............................................................................................................................................................50
Definicin XML:..................................................................................................................................................- 53 Elementos:........................................................................................................................................................- 53 -
Pgina 57 de 57