/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-3 Sep, 2010 Consultation CS-TI inc. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.salesmanager.core.service.ws.impl; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.context.MessageSource; import com.salesmanager.core.entity.customer.ws.CreateCustomerWebServiceResponse; import com.salesmanager.core.entity.customer.ws.Customer; import com.salesmanager.core.entity.customer.ws.GetCustomerWebServiceResponse; import com.salesmanager.core.entity.reference.Country; import com.salesmanager.core.entity.reference.SystemUrlEntryType; import com.salesmanager.core.entity.reference.Zone; import com.salesmanager.core.service.ServiceException; import com.salesmanager.core.service.ServiceFactory; import com.salesmanager.core.service.cache.RefCache; import com.salesmanager.core.service.customer.CustomerService; import com.salesmanager.core.service.ws.SalesManagerCustomerWS; import com.salesmanager.core.service.ws.WebServiceCredentials; import com.salesmanager.core.service.ws.WebServiceResponse; import com.salesmanager.core.util.EncryptionUtil; import com.salesmanager.core.util.LanguageUtil; import com.salesmanager.core.util.LocaleUtil; import com.salesmanager.core.util.SpringUtil; @WebService public class SalesManagerCustomerWSImpl implements SalesManagerCustomerWS{ private Logger log = Logger.getLogger(SalesManagerCustomerWSImpl.class); private static final String MESSAGE_SEPERATOR=","; /** * Validates web service credentials * @param locale * @param credentials * @throws ServiceException */ private void validateCredentials(Locale locale, WebServiceCredentials credentials) throws ServiceException { MessageSource messageSource = (MessageSource)SpringUtil.getBean("messageSource"); try { int merchantId = credentials.getMerchantId(); String k = EncryptionUtil.generatekey(String.valueOf(merchantId)); String apiKeyGen = EncryptionUtil.encrypt(k, String.valueOf(merchantId)); if(StringUtils.isBlank(apiKeyGen) || apiKeyGen.length()<16) { log.error("Problem with API KEY GENERATION " + apiKeyGen); throw new ServiceException(messageSource.getMessage("errors.technical", null, locale)); } String apiKey = credentials.getApiKey(); if(StringUtils.isBlank(apiKey)) { throw new ServiceException(messageSource.getMessage("messages.error.ws.invalidcredentials", null, locale)); } if(!apiKeyGen.equals(apiKey)) { throw new ServiceException(messageSource.getMessage("messages.error.ws.invalidcredentials", null, locale)); } } catch (Exception e) { if(e instanceof ServiceException) { throw (ServiceException)e; } log.error(e); throw new ServiceException(messageSource.getMessage("errors.technical", null, locale)); } } /** * Creates a new Customer */ @WebMethod public @WebResult CreateCustomerWebServiceResponse createCustomer(@WebParam(name="credentials")WebServiceCredentials credentials,@WebParam(name="customer")Customer customer) { MessageSource messageSource = (MessageSource)SpringUtil.getBean("messageSource"); Locale locale = LocaleUtil.getDefaultLocale(); if(StringUtils.isNotBlank(customer.getCustomerLang())) { locale = LocaleUtil.getLocale(customer.getCustomerLang()); } CreateCustomerWebServiceResponse response = new CreateCustomerWebServiceResponse(); try { //check credentials validateCredentials(locale,credentials); String[] validationErrorList = validate(customer, locale,messageSource); if(validationErrorList != null && validationErrorList.length>0){ response.setMessages(validationErrorList); response.setStatus(2); return response; } CustomerService cservice = (CustomerService)ServiceFactory.getService(ServiceFactory.CustomerService); //if customer has customer id >0 check that it belongs to this merchant id com.salesmanager.core.entity.customer.Customer tmpCustomer = null; if(customer.getCustomerId()>0) { tmpCustomer = cservice.getCustomer(customer.getCustomerId()); if(tmpCustomer!=null) { if(tmpCustomer.getMerchantId()!=credentials.getMerchantId()) { response.setMessages(new String[]{messageSource.getMessage("messages.authorization", null, locale)}); response.setStatus(0); } } } com.salesmanager.core.entity.customer.Customer newCustomer = new com.salesmanager.core.entity.customer.Customer(); if(tmpCustomer!=null) {//modify existing customer newCustomer = tmpCustomer; } BeanUtils.copyProperties(newCustomer, customer); //copy properties to billing newCustomer.setCustomerBillingCity(customer.getCustomerCity()); newCustomer.setCustomerBillingCountryId(customer.getCustomerCountryId()); newCustomer.setCustomerBillingCountryName(newCustomer.getBillingCountry()); newCustomer.setCustomerBillingFirstName(customer.getCustomerFirstname()); newCustomer.setCustomerBillingLastName(customer.getCustomerLastname()); newCustomer.setCustomerBillingPostalCode(customer.getCustomerPostalCode()); newCustomer.setCustomerBillingState(newCustomer.getStateProvinceName()); newCustomer.setCustomerBillingStreetAddress(customer.getCustomerStreetAddress()); newCustomer.setCustomerBillingZoneId(customer.getCustomerZoneId()); newCustomer.setLocale(locale); newCustomer.setMerchantId(credentials.getMerchantId()); if(StringUtils.isBlank(customer.getZoneName()) && customer.getCustomerZoneId()>0) { java.util.Map zones = (java.util.Map)RefCache.getAllZonesmap(LanguageUtil.getLanguageNumberCode(locale.getLanguage())); if(zones!=null) { Zone z = (Zone)zones.get(customer.getCustomerZoneId()); if(z!=null) { newCustomer.setCustomerState(z.getZoneName()); } } } if(StringUtils.isBlank(newCustomer.getBillingState()) && newCustomer.getCustomerZoneId()>0) { java.util.Map zones = (java.util.Map)RefCache.getAllZonesmap(LanguageUtil.getLanguageNumberCode(locale.getLanguage())); if(zones!=null) { Zone z = (Zone)zones.get(newCustomer.getCustomerZoneId()); if(z!=null) { newCustomer.setCustomerBillingState(z.getZoneName()); } } } cservice.saveOrUpdateCustomer(newCustomer, SystemUrlEntryType.WEB,locale); response.setMessages(new String[]{messageSource.getMessage("messages.customer.customerregistered", null, locale)}); response.setStatus(1); response.setCustomerId(newCustomer.getCustomerId()); } catch(Exception e){ if(e instanceof ServiceException) { String msg[] = {((ServiceException)e).getMessage()}; response.setMessages(msg); response.setStatus(0); } else { log.error("Exception occurred while creating Customer",e); response.setMessages(new String[]{messageSource.getMessage("errors.technical", null, locale)}); response.setStatus(0); } } return response; } /** * Get customer for a customerId and merchantId */ @WebMethod public @WebResult GetCustomerWebServiceResponse getCustomer(@WebParam(name="credentials") WebServiceCredentials credentials, @WebParam(name="customer")Customer customer) { MessageSource messageSource = (MessageSource)SpringUtil.getBean("messageSource"); Locale locale = LocaleUtil.getDefaultLocale(); if(StringUtils.isNotBlank(customer.getCustomerLang())) { locale = LocaleUtil.getLocale(customer.getCustomerLang()); } GetCustomerWebServiceResponse response = new GetCustomerWebServiceResponse(); try { if(customer.getCustomerId() == 0){ setStatusMsg(messageSource, locale, response,"messages.authorization",0); return response; } //check credentials validateCredentials(locale,credentials); CustomerService cservice = (CustomerService)ServiceFactory.getService(ServiceFactory.CustomerService); com.salesmanager.core.entity.customer.Customer entityCustomer = cservice.getCustomer(customer.getCustomerId()); if(entityCustomer == null){ setStatusMsg(messageSource, locale, response,"messages.customer.doesnotexist",0); return response; } if(entityCustomer.getMerchantId()!=credentials.getMerchantId()) { setStatusMsg(messageSource, locale, response,"messages.authorization",0); return response; } Customer webCustomer = new Customer(); BeanUtils.copyProperties(webCustomer, entityCustomer); response.setCustomer(webCustomer); response.setStatus(1); } catch(Exception e){ if(e instanceof ServiceException) { String[] msg = {((ServiceException)e).getMessage()}; response.setMessages(msg); response.setStatus(0); } else { log.error("Exception occurred while creating Customer",e); response.setMessages(new String[]{messageSource.getMessage("errors.technical", null, locale)}); response.setStatus(0); } } return response; } private void setStatusMsg(MessageSource messageSource, Locale locale, WebServiceResponse response,String messageKey,int status) { response.setMessages(new String[]{messageSource.getMessage(messageKey, null, locale)}); response.setStatus(status); } private static String[] validate(Customer customer,Locale locale, MessageSource messageSource){ List<String> validationErrorList = new ArrayList<String>(); validate(customer.getCustomerFirstname(), "messages.required.firstname", validationErrorList, locale, messageSource); validate(customer.getCustomerLastname(), "messages.required.lastname", validationErrorList, locale, messageSource); validate(customer.getCustomerEmailAddress(), "messages.required.email", validationErrorList, locale, messageSource); validate(customer.getCustomerTelephone(), "messages.required.phone", validationErrorList, locale, messageSource); validate(customer.getCustomerCity(), "messages.required.city", validationErrorList, locale, messageSource); validate(customer.getCustomerPostalCode(), "messages.required.postalcode", validationErrorList, locale, messageSource); validate(customer.getCustomerStreetAddress(), "messages.required.streetaddress", validationErrorList, locale, messageSource); validate(customer.getCustomerLang(), "messages.required.language", validationErrorList, locale, messageSource); //validate country if(customer.getCustomerCountryId()==0) { validationErrorList.add(messageSource.getMessage("messages.required.customercountrycode", null, locale)); } else { java.util.Map countries = RefCache.getAllcountriesmap(1); Country c = (Country)countries.get(customer.getCustomerCountryId()); if(c==null) { validationErrorList.add(messageSource.getMessage("messages.required.customercountrycode", null, locale)); } } //validate zone if(customer.getCustomerZoneId()==0) { if(StringUtils.isBlank(customer.getZoneName())) { validationErrorList.add(messageSource.getMessage("messages.required.customerzonecode", null, locale)); } } else { java.util.Map zones = RefCache.getAllZonesmap(1); Zone z = (Zone)zones.get(customer.getCustomerZoneId()); if(z==null) { validationErrorList.add(messageSource.getMessage("messages.required.customerzonecode", null, locale)); } } if(validationErrorList.size()>0) { String[] messages = (String[])validationErrorList.toArray(); return messages; } else { return null; } } /** * Utility method to validate for not-null/empty check. * @param valueToValidate String to check for not-null/empty * @param validationErrorKey If validation fails then error message key to use. * @param validationErrorList List of error messages * @param locale Locale * @param messageSource MessageSource */ private static void validate(String valueToValidate,String validationErrorKey, List<String> validationErrorList,Locale locale,MessageSource messageSource){ if (StringUtils.isBlank(valueToValidate)) { validationErrorList.add(messageSource.getMessage(validationErrorKey, null, locale)); } } /* private static String getMessages(List<String> errorMessages,String seperator){ String message = null; for(String msg:errorMessages){ if(message != null){ message += seperator+msg; }else{ message = msg; } } return message; }*/ }