SynchroMetaDataListener.java

00001 package org.openmobileis.synchro.openmsp.client;
00002 
00003 import java.io.ByteArrayInputStream;
00004 import java.io.ByteArrayOutputStream;
00005 import java.io.IOException;
00006 import java.io.ObjectInputStream;
00007 import java.io.ObjectOutputStream;
00008 import java.io.Serializable;
00009 
00010 import org.openmobileis.common.util.codec.GeneralCoder;
00011 import org.openmobileis.common.util.exception.SynchroException;
00012 import org.openmobileis.common.util.log.LogManager;
00013 import org.openmobileis.synchro.client.SynchroDescriptor;
00014 import org.openmobileis.synchro.journal.JournalManager;
00015 import org.openmobileis.synchro.journal.SimpleLogRenderer;
00016 import org.openmobileis.synchro.openmsp.OpenMSPException;
00017 import org.openmobileis.synchro.openmsp.client.DefaultOpenMSPSyncListener;
00018 import org.openmobileis.synchro.openmsp.client.core.NumSyncManagerDB;
00019 import org.openmobileis.synchro.openmsp.protocol.Command;
00020 import org.openmobileis.synchro.openmsp.protocol.ContainerMessage;
00021 import org.openmobileis.synchro.openmsp.protocol.DataItem;
00022 import org.openmobileis.synchro.openmsp.protocol.Element;
00023 import org.openmobileis.synchro.openmsp.protocol.Item;
00024 import org.openmobileis.synchro.openmsp.protocol.Message;
00025 import org.openmobileis.synchro.openmsp.protocol.Result;
00026 import org.openmobileis.synchro.openmsp.protocol.Status;
00027 import org.openmobileis.synchro.security.auth.Credential;
00028 
00029 public class SynchroMetaDataListener extends DefaultOpenMSPSyncListener {
00030         boolean endsync = false;
00031         private Serializable terminalMetadata;
00032         private Serializable serverMetadata;
00033 
00034         public SynchroMetaDataListener() {
00035                 JournalManager.getManager().registerJournalLogRenderer(new SimpleLogRenderer(this.getSyncName(), "Synchro Metadata"));
00036         }
00037 
00038         public Serializable getTerminalMetadata() {
00039                 return terminalMetadata;
00040         }
00041 
00042         public void setTerminalMetadata(Serializable terminalMetadata) {
00043                 this.terminalMetadata = terminalMetadata;
00044         }
00045 
00046         public Serializable getServerMetadata() {
00047                 return serverMetadata;
00048         }
00049 
00050         public void setServerMetadata(Serializable serverMetadata) {
00051                 this.serverMetadata = serverMetadata;
00052         }
00053 
00054         public String getSyncName() {
00055                 return "FWKsynchrometadata";
00056         }
00057 
00058         public void startSync(Credential cred, SynchroDescriptor synchrodescriptor)
00059                         throws OpenMSPException {
00060                 super.startSync(cred, synchrodescriptor);
00061                 endsync = false;
00062         }
00063 
00064         /* (non-Javadoc)
00065          * @see org.openmobileis.synchro.openmsp.client.OpenMSPSyncListener#receiveResultCommand(org.openmobileis.synchro.openmsp.protocol.ContainerMessage, org.openmobileis.synchro.openmsp.protocol.ContainerMessage)
00066          */
00067         public void receiveResultCommand(ContainerMessage resultContainer,      ContainerMessage initialCommand) throws OpenMSPException {
00068                 try {
00069                         while (resultContainer.hasMoreMessage()) {
00070                                 DataItem item = (DataItem) resultContainer.nextMessage().getElement();
00071                                 String meta = item.getMetaInformation();
00072                                 if (meta.equals("object")) {
00073                                         this.serverMetadata = (Serializable)this.unserializeDBObject(item.getData().getBytes());
00074                                         if (this.isSyncOK()) {
00075                                                 Result resultCommand = (Result) resultContainer.getElement(); //result
00076                                                 long newSessionID = Long.parseLong(resultCommand.getMetaInformation());
00077                                                 NumSyncManagerDB.getManager().saveSyncNumberForService(newSessionID, this.getSyncName());
00078                                         }
00079                                 }
00080                                 if (meta.equals("noobject")) {
00081                                         /* do nothing  */
00082                                 }
00083 
00084                         }
00085                 } catch (Throwable ex) {
00086                         throw new OpenMSPException(ex);
00087                 }
00088         }
00089 
00090         public void receiveStatusCommand(Status statusCommande, ContainerMessage initialCommand) throws OpenMSPException {
00091                 int status = statusCommande.getStatus();
00092                 if (status != Status.STATUS_OK) {
00093                         this.notifySynchroFailure();
00094                 }
00095         }
00096 
00097         public void sendData(Message message) throws OpenMSPException {
00098                 if (endsync) {
00099                         return; // return if an error occurs during synchro.
00100                 }
00101 
00102                 // get modified files
00103                 long ns = NumSyncManagerDB.getManager().getSyncNumberForService(this.getSyncName());
00104 
00105                 try {
00106                         Command getCommand = new Command(Element.GET, getSyncName(), getSyncName());
00107                         getCommand.setSourceSessionID(ns);
00108                         ContainerMessage getContainer = new ContainerMessage(getCommand);
00109                         String data = "";
00110                         if (this.terminalMetadata != null)      {
00111                                 data = new String(this.serializeDBObject(this.terminalMetadata));
00112                         }
00113                         Item newItem = new DataItem(Element.ITEM, "Synchro metadata", data, null, null);
00114                         getContainer.add(newItem);
00115                         message.add(getContainer);
00116                 } catch (Throwable ex) {
00117                         this.setSynchroStatus(Status.STATUS_FAILED);
00118                         LogManager.trace(new SynchroException("SynchroMetaDataListener "
00119                                         + this.getSyncName() + " Send data exception ", ex));
00120                 } finally {
00121                         endsync = true;
00122                 }
00123 
00124         }
00125 
00126          private byte[] serializeDBObject (Object obj) throws IOException {
00127             ByteArrayOutputStream bstr = new ByteArrayOutputStream();
00128             ObjectOutputStream ostr = new ObjectOutputStream(bstr);
00129             ostr.writeObject(obj);
00130             return GeneralCoder.encodeBase64(bstr.toByteArray());
00131           }
00132           
00133          private Object unserializeDBObject(byte[] data) throws IOException, ClassNotFoundException {
00134               ByteArrayInputStream bstr = new ByteArrayInputStream(GeneralCoder.decodeBase64(data));
00135               ObjectInputStream ostr = new ObjectInputStream(bstr);
00136               return ostr.readObject();
00137           }
00138 
00139 }

Generated on Mon Jan 11 21:19:17 2010 for OpenMobileIS by  doxygen 1.5.4