/*
* Copyright (C) 2005-2012 BetaCONCEPT Limited
*
* This file is part of Astroboa.
*
* Astroboa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Astroboa is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Astroboa. If not, see <http://www.gnu.org/licenses/>.
*/
package org.betaconceptframework.astroboa.console.jsf.richfaces;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.api.model.CmsProperty;
import org.betaconceptframework.astroboa.api.model.ComplexCmsProperty;
import org.betaconceptframework.astroboa.api.model.definition.CmsPropertyDefinition;
import org.betaconceptframework.astroboa.api.model.definition.SimpleCmsPropertyDefinition;
import org.betaconceptframework.astroboa.util.CmsConstants;
import org.betaconceptframework.astroboa.util.PropertyPath;
import org.betaconceptframework.ui.jsf.utility.JSFUtilities;
import org.richfaces.model.TreeNode;
/**
* A simplified version of {@link LazyLoadingContentObjectPropertyTreeNodeRichFaces} specific
* to content object edit
*
* @author Savvas Triantafyllou (striantafillou@betaconcept.gr)
*
*/
/**
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public class LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces extends LazyLoadingTreeNodeRichFaces{
public enum NodeType{
LABEL_NODE,
CMS_PROPERTY_TEMPLATE,
COMPLEX_CMS_PROPERTY
}
private CmsProperty cmsProperty;
private boolean mandatory;
private String propertyNameForTemplate;
public LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces(String identifier, String description, TreeNode parent, String type,
CmsProperty cmsProperty, boolean mandatory){
//If definition is an instance then it is a leaf node
super(identifier, description, parent,
type,
(type == null
|| NodeType.CMS_PROPERTY_TEMPLATE.toString().equals(type)) //Leaf if definition is simple
);
this.cmsProperty = cmsProperty;
this.mandatory = mandatory;
//Set default description in case no description is provided
//Default value is cms definition name if any and an appropriate message in parenthesis
if (StringUtils.isBlank(this.description))
this.description = (cmsProperty != null ? cmsProperty.getName() : "" );
}
@Override
public Iterator<Entry<String, TreeNode>> getChildren() {
if (!isLeaf() && children.size() == 0 && cmsProperty != null &&
cmsProperty instanceof ComplexCmsProperty) {
final ComplexCmsProperty complexCmsProperty = (ComplexCmsProperty)cmsProperty;
// get the child property definitions and generate nodes for each complex property
Collection<CmsPropertyDefinition> childPropertyDefinitions =
complexCmsProperty.getPropertyDefinition().getSortedChildCmsPropertyDefinitionsByAscendingOrderAndLocale(JSFUtilities.getLocaleAsString()).values();
if (childPropertyDefinitions != null && !childPropertyDefinitions.isEmpty()) {
for (CmsPropertyDefinition childPropertyDefinition : childPropertyDefinitions) {
// we are looking for type properties excluding "profile" and "accessibility", "workflow" which have a special treatment at the UI
if (!childPropertyDefinition.getName().equals("profile")
&& ! childPropertyDefinition.isObsolete()
// && !childPropertyDefinition.getName().equals("accessibility")
// && !childPropertyDefinition.getName().equals("workflow")
)
{
String locale = JSFUtilities.getLocaleAsString();
String localizedLabelForLocale = childPropertyDefinition.getDisplayName().getLocalizedLabelForLocale(locale);
if (localizedLabelForLocale == null)
localizedLabelForLocale = childPropertyDefinition.getName();
if (! (childPropertyDefinition instanceof SimpleCmsPropertyDefinition)){
//Child Property is a Complex property
if (childPropertyDefinition.isMultiple()){
//Create a dummy node to be used for creating a new property template
//for this property
LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces childPropertyTreeNode =
new LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces(
PropertyPath.createFullPropertyPath(cmsProperty.getFullPath(), childPropertyDefinition.getName()+":New"),
localizedLabelForLocale,
this,
NodeType.CMS_PROPERTY_TEMPLATE.toString(),
null,
false);
childPropertyTreeNode.setPropertyNameForTemplate(childPropertyDefinition.getName());
children.put(childPropertyTreeNode.identifier, childPropertyTreeNode);
}
//Load all children under this path
List<CmsProperty> childProperties = complexCmsProperty.getChildPropertyList(childPropertyDefinition.getName());
if (CollectionUtils.isNotEmpty(childProperties)){
for (CmsProperty childProperty: childProperties){
LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces childPropertyTreeNode =
new LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces(
childProperty.getFullPath(),
localizedLabelForLocale + extractIndexFromFullPath(childProperty.getFullPath()),
this,
NodeType.COMPLEX_CMS_PROPERTY.toString(),
childProperty,
childPropertyDefinition.isMandatory());
children.put(childPropertyTreeNode.identifier, childPropertyTreeNode);
}
}
}
}
}
}
}
return children.entrySet().iterator();
}
private String extractIndexFromFullPath(String fullPath) {
if (StringUtils.isBlank(fullPath))
return "";
String index = StringUtils.substringAfterLast(fullPath, CmsConstants.LEFT_BRACKET);
if (StringUtils.isBlank(index) || index.startsWith("0"))
return "";
return CmsConstants.LEFT_BRACKET+index;
}
public void clearChildren() {
children.clear();
}
public boolean getMandatory() {
return mandatory;
}
public boolean isErroneous(){
if (cmsProperty == null)
return false;
boolean existMessagesForControlId = JSFUtilities.existMessagesForControlId(PropertyPath.removeIndexesFromPath(cmsProperty.getFullPath()));
if (!existMessagesForControlId && ! children.isEmpty()){
Collection<TreeNode> childTreeNodes = children.values();
for (TreeNode childNode : childTreeNodes){
if (((LazyLoadingCmsPropertyForContentObjectEditTreeNodeRichFaces)childNode).isErroneous())
return true;
}
}
return existMessagesForControlId;
}
public CmsProperty getCmsProperty() {
return cmsProperty;
}
public String getPropertyNameForTemplate() {
return propertyNameForTemplate;
}
public void setPropertyNameForTemplate(String propertyNameForTemplate) {
this.propertyNameForTemplate = propertyNameForTemplate;
}
}