/* * 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.apache.commons.lang.StringUtils; import org.betaconceptframework.astroboa.api.model.ContentObject; import org.betaconceptframework.astroboa.api.model.ObjectReferenceProperty; import org.betaconceptframework.astroboa.api.model.ValueType; import org.betaconceptframework.astroboa.api.model.definition.CmsPropertyDefinition; import org.betaconceptframework.astroboa.api.model.definition.ContentObjectTypeDefinition; import org.betaconceptframework.astroboa.api.model.definition.ObjectReferencePropertyDefinition; import org.betaconceptframework.astroboa.api.model.io.FetchLevel; import org.betaconceptframework.astroboa.api.model.io.ResourceRepresentationType; import org.betaconceptframework.astroboa.api.model.query.CmsOutcome; import org.betaconceptframework.astroboa.api.model.query.Order; import org.betaconceptframework.astroboa.api.model.query.criteria.ContentObjectCriteria; import org.betaconceptframework.astroboa.api.service.ContentService; import org.betaconceptframework.astroboa.api.service.DefinitionService; import org.betaconceptframework.astroboa.console.commons.ContentObjectUIWrapper; import org.betaconceptframework.astroboa.console.commons.ContentObjectUIWrapperFactory; import org.betaconceptframework.astroboa.console.jsf.clipboard.ContentObjectItem; import org.betaconceptframework.astroboa.model.factory.CmsRepositoryEntityFactory; import org.betaconceptframework.astroboa.model.factory.CriterionFactory; import org.betaconceptframework.astroboa.util.CmsConstants; import org.betaconceptframework.ui.jsf.utility.JSFUtilities; import org.richfaces.event.DropEvent; /** * @author Gregory Chomatas (gchomatas@betaconcept.com) * @author Savvas Triantafyllou (striantafyllou@betaconcept.com) * */ public class ContentObjectPropertyWrapper extends MultipleSimpleCmsPropertyWrapper<ObjectReferenceProperty>{ private String contentObjectTitlePattern; private ContentObjectCriteria contentObjectCriteria; private List<String> acceptedContentTypes; private ContentService contentService; private ContentObjectUIWrapperFactory contentObjectUIWrapperFactory; private DefinitionService definitionService; private String localizedLabelsForAcceptedTypes = null; public ContentObjectPropertyWrapper(ObjectReferenceProperty contentObjectProperty, ContentObjectCriteria contentObjectCriteria, CmsPropertyDefinition cmsPropertyDefinition, String parentCmsPropertyPath, ContentService contentService, ContentObjectUIWrapperFactory contentObjectUIWrapperFactory, DefinitionService definitionService, CmsRepositoryEntityFactory cmsRepositoryEntityFactory, ContentObject contentObject, int wrapperIndex, ComplexCmsPropertyEdit complexCmsPropertyEdit) { super(cmsPropertyDefinition, parentCmsPropertyPath, cmsRepositoryEntityFactory, contentObject, wrapperIndex, complexCmsPropertyEdit); cmsProperty = contentObjectProperty; this.contentService = contentService; this.contentObjectUIWrapperFactory = contentObjectUIWrapperFactory; this.definitionService = definitionService; //Initialize topic criteria this.contentObjectCriteria = contentObjectCriteria; if (getCmsPropertyDefinition() != null) acceptedContentTypes = ((ObjectReferencePropertyDefinition)getCmsPropertyDefinition()).getExpandedAcceptedContentTypes(); if (CollectionUtils.isEmpty(acceptedContentTypes)){ //Load all content object types acceptedContentTypes = definitionService.getContentObjectTypes(); //Add a default if (acceptedContentTypes != null){ acceptedContentTypes.add(ValueType.ObjectReference.toString()); } } //this.contentObjectCriteria.getRenderProperties().renderValuesForLocale(JSFUtilities.getLocaleAsString()); this.contentObjectCriteria.setOffsetAndLimit(0,15); this.contentObjectCriteria.addOrderProperty("profile.title", Order.ascending); } public List<SimpleCmsPropertyValueWrapper> getSimpleCmsPropertyValueWrappers(){ if (CollectionUtils.isEmpty(simpleCmsPropertyValueWrappers)){ //Create wrappers only if there are any values if (cmsProperty != null && CollectionUtils.isNotEmpty(cmsProperty.getSimpleTypeValues())){ List values = cmsProperty.getSimpleTypeValues(); for (int i=0; i<values.size(); i++){ simpleCmsPropertyValueWrappers.add(new SimpleCmsPropertyValueWrapper(cmsProperty, i, cmsRepositoryEntityFactory, null)); } } } return simpleCmsPropertyValueWrappers; } public void deleteValueFromContentObjectProperty_UIAction(){ // add the wrapper index to the list of wrappers that should be updated by the UI complexCmsPropertyEdit.setWrapperIndexesToUpdate(Collections.singleton(wrapperIndex)); //Remove value only it has not already been deleted in case of null value if (indexOfPropertyValueToBeProcessed != -1){ try{ if (cmsProperty.getPropertyDefinition().isMultiple()){ //Remove value from simple cms property //only if indexOfPropertyValueToBeProcessed exists for values if (indexOfPropertyValueToBeProcessed < cmsProperty.getSimpleTypeValues().size()){ cmsProperty.removeSimpleTypeValue(indexOfPropertyValueToBeProcessed); } } else{ cmsProperty.setSimpleTypeValue(null); } } catch (Exception e){ logger.error("",e); } finally{ //Reset first wrapper simpleCmsPropertyValueWrappers.clear(); indexOfPropertyValueToBeProcessed = -1; } } } public List<ContentObjectUIWrapper> findContentObjects_UIAction(Object event) { try { String selectedContentObjectTitle = event.toString(); //Do not proceed if selected topic label is empty if (StringUtils.isBlank(selectedContentObjectTitle)) return null; //Reset criteria contentObjectCriteria.reset(); //Profile Title criterion if (StringUtils.deleteWhitespace(selectedContentObjectTitle).equals(selectedContentObjectTitle) && ! selectedContentObjectTitle.contains("\"") && ! selectedContentObjectTitle.contains("'") && ! selectedContentObjectTitle.contains("*")){ //If Search Text contains only one word and not any special search character then Append * at the end contentObjectCriteria.addCriterion(CriterionFactory.contains("profile.title", CmsConstants.ANY_NAME + selectedContentObjectTitle + CmsConstants.ANY_NAME)); } else{ contentObjectCriteria.addCriterion(CriterionFactory.contains("profile.title", selectedContentObjectTitle)); } //ContentObject Types criterion if (CollectionUtils.isNotEmpty(acceptedContentTypes)){ contentObjectCriteria.addContentObjectTypesEqualsAnyCriterion(acceptedContentTypes); } CmsOutcome<ContentObject> cmsOutcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST); List<ContentObjectUIWrapper> wrappedContentObjects = new ArrayList<ContentObjectUIWrapper>(); if (cmsOutcome.getCount() > 0) { List<ContentObject> objects = cmsOutcome.getResults(); for (ContentObject object : objects) { wrappedContentObjects.add(contentObjectUIWrapperFactory.getInstance(object)); } } return wrappedContentObjects; } catch (Exception e) { logger.error("Error while loading Content Objects ",e); return null; } } public void addDraggedAndDroppedContentObject_Listener(DropEvent dropEvent) { // add the wrapper index to the list of wrappers that should be updated by the UI complexCmsPropertyEdit.setWrapperIndexesToUpdate(Collections.singleton(wrapperIndex)); ContentObjectItem contentObjectItem = (ContentObjectItem) dropEvent.getDragValue(); String dragType = dropEvent.getDragType(); //Only content object is supported if (getCmsPropertyDefinition() != null && getCmsPropertyDefinition() instanceof ObjectReferencePropertyDefinition && StringUtils.isNotBlank(dragType)){ //Drag type not used for now //A Content Object has been dragged //Load Content object from repository ContentObject contentObject = contentService.getContentObject(contentObjectItem.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false); if (contentObject == null) JSFUtilities.addMessage(null, "Δεν υπάρχει Αντικείμενο με αναγνωριστικό "+ contentObjectItem.getId() , FacesMessage.SEVERITY_WARN); else{ addSelectedContentObject_UIAction(contentObject, false); } } } public void addSelectedContentObject_UIAction(ContentObject selectedContentObject, boolean checkAcceptedContentObjectTypes){ // add the wrapper index to the list of wrappers that should be updated by the UI complexCmsPropertyEdit.setWrapperIndexesToUpdate(Collections.singleton(wrapperIndex)); if (cmsProperty != null && getCmsPropertyDefinition() != null && selectedContentObject != null){ List<ContentObject> contentObjects= new ArrayList<ContentObject>(); if (getCmsPropertyDefinition().isMultiple()){ contentObjects = cmsProperty.getSimpleTypeValues(); } else{ if (cmsProperty.getSimpleTypeValue() != null) contentObjects.add(cmsProperty.getSimpleTypeValue()); } String selectedContentObjectId = selectedContentObject.getId(); // check if selected content object is already inserted boolean contentObjectExists = false; for (ContentObject contentObject : contentObjects) { if (contentObject.getId() != null && contentObject.getId().equals(selectedContentObjectId)) { contentObjectExists = true; break; } } if (!contentObjectExists) { //Check that content object type is accepted if (CollectionUtils.isNotEmpty(acceptedContentTypes) && checkAcceptedContentObjectTypes){ if (selectedContentObject.getContentObjectType() == null || ! acceptedContentTypes.contains(selectedContentObject.getContentObjectType()) ){ JSFUtilities.addMessage(null, "Ο τύπος τoυ Αντικειμένου με αναγνωριστικό "+ selectedContentObjectId +" δεν ανήκει στους επιτρεπόμενους τύπους του στοιχείου " + acceptedContentTypes , FacesMessage.SEVERITY_WARN); return; } } if (isMultiple()){ cmsProperty.addSimpleTypeValue(selectedContentObject); simpleCmsPropertyValueWrappers.clear(); } else{ //Now replace value cmsProperty.setSimpleTypeValue(selectedContentObject); } } else JSFUtilities.addMessage(null, "Το αντικείμενο ΔΕΝ ΠΡΟΣΤΕΘΗΚΕ γιατί υπάρχει ήδη στο στοιχείο" , FacesMessage.SEVERITY_WARN); } } @Override public void addBlankValue_UIAction() { } public void setContentObjectTitlePattern(String contentObjectTitlePattern) { this.contentObjectTitlePattern = contentObjectTitlePattern; } public String getContentObjectTitlePattern() { return contentObjectTitlePattern; } public List<String> getAcceptedContentTypes() { if (acceptedContentTypes == null){ return definitionService.getContentObjectTypes(); } return acceptedContentTypes; } public String getLocalizedLabelsForAcceptedContentTypes(){ if (StringUtils.isBlank(localizedLabelsForAcceptedTypes)){ List<String> acceptedContentTypes = null; List<String> localizedLabels = new ArrayList<String>(); // we do not get the accepted object types from the provided class property since we do not need to return to the user all available types // if no restriction has been set in the definition. When there is no rescriction we just return a localized string for "All Object Types are accepted" if (getCmsPropertyDefinition() != null) { acceptedContentTypes = ((ObjectReferencePropertyDefinition)getCmsPropertyDefinition()).getExpandedAcceptedContentTypes(); } if (CollectionUtils.isNotEmpty(acceptedContentTypes)){ for (String acceptedContentType : acceptedContentTypes){ ContentObjectTypeDefinition typeDefinition = (ContentObjectTypeDefinition)definitionService.getCmsDefinition(acceptedContentType, ResourceRepresentationType.DEFINITION_INSTANCE, false); if (typeDefinition == null){ logger.warn("Try to load accepted content type {} but was not found", acceptedContentType); localizedLabels.add(acceptedContentType); } else{ if (StringUtils.isNotBlank(typeDefinition.getDisplayName().getLocalizedLabelForLocale(JSFUtilities.getLocaleAsString()))){ localizedLabels.add(typeDefinition.getDisplayName().getLocalizedLabelForLocale(JSFUtilities.getLocaleAsString())); } else{ localizedLabels.add(acceptedContentType); } } } } else { localizedLabels.add(JSFUtilities.getStringI18n("dialog.objectSelection.allObjectTypesAreAccepted")); } if (localizedLabels.size() > 0){ localizedLabelsForAcceptedTypes = StringUtils.join(localizedLabels, ","); } } return localizedLabelsForAcceptedTypes; } }