001
014
015 package com.liferay.portlet.exportimport.xstream;
016
017 import com.liferay.registry.Registry;
018 import com.liferay.registry.RegistryUtil;
019 import com.liferay.registry.ServiceReference;
020 import com.liferay.registry.ServiceRegistration;
021 import com.liferay.registry.ServiceTracker;
022 import com.liferay.registry.ServiceTrackerCustomizer;
023 import com.liferay.registry.collections.ServiceRegistrationMap;
024 import com.liferay.registry.collections.ServiceRegistrationMapImpl;
025
026 import java.util.Map;
027 import java.util.concurrent.ConcurrentHashMap;
028
029
032 public class XStreamAliasRegistryUtil {
033
034 public static Map<Class<?>, String> getAliases() {
035 return _instance._getAliases();
036 }
037
038 public static void register(Class<?> clazz, String name) {
039 _instance._register(clazz, name);
040 }
041
042 public static void unregister(Class<?> clazz, String name) {
043 _instance._unregister(clazz, name);
044 }
045
046 private XStreamAliasRegistryUtil() {
047 Registry registry = RegistryUtil.getRegistry();
048
049 _serviceTracker = registry.trackServices(
050 XStreamAlias.class, new XStreamAliasServiceTrackerCustomizer());
051
052 _serviceTracker.open();
053 }
054
055 private Map<Class<?>, String> _getAliases() {
056 return _xstreamAliases;
057 }
058
059 private void _register(Class<?> clazz, String name) {
060 XStreamAlias xStreamAlias = new XStreamAlias(clazz, name);
061
062 Registry registry = RegistryUtil.getRegistry();
063
064 ServiceRegistration<XStreamAlias> serviceRegistration =
065 registry.registerService(XStreamAlias.class, xStreamAlias);
066
067 _serviceRegistrations.put(xStreamAlias, serviceRegistration);
068 }
069
070 private void _unregister(Class<?> clazz, String name) {
071 XStreamAlias xStreamAlias = new XStreamAlias(clazz, name);
072
073 ServiceRegistration<XStreamAlias> serviceRegistration =
074 _serviceRegistrations.remove(xStreamAlias);
075
076 if (serviceRegistration != null) {
077 serviceRegistration.unregister();
078 }
079 }
080
081 private static final XStreamAliasRegistryUtil _instance =
082 new XStreamAliasRegistryUtil();
083
084 private final ServiceRegistrationMap<XStreamAlias> _serviceRegistrations =
085 new ServiceRegistrationMapImpl<>();
086 private final ServiceTracker<XStreamAlias, XStreamAlias> _serviceTracker;
087 private final Map<Class<?>, String> _xstreamAliases =
088 new ConcurrentHashMap<>();
089
090 private class XStreamAliasServiceTrackerCustomizer
091 implements ServiceTrackerCustomizer<XStreamAlias, XStreamAlias> {
092
093 @Override
094 public XStreamAlias addingService(
095 ServiceReference<XStreamAlias> serviceReference) {
096
097 Registry registry = RegistryUtil.getRegistry();
098
099 XStreamAlias xStreamAlias = registry.getService(serviceReference);
100
101 _xstreamAliases.put(
102 xStreamAlias.getClazz(), xStreamAlias.getName());
103
104 return xStreamAlias;
105 }
106
107 @Override
108 public void modifiedService(
109 ServiceReference<XStreamAlias> serviceReference,
110 XStreamAlias xStreamAlias) {
111 }
112
113 @Override
114 public void removedService(
115 ServiceReference<XStreamAlias> serviceReference,
116 XStreamAlias xStreamAlias) {
117
118 Registry registry = RegistryUtil.getRegistry();
119
120 registry.ungetService(serviceReference);
121
122 _xstreamAliases.remove(xStreamAlias.getClazz());
123 }
124
125 }
126
127 }