001: /*
002: * This file is part of the Echo Web Application Framework (hereinafter "Echo").
003: * Copyright (C) 2002-2005 NextApp, Inc.
004: *
005: * Version: MPL 1.1/GPL 2.0/LGPL 2.1
006: *
007: * The contents of this file are subject to the Mozilla Public License Version
008: * 1.1 (the "License"); you may not use this file except in compliance with
009: * the License. You may obtain a copy of the License at
010: * http://www.mozilla.org/MPL/
011: *
012: * Software distributed under the License is distributed on an "AS IS" basis,
013: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
014: * for the specific language governing rights and limitations under the
015: * License.
016: *
017: * Alternatively, the contents of this file may be used under the terms of
018: * either the GNU General Public License Version 2 or later (the "GPL"), or
019: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
020: * in which case the provisions of the GPL or the LGPL are applicable instead
021: * of those above. If you wish to allow use of your version of this file only
022: * under the terms of either the GPL or the LGPL, and not to allow others to
023: * use your version of this file under the terms of the MPL, indicate your
024: * decision by deleting the provisions above and replace them with the notice
025: * and other provisions required by the GPL or the LGPL. If you do not delete
026: * the provisions above, a recipient may use your version of this file under
027: * the terms of any one of the MPL, the GPL or the LGPL.
028: */
029:
030: package nextapp.echo2.app.util;
031:
032: import java.io.IOException;
033: import java.util.HashMap;
034: import java.util.Iterator;
035: import java.util.Map;
036:
037: import nextapp.echo2.app.util.PropertiesDiscovery;
038:
039: /**
040: * A mechanism for retrieving instances of singleton peer objects which are
041: * defined to each support a specific <code>Class</code>.
042: * A properties file is used to associate peer classes with their supported
043: * classes. The properties file should contain the fully qualified class
044: * names of the supported objects as its keys. The values of the properties
045: * file should contain the fully qualified class names of the peer objects.
046: * A single instance of each peer class will be used to support ALL instances
047: * of the supported class.
048: */
049: public class PeerFactory {
050:
051: private final Map objectClassNameToPeerMap = new HashMap();
052:
053: /**
054: * Creates a new <code>PeerFactory</code>.
055: *
056: * @param resourceName the name of the resource properties file from which
057: * the peer bindings may be retrieved (this file will be retrieved
058: * using the <code>PropertiesDiscovery</code> system, so multiple
059: * instances of the file within the <code>CLASSPATH</code> will be
060: * automatically discovered.
061: * @param classLoader the <code>ClassLoader</code> to use for retrieving the
062: * resource file and for instantiating the peer singleton instances
063: */
064: public PeerFactory(String resourceName, ClassLoader classLoader) {
065: try {
066: Map peerNameMap = PropertiesDiscovery.loadProperties(
067: resourceName, classLoader);
068: Iterator it = peerNameMap.keySet().iterator();
069: while (it.hasNext()) {
070: String objectClassName = (String) it.next();
071: String peerClassName = (String) peerNameMap
072: .get(objectClassName);
073: Class peerClass = classLoader.loadClass(peerClassName);
074: Object peer = peerClass.newInstance();
075: objectClassNameToPeerMap.put(objectClassName, peer);
076: }
077: } catch (ClassNotFoundException ex) {
078: throw new RuntimeException(
079: "Unable to load synchronize peer bindings: " + ex);
080: } catch (IOException ex) {
081: throw new RuntimeException(
082: "Unable to load synchronize peer bindings: " + ex);
083: } catch (InstantiationException ex) {
084: throw new RuntimeException(
085: "Unable to load synchronize peer bindings: " + ex);
086: } catch (IllegalAccessException ex) {
087: throw new RuntimeException(
088: "Unable to load synchronize peer bindings: " + ex);
089: }
090: }
091:
092: /**
093: * Retrieves the appropriate peer instance for a given object
094: * <code>Class</code>. Returns null in the event that no peer is provided
095: * to support the specified class.
096: *
097: * @param objectClass the supported object class
098: * @param searchSuperClasses flag indicating whether superclasses
099: * of <code>objectClass</code> should be searched for peers if
100: * none can be found for <code>objectClass</code> itself
101: * @return the relevant peer, or null if none can be found
102: */
103: public Object getPeerForObject(Class objectClass,
104: boolean searchSuperClasses) {
105: Object peer = null;
106: do {
107: peer = objectClassNameToPeerMap.get(objectClass.getName());
108: if (peer != null) {
109: return peer;
110: }
111: objectClass = objectClass.getSuperclass();
112: } while (searchSuperClasses && objectClass != null);
113: return null;
114: }
115: }
|