UDA-Componentes RUP. Jerarquía  (v2.1.1 deprecado)
Upcoming SlideShare
Loading in...5
×
 

UDA-Componentes RUP. Jerarquía (v2.1.1 deprecado)

on

  • 615 views

UDA-Utilidades de desarrollo de aplicaciones

UDA-Utilidades de desarrollo de aplicaciones
• UDA-Componentes RUP. Jerarquía

http://code.google.com/p/uda/

Statistics

Views

Total Views
615
Views on SlideShare
615
Embed Views
0

Actions

Likes
0
Downloads
3
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

UDA-Componentes RUP. Jerarquía  (v2.1.1 deprecado) UDA-Componentes RUP. Jerarquía (v2.1.1 deprecado) Document Transcript

  • UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.UDA - Utilidades de desarrollo de aplicacionesComponentes RUP – JerarquíaFecha: 07/11/2012 Referencia:EJIE S.A.Mediterráneo, 14Tel. 945 01 73 00*Fax. 945 01 73 0101010 Vitoria-GasteizPosta-kutxatila / Apartado: 80901080 Vitoria-Gasteizwww.ejie.es
  • Componentes RUP – Jerarquía ii/21Control de documentaciónTítulo de documento: Componentes RUP – JerarquíaHistórico de versionesCódigo: Versión: Fecha: Resumen de cambios:1.0.0 17/12/2012 Primera versión.Cambios producidos desde la última versiónControl de difusiónResponsable: Ander MartínezAprobado por:Firma: Fecha:Distribución:Referencias de archivoAutor:Nombre archivo:Localización:
  • Componentes RUP – Jerarquía iii/21ContenidoCapítulo/sección Página1. Introducción 52. Ejemplo 53. Casos de uso 54. Infraestructura 54.1. Ficheros 64.2. Dependencias 65. Invocación 76. Propiedades 77. Sobreescritura del theme 98. Requisitos (Base de Datos) 99. Integración con UDA 109.1. Modelo 109.2. Acceso a datos 109.2.1. Consulta 109.2.2. Consulta con filtro 129.2.3. Consulta elementos contraídos 139.3. Mapeador de datos [RowMapper] 139.4. Controlador 149.5. Serialización de datos 159.6. Presentación 1510. Jerarquía con selección múltiple 1510.1. Menú desplegable 1610.2. Edición múltiple / Eliminación múltiple 17
  • Componentes RUP – Jerarquía iv/2110.2.1. Acceso a datos 1710.2.2. Consulta 1810.2.3. Controlador 1910.2.4. Presentación 1911. Integración con x38 1911.1. Pagination 1911.2. Jerarquía 21
  • Componentes RUP – Jerarquía 5/211. IntroducciónLa descripción del Componente Jerarquía, visto desde el punto de vista de RUP, es la siguiente:El objetivo principal del componente Jerarquía es la presentación de un conjunto de datos (tabla)ordenados jerárquicamente en base a una relación existente entre ellos.NOTA: Este no es un componente como tal, si no una mejora aplicable sobre el componente tabla.2. EjemploSe presentan a continuación un ejemplo de este componente:3. Casos de usoSe recomienda el uso del componente:• Cuando se desea estructurar los datos para facilitar su visualización por parte del usuario.• Cuando se desea navegar por niveles para buscar un determinado dato.• Cuando se desea obtener un elemento en concreto y conocer sus ancestros/niveles superiores.4. InfraestructuraA continuación se comenta la infraestructura necesaria para el correcto funcionamiento del componente.• Se necesita que la entidad a mostrar contenga en la Base de Datos una columna por la que seinterrelaciones las filas. Es decir, una columna “Padre” que indique el nivel superior de cadaelemento si lo tuviera (si no el valor del campo sería null).
  • Componentes RUP – Jerarquía 6/21• Requiere un tratamiento especial en el DAO para lanzar unas determinadas sentencias SQL pararecuperar datos adicionales a los relativos a la entidad. Las modificaciones serán tanto a nivel demétodo como de mapeador de datos de Base de Datos a datos de presentación. Para facilitar lalabor se incluyen ciertas clases y funcionalidades en x38.• Se requiere la inclusión de los ficheros que implementan el componente (js y css) comentados enlos apartados Ficheros y Dependencias.• Se necesitan realizar algunas modificaciones sobre la tabla original para que se muestrecorrectamente la jerarquía.4.1. FicherosRuta Javascript: rup/scripts/Fichero de plugin: rup.grid.jerarquia-x.y.z.jsRuta theme: rup/basic-theme/Fichero CSS del theme: theme.rup.grid.jerarquia- x.y.z.css4.2. DependenciasPor la naturaleza de desarrollo de los componentes (patrones) como plugins basados en la libreríaJavaScript jQuery, es necesaria la inclusión del esta. La versión elegida para el desarrollo ha sido laversión 1.8.0.• jQuery 1.8.0: http://jquery.com/La gestión de la ciertas partes visuales de los componentes, se han realizado mediante el plugin jQueryUI que se basa en jQuery y se utiliza para construir aplicaciones web altamente interactivas. Este plugin,proporciona abstracciones de bajo nivel de interacción y animación, efectos avanzados de alto nivel,componentes personalizables (estilos) ente otros. La versión utilizada en el desarrollo ha sido la 1.8.23.• jQuery UI 1.8.23: http://jqueryui.com/La visualización de los datos en pantalla se realiza a través del plugin jqGrid basado en jQuery. Laversión empleada para la jerarquización de datos ha sido la 4.4.1:• jqGrid 4.4.1: http://www.trirand.com/blog/Los ficheros necesarios para el correcto funcionamiento del componente son:• jquery-1.8.0.js• jquery-ui-1.8.23.custom.js• jquery-ui-1.8.23.custom.css• jqGrid-4.4.1.js• rup.base-x.y.z.js• rup.grid.jerarquia-x.y.z.js
  • Componentes RUP – Jerarquía 7/21• theme.rup.grid.jerarquia-z.y.z.css5. InvocaciónEste componente se invocará sobre un elemento al que anteriormente se le haya aplicado el componenterup.grid. Por ejemplo:$("#id_elemento").rup_grid(properties);...$("#id_elemento").rup_grid_jerarquia(properties);Donde el parámetro “properties” es un objeto ( var properties = {}; ) o bien directamente la declaración de lovalores directamente. Sus posibles valores se detallan en el siguiente apartado.6. PropiedadesA continuación se muestran los posibles parámetros de configuración que recibe el componente.• expandColName: Nombre de la columna en la que será la que se contraiga/expanda.Puede definirse una columna que ya exista o una vacía para este propósito si así se desea:• relatedColName: Nombre de la columna que marca la relación. Deberá ser la clave primariade la tabla en Base de Datos.• expandedClass: Clase de los elementos expandidos. Valor por defecto ui-icon-triangle-se. La imagen es• unExpandedClass: Clase de los elementos contraídos. Valor por defecto ui-icon-triangle-e. La imagen es• noChildClass: Clase de los elementos sin hijos. Valor por defecto ui-icon-none.
  • Componentes RUP – Jerarquía 8/21• filterClass: Clase de los elementos que cumplen el filtro. Valor por defecto ui-icon-star. La imagen es• resetEvents: Mapa en el que se indica en qué evento sobre qué objeto se invocará lafunción de reiniciar los valores de los elementos expandios La key del mapa será el eventoen el que se produce y el value será un array con los identificadores de los objetos sobre losque se produce el evento. En el caso de que se desee ejecutar una función antes del eventoesta deberá ir como primer elemento del array de objetos. Ejemplo:resetEvents: {click: ["bt_search_usuarioJerarquia","clean_search_usuarioJerarquia"],keydown : [ function(event){ if (event.keyCode === 13) {return false; } }, "searchForm" ]}• resetMultiEvents: Mapa en el que se indica en qué evento sobre qué objeto se invocará lafunción de reiniciar los valores de los elementos seleccionados (cuando se utiliza lamultiselección). La key del mapa será el evento en el que se produce y el value será unarray con los identificadores de los objetos sobre los que se produce el evento. En el casode que se desee ejecutar una función antes del evento esta deberá ir como primer elementodel array de objetos. Ejemplo:resetMultiEvents: {click: ["bt_search_usuarioJerarquia","clean_search_usuarioJerarquia"],keydown : [ function(event){ if (event.keyCode === 13) {return false; } }, "searchForm" ]}• parentNodesTooltip: Determina que se cree un tooltip con los diferentes nodos sobre lacolumna que se utiliza para la jerraquía de los elementos. Valor por defecto true. Ejemplo:• parentNodesTooltipFnc: Permite sobrescribir la función que genera el tooltip con losdiferentes nodos. Valor por defecto null.• tooltipDelay: Tiempo en milisegundos que tarda el tooltip en aparecer. Valor por defecto500.• multiMenu: Determina el menú desplegable a mostrar junto a cada checkbox en el caso dela multiselección. Se recibe un JSON como parámetro indicando que opciones se mostrarány cuales no.o hijos: Permite seleccionar los hijos directos.o descendientes: Permite seleccionar todos los hijos, independientemente del nivel alque pertenezcan.
  • Componentes RUP – Jerarquía 9/21Su valor por defecto es:multiMenu : {hijos : true,descendientes : true}• multiMenuDisabled: En la multiselección determina si se deshabilitan los menúsdesplegables de los elementos que no lo requieran (true) o si directamente no aparece elicono para desplegarlo (false). Valor por defecto true.• multiboxonly: Determina, en caso afimativo, que para seleccionar una fila se debe pulsaren el checkbox. Si no, se podrá pulsar en cualquier celda para seleccionar la fila. Valor pordefecto false.7. Sobreescritura del themeEl componente aplica los estilos definidos en el fichero de estilos theme.rup.grid.jerarquia-x.y.z.css.Sobre cada elemento que compone la jerarquía, se aplican los estilos:.rup-grid-jerarquia.rup-grid-jerarquia_level_XLa X indica el nivel dentro de la jerarquía comenzando por 1. El fichero de estilos define 10 estilos en los quela tabulación va aumentando progresivamente. Si se necesita cambiar estos estilos bastará consobrescribirlos en un fichero propio de la aplicación.Adicionalmente se pueden modificar los iconos mostrados para indicar si el nodo contiene hijos y estáexpandido o contraído, o si por el contrario el nodo no tiene hijos (ver apartado “6. Propiedades”).Para aquellos elementos que cumplen el criterio de búsqueda introducido, existe un estilo (uno por nivel)para definir su posicionamiento: .rup-grid-jerarquia_filter_XAdicionalmente existen ciertos estilos para el menú que se muestra en la selección múltiple que en caso denecesidad podrían ser sobrescritos aunque no se recomienda.8. Requisitos (Base de Datos)La relación de jerarquía se define a través de una columna adicional definida en la tabla cuyos elementos sequieren presentar en “forma de árbol”. La nueva columna tendrá como valor un dato que identificaráinequívocamente a su padre, que podría ser su clave primaria (se recomienda el uso de claves subrogadasya que dichos datos se enviarán como parámetro).A continuación se muestra un ejemplo:
  • Componentes RUP – Jerarquía 10/219. Integración con UDAEn el apartado que nos ocupa, se explican la manera en que el componente se integra con UDA y con lasdiferentes capas.9.1. ModeloSe deberá añadir el atributo correspondiente a la columna que indica quien es su padre, si es queno se tiene ya (ver apartado “8. Requisitos (Base de Datos)”).9.2. Acceso a datosEl tipo de retorno del método para la obtención de datos será List<Jerarquia<Model>> (salvo en elcaso del conteo de datos que devolverá un Long). Más adelante se explicará la manera de mapearlos datos.Primero definiremos la leyenda de los elementos empleados para detallar de manera genérica lasdiferentes implementaciones:• columna columna que se usa para la referencia (ej. id)• columnaPadre columna que define el elemento con el que se relaciona, es decir, supadre. Será nulo en los casos que no tenga padre [nivel 1] (ej. manager_id).• columnaParentNode columna que se utilizará para representar la estructura en eltooltip.• tabla tabla en la que se basa la jerarquía (ej. employee)• aliasTabla alias que se le dará a la la tabla en la parte from de la query (ej. … fromemployee e …)9.2.1. ConsultaPara obtener los datos de la jerarquía se requiere una query que tenga la siguiente forma (sesimplifica para facilitar la comprensión):select …,-- Campos JERARQUIAlevel,decode (select count(1) from [tabla] subquery wheresubquery.[columnaPadre]= [aliasTabla].[columnaPadre]), 0,false, true) as HASCHILDREN,
  • Componentes RUP – Jerarquía 11/21sys_connect_by_path(NOMBRE, /) as PARENTNODES,sys_connect_by_path(ID, /) as TREENODES,case when (1=0) then true end as FILTERfrom [tabla] [aliasTabla]where 1=1-- Condiciones NEGOCIOand condiciones-- Relacion JERARQUIAstart with [columnaPadre] is nullconnect by prior [columna] = [columnaPadre]order siblings by nombreColumna asc/desc- El elemento condiciones se refiere a condiciones para la relación de tablas como a condicionespropias del negocio. Se puede utilizar para filtrar ciertos elementos siempre. Es opcional.- Los elementos destacados en rojo corresponden a elementos propios del negocio, pasadoscomo parámetros desde el controlador y por tanto variables.- Los elementos que aparecen dentro de corchetes son datos requeridos por la jerarquía y sepasarán como parámetros.Se han creado diversas funciones en el objeto Pagination de x38 para facilitar la gestión de queries.A continuación se muestra un ejemplo del código que se debería implementar (destacados ennegrita los elementos más importantes) para la obtención de los elementos jerarquizados://SELECTStringBuilder sbSQL = new StringBuilder("SELECT ...");//CONDICIONES (negocio) [OPCIONAL]StringBuilder businessFilters = new StringBuilder();List<Object> businessParams = new ArrayList<Object>();businessFilters.append("AND xxx = ?");businessParams.add("1");//FILTROMap<String, ?> mapaWhere = this.getWhereLikeMap(model, false);//JERARQUIAsbSQL = pagination.getQueryJerarquia(sbSQL, mapaWhere"COLUMNA", "COLUMNA_PADRE", "COLUMNA_PARENT_NODE", "TABLA","ALIAS_TABLA", businessFilters, businessParams);//PAGINACIÓNif (pagination != null) {sbSQL = pagination.getPaginationQueryJerarquia(sbSQL);}List<?> params = (List<?>) mapaWhere.get("params");return this.jdbcTemplate.query(sbSQL.toString(),this.rwMapJerarquia, params.toArray());La función que obtiene el número de elementos de la jerarquía (dato necesario para que el gridfuncione correctamente) se obtendrá de una función idéntica a la expuesta salvo que:1. La parte de la select sólo deberá tener “select count(1)”.
  • Componentes RUP – Jerarquía 12/21sbSQL.append("SELECT COUNT(1)");2. Se debe omitir la parte de paginación ya que se deben obtener todos los elementosposibles. Este es el código a omitir://PAGINACIÓNif (pagination != null) {sbSQL = pagination.getPaginationQueryJerarquia(sbSQL);}3. El tipo de retorno será un número por lo que el retorno será:return this.jdbcTemplate.queryForLong(sbSQL.toString(), params.toArray());En el caso de que no se necesiten condiciones de negocio bastará con obviar esas líneas e invocara la función getQueryJerarquia del objeto Pagination sin los parámetros finales. Estas condicionesde negocio se incluirán en un StringBuilder comenzando directamente con un AND o un OR y losparámetros correspondientes en un List9.2.2. Consulta con filtroEn los casos en los que se lance una búsqueda con ciertos criterios de filtrado la query se modifica ypasa a tener la siguiente estructura (se simplifica para facilitar la comprensión):select …,-- Campos JERARQUIAlevel,decode (select count(1) from [tabla] subquery wheresubquery.[columnaPadre]= [aliasTabla].[columnaPadre]), 0,false, true) as HASCHILDREN,sys_connect_by_path(NOMBRE, /) as PARENTNODES,sys_connect_by_path(ID, /) as TREENODES,case when (1=0) then true end as FILTERfrom [tabla] [aliasTabla]where 1=1-- Condiciones NEGOCIOand condiciones-- Condiciones FILTROand filtro-- Subquery PADRESor (select count(1)from [tabla]where 1=1-- Condiciones FILTROand filtro-- Condiciones NEGOCIOand condicionesconnect by prior [columna] = [columnaPadre]) > 0-- Subquery HIJOSor [columna] in (
  • Componentes RUP – Jerarquía 13/21select substr(sys_connect_by_path([columna], /),INSTR(sys_connect_by_path([columna], /), /,-1)+1)from [tabla]where 1=1-- Condiciones NEGOCIOand condicionesstart with [columna] in (select IDfrom [tabla]where 1=1-- Condiciones FILTROand filtro)connect by prior [columna] = [columnaPadre])-- Relacion JERARQUIAstart with [columnaPadre] is nullconnect by prior [columna] = [columnaPadre]order siblings by nombreColumna asc/descEl código a implementar es el mismo que en el caso de que no haya filtro.9.2.3.Consulta elementos contraídosCuando se contrae alguno de los elementos para que no se muestren sus hijos la query a ejecutarsevaría levemente. Simplemente se añade una condición extra a la parte de “Relación JERARQUIA”.El propio componente se encarga de enviar el dato requerido como parámetro de la query. Acontinuación se detalla la condición que se añade:-- Relacion JERARQUIAstart with [columnaPadre] is nullconnect by prior [columna] = [columnaPadre]and [columnaPadre] not in (?)order siblings by nombreColumna asc/desc9.3. Mapeador de datos [RowMapper]Se deberá modificar el RowMapper generado por UDA para la conversión del modelo de BD(ResultSet) a un Bean (POJO), para acomodarse a los nuevos atributos necesarios. Se utilizará laclase Jerarquia<T> incluida en x38.Se adjunta un ejemplo en el que se utiliza la clase Model como ejemplo:private RowMapper<Jerarquia<Model>> rowMapper = new RowMapper<Jerarquia<Model>>() {public Jerarquia<Model> mapRow(ResultSet resultSet, introwNum) throws SQLException {Model model = new Model();
  • Componentes RUP – Jerarquía 14/21//setters del negocio (generados por UDA)Jerarquia<Model> j = new Jerarquia<Model>();j.setModel(model);j.setLevel(resultSet.getBigDecimal("LEVEL").intValue());j.setHasChildren(Boolean.parseBoolean(resultSet.getString("HASCHILDREN")));j.setParentNodes(resultSet.getString("PARENTNODES"));j.setFilter(Boolean.parseBoolean(resultSet.getString("FILTER")));return j;}};9.4. ControladorLa jerarquía normal permite navegar por los diferentes niveles de manera descendente. Por defecto,en la primera búsqueda se obtendrán los elementos del nivel 1. Aquellos elementos que tengan hijostendrán un elemento diferenciador del resto. Dependiendo de la declaración del componente, alpinchar en dicho elemento se contraerá/expandirá ocultando/mostrando sus elementos “hijo”.La gestión de los elementos a expandir, se realiza mediante el envío automático de un parámetrotree con los identificadores de los elementos que se deben expandir que envía automáticamente elcomponente y se gestiona mediante el objeto Pagination de x38.Para versiones antiguas de aplicaciones de UDA en las que los parámetros del Pagination seobtenían de la request se debería hacer lo siguiente:Pagination pagination = new Pagination();pagination.setPage(Long.valueOf(request.getParameter("page")));pagination.setRows(Long.valueOf(request.getParameter("rows")));pagination.setSort(request.getParameter("sidx"));pagination.setAscDsc(request.getParameter("sord"));pagination.setTree(request.getParameter("tree"));Para versiones nuevas de aplicaciones de UDA la gestión del parámetro es automática ya queSpring realiza el setter de la propiedad siempre que en la declaración del método se reciba elparámetro de la siguiente manera:public @ResponseBody JQGridJSONModel getAllJQGrid(@ModelAttribute Model filterModel,@ModelAttribute Pagination pagination)La gestión correcta de los elementos mostrados en pantalla por el componente grid requiere de unamodificación en el Controller generado por defecto por UDA destacado en negrita:@RequestMapping(method = RequestMethod.GET, headers={"JQGridModel=true"})public @ResponseBody JQGridJSONModel getAllJQGrid(@ModelAttribute ModelfilterModel, @ModelAttribute Pagination pagination){List<Jerarquia<Model>> listModel = this.modelService.findAllLike
  • Componentes RUP – Jerarquía 15/21(filterModelJerarquia, pagination);Long recordNum = this.modelService.findAllLikeCount (filterModel,pagination);ModelController.logger.info("[GET - jqGrid] : Obtener Jerarquia");return new JQGridJSONModel(pagination, recordNum,listModelJerarquia);}9.5. Serialización de datosEl correcto funcionamiento de la jerarquía requiere que se incluya el objeto Jerarquia de x38 dentrode los elementos a procesar con el serializador de UDA.Para ello en el fichero jackson-config.xml se deberá incluir la siguiente entrada:<entry key="#{T(com.ejie.x38.dto.Jerarquia)}"value-ref="customSerializer" />9.6. PresentaciónLas modificaciones a realizar en la capa de presentación se limitan a añadir ciertas columnasnuevas al grid sobre el que se quiere generar una jerarquía:colNames: [ ..., "level", "hasChildren", "parentNodes", "filter"],colModel: [ ..., {name: "level", hidden: true},{name: "hasChildren", hidden: true},{name: "parenNodes", hidden: true},{name: "filter", hidden: true}]Una vez acabada la declaración del grid se realizará la declaración de la jerarquía:$("#NOMBRE_GRID").rup_grid_jerarquia({expandColName : "numexpediente",parentColName : "numexpediente",resetEvents: {click: ["bt_search_expedientes","clean_search_expedientes"],keydown : ["searchForm"]}});10. Jerarquía con selección múltipleEl componente jerarquía permite la selección múltiple para facilitar la gestión de los elementos. Acontinuación de muestra una captura:
  • Componentes RUP – Jerarquía 16/21A continuación se detallan los cambios necesarios para que la jerarquía incluya selección múltiple:1. Indicar que el grid deberá tener selección múltiple:multiselect: true,2. Se incluirá el tratamiento de la nueva columna en el maleador de datos [RowMapper]:jerarquia.setTreeNodes(resultSet.getString("TREENODES"));3. Tratamiento del nuevo parámetro para aplicaciones de UDA antiguas:Pagination pagination = new Pagination();...pagination.setMult(request.getParameter("mult"));NOTA: Si el objeto Pagination se utiliza con la anotación @ModelAttribute este paso no esnecesario.4. Se añadirá una columna más en el grid:colNames: [ ..., "treeNodes" ],colModel: [ ..., {name: "treeNodes", hidden: true} ]10.1. Menú desplegableEn la jerarquía con multiselección se muestra un menú desplegable en cada una de las filas de la tablapara realizar operaciones a partir de ese punto en la jerarquía y un menú desplegable general a aplicar atodos los elementos de la tabla:• Menú por fila:
  • Componentes RUP – Jerarquía 17/21Las opciones podrán variar en función del contexto. Por ejemplo no se mostrarán las opcionesde “desmarcar” si previamente no se han “marcado“.En aquellos elementos que no tengan hijos no podrá desplegarse el menú y por defecto saldrádeshabilitado, aunque puede configurarse para que ni siquiera se muestre el icono dedespliegue (ver atributo multiMenu).Ejemplo de menú deshabilitadoA continuación se hace un resumen de las funcionalidades:o Marcar hijos: Selecciona los hijos directos (nivel directamente inferior) del elementosobre el que se despliega el menú.o Marcar descendientes: Selecciona todos los hijos del elemento sobre el que sedespliega independiente del nivel al que pertenezcan.o Desmarcar hijos: Deselecciona los hijos directos (nivel directamente inferior) delelemento sobre el que se despliega el menú.o Desmarcar descendientes: Deselecciona todos los hijos del elemento sobre el que sedespliega independiente del nivel al que pertenezcan.• Menú general:El menú desplegable sirve para seleccionar todas las filas de la tabla. En el caso de quetodas estén seleccionadas, la opción a mostrar será “Desmarcar todos”.10.2. Edición múltiple / Eliminación múltipleEl soporte de la edición múltiple y la eliminación múltiple cuando se utiliza la jerarquía depende de laimplementación de un método que gestione internamente la paginación de la selección. A continuaciónse detallan los pasos para implementar dicho método.10.2.1. Acceso a datosEl tipo de retorno del método para la obtención de datos será TreeMap<String, TreeMap<String,String>>.Primero definiremos la leyenda de los elementos empleados para detallar de manera genérica lasdiferentes implementaciones:
  • Componentes RUP – Jerarquía 18/21• columna columna que se usa para la referencia (ej. id)• columnaPadre columna que define el elemento con el que se relaciona, es decir, supadre. Será nulo en los casos que no tenga padre [nivel 1] (ej. manager_id).• tabla tabla en la que se basa la jerarquía (ej. employee)• aliasTabla alias que se le dará a la la tabla en la parte from de la query (ej. … fromemployee e …)10.2.2. ConsultaPara obtener los datos de la jerarquía se requiere una query que tenga la siguiente forma:select * from (select [columna] as pk, ceil(rownum/?) page,case when (mod(rownum,?)= 0) then ? elseTO_CHAR(mod(rownum,?)) end as linefrom (select [columna], [columaPadre], nombreColumna, rownumfrom [tabla]-- Relacion JERARQUIAstart with [columnaPadre] is nullconnect by prior [columna] = [columnaPadre]order siblings by nombreColumna asc/desc) [aliasTabla]where 1=1-- Relacion JERARQUIAstart with [columnaPadre] is nullconnect by prior [columna] = [columnaPadre]order siblings by nombreColumna asc/desc)-- Registros SELECCIONADOSwhere (1,pk) in ((1,?),(1,?),...)NOTA: Por simplificar la query no se ha incluido el ejemplo en el que existen criterios de filtrado y/onegocio.- Los elementos destacados en rojo corresponden a elementos propios del negocio, pasadoscomo parámetros desde el controlador y por tanto variables.- Los elementos que aparecen dentro de corchetes son datos requeridos por la jerarquía y sepasarán como parámetros.Se han creado diversas funciones en el objeto Pagination de x38 para facilitar la gestión de queries.A continuación se muestra un ejemplo del código que se debería implementar (destacados ennegrita los elementos más importantes) para la obtención de los elementos jerarquizados://SELECTStringBuilder sbSQL = new StringBuilder("");//CONDICIONES (negocio) [OPCIONAL]StringBuilder businessFilters = new StringBuilder();List<Object> businessParams = new ArrayList<Object>();
  • Componentes RUP – Jerarquía 19/21List<String> businessNames = new ArrayList<String>();businessFilters.append("AND t1.EJIE = ?");businessParams.add("1");businessNames.add("EJIE");//FILTROMap<String, ?> mapaWhere = this.getWhereLikeMap(usuarioJerarquia,false);//SELECTEDsbSQL = pagination.getQuerySelectedGrid(sbSQL, mapaWhere, model"COLUMNA", "COLUMNA_PADRE", "TABLA", "ALIAS_TABLA", businessFilters,businessParams);List<?> params = (List<?>) mapaWhere.get("params");return this.jdbcTemplate.query(sbSQL.toString(),pagination.selectedExtractorGrid, params.toArray());10.2.3.ControladorLa gestión de los elementos seleccionados requiere el siguiente método:@RequestMapping(method = RequestMethod.GET,headers={"JQGridModel_selected=true"})public @ResponseBodyTreeMap<String, TreeMap<String, String>>getAllJQGridSelected (@ModelAttribute UsuarioJerarquiafilterUsuarioJerarquia, @ModelAttribute Paginationpagination){return this.usuarioJerarquiaService.findAllLikeSelected(filterUsuarioJerarquia, pagination);}10.2.4.PresentaciónNo se requiere de ningún cambio y/o implementación ya que es interno de la jerarquía.11. Integración con x38En este apartado se comentan los cambios más destacados en la librería x38 para incluir funciones quefaciliten la integración de la jerarquía en UDA.11.1. PaginationA continuación se detallan los métodos del bean Pagination para facilitar la creación de las queriesrelativas a la jerarquía.• public StringBuilder getPaginationQueryJerarquia(StringBuilder query)
  • Componentes RUP – Jerarquía 20/21Modifica la query recibida como parámetro para filtrar los elementos según los criterios depaginación.• public StringBuilder getQueryJerarquia(StringBuilder query, Map<String,?> mapaWhere, String columna, String columnaPadre, StringcolumnaParentNodes, String tabla, String aliasTabla)Modifica la query recibida como parámetro y añade los parámetros de la query a lareferencia mapaWhere.query Comienzo de la query (Ej. “select xxx, yyyy “).mapaWhere Mapa con las condiciones de filtrado (generado por UDA).columna Nombre de la columna que se relaciona.columnaPadre Nombre de la columna con la que se relaciona.columnaParentNodes Nombre de la columna para mostrar en el tooltip.tabla Nombre de la tabla que implementa la relación.aliasTabla Alias asociado a la tabla en la query.• public StringBuilder getQueryJerarquia(StringBuilder query, Map<String,?> mapaWhere, String columna, String columnaPadre, StringcolumnaParentNodes, String tabla, String aliasTabla, StringBuilderjoins)Modifica la query recibida como parámetro y añade los parámetros de la query a lareferencia mapaWhere.joins Relación entre tablas.• public StringBuilder getQueryJerarquia(StringBuilder query, Map<String,?> mapaWhere, String columna, String columnaPadre, StringcolumnaParentNodes, String tabla, String aliasTabla, StringBuilderjoins, StringBuilder businessFilters, List<?> businessParams)Modifica la query recibida como parámetro y añade los parámetros de la query a lareferencia mapaWhere cuando se requieren condiciones de negocio.businessFilters Literal con las condiciones.businessParam s Parámetros (datos) de las condiciones.• public StringBuilder getQueryJerarquiaCount(StringBuilder query,Map<String, ?> mapaWhere, String columna, String columnaPadre, StringcolumnaParentNodes, String tabla, String aliasTabla)Modifica la query recibida como parámetro y añade los parámetros de la query a lareferencia mapaWhere para el recuento de elementos.• public StringBuilder getQueryJerarquiaCount(StringBuilder query,Map<String, ?> mapaWhere, String columna, String columnaPadre, StringcolumnaParentNodes, String tabla, String aliasTabla, StringBuilderbusinessFilters, List<?> businessParams)
  • Componentes RUP – Jerarquía 21/21Modifica la query recibida como parámetro y añade los parámetros de la query a lareferencia mapaWhere para el recuento de elementos cuando se requieren condiciones denegocio.• public StringBuilder getQuerySelectedGrid(StringBuilder query,Map<String, ?> mapaWhere, Object bean, String columna, StringcolumnaPadre, String columnaParentNodes, String tabla, StringaliasTabla)Crea una query para la obtención de la estructura necesaria para soportar la edición múltipley el borrado múltiple en la jerarquía.• public StringBuilder getQuerySelectedGrid(StringBuilder query,Map<String, ?> mapaWhere, Object bean, String columna, StringcolumnaPadre, String columnaParentNodes, String tabla, StringaliasTabla, StringBuilder businessFilters, List<?> businessParams,List<?> businessNames)Crea una query para la obtención de la estructura necesaria para soportar la edición múltipley el borrado múltiple en la jerarquía cuando se requieren condiciones de negocio.• public ResultSetExtractor<TreeMap<String, TreeMap<String, String>>>selectedExtractorGrid = new ResultSetExtractor<TreeMap<String,TreeMap<String, String>>>(){ ... }Clase que gestiona el resultado de la query para la obtención de la estructura necesaria parasoportar la edición múltiple y el borrado múltiple en la jerarquía que requiere la presentación.11.2. JerarquíaA continuación se detallan los campos del bean Jerarquía para la transmisión de los datos de lajerarquía.@JsonUnwrappedprivate T model;private int level;private boolean hasChildren;private String parentNodes;private String treeNodes;private boolean filter;model Bean utilizado para el Modelo de datos. Contiene los datos del negocio.level Nivel dentro de la jerarquía.hasChildren Indicador de si contiene hijos o no.parentNodes Lista de los padres hasta el nodo actual (literal para el tooltip).treeNodes Lista de los padres hasta el nodo actual (valor para la selección múltiple).filter Indicador de si el elemento cumple el filtro o no.