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
00053
00054
00055
00056
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
00082 private OpenMSPSynchroTargetListener target;
00083
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
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
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 }
00165 }
00166 }
00167
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 }
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
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
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 }