package com.salesmanager.core.business.services.reference.loader;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.model.system.IntegrationModule;
import com.salesmanager.core.model.system.ModuleConfig;
@Component
public class IntegrationModulesLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(IntegrationModulesLoader.class);
public List<IntegrationModule> loadIntegrationModules(String jsonFilePath) throws Exception {
List<IntegrationModule> modules = new ArrayList<IntegrationModule>();
ObjectMapper mapper = new ObjectMapper();
try {
InputStream in =
this.getClass().getClassLoader().getResourceAsStream(jsonFilePath);
@SuppressWarnings("rawtypes")
Map[] objects = mapper.readValue(in, Map[].class);
for(int i = 0; i < objects.length; i++) {
modules.add(this.loadModule(objects[i]));
}
return modules;
} catch (Exception e) {
throw new ServiceException(e);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public IntegrationModule loadModule(Map object) throws Exception {
ObjectMapper mapper = new ObjectMapper();
IntegrationModule module = new IntegrationModule();
module.setModule((String)object.get("module"));
module.setCode((String)object.get("code"));
module.setImage((String)object.get("image"));
if(object.get("type")!=null) {
module.setType((String)object.get("type"));
}
if(object.get("customModule")!=null) {
Object o = object.get("customModule");
Boolean b = false;
if(o instanceof Boolean) {
b = (Boolean)object.get("customModule");
} else {
try {
b = new Boolean((String)object.get("customModule"));
} catch(Exception e) {
LOGGER.error("Cannot cast " + o.getClass() + " tp a boolean value");
}
}
module.setCustomModule(b);
}
//module.setRegions(regions)
if(object.get("details")!=null) {
Map<String,String> details = (Map<String,String>)object.get("details");
module.setDetails(details);
//maintain the original json structure
StringBuilder detailsStructure = new StringBuilder();
int count = 0;
detailsStructure.append("{");
for(String key : details.keySet()) {
String jsonKeyString = mapper.writeValueAsString(key);
detailsStructure.append(jsonKeyString);
detailsStructure.append(":");
String jsonValueString = mapper.writeValueAsString(details.get(key));
detailsStructure.append(jsonValueString);
if(count<(details.size()-1)) {
detailsStructure.append(",");
}
count++;
}
detailsStructure.append("}");
module.setConfigDetails(detailsStructure.toString());
}
List confs = (List)object.get("configuration");
//convert to json
if(confs!=null) {
StringBuilder configString = new StringBuilder();
configString.append("[");
Map<String,ModuleConfig> moduleConfigs = new HashMap<String,ModuleConfig>();
int count=0;
for(Object oo : confs) {
Map values = (Map)oo;
String env = (String)values.get("env");
ModuleConfig config = new ModuleConfig();
config.setScheme((String)values.get("scheme"));
config.setHost((String)values.get("host"));
config.setPort((String)values.get("port"));
config.setUri((String)values.get("uri"));
config.setEnv((String)values.get("env"));
if((String)values.get("config1")!=null) {
config.setConfig1((String)values.get("config1"));
}
if((String)values.get("config2")!=null) {
config.setConfig2((String)values.get("config2"));
}
String jsonConfigString = mapper.writeValueAsString(config);
configString.append(jsonConfigString);
moduleConfigs.put(env, config);
if(count<(confs.size()-1)) {
configString.append(",");
}
count++;
}
configString.append("]");
module.setConfiguration(configString.toString());
module.setModuleConfigs(moduleConfigs);
}
List<String> regions = (List<String>)object.get("regions");
if(regions!=null) {
StringBuilder configString = new StringBuilder();
configString.append("[");
int count=0;
for(String region : regions) {
module.getRegionsSet().add(region);
String jsonConfigString = mapper.writeValueAsString(region);
configString.append(jsonConfigString);
if(count<(regions.size()-1)) {
configString.append(",");
}
count++;
}
configString.append("]");
module.setRegions(configString.toString());
}
return module;
}
}