/******************************************************************************* * Copyright 2012 Christian Ternes and Thorsten Volland * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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 org.businessmanager.web.controller; import java.util.ArrayList; import java.util.List; import javax.faces.application.FacesMessage; import org.businessmanager.domain.Address; import org.businessmanager.domain.Address.AddressType; import org.businessmanager.geodb.Country; import org.businessmanager.geodb.OpenGeoDB; import org.businessmanager.geodb.OpenGeoEntry; import org.businessmanager.i18n.ResourceBundleAccessor; import org.businessmanager.service.AddressService; import org.businessmanager.web.bean.AddressBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * This controller manages the whole addressManagement component. * * @author Christian Ternes * */ @Component("addressManagementController") @Scope("view") public class AddressManagementControllerImpl extends AbstractController implements AddressManagementController { private static final String CLIENT_ID_STREET = "addStreet"; private static final String CLIENT_ID_NUMBER= "addNumber"; private static final String CLIENT_ID_CITY = "addCity"; private static final String CLIENT_ID_ZIP = "addZip"; private static final String CLIENT_ID_COUNTRY = "addCountry"; @Autowired private AddressService addressService; @Autowired private OpenGeoDB openGeoDB; private List<AddressBean> addressList = new ArrayList<AddressBean>(); private List<AddressType> availableAddressTypes = new ArrayList<AddressType>(); private AddressBean selectedAddress; private AddressBean addressToUpdate; private boolean showAddressAddDialog = false; private boolean showAddressUpdateDialog = false; private int maxAssigneableAddresses = 3; //DEFAULT is 3 @Override public void initializeAddressComponent(Address address) { if(address != null) { List<Address> addressList = new ArrayList<Address>(); addressList.add(address); initializeAddressComponent(addressList); } } @Override public void initializeAddressComponent(List<Address> list) { if(list != null) { for (Address address : list) { AddressBean bean = new AddressBean().getMappedAddressBean(address); addressList.add(bean); } } } private long createTempUniqueId(AddressBean theAddressBean) { return theAddressBean.hashCode()+System.currentTimeMillis(); } public void addAddress() { if(!getIsMaximumReached()) { //create unique id and add address if(validateInput(addressToUpdate)) { addressToUpdate.setId(createTempUniqueId(addressToUpdate)); removeDefaultFlag(addressToUpdate); addressList.add(addressToUpdate); addressToUpdate = new AddressBean(); //hide add dialog showAddressAddDialog = false; } } } private void removeDefaultFlag(AddressBean addressBean) { if(addressBean.getIsDefault()) { for (AddressBean bean : addressList) { if(!bean.equals(addressBean)) { bean.setIsDefault(false); } } } } public void viewSelected() { if(selectedAddress == null) { addMessage(FacesMessage.SEVERITY_WARN, "no_data_selected"); } else { if(addressToUpdate == null) { addressToUpdate = new AddressBean(); } addressToUpdate.copyDataFromAddressBean(selectedAddress); } } public void deleteSelected() { if(selectedAddress == null) { addMessage(FacesMessage.SEVERITY_WARN, "no_data_selected"); } else { addressList.remove(selectedAddress); } } public void updateAddress() { if(validateInput(addressToUpdate)) { AddressBean address = findAddressInList(addressToUpdate.getId()); if(address != null) { removeDefaultFlag(address); address.copyDataFromAddressBean(addressToUpdate); showAddressUpdateDialog = false; } else { addMessage(FacesMessage.SEVERITY_WARN, "no_data_selected"); } } } public List<AddressBean> getAddressList() { return addressList; } public void setSelectedAddress(AddressBean selectedAddress) { this.selectedAddress = selectedAddress; } public AddressBean getSelectedAddress() { return selectedAddress; } public void setAddressToUpdate(AddressBean addressToUpdate) { this.addressToUpdate = addressToUpdate; } public AddressBean getAddressToUpdate() { return addressToUpdate; } public void setShowAddressAddDialog(boolean showAddressAddDialog) { this.showAddressAddDialog = showAddressAddDialog; this.showAddressUpdateDialog = !showAddressAddDialog; addressToUpdate = new AddressBean(); } public boolean isShowAddressAddDialog() { return showAddressAddDialog; } public void setShowAddressUpdateDialog(boolean showAddressUpdateDialog) { if(showAddressUpdateDialog) { if(selectedAddress != null) { this.showAddressUpdateDialog = showAddressUpdateDialog; this.showAddressAddDialog = !showAddressUpdateDialog; } } else { this.showAddressUpdateDialog = showAddressUpdateDialog; this.showAddressAddDialog = !showAddressUpdateDialog; } } public boolean isShowAddressUpdateDialog() { return showAddressUpdateDialog; } @Override public List<Address> getAssignedAddressList() { List<Address> resultList = new ArrayList<Address>(); for (AddressBean bean : addressList) { Address aAdresse = bean.getAddress(isIdExisting(bean.getId())); resultList.add(aAdresse); } return resultList; } @Override public void setMaxAssigneableAddresses(int maxAssigneableAddresses) { this.maxAssigneableAddresses = maxAssigneableAddresses; } public int getMaxAssigneableAddresses() { return maxAssigneableAddresses; } public boolean getIsMaximumReached() { if(maxAssigneableAddresses != -1 && addressList.size() == maxAssigneableAddresses) { return true; } return false; } void reset() { addressList = new ArrayList<AddressBean>(); selectedAddress = null; addressToUpdate = new AddressBean(); showAddressAddDialog = false; showAddressUpdateDialog = false; maxAssigneableAddresses = -1; } private boolean validateInput(AddressBean bean) { boolean isValid = true; String street = bean.getStreet(); if(street == null || street.isEmpty()) { addErrorMessage(CLIENT_ID_STREET, "addressmanagement_error_empty_street"); isValid = false; } String number = bean.getHousenumber(); if(number == null || number.isEmpty()) { addErrorMessage(CLIENT_ID_NUMBER, "addressmanagement_error_empty_housenumber"); isValid = false; } String zip = bean.getZipCode(); if(zip == null || zip.isEmpty()) { addErrorMessage(CLIENT_ID_ZIP, "addressmanagement_error_empty_zipcode"); isValid = false; } String city = bean.getCity(); if(city == null || city.isEmpty()) { addErrorMessage(CLIENT_ID_CITY, "addressmanagement_error_empty_city"); isValid = false; } Country country = bean.getCountry(); if(country == null) { addErrorMessage(CLIENT_ID_COUNTRY, "addressmanagement_error_empty_country"); isValid = false; } return isValid; } private AddressBean findAddressInList(Long addressId) { for (AddressBean aAddressBean : addressList) { if(aAddressBean.getId().equals(addressId)) { return aAddressBean; } } return null; } private boolean isIdExisting(Long addressId) { Address address = addressService.getAddressById(addressId); if(address != null) { return true; } return false; } public List<AddressType> getAvailableAddressTypeValues() { return availableAddressTypes; } @Override public void setAvailableAddressTypes(List<AddressType> availableAddressTypes) { this.availableAddressTypes = availableAddressTypes; } public String getPanelTitle() { if(showAddressAddDialog) { return ResourceBundleAccessor.getString("addressmanagement_address_new"); } return ResourceBundleAccessor.getString("addressmanagement_update_address"); } public void closePanel() { this.showAddressAddDialog = false; this.showAddressUpdateDialog = false; } public boolean isEditMode() { if(showAddressAddDialog || showAddressUpdateDialog) { return true; } return false; } @Override public void findCity() { String zipCode = addressToUpdate.getZipCode(); if(zipCode == null || zipCode.length() < 3) { return; } List<OpenGeoEntry> findByZipCode = openGeoDB.findByZipCode("DE", zipCode); if(findByZipCode != null && findByZipCode.size() > 0) { addressToUpdate.setCity(findByZipCode.get(0).getName()); } } public List<Country> getAvailableCountries() { return openGeoDB.getListOfCountries(facesContext.getLocale().getLanguage()); } }