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
00065
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();
00076 long newSessionID = Long.parseLong(resultCommand.getMetaInformation());
00077 NumSyncManagerDB.getManager().saveSyncNumberForService(newSessionID, this.getSyncName());
00078 }
00079 }
00080 if (meta.equals("noobject")) {
00081
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;
00100 }
00101
00102
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 }