001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
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 package org.apache.hivemind.impl;
016
017 import java.util.HashMap;
018 import java.util.Locale;
019 import java.util.Map;
020
021 import org.apache.hivemind.ApplicationRuntimeException;
022 import org.apache.hivemind.ClassResolver;
023 import org.apache.hivemind.ErrorHandler;
024 import org.apache.hivemind.HiveMind;
025 import org.apache.hivemind.Messages;
026 import org.apache.hivemind.internal.MessageFinder;
027 import org.apache.hivemind.internal.Module;
028 import org.apache.hivemind.internal.RegistryInfrastructure;
029 import org.apache.hivemind.internal.ServiceModelFactory;
030 import org.apache.hivemind.internal.ServicePoint;
031 import org.apache.hivemind.service.ThreadLocale;
032 import org.apache.hivemind.util.IdUtils;
033 import org.apache.hivemind.util.ToStringBuilder;
034
035 /**
036 * Implementation of {@link org.apache.hivemind.internal.Module}.
037 *
038 * @author Howard Lewis Ship
039 */
040 public final class ModuleImpl extends BaseLocatable implements Module
041 {
042 private String _moduleId;
043
044 /** @since 1.1 */
045 private String _packageName;
046
047 private RegistryInfrastructure _registry;
048
049 private ClassResolver _resolver;
050
051 private Messages _messages;
052
053 /**
054 * Map from (partial) class name to Class. Related to performance bug HIVEMIND-162.
055 *
056 * @since 1.1.1
057 */
058 private final Map _typeCache = new HashMap();
059
060 public Object getConfiguration(String extensionPointId)
061 {
062 String qualifiedId = IdUtils.qualify(_moduleId, extensionPointId);
063
064 return _registry.getConfiguration(qualifiedId, this);
065 }
066
067 public String getModuleId()
068 {
069 return _moduleId;
070 }
071
072 /** @since 1.1 */
073
074 public void setPackageName(String packageName)
075 {
076 _packageName = packageName;
077 }
078
079 public boolean containsService(Class serviceInterface)
080 {
081 return _registry.containsService(serviceInterface, this);
082 }
083
084 public Object getService(String serviceId, Class serviceInterface)
085 {
086 String qualifiedId = IdUtils.qualify(_moduleId, serviceId);
087
088 return _registry.getService(qualifiedId, serviceInterface, this);
089 }
090
091 public Object getService(Class serviceInterface)
092 {
093 return _registry.getService(serviceInterface, this);
094 }
095
096 public void setModuleId(String string)
097 {
098 _moduleId = string;
099 }
100
101 public void setRegistry(RegistryInfrastructure registry)
102 {
103 _registry = registry;
104 }
105
106 public void setClassResolver(ClassResolver resolver)
107 {
108 _resolver = resolver;
109 }
110
111 public ClassResolver getClassResolver()
112 {
113 return _resolver;
114 }
115
116 public synchronized Messages getMessages()
117 {
118 if (_messages == null)
119 {
120 ThreadLocale threadLocale = (ThreadLocale) _registry.getService(
121 HiveMind.THREAD_LOCALE_SERVICE,
122 ThreadLocale.class,
123 this);
124
125 MessageFinder finder = new MessageFinderImpl(getLocation().getResource());
126
127 _messages = new ModuleMessages(finder, threadLocale);
128 }
129
130 return _messages;
131 }
132
133 public String toString()
134 {
135 ToStringBuilder builder = new ToStringBuilder(this);
136
137 builder.append("moduleId", _moduleId);
138 builder.append("classResolver", _resolver);
139
140 return builder.toString();
141 }
142
143 public ServicePoint getServicePoint(String serviceId)
144 {
145 String qualifiedId = IdUtils.qualify(_moduleId, serviceId);
146
147 return _registry.getServicePoint(qualifiedId, this);
148 }
149
150 public ServiceModelFactory getServiceModelFactory(String name)
151 {
152 return _registry.getServiceModelFactory(name);
153 }
154
155 public Locale getLocale()
156 {
157 return _registry.getLocale();
158 }
159
160 public ErrorHandler getErrorHandler()
161 {
162 return _registry.getErrorHander();
163 }
164
165 public synchronized Class resolveType(String type)
166 {
167 Class result = (Class) _typeCache.get(type);
168
169 if (result == null)
170 {
171 result = findTypeInClassResolver(type);
172
173 _typeCache.put(type, result);
174 }
175
176 return result;
177 }
178
179 private Class findTypeInClassResolver(String type)
180 {
181 Class result = _resolver.checkForClass(type);
182
183 if (result == null)
184 result = _resolver.checkForClass(_packageName + "." + type);
185
186 if (result == null)
187 throw new ApplicationRuntimeException(ImplMessages.unableToConvertType(
188 type,
189 _packageName));
190
191 return result;
192 }
193
194 /**
195 * @see org.apache.hivemind.internal.Module#getRegistry()
196 */
197 public RegistryInfrastructure getRegistry()
198 {
199 return _registry;
200 }
201
202 }