SimpleMockSynchroManager.java

00001 
00025 package org.openmobileis.test.mock.synchro;
00026 
00027 import java.io.ByteArrayOutputStream;
00028 import java.io.File;
00029 import java.io.FileOutputStream;
00030 import java.util.HashMap;
00031 import java.util.Iterator;
00032 import java.util.zip.ZipEntry;
00033 import java.util.zip.ZipOutputStream;
00034 
00035 import org.openmobileis.common.util.PropertiesManager;
00036 import org.openmobileis.common.util.collection.Array;
00037 import org.openmobileis.common.util.file.FileUtilities;
00038 import org.openmobileis.synchro.client.SynchroDescriptor;
00039 import org.openmobileis.synchro.openmsp.OpenMSPException;
00040 import org.openmobileis.synchro.openmsp.client.OpenMSPSyncListener;
00041 import org.openmobileis.synchro.openmsp.client.core.OpenMSPSyncMessageFactory;
00042 import org.openmobileis.synchro.openmsp.protocol.ContainerMessage;
00043 import org.openmobileis.synchro.openmsp.protocol.Header;
00044 import org.openmobileis.synchro.openmsp.protocol.Message;
00045 import org.openmobileis.synchro.openmsp.protocol.MessageFactory;
00046 import org.openmobileis.synchro.openmsp.server.synctarget.OpenMSPSynchroTargetListener;
00047 import org.openmobileis.synchro.openmsp.server.synctarget.SyncTargetAnswer;
00048 import org.openmobileis.synchro.openmsp.server.util.ZipEntryMemoryFile;
00049 import org.openmobileis.synchro.security.auth.Credential;
00050 
00051 /*
00052  * Title:        OpenMobileIS project source <BR>
00053  * Description:
00054  * @author      Philippe Delrieu
00055  * @since       JDK 1.1
00056  * @version 1.0.
00057  */
00058 
00059 public final class SimpleMockSynchroManager {
00060   class ZipArrayEntryFile {
00061     ByteArrayOutputStream array;
00062 
00063     ZipOutputStream zip;
00064 
00065     String fileName;
00066 
00067     public int hashCode() {
00068       return fileName.hashCode();
00069     }
00070 
00071     public boolean equals(Object obj) {
00072       if (obj instanceof ZipArrayEntryFile) {
00073         return ((ZipArrayEntryFile) obj).fileName.equals(this.fileName);
00074       }
00075       return false;
00076     }
00077 
00078   }
00079 
00080   private OpenMSPSyncListener listener;
00081  // private InfoSynchroListener listener;
00082   private OpenMSPSynchroTargetListener target;
00083  // private InfoSyncService target;
00084   
00085   private String terminalSynchroDirectory;
00086 
00087   private long sessionNumber = 0;
00088 
00089   public SimpleMockSynchroManager(String terminalSynchroDirectory) {
00090     this.terminalSynchroDirectory = terminalSynchroDirectory;
00091     File newDir = new File(this.terminalSynchroDirectory+"/dbfiles");
00092     if (!newDir.exists()) newDir.mkdirs();
00093     File file = new File (terminalSynchroDirectory+"/filedir");
00094     if (!file.exists()) file.mkdirs();
00095   }
00096 
00097   public void registerTerminalSynchroListener(OpenMSPSyncListener listener) {
00098     this.listener = listener;
00099   }
00100 
00101   public OpenMSPSyncListener getTerminalSynchroListener() {
00102     return listener;
00103   }
00104 
00105   public void registerServerSynchroTarget(OpenMSPSynchroTargetListener target) {
00106     this.target = target;
00107   }
00108 
00109   public OpenMSPSynchroTargetListener getServerSynchroTarget() {
00110     return target;
00111   }
00112 
00113   public void synchronize(String group, Credential cred, SynchroDescriptor synchrodescriptor) throws OpenMSPException {
00114         synchrodescriptor.setSynchroConduit(new MockSynchroConduit(this.terminalSynchroDirectory));
00115     PropertiesManager.getManager().addProperty("org.openmobileis.synchro.client.openmsp.numsyncpropsfile", System.getProperty("user.dir") + File.separator +"numsync.txt");
00116     OpenMSPSyncMessageFactory messageFactory = new OpenMSPSyncMessageFactory();
00117     Array listenerList = new Array();
00118     listenerList.add(this.listener);
00119     try {
00120       messageFactory.beginSynchro(cred, synchrodescriptor);
00121       listener.startSync(cred, synchrodescriptor);
00122       
00123       while (true) {
00124         Message message = messageFactory.getOpenMSPMessage(listenerList);
00125         if (message.isEmpty()) {
00126           //get next listener phase.
00127           break;
00128         }
00129         Message CMLAnswer = MessageFactory.getFactory().createMessage(new Header(this.getNextSessionNumber(), target.getTargetName(), listener.getSyncName(), null, null));
00130         message.resetCursor();
00131         while (message.hasMoreMessage()) {
00132           ContainerMessage CMLRequest = message.nextMessage();
00133           SyncTargetAnswer listenerAnswer = target.processCommand(cred, CMLRequest);
00134           //manage synchronized files.
00135           HashMap zipFileMap = new HashMap(10);
00136           if (listenerAnswer.answerfiles != null)   {
00137             for (int i=0; i<listenerAnswer.answerfiles.length; i++) { 
00138                if (listenerAnswer.answerfiles[i] instanceof ZipEntryMemoryFile)    {
00139                 String zipFileName = ((ZipEntryMemoryFile) listenerAnswer.answerfiles[i]).getZipFileName();
00140                 ZipArrayEntryFile zipEntry = (ZipArrayEntryFile) zipFileMap.get(zipFileName);
00141                 if (zipEntry == null) {
00142                   zipEntry = new ZipArrayEntryFile();
00143                   zipEntry.array = new ByteArrayOutputStream(100000);
00144                   zipEntry.zip = new ZipOutputStream(zipEntry.array);
00145                   zipEntry.fileName = zipFileName;
00146                   zipFileMap.put(zipFileName, zipEntry);
00147                 }
00148                 ZipEntry entry = new ZipEntry(FileUtilities.convertToUnixFomat(listenerAnswer.answerfiles[i].getFileName()));
00149                 entry.setTime(listenerAnswer.answerfiles[i].getFileDate());
00150                 entry.setMethod(ZipEntry.DEFLATED);
00151                 zipEntry.zip.putNextEntry(entry);
00152                 zipEntry.zip.write(listenerAnswer.answerfiles[i].getFileData());
00153                 zipEntry.zip.closeEntry();
00154               } else    {
00155                 String path = this.terminalSynchroDirectory+listenerAnswer.answerfiles[i].getFilePath(); //
00156                 File newDir = new File(path);
00157                 if (!newDir.exists()) newDir.mkdirs();
00158                 FileOutputStream out = new FileOutputStream(path+listenerAnswer.answerfiles[i].getFileName());
00159                 try   {
00160                   out.write(listenerAnswer.answerfiles[i].getFileData());
00161                 } finally {
00162                   out.flush();
00163                   out.close();
00164                 } //end try / finally
00165               } //end if else
00166             } //end for
00167             //unzip zipped collection files.
00168             Iterator iter = zipFileMap.keySet().iterator();
00169             while (iter.hasNext())  {
00170               String filename = (String) iter.next();
00171               ZipArrayEntryFile zipEntry = (ZipArrayEntryFile) zipFileMap.get(filename);
00172               zipEntry.zip.flush();
00173               zipEntry.zip.close();
00174               FileOutputStream out = new FileOutputStream(this.terminalSynchroDirectory+filename);
00175               try   {
00176                 out.write(zipEntry.array.toByteArray());
00177               } finally {
00178                 out.flush();
00179                 out.close();
00180               } //end try / finally
00181             }
00182           }
00183           
00184           if (listenerAnswer.containerMessage != null) {
00185             int size = listenerAnswer.containerMessage.length;
00186             for (int i = 0; i < size; i++) {
00187               CMLAnswer.add(listenerAnswer.containerMessage[i]);
00188             }
00189           }
00190         }
00191 
00192         // third step : Process responses
00193         messageFactory.receiveOpenMSPMessage(listenerList, CMLAnswer);
00194       }
00195       listener.endSync();
00196     } catch (Throwable ex) {
00197       listener.notifySynchroFailure();
00198       throw new OpenMSPException(ex);
00199     } finally {
00200       messageFactory.endSynchro();
00201       //remove created files
00202       File file = new File(System.getProperty("user.dir") + File.separator +"numsync.txt");
00203       if (file.exists()) file.delete();
00204 
00205     }
00206 
00207   }
00208 
00209   private long getNextSessionNumber() {
00210     return sessionNumber + 1;
00211   }
00212 
00213 }

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