Download Vamos a usar el JAXB para poder leer y escribir codigo XML que

Document related concepts
no text concepts found
Transcript
Vamos a usar el JAXB para poder leer y escribir codigo XML que describe a un objeto
java.
Si lo que deseamos es interactuar entre dos sistemas enviando solamente una descripción
xml de un objeto java, podemos enviarlo en xml , texto plano, para que el otro sistema lo
vuelva a reconstruir.
Esta técnica no es para sustitur el mecanismo de serializacion que ofrece java con la
interfaz Serializable. Las necesidades pueden variar pero este mecanismo es util cuando se
desea invocar a un webservice por ejemplo, y el webservice en uno de los argumentos de
sus servicios, espera a un objeto, el cual viaja a traves de la red por en formato de xml.
1.Primero definimos el xsd que describe al objeto java. Se llama PCTimerList
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Juan
Miguel (JMC) -->
<xs:schema xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" jxb:version="1.0">
<xs:element name="PCTimerList">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element name="pcTimer" type="PCTimer"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="PCTimer">
<xs:all>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="ip" type="xs:string"/>
<xs:element name="tiempo" type="xs:string"/>
<xs:element name="cobrar" type="xs:string"/>
<xs:element name="x" type="xs:int"/>
<xs:element name="y" type="xs:int"/>
<xs:element name="tamx" type="xs:int"/>
<xs:element name="tamy" type="xs:int"/>
<xs:element name="tabSelected" type="xs:int"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="iconId" type="xs:int"/>
<xs:element name="horaFin" type="xs:string"
minOccurs="0"/>
<xs:element name="horaInicio" type="xs:string"
minOccurs="0"/>
<xs:element name="maquina" type="xs:string"
minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:schema>
2.Ahora lo compilamos con un compilador que viene en la implementación de JAXB que
se llama XJC. Ese compilador recibe como entrada un archivo xml en donde dice donde
esta el archivo xsd. Y el resultado de la compilación son los archivos .java que sirven para
interpretar al archivo xml que describe a un PCTimerlist según lo que viene en su archivo
XSD.
<?xml version="1.0"?>
<!-Copyright 2003 Sun Microsystems, Inc. All rights reserved.
-->
<project basedir="." default="compile">
<!-- if you are not running from $JWSDP_HOME/jaxb/samples AND you
are using your own version of Ant, then you need to specify
"ant -Djwsdp.home=..." -->
<property name="jwsdp.home" value="c:\jwsdp-1.3" />
<path id="classpath">
<pathelement path="." />
<!-- for use with bundled ant -->
<fileset dir="${jwsdp.home}" includes="jaxb/lib/*.jar" />
<fileset dir="${jwsdp.home}" includes="jwsdpshared/lib/*.jar" />
<fileset dir="${jwsdp.home}" includes="jaxp/lib/**/*.jar" />
</path>
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath refid="classpath" />
</taskdef>
<!-- compile Java source files -->
<target name="compile">
<!-- generate the Java content classes from the schema -->
<echo message="Compilando PCTimers..." />
<xjc schema="PCTimers.xsd"
target="."
package="inc.jmc.cyberboard.persistence.xsd.pctimers"/>
</target>
</project>
3 Para correr este xml, el cual no es otra cosa mas que un script de compilación para ANT,
usamos ANT (ya sea desde linea de comandos o desde eclipse)
En la imagen podemos ver del lado derecho los paquetes que genero el compilador, los
cuales no son otra cosa mas que los interpretes de xml de la clase PCTImerlist
4.- aquí tenemos un ejemplo de cómo se usan las clases que se acaban de crear.
/*
* PCTimersFrmIO.java
*
* Created on 9 de octubre de 2006, 08:34 AM
*
*/
package inc.jmc.cyberboard.persistence;
import java.util.Iterator;
import java.util.List;
import inc.jmc.cyberboard.log.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Marshaller;
import inc.jmc.cyberboard.ui.*;
import inc.jmc.cyberboard.dao.*;
import java.io.*;
import inc.jmc.cyberboard.ui.*;
import inc.jmc.cyberboard.*;
import inc.jmc.cyberboard.persistence.xsd.pctimers.impl.*;
import inc.jmc.cyberboard.common.*;
import org.apache.log4j.Logger;
/**
*
* @author Juan Miguel Olguin Salguero
*/
public class PCTimersFrmIO implements Streamable{
static Logger logger = Logger.getLogger(PCTimersFrmIO.class.getName());
/** Creates a new instance of PCTimersFrmIO */
public PCTimersFrmIO() {
}
public java.util.ArrayList load(InternalClock clock)throws Exception{
java.util.ArrayList arryRet=null;
try{
arryRet=new java.util.ArrayList();
java.sql.Connection conn=Dao.getConnection();
SerialObjectsDao ser=new SerialObjectsDao();
String xml=ser.query(conn,PCTimerListImpl.class.getName());
conn.close();
JAXBContext jc =
JAXBContext.newInstance("inc.jmc.cyberboard.persistence.xsd.pctimers");
Unmarshaller u = jc.createUnmarshaller();
//System.out.println(u.unmarshal(new
ByteArrayInputStream(xml.getBytes())).getClass());
PCTimerListImpl
listaImpl= (PCTimerListImpl) u.unmarshal(new
ByteArrayInputStream(xml.getBytes()));
List pctimersList=listaImpl.getPcTimer();
Iterator it=pctimersList.iterator();
while(it.hasNext())
{
PCTimerImpl pctimerItem=(PCTimerImpl)it.next();
PCTimers timerGui=new PCTimers(clock);
timerGui.getCobrarTxt().setText(pctimerItem.getCobrar());
timerGui.getDisplayTimerTxt().setText(pctimerItem.getTiempo());
timerGui.getNombreCompuTxt().setText(pctimerItem.getNombre());
timerGui.getTituloFrontalLabel().setText(pctimerItem.getNombre());
timerGui.getCronometroLabel().setToolTipText(pctimerItem.getNombre());
timerGui.getIpTxt().setText(pctimerItem.getIp());
timerGui.getCobrarTxt().setText(pctimerItem.getCobrar());
//timerGui.getJTabbedPane1().setSelectedIndex(pctimerItem.getTabSelected());
timerGui.getJTabbedPane1().setSelectedIndex(pctimerItem.getTabSelected());
timerGui.setLocation(pctimerItem.getX(),pctimerItem.getY());
timerGui.setSize(pctimerItem.getTamx(),pctimerItem.getTamy());
timerGui.setTitle(pctimerItem.getTitle());
///nuevas cosas
timerGui.getInicioTxt().setText(pctimerItem.getHoraInicio());
timerGui.getFinTxt().setText(pctimerItem.getHoraFin());
timerGui.getPcLabel().setIcon(ImageLoader.images[pctimerItem.getIconId()]);
arryRet.add(timerGui);
}
}
catch(JAXBException jaxbe)
{
jaxbe.printStackTrace();
}
return arryRet;
}
public String save(java.util.ArrayList pcTimersArry)throws Exception
{
String ret=null;
//try{
JAXBContext jc =
JAXBContext.newInstance("inc.jmc.cyberboard.persistence.xsd.pctimers");
Marshaller m = jc.createMarshaller();
m.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
PCTimerListImpl secuencia= new PCTimerListImpl();
List listPCTimers=secuencia.getPcTimer();
Iterator it=pcTimersArry.iterator();
while(it.hasNext())
{
inc.jmc.cyberboard.ui.PCTimers aux=(inc.jmc.cyberboard.ui.PCTimers)it.next();
String cobrar=aux.getCobrarTxt().getText();
String nombre=aux.getNombreCompuTxt().getText();
String horaTranscurrida=aux.getDisplayTimerTxt().getText();
PCTimerImpl pctimerimpl=new PCTimerImpl();
pctimerimpl.setCobrar(cobrar);
pctimerimpl.setNombre(nombre);
pctimerimpl.setIp(aux.getIpTxt().getText());
pctimerimpl.setTiempo(horaTranscurrida);
pctimerimpl.setX(aux.getX());
pctimerimpl.setY(aux.getY());
pctimerimpl.setTamx(aux.getWidth());
pctimerimpl.setTamy(aux.getHeight());
pctimerimpl.setTabSelected(aux.getJTabbedPane1().getSelectedIndex());
pctimerimpl.setTitle(aux.getTitle());
///nuevas cosas
pctimerimpl.setMaquina(nombre);
pctimerimpl.setHoraInicio(aux.getInicioTxt().getText());
pctimerimpl.setHoraFin(aux.getFinTxt().getText());
///
pctimerimpl.setIconId(ImageLoader.getIdIcon((javax.swing.ImageIcon)aux.getPcLabel().g
etIcon() ));
listPCTimers.add(pctimerimpl);
}
java.io.StringWriter swr= new java.io.StringWriter();
m.marshal( secuencia, swr );
ret=swr.toString();
logger.info("ya serializamos a todos los pctimers ["+ret.length()+"]\n"+ret);
java.sql.Connection conn=Dao.getConnection();
SerialObjectsDao ser=new SerialObjectsDao();
logger.info("llave de insercion \n"+secuencia.getClass().getName());
ser.update(conn,PCTimerListImpl.class.getName(),ret);
conn.close();
/* }
catch(JAXBException ex)
{
ex.printStackTrace();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}
catch(java.sql.SQLException ex)
{
ex.printStackTrace();
}*/
return ret;
}
}
/*
*este codigo se
tarifasList=Tarifa.getTarifas();
FileOutputStream fos = new
FileOutputStream("D:\\jmdevelopment\\CyberCaffeeNet\\tarifasfrm.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tarifasList);
oos.close();
tarifasList=Tarifa.getTarifas();
FileOutputStream fos = new
FileOutputStream("D:\\jmdevelopment\\CyberCaffeeNet\\tarifasfrm.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tarifasList);
oos.close();
*/