Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Fco.JavierY ezJuan
ITIS
Consultor:JavierFerrGarcia
9deenerode2006
ndice de contenido
Plandetrabajo......................................................................................................................................................3
DescripcindelTFC.......................................................................................................................................3
Objetivosgeneralesyespecficos...................................................................................................................3
Planificacin....................................................................................................................................................3
Anlisisderequisitos............................................................................................................................................5
Introduccin....................................................................................................................................................5
Glosario...........................................................................................................................................................6
Modelodedominio.........................................................................................................................................7
Casosdeuso....................................................................................................................................................8
Guiones...........................................................................................................................................................9
Descripcintextualdeloscasosdeuso........................................................................................................10
Fichasdeloscasosdeuso.............................................................................................................................11
Futurasmejoras.............................................................................................................................................13
Diseo.................................................................................................................................................................14
Arquitectura..................................................................................................................................................15
Capas.......................................................................................................................................................15
Implementacindelascapas...................................................................................................................15
Arquitecturadepatrones.........................................................................................................................17
Diagramadedespliegue..........................................................................................................................19
Diagramadecomponentes......................................................................................................................20
Diagramadeclases..................................................................................................................................21
Diagramadecolaboracin.......................................................................................................................23
Persistencia..............................................................................................................................................24
Detallesdeimplementacin....................................................................................................................26
ServiceLocator...................................................................................................................................26
TypesafeEnumeration.......................................................................................................................26
Interfazdeusuario.........................................................................................................................................27
Conclusiones.......................................................................................................................................................28
Guadeinstalacin.............................................................................................................................................29
Paso1.............................................................................................................................................................29
Paso2............................................................................................................................................................29
Paso3............................................................................................................................................................30
Paso4............................................................................................................................................................30
Paso5............................................................................................................................................................30
2de34
Plandetrabajo
DescripcindelTFC
EstetrabajofinaldecarreraconsisteenlarealizacindeunaaplicacinbajolaplataformaJ2EE.La
realizacindeestaaplicacinpermitiraplicarconocimientosadquiridosendiferentesasignaturasdelos
estudiosdeITIS.ConeldesarrollodelaaplicacinseadquirirnlosconocimientosbsicossobreJ2EE.
Laaplicacinarealizarpermitirgestionarlastareaspendientesenunproyectodedesarrollodesoftware.
Esdeutilidadsobretodoenlasultimasfasesdelproyectocuandosequierecerraryhaymltiplescambios
pequeosquehacer(corregirbugs,pequeasmejoras,etc).Tambinestilparalafasedemantenimientoen
laquelosusuariosdetectanbugsypidenpequeoscambios.
Objetivosgeneralesyespecficos
Eldesarrollodelaaplicacinsebasarenpatronesdediseo.
Lalgicadelaaplicacinsedividirenvariaspartes:lgicadepresentacin,lgicadenegocioylgica
deintegracin(persistenciaenSGBD).Sepretendeaplicarlospatronesdediseoapropiadosparacadatipo
delgica.
Sepretendenlossiguientesobjetivosfuncionales:
1. Introducir tareas pendientes indicando el tipo de tarea (corregir bug, aadir funcionalidad,
cambiarfuncionalidad,etc),eltitulo,ladescripcin,laprioridadyelproyecto.
2.
Cambiarelestadodeunatarea(encurso,realizada,rechazada,etc.)
3.
Listarlastareasfiltradasporestado,yordenadasporprioridad.
4.
Crear,modificaryeliminarproyectos.
Planificacin
Fecha
Hito
16/10/05
Documentodeanlisisderequisitos
30/10/05
Documentodediseo
13/11/05
Programacin:Crear,modificaryeliminarproyectos
20/11/05
Programacin:Introducirtareas
27/11/05
Programacin:Listartareas
4/12/05
Programacin:Cambiarelestadodeunatarea
18/12/05
Memoria
3de34
Fecha
25/12/05
Hito
PresentacindefensadelTFC
4de34
Anlisisderequisitos
Introduccin
Enlosproyectosdedesarrollodesoftwaresesuelengestionarlosbugsmedianteaplicacionesrealizadas
paratalfin,como,porejemplo,bugzilla.
Sepretenderealizarunaaplicacinquehagaunpocoms.Ademsdelosbugs,duranteeldesarrollode
softwaresesuelenacumularpequeastareas,talescomovariacionesenlafuncionalidad,variacionesenel
interfaz,etc.Todasestastareasjuntoconlosbugspodrnsergestionadasporlaaplicacin.
5de34
Glosario
Proyecto:serefiereaunproyectodedesarrollodesoftware.
Tarea:trabajopendientederealizarenunproyecto.
Estado:situacinenqueseencuentrauntarea.
Tipo:naturalezadeunatarea.Losposiblestipossonlossiguientes:bug,modificacin,nuevafuncionalidad.
6de34
Modelodedominio
Parasimplificarsehanomitidolosmtodosdeaccesoalosatributosdelasclases.
7de34
Casosdeuso
8de34
Guiones
Administrador:eladministradoreselresponsabledecrear,modificaryeliminarlosproyectosalosquese
lesasignarntareas.
Usuario:elusuarioserquienasignetareasalosproyectos.Tambinseencargardemodificarelestadode
dichastareas.
9de34
Descripcintextualdeloscasosdeuso
CU01Crearproyecto:creaunnuevoproyectoenelsistema.
CU02Modificarproyecto:modificalaspropiedadesdeunproyectoexistenteenelsistema.
CU03Eliminarproyecto:eliminaunproyectoexistenteenelsistema.Siexistentareasrelacionadasconel
proyectotambinsoneliminadas.
CU04Listarproyectos:listatodoslosproyectosexistentesenelsistema.
CU05Introducirtarea:introduceunanuevatareaasociadaaundeterminadoproyecto.
CU06Modificartarea:modificalaspropiedadesdeunatareaexistenteenelsistema.
CU07Cambiarestadotarea:cambiaelestadodeunatareaexistenteenelsistema.
CU08Listartareas:listalastareaspertenecientesaundeterminadoproyecto.
10de34
Fichasdeloscasosdeuso
Casodeuso:crearproyecto
Cdigo:CU01
Descripcin:creaunnuevoproyectoenel
sistema
Actores:administrador
Precondicin:
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:baja
Casodeuso:modificarproyecto
Cdigo:CU02
Descripcin:modificalaspropiedadesdeun
proyectoexistenteenelsistema
Actores:administrador
Precondicin:elproyectotienequehabersido
creado
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:baja
Casodeuso:Eliminarproyecto
Cdigo:CU03
Descripcin:eliminaunproyectoexistenteen
elsistema.Siexistentareasrelacionadasconel
proyectotambinsoneliminadas.
Actores:administrador
Precondicin:elproyectotienequehabersido
creado
Casosdeusorelacionados:
Frecuenciadeuso:baja
Casodeuso:Listarproyectos
Cdigo:CU04
Descripcin:listatodoslosproyectosexistentes
enelsistema
Actores:administrador,usuario
Precondicin:
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:alta
Casodeuso:Introducirtarea
Cdigo:CU05
Descripcin:introduceunanuevatarea
asociadaaundeterminadoproyecto
Actores:usuario
Prioridad:alta
Prioridad:baja
Prioridad:baja
Prioridad:alta
11de34
Prioridad:media
Precondicin: el proyecto relacionado tiene que Postcondicin:
existir
Casosdeusorelacionados:
Frecuenciadeuso:alta
Casodeuso:Modificartarea
Cdigo:CU06
Descripcin:modificalaspropiedadesdeuna
tareaexistenteenelsistema
Actores:usuario
Precondicin:latareatienequeexistir
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:baja
Casodeuso:Cambiarestadotarea
Cdigo:CU07
Descripcin:cambiaelestadodeunatarea
existenteenelsistema
Actores:usuario
Precondicin:latareadebeexistir
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:alta
Casodeuso:Listartareas
Cdigo:CU08
Descripcin:listalastareaspertenecientesa
undeterminadoproyecto
Actores:usuario
Precondicin:
Postcondicin:
Casosdeusorelacionados:
Frecuenciadeuso:alta
Prioridad:baja
Prioridad:alta
Prioridad:media
12de34
Futurasmejoras
Debidoalimitacionesdetiempoenesteproyectonosehanpodidoincluiralgunasfuncionalidades.
Estasfuncionalidadessonlassiguientes:
Seguridad: creacin de una gestin de usuarios basada en roles. Cada usuario deber
autenticarseparaaccederalsistemaylafuncionalidadquetendrdisponiblevariarsegnlosroles
queposea.
Asignacindetareas:sepodrasignarunatareaaunusuarioenconcreto.Sepodrlistarlas
tareasasignadasaundeterminadousuarioyfiltrarporestado.
Avisos por email: cuando a un usuario se le asigne una tarea se le avisar por correo
electrnico.
13de34
Diseo
14de34
Arquitectura
Capas
Persistencia
Integracin
Negocio
Presentacin
Renderizado
Enesteesquemapodemosverlascapasdelasquevaaconstarelsistema.
Lacapaderenderizadoserefierealnavegador(InternetExplorer,Firefox,Opera,etc.).
Lacapadepresentacineslaquerespondealaspeticionesdelacapaderenderizadodespusdeconsultar
alacapadenegocio.SurespuestaesenformadeHTML.
Lacapadenegociorespondealacapadepresentacindespusdeconsultaralacapadeintegracin.En
estacapaesdondesedebeimplementarlasreglasdenegocio.
Lacapadeintegracinpermitealacapadenegocioaccederalapersistencia.
Lacapadepersistenciaeslaquepermitepersistiryrecuperarlainformacinprocedenteodemandadapor
lasotrascapas.
LacapadepresentacinlaimplementaremosusandoelpopularframeworkStruts.
LacapadenegociolaimplementaremosusandoStatelessSessionBeans.
LacapadeintegracinlaimplementaremosusandoelpatrnDAO(vermsadelantelaexplicacin).
La capa de persistencia, al igual que la de renderizado, no la vamos a implementar ya que existen
mltiplessoluciones.EnestecasoconfiaremoslapersistenciaalSGBDPostgreSQL.
16de34
Arquitectura de patrones
Model
View
Controler
TransferObject
BusinessDelegate
SessionFaade
ServiceLocator
DAO
BasedeDatos
17de34
EncolorazulestnloscomponentesdelpatrnMVC2.,engrislospatronesdelgicadenegocio,enrojo
losdeintegracin,enazulelpatrnTransferObjectyenamarilloelSGBDquenoesunpatrnperolohe
incluidoenelesquemaparamayorclaridad.
MVC2: elpatrnMVC2(ModeloVistaControlador2)eselqueemplearenlacapadepresentacin.
Struts esunframeworkmuyextendidoquesebasaenMVC2.ElfuncionamientodelpatrnMVC2se
basaenqueelcontrolador(servlet)recibelaspeticionesqueprocesa,traslocualinstanciaelmodelo
(JavaBean o FormBean) e invoca a la vista (JSP) tras lo cual se contesta a la peticin. En
http://www.javaworld.com/javaworld/jw121999/jw12ssjjspmvc.htmlhayunarticulointeresantesobre
laaplicacindeMVC2conJSP.Deestearticuloheextradoelsiguienteesquema:
SessionFaade:estepatrnpermiteenunaplataformamulticapaJ2EEmostrarunafachadadelacapa
delgicadenegocioalacapadepresentacin.Encapsulaelaccesoalalgicadenegociopresentandoun
niveldeabstraccinelevado.Laimplementacindel SessionFaade serealizaconun sessionbean. Este
patrnestabasadoenelpatrnFaadedeGoF,ysedescribeenellibroCoreJ2EEPatterns.
BussinesDelegate:lafuncindeestepatrnesencapsularlacomplejidaddelacomunicacinremotacon
loscomponentesdenegocio.Aunqueseuseenlapartedelcliente,seconsideraunpatrndenegocioyaque
eselaccesodelalgicadenegocioparaelclienteylosueleprogramarelprogramadordelgicadenegocio.
El Bussines Delegate suele usar el patrn Service Locator para hacer el lookup de los servicios. Se
comunicadirectamenteconelSessionFaade.
DAO:elpatrnDAO(DataAccessObject)permiteencapsularlosaccesosalapersistencia.Esunpatrn
delacapadeintegracin.
ServiceLocator:ocultalaimplementacindelmecanismodelookupdelAPIJNDI.
TransferObject:seusaparamoverinformacinentrecapas.EnCoreJ2EEPatternssepresentacomoun
patrndelgicadenegocio.Perootrosautoresloconsideranunpatrnmulticapa.Tambinesconocido
comoValueObject.
18de34
Diagrama de despliegue
Eneldiagramadedesplieguesevecomodesdeelcliente,pormediodelnavegadorweb,seaccedeal
servidordeaplicaciones(Jboss)ydesdeesteseaccedealSGBD(PostgreSQL)queestnenotramquina
(aunquepodraestarenlamisma).
19de34
Diagrama de componentes
Laaplicacinconstadedoscomponentes.SoftwareTasks.jareselcomponentequecontienelalgicade
negocio, mientras que SoftwareTasks.war es el componente que contiene la lgica de presentacin. El
componentedelgicadenegociopresentaunosinterfacesalosquelalgicadepresentacinaccede.
20de34
Diagrama de clases
Elsiguientediagramasecorrespondeconlacapadenegocioeintegracin.
21de34
Elsiguientediagramasecorrespondeconlacapadepresentacin.SehaincluidolaclaseProjectDelegate
quenoperteneceestrictamentealalgicadepresentacin.
22de34
Diagrama de colaboracin
El siguiente diagrama de colaboracin se refiere al caso de uso de mostrar todos los proyectos. Es
representativodelosdemscasosdeuso.
23de34
Persistencia
LalabordepersistenciaseconfaalsistemagestordebasesdedatosPostgreSQL.Acontinuacinsedefinen
lastablasjuntoconlassentenciasdecreacin.
Tabla:Project
Campo
Tipo
ProjectId
serial
Name
text
Referenciaa
Tipo
PriorityId
serial
Name
text
Referenciaa
Tipo
StatusId
serial
Name
text
Referenciaa
Tipo
TaskId
serial
Name
text
Description
text
Referenciaa
24de34
Tabla:Task
Campo
Tipo
Referenciaa
ProjectId
int
Project
StatusId
int
Status
PriorityId
int
Priority
TypeId
int
25de34
Detalles de implementacin
ServiceLocator
Para implementar el patrn ServiceLocator he estudiado dos ejemplos. El primero ha sido el de la
aplicacinJavaAdventureBuilderqueestaenlosblueprintsdeSunsobreJava.Elcdigofuenteesten:
http://java.sun.com/blueprints/code/adventure/1.0/src/com/sun/j2ee/bluepr
ints/servicelocator/ejb/ServiceLocator.java.html
PorotroladohemiradoelejemplodeOracle:
http://www.oracle.com/technology/sample_code/tech/java/j2ee/vsm12/src/ora
cle/otnsamples/util/ServiceLocator.java.html
MevoyaquedarconelejemplodeOracleporsusimplicidad.Aunquelomodificarparaimplementarel
patrnSingletonynotenerqueinstanciarlaclasecadavezquesequierausar.
Typesafe Enumeration
Lostiposdetareasnosonconfigurables.PararepresentarlosusarelpatrnTypesafeEnumerationquees
descritoenDesignPatterns:ElementsofReusableObjectOrientedSoftware.
Este patrn permite representar un conjunto fijo de valores de manera segura. Cada valor de la
enumeracinposeeunainstanciapublica.Existeunnicoobjetoparacadavalor.
26de34
Interfazdeusuario
Aqusemuestraunapantallasignificativadeloquepuedeserellistadodetareas.
Elmenestposicionadoalaizquierdamientrasquealaderechaaparecenlosdilogos.
27de34
Implementacin
Enesteapartadovoyacomentarlosaspectos,amijuicio,mssignificaticosdelaimplementacin.
ServiceLocator
LafuncionalidaddelServiceLocatoryahasidoexplicadaenelapartadodediseo.Paraimplementarmi
ServiceLocatormehebasadoenunodesarroladoporOracle:
(http://www.oracle.com/technology/sample_code/tech/java/j2ee/vsm12/src/oracle/otnsamples/util/ServiceLoc
ator.java.html)
LohemodificadoparaqueimplementaraelpatrnSinglentonyparaquenohayaquehacercastingdelos
diferentesobjetosdevueltos.
Elresultadoeselsiguiente:
package edu.uoc.projecttasks.util;
import java.util.Hashtable;
import
import
import
import
import
javax.ejb.EJBHome;
javax.naming.InitialContext;
javax.naming.NamingException;
javax.rmi.PortableRemoteObject;
javax.sql.DataSource;
/*
* Basado en el ServiceLocator de Oracle
*
*/
public final class ServiceLocator {
// Cache of objects in JNDI tree
private static Hashtable homeCache = new Hashtable();
// Initial context
private static InitialContext defaultContext = getContext();
private ServiceLocator() {
}
private static InitialContext getContext() {
try {
return new InitialContext();
} catch (NamingException e) {
throw new ServiceLocatorException(e.getMessage());
}
}
/**
* Method to return an object in the default JNDI context, with the supplied
* JNDI name.
* @param <b>jndiName</b> The JNDI name
* @return <b>Object</b> The object in the JNDI tree for this name.
* @throws <b>UtilityException</b> Exception this method can throw
*/
28de34
XDoclet
XDoclet(http://xdoclet.sf.net/)esunaherramientadegeneracinautomticadecdigo.Laaplicacinque
hedesarrolladohaceusodelosStatelessSessionBeans,quesonbastanteengorrososdeprogramardebidoa
quehayquerealizarvariasclasesparaunosolo.GraciasaXDocletbastaconprogramarunnicaclaseylas
demssegeneranautomticamente. Porejemplo,paraprogramar PriorityFacade sehaninsertadoenel
cdigofuentelossiguientesatributosXDoclet:
/**
* @ejb.bean
*
*
*
*
*
*/
name="PriorityFacade"
display-name="Name for PriorityFacade"
description="Description for PriorityFacade"
jndi-name="ejb/PriorityFacade"
type="Stateless"
view-type="both"
29de34
Tags
Enlacapadepresentacinlastareassonmuysimilares.ParanotenerquerealizarcdigoJSPmuysimilar
encadaJSPheutilizadotagsdeJSP.Elmstilmehasidoelqueheempleadoparaloslistados:
<%@ tag language="java" %>
<%@ variable name-given="elementList" %>
<%@ attribute name="modifyAction" required="true" %>
<%@ attribute name="deleteAction" required="true" %>
<%@ attribute name="groupName" required="true" %>
<%@ taglib uri="/WEB-INF/tlds/c.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
<% int count=0;%>
<c:forEach var="element" items="${elementList}">
<tr>
<td class="<%= (count % 2==0 ?"bodytablerow1":"bodytablerow2") %>">
<form name=<c:out value="${groupName}"/><%= count %> method="post"
action="/ProjectTasksWeb//<c:out value="${modifyAction}"/>">
<input
type="hidden"
name="id"
value="<c:out
value="${element.id}"/>">
<input
type="hidden"
name="name"
value="<c:out
value="${element.name}"/>">
<a href="javascript:document.<c:out value="${groupName}"/><%=
count %>.submit()">
<c:out value="${element.name}"/>
</a>
</form>
</td>
<%-- boton eliminar --%>
<td class="bodytablerow1">
<form
method="post"
action="/ProjectTasksWeb//<c:out
value="${deleteAction}"/>"
onsubmit="return
confirmDelete('<c:out
value="${element.name}"/>')">
<input
type="hidden"
name="id"
value="<c:out
value="${element.id}"/>">
<input
type="hidden"
name="name"
value="<c:out
value="${element.name}"/>">
<html:submit
styleClass="buttoncolornormal"
onmouseover
=
"this.className='buttoncolorover'" onmouseout = "this.className='buttoncolornormal'">
Eliminar
</html:submit>
</form>
</td>
</tr>
<% count++;%>
</c:forEach>
TypeSafeEnumeration
Para implementar el patrn Type Safe Enumeration he hecho uso del Enum de Java 5. Lo cual ha
simplificadobastantelascosas.
Haquedadoas:
package edu.uoc.tfc.projecttasks.to;
30de34
import java.io.Serializable;
public enum TypeTO implements Serializable {
BUG(1, "bug"), NEW_FUNCTIONALITY(2, "Nueva funcionalidad"),
MODIFICATION(3, "Modificacin"), OTHER(4, "Otros");
private int id;
private String name;
private TypeTO(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
31de34
Conclusiones
LarealizacindeunproyectoJ2EEnoestrivial.LospatronesdediseoespecificosparaJ2EEsonuna
orientacinbsica,porlocualesnecesariotenerconocimientosdediagramacinUML.Debidoalotedioso
delaprogramcindelasinterfaces,localesyremotas,esmuyrecomendablerecurriraXdocletparacrear
cdigodeformaautomtica.
En la parte de presentacin la base es el conocimiento del HTML. Conociendo HTML no es muy
complicadoentenderlafilosofiadelJSP.DentrodeJSPhayunavariedaddelibreriasquesepuedenescoger.
EnelcasodeesteproyectoheoptadoporlasqueparecensermsdifundidasStrutsyJSTL.Strutsademsde
proporcionarlibreriasdetagsproporcionaunFrontControllerqueimplemetaMVC2.Sinosedispusieradel
framework Struts , o de cualquier otro, la programacin de la parte de presentacin sera mucho ms
compleja.
LaconclusinfinalesqueprogramarunaaplicacinJ2EErequieredeunacurvadeaprendizajeelevada.
AcambioJ2EEproporcionaunaseriedeventajas:separacindelgicadenegocioypresentacin,seguridad
controladaporelservidordeaplicacionesyrobustezdelasaplicaciones,entreotrasventajas.
32de34
Guadeinstalacin
LoexplicadoaquserefierealainstalacindelaaplicacinenunservidordeaplicacionesJBoss.Seha
probadoenunJBoss versin4.0.3..Esdeesperarquefuncioneenotras versiones,aunquenohasido
verificado.
Paso1
Creareneldirectoriodedespliegueunfichero,correspondientealdatasource,llamadotasksds.xmlcon
elsiguientecontenido:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!--->
<!-- JBoss Server Configuration
-->
<!--->
<!-- ===================================================================== -->
<!-- $Id: postgres-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ -->
<!-- ==================================================================== -->
<!-- Datasource config for Postgres
-->
<!-- ==================================================================== -->
<datasources>
<local-tx-datasource>
<jndi-name>TasksDS</jndi-name>
<connection-url>jdbc:postgresql://localhost:5432/tasks</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>javier</user-name>
<password></password>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>PostgreSQL 8.0</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
Esposible,dependiendodelaconfiguracindelabasededatos,quehayaquemodificarelusuarioy
contraseadelfichero.
Paso2
Crearlaestructuradelabasededatosconlassiguientessentencias:
33de34
Paso3
CopiareneldirectoriodelibreriasdelservidorlaslibreriscorrespondientesaStrutsyaJSTL.
LaslibreriasdeStrutsestndisponiblesenhttp://apache.rediris.es/struts/library/struts1.2.8lib.zip.
Las librerias de JSTL estn disponibles en http://www.apache.org/dist/jakarta/taglibs/standard/jakarta
taglibsstandardcurrent.zip
Paso4
CopiareneldirectoriodedespliegueelficheroProjectTasksApplication.ear.
Paso5
ArrancarJBossyaccederahttp://localhost:8080/ProjectTasksWeb/
34de34