/*
* 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.edit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.faces.application.FacesMessage;
import org.apache.commons.collections.CollectionUtils;
import org.betaconceptframework.astroboa.api.model.CmsProperty;
import org.betaconceptframework.astroboa.api.model.ComplexCmsProperty;
import org.betaconceptframework.astroboa.api.model.ContentObject;
import org.betaconceptframework.astroboa.api.model.definition.CmsPropertyDefinition;
import org.betaconceptframework.astroboa.console.seam.SeamEventNames;
import org.betaconceptframework.astroboa.model.factory.CmsRepositoryEntityFactory;
import org.betaconceptframework.ui.jsf.utility.JSFUtilities;
import org.jboss.seam.core.Events;
import org.richfaces.event.DropEvent;
/**
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public class ComplexCmsPropertyParentWrapper extends CmsPropertyWrapper<ComplexCmsProperty<?,?>>{
private List<ComplexCmsPropertyWrapper> childComplexCmsPropertyWrappers;
private CmsPropertyDefinition childComplexCmsPropertyDefinition;
public ComplexCmsPropertyParentWrapper(ComplexCmsProperty<?,?> parentComplexCmsProperty,
CmsPropertyDefinition childComplexCmsPropertyDefinition,
CmsRepositoryEntityFactory cmsRepositoryEntityFactory,
ContentObject contentObject,
int wrapperIndex,
ComplexCmsPropertyEdit complexCmsPropertyEdit) {
super(childComplexCmsPropertyDefinition,
parentComplexCmsProperty.getPath(), cmsRepositoryEntityFactory, contentObject, wrapperIndex, complexCmsPropertyEdit);
this.cmsProperty = parentComplexCmsProperty;
this.childComplexCmsPropertyDefinition = childComplexCmsPropertyDefinition;
}
public String getCmsPropertyIndex(){
return "";
}
@Override
public boolean isMultiple() {
return childComplexCmsPropertyDefinition == null ? false : childComplexCmsPropertyDefinition.isMultiple();
}
@Override
public boolean isMandatory() {
return childComplexCmsPropertyDefinition == null ? false : childComplexCmsPropertyDefinition.isMandatory();
}
@Override
public String getDefinitionName() {
return childComplexCmsPropertyDefinition == null ? null : childComplexCmsPropertyDefinition.getName();
}
@Override
public String getLocalizedLabelForCurrentLocale() {
return childComplexCmsPropertyDefinition == null ? null :
childComplexCmsPropertyDefinition.getDisplayName().getAvailableLocalizedLabel(JSFUtilities.getLocaleAsString());
}
@Override
protected String getRestrictReadToRoles() {
return childComplexCmsPropertyDefinition.getRestrictReadToRoles();
}
@Override
protected String getRestrictToWriteRoles() {
return childComplexCmsPropertyDefinition.getRestrictWriteToRoles();
}
@Override
public CmsPropertyDefinition getCmsPropertyDefinition() {
return childComplexCmsPropertyDefinition;
}
public List<ComplexCmsPropertyWrapper> getChildComplexCmsPropertyWrappers() {
if (childComplexCmsPropertyWrappers != null)
return childComplexCmsPropertyWrappers;
if (cmsProperty.hasValueForChildProperty(childComplexCmsPropertyDefinition.getName())){
childComplexCmsPropertyWrappers = new ArrayList<ComplexCmsPropertyWrapper>();
List<CmsProperty<?,?>> complexCmsProperties = cmsProperty.getChildPropertyList(childComplexCmsPropertyDefinition.getName());
if (CollectionUtils.isNotEmpty(complexCmsProperties)){
for (CmsProperty<?,?> complexCmsProperty : complexCmsProperties)
childComplexCmsPropertyWrappers.add(new ComplexCmsPropertyWrapper(complexCmsProperty, false,
childComplexCmsPropertyDefinition, cmsProperty.getPath(), cmsRepositoryEntityFactory, getContentObject(), wrapperIndex, complexCmsPropertyEdit));
}
}
return childComplexCmsPropertyWrappers;
}
public void deleteAllChildComplexCmsProperties_UIAction(){
if (childComplexCmsPropertyDefinition != null)
{
deleteComplexCmsProperty_UIAction(childComplexCmsPropertyDefinition.getName());
}
}
//childPropertyPath is relative to cmsProperty
public void deleteComplexCmsProperty_UIAction(String childPropertyPath){
// add the wrapper index to the list of wrappers that should be updated by the UI
complexCmsPropertyEdit.setWrapperIndexesToUpdate(Collections.singleton(wrapperIndex));
try{
cmsProperty.removeChildProperty(childPropertyPath);
//Nullify to force to be reloaded
childComplexCmsPropertyWrappers = null;
}
catch (Exception e) {
JSFUtilities.addMessage(null, "application.unknown.error.message", null, FacesMessage.SEVERITY_WARN);
logger.error("Could not remove complex cms property in path "+ childPropertyPath,e);
}
}
@Override
public void addBlankValue_UIAction() {
try{
//Create a template for new complex cms property
CmsProperty<?, ?> childCmsProperty = cmsProperty.createNewValueForMulitpleComplexCmsProperty(childComplexCmsPropertyDefinition.getName());
//Notify tree that a property is added
if (childCmsProperty != null){
Events.instance().raiseEvent(SeamEventNames.NEW_COMPLEX_CMS_PROPERTY_ADDED, childCmsProperty.getPath(), complexCmsPropertyEdit);
}
else{
logger.warn("Could not create new cms property {}", cmsProperty.getFullPath()+"."+childComplexCmsPropertyDefinition.getName());
}
}
catch (Exception e) {
JSFUtilities.addMessage(null, "application.unknown.error.message", null, FacesMessage.SEVERITY_WARN);
logger.error("Could not create new complex cms property for path "+ cmsProperty.getFullPath(),e);
}
}
public boolean isAspect(){
return false;
}
private void swapChildPropertyPositions(String childPropertyName, Integer fromIndex, Integer toIndex) {
if (CollectionUtils.isEmpty(childComplexCmsPropertyWrappers)){
logger.error("List of child properties is empty.");
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (cmsProperty.swapChildPropertyValues(childPropertyName, fromIndex, toIndex)) {
ComplexCmsPropertyWrapper fromChildPropertyWrapper = childComplexCmsPropertyWrappers.get(fromIndex);
ComplexCmsPropertyWrapper toChildPropertyWrapper = childComplexCmsPropertyWrappers.get(toIndex);
fromChildPropertyWrapper.resetCmsPropertyIndex();
toChildPropertyWrapper.resetCmsPropertyIndex();
Collections.swap(childComplexCmsPropertyWrappers, fromIndex, toIndex);
}
else {
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
}
}
private void changeChildPropertyPosition(String childPropertyName, Integer fromIndex, Integer toIndex) {
if (CollectionUtils.isEmpty(childComplexCmsPropertyWrappers)){
logger.error("List of child properties is empty.");
JSFUtilities.addMessage(null, "object.edit.changePropertyValuePosition.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (cmsProperty.changePositionOfChildPropertyValue(childPropertyName, fromIndex, toIndex)) {
childComplexCmsPropertyWrappers.add(toIndex, childComplexCmsPropertyWrappers.get(fromIndex));
if (fromIndex > toIndex) {
fromIndex++;
}
childComplexCmsPropertyWrappers.remove(fromIndex.intValue());
for (ComplexCmsPropertyWrapper complexCmsPropertyWrapper : childComplexCmsPropertyWrappers) {
complexCmsPropertyWrapper.resetCmsPropertyIndex();
}
}
else {
JSFUtilities.addMessage(null, "object.edit.changePropertyValuePosition.failed", null, FacesMessage.SEVERITY_WARN);
}
}
public void addDraggedAndDroppedReference_Listener(DropEvent dropEvent){
ComplexCmsPropertyWrapper fromChildPropertyWrapper = (ComplexCmsPropertyWrapper) dropEvent.getDragValue();
ComplexCmsPropertyWrapper toChildPropertyWrapper = (ComplexCmsPropertyWrapper) dropEvent.getDropValue();
if (fromChildPropertyWrapper == null || toChildPropertyWrapper == null) {
logger.error("Either the dragged or the dropped value is null");
JSFUtilities.addMessage(null, "object.edit.changePropertyValuePosition.failed", null, FacesMessage.SEVERITY_WARN);
}
Integer fromIndex = childComplexCmsPropertyWrappers.indexOf(fromChildPropertyWrapper);
Integer toIndex = childComplexCmsPropertyWrappers.indexOf(toChildPropertyWrapper);
if (fromIndex == null || toIndex == null || fromIndex < 0 || toIndex < 0){
logger.warn("Cannot drag value from {} to {}", fromIndex, toIndex);
JSFUtilities.addMessage(null, "object.edit.changePropertyValuePosition.failed", null, FacesMessage.SEVERITY_WARN);
return ;
}
if (fromIndex.equals(toIndex)){
return;
}
logger.debug("Moving value from index "+
fromIndex+ " to index "+ toIndex);
changeChildPropertyPosition(fromChildPropertyWrapper.getDefinitionName(), fromIndex, toIndex);
}
public void moveUp_UIAction(ComplexCmsPropertyWrapper childPropertyWrapper){
if (childPropertyWrapper == null){
logger.warn("No value provided to move");
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (CollectionUtils.isEmpty(childComplexCmsPropertyWrappers)){
logger.error("List of child properties is empty.");
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
int valueIndexInList = childComplexCmsPropertyWrappers.indexOf(childPropertyWrapper);
if (valueIndexInList == -1){
logger.error("List of values does not contain value {}", childPropertyWrapper.getLocalizedLabelForCurrentLocale());
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (valueIndexInList == 0){
//Value is already at the top of the list
return;
}
swapChildPropertyPositions(childPropertyWrapper.getDefinitionName(), valueIndexInList, valueIndexInList-1);
}
public void moveDown_UIAction(ComplexCmsPropertyWrapper childPropertyWrapper){
if (childPropertyWrapper == null){
logger.warn("No value provided to move");
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (CollectionUtils.isEmpty(childComplexCmsPropertyWrappers)){
logger.error("List of child properties is empty.");
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
int valueIndexInList = childComplexCmsPropertyWrappers.indexOf(childPropertyWrapper);
if (valueIndexInList == -1){
logger.error("List of values does not contain value {}", childPropertyWrapper.getLocalizedLabelForCurrentLocale());
JSFUtilities.addMessage(null, "object.edit.swapPropertyValuePositions.failed", null, FacesMessage.SEVERITY_WARN);
return;
}
if (valueIndexInList == childComplexCmsPropertyWrappers.size()){
//Value is already at the bottom of the list
return;
}
swapChildPropertyPositions(childPropertyWrapper.getDefinitionName(), valueIndexInList, valueIndexInList+1);
}
}