package com.salesmanager.central.integration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.salesmanager.central.BaseAction;
import com.salesmanager.core.constants.Constants;
import com.salesmanager.core.constants.ErrorConstants;
import com.salesmanager.core.constants.IntegrationConstants;
import com.salesmanager.core.entity.merchant.MerchantConfiguration;
import com.salesmanager.core.entity.reference.ModuleConfiguration;
import com.salesmanager.core.entity.system.Field;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.merchant.ConfigurationRequest;
import com.salesmanager.core.service.merchant.ConfigurationResponse;
import com.salesmanager.core.service.merchant.MerchantService;
import com.salesmanager.core.service.reference.ReferenceService;
import com.salesmanager.core.util.ConfigurationFieldUtil;
public class PortletConfigurationAction extends BaseAction {
private Logger log = Logger.getLogger(PortletConfigurationAction.class);
private String portletModule;
private String page;
private List fieldsList = new ArrayList();
public String displayFields() throws Exception {
try {
Map fields = new HashMap();
if(StringUtils.isBlank(portletModule)) {
log.error("portletModule is null");
super.setErrorMessage("messages.error.integration.invalidparameter");
return ErrorConstants.AJAX_CONTENT_ERROR_PAGE;
}
//get fields
MerchantService mservice = (MerchantService)ServiceFactory.getService(ServiceFactory.MerchantService);
ReferenceService rservice = (ReferenceService)ServiceFactory.getService(ServiceFactory.ReferenceService);
ModuleConfiguration conf = rservice.getModuleConfiguration(this.getPortletModule(), IntegrationConstants.FIELDS_KEY, Constants.ALLCOUNTRY_ISOCODE);
if(conf==null) {
log.error("portlet has no fields");
List messages = new ArrayList();
messages.add(this.getPortletModule());
super.setErrorMessage("messages.error.integration.noconfiguration",messages);
return ErrorConstants.AJAX_CONTENT_ERROR_PAGE;
}
if(conf.getId().getConfigurationKey().equals("fields")) {
fields = ConfigurationFieldUtil.parseFields(conf.getConfigurationValue());
}
//get fields values
Map fieldValues = null;//configurable fields values (String->module,List<Field>)
if(fields.size()>0) {
//get fields values
//merchant_configuration
//config_key = page-name
//config_value = {"fields":[{"module":"moduleName","values":[{"name":"fieldName","value":"fieldValue"}...]}...]}
ConfigurationRequest configRequest = new ConfigurationRequest(super.getContext().getMerchantid(),ConfigurationFieldUtil.getMerchantConfigurationKey(this.page, this.portletModule));
ConfigurationResponse configResponse = mservice.getConfiguration(configRequest);
MerchantConfiguration c = configResponse.getMerchantConfiguration(ConfigurationFieldUtil.getMerchantConfigurationKey(this.page, this.portletModule));
if(c!=null) {
List sArrayList = new ArrayList();
sArrayList.add(c.getConfigurationValue());
fieldValues = ConfigurationFieldUtil.parseFieldsValues(sArrayList);
}
if(fieldValues!=null && fieldValues.size()>0) {
for(Object o : fieldValues.keySet()) {
String fieldName = (String)o;
List fs = (List)fieldValues.get(fieldName);
for(Object of: fs) {
Field f =(Field)of;
Field configurableField = (Field)fields.get(f.getName());
if(configurableField!=null) {
configurableField.setFieldValue(f.getFieldValue());
}
}
}
}
}
Set entries = fields.entrySet();
for(Object o: fields.keySet()) {
String fieldName = (String)o;
Field f = (Field)fields.get(fieldName);
fieldsList.add(f);
}
super.getServletRequest().setAttribute("fields", fields);
return SUCCESS;
} catch (Exception e) {//need a specific error page
log.error(e);
return ErrorConstants.AJAX_CONTENT_ERROR_PAGE;
}
}
public String getPortletModule() {
return portletModule;
}
public void setPortletModule(String portletModule) {
this.portletModule = portletModule;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public List getFieldsList() {
return fieldsList;
}
}