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 public ServiceTrackerMapModelAdapterBuilderLocator() {
038 _modelAdapterBuilders.open();
039 }
040
041 @Override
042 public void close() {
043 _modelAdapterBuilders.close();
044 }
045
046 @Override
047 public <T, V> ModelAdapterBuilder<T, V> locate(
048 Class<T> adapteeModelClass, Class<V> adaptedModelClass) {
049
050 return _modelAdapterBuilders.getService(
051 getKey(adapteeModelClass, adaptedModelClass));
052 }
053
054 private <T, V> String getKey(
055 Class<T> adapteeModelClass, Class<V> adaptedModelClass) {
056
057 return adapteeModelClass.getName() + "->" + adaptedModelClass.getName();
058 }
059
060 @SuppressWarnings({"unchecked", "rawtypes"})
061 private final ServiceTrackerMap<String, ModelAdapterBuilder>
062 _modelAdapterBuilders = ServiceTrackerCollections.singleValueMap(
063 ModelAdapterBuilder.class, null,
064 new ServiceReferenceMapper<String, ModelAdapterBuilder>() {
065
066 @Override
067 public void map(
068 ServiceReference<ModelAdapterBuilder> serviceReference,
069 Emitter<String> emitter) {
070
071 Registry registry = RegistryUtil.getRegistry();
072
073 ModelAdapterBuilder modelAdapterBuilder =
074 registry.getService(serviceReference);
075
076 Type genericInterface = ReflectionUtil.getGenericInterface(
077 modelAdapterBuilder, ModelAdapterBuilder.class);
078
079 if ((genericInterface == null) ||
080 !(genericInterface instanceof ParameterizedType)) {
081
082 return;
083 }
084
085 ParameterizedType parameterizedType =
086 (ParameterizedType)genericInterface;
087
088 Type[] typeArguments =
089 parameterizedType.getActualTypeArguments();
090
091 if (ArrayUtil.isEmpty(typeArguments) ||
092 (typeArguments.length != 2)) {
093
094 return;
095 }
096
097 try {
098 Class adapteeModelClass = (Class)typeArguments[0];
099 Class adaptedModelClass = (Class)typeArguments[1];
100
101 emitter.emit(
102 getKey(adapteeModelClass, adaptedModelClass));
103 }
104 catch (ClassCastException cce) {
105 return;
106 }
107 }
108
109 });
110
111 }