package org.cloudgraph.web.model.campaign; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import java.util.UUID; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; import javax.faces.validator.ValidatorException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.cloudgraph.web.ErrorHandlerBean; import org.cloudgraph.web.ResourceManager; import org.cloudgraph.web.WebConstants; import org.cloudgraph.web.config.web.AppActions; import org.cloudgraph.web.model.ModelBean; import org.cloudgraph.web.model.common.CategorizedPropertySupport; import org.cloudgraph.web.model.common.PropertySelector; import org.cloudgraph.web.model.configuration.PropertyItem; import org.cloudgraph.web.model.configuration.PropertyType; import org.cloudgraph.web.model.search.SearchBean; import org.cloudgraph.web.query.CampaignQuery; import org.cloudgraph.web.sdo.adapter.PropertyAdapter; import org.cloudgraph.web.sdo.campaign.Campaign; import org.cloudgraph.web.sdo.campaign.CampaignType; import org.cloudgraph.web.sdo.campaign.DispersalType; import org.cloudgraph.web.sdo.meta.Property; import org.cloudgraph.web.util.BeanFinder; import org.cloudgraph.web.util.ResourceUtils; import org.plasma.sdo.PlasmaDataObject; import org.plasma.sdo.PlasmaProperty; import org.plasma.sdo.access.client.SDODataAccessClient; import org.plasma.sdo.helper.PlasmaDataFactory; import org.plasma.sdo.helper.PlasmaTypeHelper; import commonj.sdo.DataGraph; import commonj.sdo.DataObject; import commonj.sdo.Type; @ManagedBean(name="CampaignEditBean") @SessionScoped public class CampaignEditBean extends ModelBean implements PropertySelector { private static final long serialVersionUID = 1L; private static Log log = LogFactory.getLog(CampaignEditBean.class); private Long campaignId; private Campaign campaign; private CategorizedPropertySupport propertySupport; public CampaignEditBean() { log.debug("created CampaignEditBean"); this.propertySupport = new CategorizedPropertySupport(this); } public String getTitle() { if (this.campaign != null) return "Edit Campaign: " + this.campaign.getName(); else return ""; } public String createFromAjax() { create(); return null; // maintains AJAX happyness } public String create() { BeanFinder beanFinder = new BeanFinder(); ErrorHandlerBean errorHandler = beanFinder.findErrorHandlerBean(); try { DataGraph dataGraph = PlasmaDataFactory.INSTANCE.createDataGraph(); dataGraph.getChangeSummary().beginLogging(); // log changes from this point Type rootType = PlasmaTypeHelper.INSTANCE.getType(Campaign.class); this.campaign = (Campaign)dataGraph.createRootObject(rootType); this.campaign.setName("New Campaign"); this.campaign.setExternalId(UUID.randomUUID().toString()); return AppActions.CREATE.value(); } catch (Throwable t) { log.error(t.getMessage(), t); errorHandler.setError(t); errorHandler.setRecoverable(false); return AppActions.ERRORHANDLER.value(); } finally { } } public String editFromAjax() { edit(); return null; // maintains AJAX happyness } public String edit() { BeanFinder beanFinder = new BeanFinder(); ErrorHandlerBean errorHandler = beanFinder.findErrorHandlerBean(); try { SDODataAccessClient service = new SDODataAccessClient(); DataGraph[] result = service.find(CampaignQuery.createEditQuery(this.campaignId)); this.campaign = (Campaign)result[0].getRootObject(); clear(); return AppActions.EDIT.value(); } catch (Throwable t) { log.error(t.getMessage(), t); errorHandler.setError(t); errorHandler.setRecoverable(false); return AppActions.ERRORHANDLER.value(); } finally { } } public String saveFromAjax() { save(); return null; // maintains AJAX happyness } public String save() { BeanFinder beanFinder = new BeanFinder(); ErrorHandlerBean errorHandler = beanFinder.findErrorHandlerBean(); try { if (log.isDebugEnabled()) log.debug(((PlasmaDataObject)this.campaign).dump()); SDODataAccessClient service = new SDODataAccessClient(); service.commit(this.campaign.getDataGraph(), beanFinder.findUserBean().getName()); clear(); return AppActions.SAVE.value(); } catch (Throwable t) { log.error(t.getMessage(), t); errorHandler.setError(t); errorHandler.setRecoverable(false); return AppActions.ERRORHANDLER.value(); } finally { } } public String exit() { try { this.campaign.getDataGraph().getChangeSummary().endLogging(); // wipe any changes this.campaign.getDataGraph().getChangeSummary().beginLogging(); this.campaign = null; } catch (Throwable t) { } finally { } return null; } public void clear() { try { } catch (Throwable t) { } finally { } } public long getNameMaxLength() { PlasmaProperty nameProp = (PlasmaProperty)this.campaign.getType().getProperty( Campaign.PROPERTY.name.name()); return nameProp.getMaxLength(); } public long getDescriptionMaxLength() { PlasmaProperty nameProp = (PlasmaProperty)this.campaign.getType().getProperty( Campaign.PROPERTY.description.name()); return nameProp.getMaxLength(); } public void validateDescriptionLength(FacesContext facesContext, UIComponent component, Object value) { String label = "Definition"; String text = null; if (value == null || ((String)value).trim().length() == 0) { return; } else text = ((String)value).trim(); long max = this.getDescriptionMaxLength(); if (text.length() > max) { String msg = label + " is longer than allowed maximum " + String.valueOf(max) + " characters"; throw new ValidatorException(new FacesMessage(msg, msg)); } } public void validateDataTypeId(FacesContext facesContext, UIComponent component, Object value) { if (value == null || ((Long)value).intValue() == -1) { String label = "Data Type"; try { label = ResourceManager.instance().getString("aplsPropertyEdit_dataType_label"); } catch (MissingResourceException e) { } String msg = label + " is a required field"; throw new ValidatorException(new FacesMessage(msg, msg)); } } public Long getCampaignId() { return this.campaignId; } public void setCampaignId(Long selected) { this.campaignId = selected; } public boolean getHasCampaign() { return this.campaign != null; } public Campaign getCampaign() { return this.campaign; } public void setCampaign(Campaign selectedCampaign) { this.campaign = selectedCampaign; } public DataObject getCampaignDataObject() { return this.campaign; } List<SelectItem> typeItems; public List<SelectItem> getTypeItems() { if (typeItems == null) { typeItems = new ArrayList<SelectItem>(); SelectItem item = new SelectItem(WebConstants.DEFAULT_SELECTION, WebConstants.DEFAULT_SELECTION); typeItems.add(item); CampaignType[] types = CampaignType.values(); for (int i = 0; i < types.length; i++) { String key = ResourceUtils.constructResourceLabelKey(PropertyType.class, types[i].name()); String displayName = null; try { displayName = ResourceManager.instance().getString(key); } catch (MissingResourceException e) { displayName = types[i].name(); } typeItems.add(new SelectItem(types[i].getInstanceName(), displayName)); } } return typeItems; } List<SelectItem> dispersalMethodItems; public List<SelectItem> getDispersalMethodItems() { if (dispersalMethodItems == null) { dispersalMethodItems = new ArrayList<SelectItem>(); SelectItem item = new SelectItem(WebConstants.DEFAULT_SELECTION, WebConstants.DEFAULT_SELECTION); dispersalMethodItems.add(item); DispersalType[] dispersalTypes = DispersalType.values(); for (int i = 0; i < dispersalTypes.length; i++) { String key = ResourceUtils.constructResourceLabelKey(PropertyType.class, dispersalTypes[i].name()); String displayName = null; try { displayName = ResourceManager.instance().getString(key); } catch (MissingResourceException e) { displayName = dispersalTypes[i].name(); } dispersalMethodItems.add(new SelectItem(dispersalTypes[i].getInstanceName(), displayName)); } } return dispersalMethodItems; } public long getNotesMaxLength() { PlasmaProperty prop = (PlasmaProperty)this.campaign.getType().getProperty( Campaign.PROPERTY.notes.name()); return prop.getMaxLength(); } public void validateNotesLength(FacesContext facesContext, UIComponent component, Object value) { String label = "Notes"; String text = null; if (value == null || ((String)value).trim().length() == 0) { return; } else text = ((String)value).trim(); long max = this.getNotesMaxLength(); if (text.length() > max) { String msg = label + " is longer than allowed maximum " + String.valueOf(max) + " characters"; throw new ValidatorException(new FacesMessage(msg, msg)); } } private Map<Long,List<PropertyItem>> availablePropertiesMap = new HashMap<Long,List<PropertyItem>>(); public List<PropertyItem> getAvailableProperties() { SearchBean searchBean = this.beanFinder.findSearchBean(); List<PropertyItem> available = availablePropertiesMap.get(searchBean.getClazzId()); if (available == null) { available = new ArrayList<PropertyItem>(); for (PropertyAdapter adapter : this.propertySupport.getAllProperties()) available.add(new PropertyItem(adapter.getId(), adapter.getName())); availablePropertiesMap.put(searchBean.getClazzId(), available); } return available; } public void setAvailableProperties(List<PropertyItem> availableList) { SearchBean searchBean = this.beanFinder.findSearchBean(); List<PropertyItem> available = availablePropertiesMap.get(searchBean.getClazzId()); if (available == null) { available = new ArrayList<PropertyItem>(); availablePropertiesMap.put(searchBean.getClazzId(), available); } else available.clear(); available.addAll(availableList); } private Map<Long,List<PropertyItem>> selectedPropertiesMap = new HashMap<Long,List<PropertyItem>>(); public List<PropertyItem> getSelectedProperties() { SearchBean searchBean = this.beanFinder.findSearchBean(); List<PropertyItem> selected = selectedPropertiesMap.get(searchBean.getClazzId()); if (selected == null) { selected = new ArrayList<PropertyItem>(); } return selected; } public void setSelectedProperties(List<PropertyItem> selectedList) { SearchBean searchBean = this.beanFinder.findSearchBean(); List<PropertyItem> selected = selectedPropertiesMap.get(searchBean.getClazzId()); if (selected == null) { selected = new ArrayList<PropertyItem>(); selectedPropertiesMap.put(searchBean.getClazzId(), selected); } else selected.clear(); selected.addAll(selectedList); } @Override public boolean isSelected(Property property) { for (PropertyItem item : getSelectedProperties()) { if (item.getId() == property.getSeqId()) { return true; } } return false; } }