View Javadoc
1 /* 2 * (C) 2002 David Carr david@carr.name 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 */ 18 19 package net.sourceforge.mflow.impl; 20 21 import java.text.ParseException; 22 import java.util.ArrayList; 23 import java.util.List; 24 import java.util.TooManyListenersException; 25 import java.util.logging.Logger; 26 27 import net.sourceforge.mflow.api.ContactMethod; 28 import net.sourceforge.mflow.api.ContactMethodManager; 29 import net.sourceforge.mflow.api.PluginManager; 30 import net.sourceforge.mflow.reflect.ParamArgPair; 31 import net.sourceforge.mflow.reflect.ReflectionException; 32 import net.sourceforge.mflow.reflect.ReflectionUtil; 33 34 /*** 35 * A class for managing instances of ContactMethod 36 * 37 * @author <a href="mailto:david@carr.name">David Carr</a> 38 * @version $Revision: 1.3 $ 39 */ 40 public class ContactMethodManagerImpl implements ContactMethodManager { 41 private List instances = new ArrayList(); 42 43 /*** 44 * Private storage for all ContactMethod implementations as Class objects 45 */ 46 private List implementations = new ArrayList(); 47 48 /*** 49 * Private storage for all protocols as Strings (parallel to 50 * this.implementations) 51 */ 52 private List protocols = new ArrayList(); 53 54 private static Logger log = 55 Logger.getLogger(ContactMethodManagerImpl.class.getName()); 56 57 private PluginManager pluginManager; 58 59 /*** 60 * Default constructor. Makes a new ContactMethodManager. 61 * 62 * @param pluginManager the plugin manager to use 63 */ 64 ContactMethodManagerImpl(PluginManager pluginManager) { 65 log.entering("ContactMethodManager", "(PluginManager)"); 66 this.pluginManager = pluginManager; 67 log.exiting("ContactMethodManager", "(PluginManager)"); 68 } 69 70 public synchronized void addContactMethodType(Class cmt, String protocol) 71 throws TooManyListenersException, ClassCastException { 72 if (cmt == null) { 73 log.warning( 74 "Called ContactMethodManager.addContactMethodType with null implementation"); 75 return; 76 } 77 log.entering( 78 "ContactMethodManager", 79 "addContactMethodType(" + cmt.getName() + ", " + protocol + ")"); 80 int index = this.protocols.indexOf(protocol); 81 if (index > -1) { 82 Class c = (Class) this.implementations.get(index); 83 throw new TooManyListenersException( 84 "Protocol " + protocol + " already defined by " + c.getName()); 85 } 86 if (!Util.implementsInterface(cmt, ContactMethod.class)) { 87 throw new ClassCastException( 88 cmt.getName() + " does not implement ContactMethod"); 89 } 90 log.info( 91 "ContactMethod definition added: " 92 + cmt.getName() 93 + " handles protocol " 94 + protocol); 95 this.implementations.add(cmt); 96 this.protocols.add(protocol); 97 } 98 99 public ContactMethod parse(String s) throws ParseException { 100 log.entering("ContactMethodManager", "parse(" + s + ")"); 101 int colon = s.indexOf(':'); 102 if (colon == -1) 103 throw new ParseException(s, -1); 104 String pr = s.substring(0, colon); 105 log.fine("Protocol: " + pr); 106 String id = s.substring(colon + 1); 107 log.fine("Identifier: " + id); 108 return getInstance(pr, id); 109 } 110 111 public synchronized ContactMethod getInstance( 112 String protocol, 113 String identifier) { 114 log.entering( 115 "ContactMethodManager", 116 "getInstance(" + protocol + ", " + identifier + ")"); 117 for (int i = 0; 118 i < this.instances.size(); 119 i++) { //check for an existing instance 120 ContactMethod cm = (ContactMethod) this.instances.get(i); 121 if (cm.getProtocol().equals(protocol) 122 && cm.getIdentifier().equals(identifier)) { 123 log.finer("Found existing instance of contact method"); 124 log.exiting( 125 "ContactMethodManager", 126 "getInstance(" + protocol + ", " + identifier + ")", 127 cm); 128 return cm; //found one, return it 129 } 130 } 131 int index = this.protocols.indexOf(protocol); 132 if (index > -1) { 133 Class c = (Class) this.implementations.get(index); 134 log.fine( 135 "Found implementation " + c.getName() + " for protocol " + protocol); 136 ContactMethod cm = newInstanceOf(c); 137 log.info("Made new instance of " + c.getName()); 138 cm.setIdentifier(identifier); 139 log.info("Set identifier to " + identifier); 140 this.instances.add(cm); 141 log.exiting( 142 "ContactMethodManager", 143 "getInstance(" + protocol + ", " + identifier + ")", 144 cm); 145 return cm; 146 } else { 147 log.fine("No implementation for target protocol " + protocol); 148 log.exiting( 149 "ContactMethodManager", 150 "getInstance(" + protocol + ", " + identifier + ")", 151 null); 152 return null; 153 } 154 } 155 156 private ContactMethod newInstanceOf(Class c) { 157 List paramArgs = new ArrayList(); 158 Class[] configArgs = { PluginManager.class }; 159 Object[] configParams = { this.pluginManager }; 160 paramArgs.add(new ParamArgPair(configArgs, configParams)); 161 paramArgs.add(new ParamArgPair()); 162 try { 163 return (ContactMethod) ReflectionUtil.instantiate(c, paramArgs); 164 } catch (ReflectionException re) { 165 log.throwing(getClass().getName(), "newInstanceOf", re); 166 return null; 167 } 168 } 169 170 public synchronized String[] getProtocols() { 171 return (String[]) this.protocols.toArray(new String[this.protocols.size()]); 172 } 173 }

This page was automatically generated by Maven