00001 /* 00002 * OpenMobileIS - a free Java(TM) Framework for mobile applications Java(TM) 00003 * Copyright (C) 2004-2005 Philippe Delrieu 00004 * All rights reserved. 00005 * Contact: openmobileis@e-care.fr 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00020 * USA 00021 * 00022 * Author : Philippe Delrieu 00023 * 00024 */ 00025 package org.openmobileis.synchro.openmsp.server.synctarget; 00026 00027 import java.util.HashMap; 00028 00029 import org.openmobileis.common.context.ApplicationContextManager; 00030 import org.openmobileis.common.context.UserTerminal; 00031 import org.openmobileis.common.util.collection.Array; 00032 import org.openmobileis.synchro.openmsp.server.synctarget.proxy.GenericProxySynchroTarget; 00033 import org.openmobileis.synchro.openmsp.server.synctarget.proxy.ProxySyncroTarget; 00034 00042 public final class SynchroTargerManager { 00043 private static SynchroTargerManager manager; 00044 private HashMap targetMap; 00045 private HashMap proxyList; 00046 00047 class TargetVersion { 00048 UserTerminal terminal; 00049 String version; 00050 OpenMSPSynchroTargetListener target; 00051 } 00052 00053 00054 class TargetContainer { 00055 Array TargetList; 00056 String targetName; 00057 00058 public boolean equals(Object obj) { 00059 if ((obj != null) 00060 && (obj instanceof TargetContainer) 00061 && ((TargetContainer)obj).targetName.equals(this.targetName) 00062 ) { 00063 return true; 00064 } 00065 return false; 00066 } 00067 00068 public int hashCode() { 00069 return this.targetName.hashCode(); 00070 } 00071 } 00072 00076 private SynchroTargerManager() { 00077 super(); 00078 targetMap = new HashMap(20); 00079 proxyList = new HashMap(10); 00080 } 00081 00082 public static SynchroTargerManager getManager() { 00083 if (manager == null) { 00084 synchronized (SynchroTargerManager.class) { 00085 if (manager == null) { 00086 manager = new SynchroTargerManager(); 00087 ApplicationContextManager.getManager().addManager(manager); 00088 } 00089 } 00090 } 00091 return manager; 00092 } 00093 00094 public void registerProxyTargetForTerminal(ProxySyncroTarget proxy, UserTerminal terminal) { 00095 proxyList.put(terminal, proxy); 00096 } 00097 00108 public void addSynchroTargetListener(OpenMSPSynchroTargetListener listener, String version, UserTerminal terminal) { 00109 TargetContainer container = (TargetContainer)targetMap.get(listener.getTargetName()); 00110 if (container == null) { 00111 container = new TargetContainer(); 00112 container.TargetList = new Array(); 00113 container.targetName = listener.getTargetName(); 00114 targetMap.put(listener.getTargetName(), container); 00115 } 00116 TargetVersion target = new TargetVersion(); 00117 target.target = listener; 00118 target.version = version; 00119 target.terminal = terminal; 00120 container.TargetList.add(target); 00121 } 00122 00132 public OpenMSPSynchroTargetListener getSynchroTargetListener(String listenerName, String version , UserTerminal terminal) { 00133 TargetContainer container = (TargetContainer)targetMap.get(listenerName); 00134 if ((container == null) || (container.TargetList.size() == 0)) { 00135 return null; 00136 } 00137 OpenMSPSynchroTargetListener foundlistener = ((TargetVersion)container.TargetList.get(0)).target; 00138 int size = container.TargetList.size(); 00139 for (int i=0; i<size; i++) { 00140 TargetVersion currentTarget = (TargetVersion)container.TargetList.get(i); 00141 if ((version != null) && (terminal != null)) { 00142 if ((currentTarget.version != null) && (currentTarget.terminal != null)) { 00143 if ((currentTarget.version.equals(version)) && (currentTarget.terminal.equals(terminal))){ 00144 foundlistener = currentTarget.target; 00145 break; 00146 } 00147 }else if ((currentTarget.version != null) && (currentTarget.version.equals(version))) { 00148 foundlistener = currentTarget.target; 00149 }else if ((currentTarget.terminal != null) && (currentTarget.terminal.equals(terminal))) { 00150 foundlistener = currentTarget.target; 00151 } 00152 } else if (version != null) { 00153 if ((currentTarget.version != null) && (currentTarget.version.equals(version))) { 00154 foundlistener = currentTarget.target; 00155 } 00156 } else if (terminal != null) { 00157 if ((currentTarget.terminal != null) && (currentTarget.terminal.equals(terminal))) { 00158 foundlistener = currentTarget.target; 00159 } 00160 } else { 00161 if ((currentTarget.terminal == null) && (currentTarget.version == null)) { 00162 foundlistener = currentTarget.target; 00163 } 00164 } 00165 } 00166 return foundlistener; 00167 } 00168 00169 public ProxySyncroTarget getProxySynchroTargetForTerminal(UserTerminal terminal) { 00170 ProxySyncroTarget proxy = (ProxySyncroTarget)proxyList.get(terminal); 00171 if (proxy == null) { 00172 proxy = new GenericProxySynchroTarget(); 00173 } 00174 return proxy; 00175 } 00176 00177 }