001: /**********************************************************************
002: Copyright (c) 2006 Erik Bengtson and others. All rights reserved.
003: Licensed under the Apache License, Version 2.0 (the "License");
004: you may not use this file except in compliance with the License.
005: You may obtain a copy of the License at
006:
007: http://www.apache.org/licenses/LICENSE-2.0
008:
009: Unless required by applicable law or agreed to in writing, software
010: distributed under the License is distributed on an "AS IS" BASIS,
011: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: See the License for the specific language governing permissions and
013: limitations under the License.
014:
015:
016: Contributors:
017: ...
018: **********************************************************************/package org.jpox.api;
019:
020: import java.lang.reflect.InvocationTargetException;
021: import java.util.HashMap;
022: import java.util.Map;
023:
024: import org.jpox.ClassLoaderResolver;
025: import org.jpox.plugin.ConfigurationElement;
026: import org.jpox.plugin.Extension;
027: import org.jpox.plugin.PluginManager;
028: import org.jpox.util.JPOXLogger;
029: import org.jpox.util.Localiser;
030:
031: /**
032: * Factory of API adapters for JPOX.
033: *
034: * @version $Revision: 1.8 $
035: */
036: public class ApiAdapterFactory {
037: /** Localisation of messages */
038: private static final Localiser LOCALISER = Localiser
039: .getInstance("org.jpox.Localisation");
040:
041: /** The adapter instances, mapped by naming string. */
042: HashMap adapters = new HashMap();
043:
044: /** Singleton instance */
045: static ApiAdapterFactory adapterMgr = new ApiAdapterFactory();
046:
047: /**
048: * Accessor for the ApiAdapterFactory for JPOX (singleton)
049: * @return The manager of type information
050: */
051: public static ApiAdapterFactory getInstance() {
052: return adapterMgr;
053: }
054:
055: /**
056: * Protected constructor to prevent outside instantiation
057: */
058: protected ApiAdapterFactory() {
059: }
060:
061: /**
062: * Method to add support for an API via an adapter.
063: * @param name name of the API
064: * @param apiAdapter instance of adapter
065: */
066: private void addAdapter(String name, ApiAdapter apiAdapter) {
067: if (name == null || apiAdapter == null) {
068: return;
069: }
070:
071: adapters.put(name, apiAdapter);
072: }
073:
074: /**
075: * Accessor for the registered Api Adapters
076: * @return A Map with ApiAdapter instances
077: */
078: public Map getRegisteredApiAdapters() {
079: return adapters;
080: }
081:
082: /**
083: * Accessor for an adapter, given the api name.
084: * @param name the adapter name
085: * @return The ApiAdapter
086: **/
087: public ApiAdapter getApiAdapter(String name) {
088: return (ApiAdapter) adapters.get(name);
089: }
090:
091: /**
092: * Load "org.jpox.api_adapter" extensions.
093: * @param clr ClassLoader resolver for resolving the adapter class
094: * @param pluginMgr the Plug-in Manager
095: */
096: public void initializeApiAdapterExtensions(ClassLoaderResolver clr,
097: PluginManager pluginMgr) {
098: if (adapters.size() > 0) {
099: //already loaded
100: return;
101: }
102:
103: Extension[] ex = pluginMgr.getExtensionPoint(
104: "org.jpox.api_adapter").getExtensions();
105: for (int i = 0; i < ex.length; i++) {
106: ConfigurationElement[] confElm = ex[i]
107: .getConfigurationElements();
108: for (int c = 0; c < confElm.length; c++) {
109: try {
110: adapterMgr
111: .addAdapter(
112: confElm[c].getAttribute("name"),
113: (ApiAdapter) pluginMgr
114: .createExecutableExtension(
115: "org.jpox.api_adapter",
116: "name",
117: confElm[c]
118: .getAttribute("name"),
119: "class-name", null,
120: null));
121: } catch (InvocationTargetException e) {
122: JPOXLogger.PERSISTENCE.error(LOCALISER.msg(
123: "022000", confElm[c]
124: .getAttribute("class-name"), e
125: .getTargetException()));
126: } catch (Exception e) {
127: JPOXLogger.PERSISTENCE.error(LOCALISER.msg(
128: "022000", confElm[c]
129: .getAttribute("class-name"), e));
130: }
131: }
132: }
133: }
134: }
|