/
ExtensionManager.java
88 lines (80 loc) · 3.25 KB
/
ExtensionManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
* This program is part of the OpenLMIS logistics management information system platform software.
* Copyright © 2017 VillageReach
*
* This program is free software: you can redistribute it and/or modify it under the terms
* of the GNU Affero General Public License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details. You should have received a copy of
* the GNU Affero General Public License along with this program. If not, see
* http://www.gnu.org/licenses. For additional information contact info@OpenLMIS.org.
*/
package org.openlmis.fulfillment.extension;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.annotation.PostConstruct;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
/**
* Class responsible for returning the right implementation of extension point.
*/
@Component
public class ExtensionManager {
private static final String EXTENSIONS_DIR = "/extensions";
private static final String CONFIG_FILE = "extensions.properties";
private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionManager.class);
@Autowired
private ApplicationContext appContext;
@Getter
@Setter
private HashMap<String, String> extensions = new HashMap<String, String>();
/**
* Returns implementation of an extension with given id (based on config file) and class.
* If mapping doesn't exist, returns one of given class (default).
*
* @param pointId id of extension point
* @param pointClass class of extension point
* @return extension point
*/
public <T> T getExtension(String pointId, Class<T> pointClass) throws ExtensionException {
T extensionPoint;
String extensionId = extensions.get(pointId);
try {
if (extensionId != null) {
extensionPoint = appContext.getBean(extensionId, pointClass);
} else {
extensionPoint = appContext.getBean(pointClass);
}
} catch (NoSuchBeanDefinitionException ex) {
throw new ExtensionException("It was not possible to find an extension with id "
+ extensionId + " or " + pointClass, ex);
}
return extensionPoint;
}
@PostConstruct
private void loadConfigurationFile() {
Properties prop = new Properties();
try {
prop.load(new FileInputStream(new File(EXTENSIONS_DIR, CONFIG_FILE)));
for (final Map.Entry<Object, Object> entry : prop.entrySet()) {
extensions.put((String) entry.getKey(), (String) entry.getValue());
}
} catch (IOException ex) {
LOGGER.debug("It was not possible to load extensions"
+ " configuration from extension.properties file", ex);
}
}
}