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