Project

General

Profile

1
package gr.uoa.di.driver.enabling.islookup;
2

    
3
import java.util.Comparator;
4
import java.util.HashMap;
5
import java.util.Map;
6

    
7
import javax.xml.bind.JAXBException;
8

    
9
import net.sf.ehcache.CacheManager;
10
import net.sf.ehcache.Ehcache;
11
import net.sf.ehcache.constructs.blocking.SelfPopulatingCache;
12
import eu.dnetlib.api.enabling.ISLookUpService;
13
import eu.dnetlib.domain.DriverResource;
14
import eu.dnetlib.domain.ResourceType;
15
import eu.dnetlib.domain.SecureDriverResource;
16
import eu.dnetlib.domain.enabling.SecurityProfile;
17
import gr.uoa.di.driver.app.DriverServiceImpl;
18
import gr.uoa.di.driver.enabling.ISLookUp;
19
import gr.uoa.di.driver.enabling.islookup.cache.CachingISLookUp;
20
import gr.uoa.di.driver.enabling.islookup.cache.DriverCacheManager;
21
import gr.uoa.di.driver.enabling.islookup.cache.LookUpEntryFactory;
22
import gr.uoa.di.driver.enabling.islookup.cache.SecurityAwareCacheManager;
23
import gr.uoa.di.driver.enabling.islookup.cache.SecurityAwareCachingISLookUp;
24
import gr.uoa.di.driver.enabling.resultset.ResultSetFactory;
25
import gr.uoa.di.driver.util.ServiceLocator;
26
import gr.uoa.di.driver.xml.ResourceToXmlConverter;
27
import gr.uoa.di.driver.xml.SecurityProfileXmlConverter;
28

    
29
public class ISLookUpFactory {
30

    
31
	private Map<Class<? extends DriverResource>, ISLookUp<? extends DriverResource>> lookUpMap = new HashMap<Class<? extends DriverResource>, ISLookUp<? extends DriverResource>>();
32
	private Map<Class<? extends DriverResource>, CachingISLookUp<? extends DriverResource>> cachingLookUpMap = new HashMap<Class<? extends DriverResource>, CachingISLookUp<? extends DriverResource>>();
33
	private Map<Class<? extends DriverResource>, Class<? extends Comparator<? extends DriverResource>>> comparatorClassMap = null;
34

    
35
	private ServiceLocator<ISLookUpService> lookupLocator = null;
36
	boolean useCache = false;
37
	private DriverServiceImpl service = null;
38
	private CacheManager cacheManager = null;
39
	private ResultSetFactory rsFactory = null;
40

    
41
	public void init() throws JAXBException {
42

    
43
		ISLookUpImpl<SecurityProfile> lookup = new ISLookUpImpl<SecurityProfile>();
44

    
45
		lookup.setConverter(new SecurityProfileXmlConverter());
46
		lookup.setLookupLocator(lookupLocator);
47

    
48
		lookUpMap.put(SecurityProfile.class, lookup);
49
	}
50

    
51
	@SuppressWarnings("unchecked")
52
	public <D extends DriverResource> ISLookUp<D> createISLookUp(
53
			Class<D> resourceClass) throws InstantiationException,
54
			IllegalAccessException {
55

    
56
		ISLookUp<D> lookup = null;
57
		
58
		if (useCache) {
59
			CachingISLookUp<D> cLookup = (CachingISLookUp<D>) cachingLookUpMap.get(resourceClass);
60

    
61
			if (cLookup == null) {
62
				Ehcache idCache = this.getIdCache(resourceClass);
63
				Ehcache criteriaCache = this.getCriteriaCache(resourceClass);
64
				cLookup = new CachingISLookUp<D>();
65

    
66
				cLookup.setConverter(getConverter(resourceClass));
67
				cLookup.setLookupLocator(lookupLocator);
68
				cLookup.setIdCache(idCache);
69
				cLookup.setCriteriaCache(criteriaCache);
70
				
71
				if (SecureDriverResource.class.isAssignableFrom(resourceClass)) {
72
					SecurityAwareCachingISLookUp<SecureDriverResource> scLookup = new SecurityAwareCachingISLookUp<SecureDriverResource>();
73
					
74
					scLookup.setLookup((CachingISLookUp<SecureDriverResource>) cLookup);
75
					scLookup.setSecurityLookup((ISLookUp<SecurityProfile>) lookUpMap.get(SecurityProfile.class));
76
					
77
					cLookup = (CachingISLookUp<D>) scLookup;
78
				}
79

    
80
				// create CacheManager
81
				DriverCacheManager<D> cacheManager = null;
82

    
83
				if (SecureDriverResource.class.isAssignableFrom(resourceClass)) {
84
					cacheManager = (DriverCacheManager<D>) new SecurityAwareCacheManager<SecureDriverResource>();
85
				} else
86
					cacheManager = new DriverCacheManager<D>();
87

    
88
				cacheManager.setComparator(this.getComparator(resourceClass));
89
				cacheManager.setConverter(this.getConverter(resourceClass));
90
				cacheManager.setResourceType(getResourceType(resourceClass));
91
				cacheManager.setSecurityLookUp((ISLookUp<SecurityProfile>) this.lookUpMap.get(SecurityProfile.class));
92
				cacheManager.setIdCache(idCache);
93
				cacheManager.setCriteriaCache(criteriaCache);
94
				cacheManager.setService(service);
95

    
96
				cacheManager.init();
97

    
98
				cachingLookUpMap.put(resourceClass, cLookup);
99
			}
100

    
101
			lookup = cLookup;
102
		} else {
103
			lookup = (ISLookUp<D>) lookUpMap.get(resourceClass);
104

    
105
			if (lookup == null) {
106
				lookup = new ISLookUpImpl<D>();
107

    
108
				((ISLookUpImpl<D>) lookup).setConverter(this.getConverter(resourceClass));
109
				((ISLookUpImpl<D>) lookup).setLookupLocator(lookupLocator);
110

    
111
				if (SecureDriverResource.class.isAssignableFrom(resourceClass)) {
112
					SecurityAwareLookupImpl<SecureDriverResource> secureLookup = new SecurityAwareLookupImpl<SecureDriverResource>();
113

    
114
					secureLookup.setLookUp((ISLookUp<SecureDriverResource>) lookup);
115
					secureLookup.setSecurityLookUp((ISLookUp<SecurityProfile>) lookUpMap.get(SecurityProfile.class));
116

    
117
					lookup = (ISLookUp<D>) secureLookup;
118
				}
119

    
120
				lookUpMap.put(resourceClass, lookup);
121
			}
122
		}
123

    
124
		return lookup;
125
	}
126

    
127
	private Map<Class<? extends DriverResource>, Class<? extends ResourceToXmlConverter<? extends DriverResource>>> converterClassMap = null;
128

    
129
	@SuppressWarnings("unchecked")
130
	private <D extends DriverResource> ResourceToXmlConverter<D> getConverter(
131
			Class<D> resourceClass) throws InstantiationException,
132
			IllegalAccessException {
133
		Class<? extends ResourceToXmlConverter<D>> converterClass = (Class<? extends ResourceToXmlConverter<D>>) converterClassMap
134
				.get(resourceClass);
135

    
136
		return converterClass.newInstance();
137
	}
138

    
139
	@SuppressWarnings("unchecked")
140
	private <D extends DriverResource> Comparator<D> getComparator(
141
			Class<D> resourceClass) throws InstantiationException,
142
			IllegalAccessException {
143
		Class<? extends Comparator<D>> comparatorClass = (Class<? extends Comparator<D>>) comparatorClassMap
144
				.get(resourceClass);
145

    
146
		if (comparatorClass != null)
147
			return comparatorClass.newInstance();
148
		else
149
			return null;
150
	}
151

    
152
	private Map<Class<? extends DriverResource>, ResourceType> resourceTypeMap = null;
153

    
154
	private <D extends DriverResource> ResourceType getResourceType(
155
			Class<D> resourceClass) {
156
		return this.resourceTypeMap.get(resourceClass);
157
	}
158

    
159
	private <D extends DriverResource> Ehcache getIdCache(Class<D> resourceClass)
160
			throws InstantiationException, IllegalAccessException {
161
		return createCache(resourceClass, resourceClass.getSimpleName() + ".id");
162
	}
163

    
164
	private <D extends DriverResource> Ehcache getCriteriaCache(
165
			Class<D> resourceClass) throws InstantiationException,
166
			IllegalAccessException {
167
		return createCache(resourceClass, resourceClass.getSimpleName()
168
				+ ".criteria");
169
	}
170

    
171
	private <D extends DriverResource> Ehcache createCache(
172
			Class<D> resourceClass, String name) throws InstantiationException,
173
			IllegalAccessException {
174
		LookUpEntryFactory<D> lookupFactory = new LookUpEntryFactory<D>();
175
	
176
		lookupFactory.setLookUpServiceLocator(lookupLocator);
177
		lookupFactory.setRsFactory(rsFactory);
178
		
179
		cacheManager.addCache(name);
180
		Ehcache cache = cacheManager.getEhcache(name);
181

    
182
		return new SelfPopulatingCache(cache, lookupFactory);
183
	}
184

    
185
	public void setLookupLocator(ServiceLocator<ISLookUpService> lookupLocator) {
186
		this.lookupLocator = lookupLocator;
187
	}
188

    
189
	public void setUseCache(boolean useCache) {
190
		this.useCache = useCache;
191
	}
192

    
193
	public void setService(DriverServiceImpl service) {
194
		this.service = service;
195
	}
196

    
197
	public void setCacheManager(CacheManager cacheManager) {
198
		this.cacheManager = cacheManager;
199
	}
200

    
201
	public void setConverterClassMap(
202
			Map<Class<? extends DriverResource>, Class<? extends ResourceToXmlConverter<? extends DriverResource>>> converterClassMap) {
203
		this.converterClassMap = converterClassMap;
204
	}
205

    
206
	public void setComparatorClassMap(
207
			Map<Class<? extends DriverResource>, Class<? extends Comparator<? extends DriverResource>>> comparatorClassMap) {
208
		this.comparatorClassMap = comparatorClassMap;
209
	}
210

    
211
	public void setResourceTypeMap(
212
			Map<Class<? extends DriverResource>, ResourceType> resourceTypeMap) {
213
		this.resourceTypeMap = resourceTypeMap;
214
	}
215

    
216
	public void setRsFactory(ResultSetFactory rsFactory) {
217
		this.rsFactory = rsFactory;
218
	}
219
}
(1-1/4)