001
014
015 package com.liferay.portal.model.adapter.builder;
016
017 import com.liferay.portal.kernel.util.ArrayUtil;
018 import com.liferay.portal.kernel.util.ReflectionUtil;
019 import com.liferay.registry.Registry;
020 import com.liferay.registry.RegistryUtil;
021 import com.liferay.registry.ServiceReference;
022 import com.liferay.registry.collections.ServiceReferenceMapper;
023 import com.liferay.registry.collections.ServiceTrackerCollections;
024 import com.liferay.registry.collections.ServiceTrackerMap;
025
026 import java.io.Closeable;
027
028 import java.lang.reflect.ParameterizedType;
029 import java.lang.reflect.Type;
030
031
034 public class ServiceTrackerMapModelAdapterBuilderLocator
035 implements ModelAdapterBuilderLocator, Closeable {
036
037 @Override
038 public void close() {
039 _modelAdapterBuilders.close();
040 }
041
042 @Override
043 public <T, V> ModelAdapterBuilder<T, V> locate(
044 Class<T> adapteeModelClass, Class<V> adaptedModelClass) {
045
046 return _modelAdapterBuilders.getService(
047 getKey(adapteeModelClass, adaptedModelClass));
048 }
049
050 private <T, V> String getKey(
051 Class<T> adapteeModelClass, Class<V> adaptedModelClass) {
052
053 return adapteeModelClass.getName() + "->" + adaptedModelClass.getName();
054 }
055
056 @SuppressWarnings({"unchecked", "rawtypes"})
057 private final ServiceTrackerMap<String, ModelAdapterBuilder>
058 _modelAdapterBuilders = ServiceTrackerCollections.openSingleValueMap(
059 ModelAdapterBuilder.class, null,
060 new ServiceReferenceMapper<String, ModelAdapterBuilder>() {
061
062 @Override
063 public void map(
064 ServiceReference<ModelAdapterBuilder> serviceReference,
065 Emitter<String> emitter) {
066
067 Registry registry = RegistryUtil.getRegistry();
068
069 ModelAdapterBuilder modelAdapterBuilder =
070 registry.getService(serviceReference);
071
072 Type genericInterface = ReflectionUtil.getGenericInterface(
073 modelAdapterBuilder, ModelAdapterBuilder.class);
074
075 if ((genericInterface == null) ||
076 !(genericInterface instanceof ParameterizedType)) {
077
078 return;
079 }
080
081 ParameterizedType parameterizedType =
082 (ParameterizedType)genericInterface;
083
084 Type[] typeArguments =
085 parameterizedType.getActualTypeArguments();
086
087 if (ArrayUtil.isEmpty(typeArguments) ||
088 (typeArguments.length != 2)) {
089
090 return;
091 }
092
093 try {
094 Class adapteeModelClass = (Class)typeArguments[0];
095 Class adaptedModelClass = (Class)typeArguments[1];
096
097 emitter.emit(
098 getKey(adapteeModelClass, adaptedModelClass));
099 }
100 catch (ClassCastException cce) {
101 return;
102 }
103 }
104
105 });
106
107 }