00001 /* 00002 * OpenMobileIS - a free Java(TM) Framework for mobile applications Java(TM) 00003 * Copyright (C) 2004-2006 Philippe Delrieu 00004 * All rights reserved. 00005 * Contact: pdelrieu@openmobileis.org 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.ProxySyncroTarget; 00033 00041 public final class SynchroTargerManager { 00042 private static SynchroTargerManager manager; 00043 private HashMap targetMap; 00044 private HashMap proxyList; 00045 private ProxySyncroTarget defaultProxy; 00046 00047 class TargetVersion { 00048 UserTerminal terminal; 00049 String version; 00050 OpenMSPSynchroTargetListener target; 00051 } 00052 00053 class TargetContainer { 00054 Array TargetList; 00055 String targetName; 00056 00057 public boolean equals(Object obj) { 00058 if ((obj != null) 00059 && (obj instanceof TargetContainer) 00060 && ((TargetContainer)obj).targetName.equals(this.targetName) 00061 ) { 00062 return true; 00063 } 00064 return false; 00065 } 00066 00067 public int hashCode() { 00068 return this.targetName.hashCode(); 00069 } 00070 } 00071 00075 private SynchroTargerManager() { 00076 super(); 00077 targetMap = new HashMap(20); 00078 proxyList = new HashMap(10); 00079 } 00080 00081 public static SynchroTargerManager getManager() { 00082 if (manager == null) { 00083 synchronized (SynchroTargerManager.class) { 00084 if (manager == null) { 00085 manager = new SynchroTargerManager(); 00086 ApplicationContextManager.getManager().addManager(manager); 00087 } 00088 } 00089 } 00090 return manager; 00091 } 00092 00093 public void registerProxyTargetForTerminal(ProxySyncroTarget proxy, UserTerminal terminal) { 00094 if(terminal == null){ 00095 defaultProxy = proxy; 00096 } 00097 proxyList.put(terminal, proxy); 00098 } 00099 00110 public void addSynchroTargetListener(OpenMSPSynchroTargetListener listener, String version, UserTerminal terminal) { 00111 TargetContainer container = (TargetContainer)targetMap.get(listener.getTargetName()); 00112 if (container == null) { 00113 container = new TargetContainer(); 00114 container.TargetList = new Array(); 00115 container.targetName = listener.getTargetName(); 00116 targetMap.put(listener.getTargetName(), container); 00117 } 00118 TargetVersion target = new TargetVersion(); 00119 target.target = listener; 00120 target.version = version; 00121 target.terminal = terminal; 00122 container.TargetList.add(target); 00123 } 00124 00134 public OpenMSPSynchroTargetListener getSynchroTargetListener(String listenerName, String version , UserTerminal terminal) { 00135 TargetContainer container = (TargetContainer)targetMap.get(listenerName); 00136 if ((container == null) || (container.TargetList.size() == 0)) { 00137 return null; 00138 } 00139 OpenMSPSynchroTargetListener foundlistener = ((TargetVersion)container.TargetList.get(0)).target; 00140 int size = container.TargetList.size(); 00141 for (int i=0; i<size; i++) { 00142 TargetVersion currentTarget = (TargetVersion)container.TargetList.get(i); 00143 if ((version != null) && (terminal != null)) { 00144 if ((currentTarget.version != null) && (currentTarget.terminal != null)) { 00145 if ((currentTarget.version.equals(version)) && (currentTarget.terminal.equals(terminal))){ 00146 foundlistener = currentTarget.target; 00147 break; 00148 } 00149 }else if ((currentTarget.version != null) && (currentTarget.version.equals(version))) { 00150 foundlistener = currentTarget.target; 00151 }else if ((currentTarget.terminal != null) && (currentTarget.terminal.equals(terminal))) { 00152 foundlistener = currentTarget.target; 00153 } 00154 } else if (version != null) { 00155 if ((currentTarget.version != null) && (currentTarget.version.equals(version))) { 00156 foundlistener = currentTarget.target; 00157 } 00158 } else if (terminal != null) { 00159 if ((currentTarget.terminal != null) && (currentTarget.terminal.equals(terminal))) { 00160 foundlistener = currentTarget.target; 00161 } 00162 } else { 00163 if ((currentTarget.terminal == null) && (currentTarget.version == null)) { 00164 foundlistener = currentTarget.target; 00165 } 00166 } 00167 } 00168 return foundlistener; 00169 } 00170 00171 public ProxySyncroTarget getProxySynchroTargetForTerminal(UserTerminal terminal) { 00172 ProxySyncroTarget proxy = (ProxySyncroTarget)proxyList.get(terminal); 00173 if (proxy == null) { 00174 proxy = defaultProxy; 00175 } 00176 return proxy; 00177 } 00178 00179 }