/** * Copyright (C) 2005-2007 BetaCONCEPT LP. * * This program 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 2 * of the License, or (at your option) any later version. * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * 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; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.Locale; import javax.faces.context.FacesContext; import org.apache.commons.lang.StringUtils; import org.betaconceptframework.astroboa.api.model.BinaryChannel; import org.betaconceptframework.astroboa.api.model.ComplexCmsRootProperty; import org.betaconceptframework.astroboa.api.model.ContentObject; import org.betaconceptframework.astroboa.api.model.StringProperty; import org.betaconceptframework.astroboa.api.model.definition.ContentObjectTypeDefinition; import org.betaconceptframework.astroboa.api.model.io.FetchLevel; import org.betaconceptframework.astroboa.api.model.io.ResourceRepresentationType; import org.betaconceptframework.astroboa.api.model.query.CacheRegion; 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.commons.Utils; import org.betaconceptframework.astroboa.console.jsf.richfaces.LazyLoadingContentObjectPropertyTreeNodeRichFaces; import org.betaconceptframework.astroboa.console.security.IdentityStoreRunAsSystem; import org.betaconceptframework.ui.jsf.AbstractUIBean; import org.betaconceptframework.ui.jsf.utility.JSFUtilities; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.international.LocaleSelector; import org.richfaces.component.html.HtmlModalPanel; import org.richfaces.model.TreeNode; import org.richfaces.model.TreeNodeImpl; /** * @author Gregory Chomatas (gchomatas@betaconcept.com) * Created on Sept 10, 2007 */ @Name("contentObjectViewAsTree") @Scope(ScopeType.CONVERSATION) public class ContentObjectViewAsTree extends AbstractUIBean { private static final long serialVersionUID = 1L; // injected beans private ContentObjectList contentObjectList; private DefinitionService definitionService; private ContentService contentService; private ContentObjectUIWrapperFactory contentObjectUIWrapperFactory; private PageController pageController; @In(create=true) private IdentityStoreRunAsSystem identityStoreRunAsSystem; @In(required=false) UIComponentBinding uiComponentBinding; @In private LocaleSelector localeSelector; // The JSF pop up panel which acts as the viewer of detailed content object properties private HtmlModalPanel contentObjectViewerPanel; private String contentObjectTitle; private TreeNode contentObjectAsTreeData; private BinaryChannel selectedBinaryChannel; private ContentObjectUIWrapper selectedContentObjectForView; public void presentContentObject_UIAction(String selectedContentObjectIdentifier) { ContentObject selectedContentObject = contentService.getContentObject( selectedContentObjectIdentifier, ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false); selectedContentObjectForView = contentObjectUIWrapperFactory.getInstance(selectedContentObject); contentObjectTitle = ((StringProperty) selectedContentObjectForView.getContentObject().getCmsProperty("profile.title")).getSimpleTypeValue(); // content object title is used as header for the contentObjectViewerPanel. So abbreviate to 100 chars to fit into one window line contentObjectTitle = StringUtils.abbreviate(contentObjectTitle, 100); // get root content object property which contains all properties ComplexCmsRootProperty rootProperty = selectedContentObjectForView.getContentObject().getComplexCmsRootProperty(); ContentObjectTypeDefinition contentObjectTypeDefinition = (ContentObjectTypeDefinition) definitionService.getCmsDefinition(selectedContentObjectForView.getContentObject().getContentObjectType(), ResourceRepresentationType.DEFINITION_INSTANCE,false); String locale = JSFUtilities.getLocaleAsString(); contentObjectAsTreeData = new LazyLoadingContentObjectPropertyTreeNodeRichFaces( rootProperty.getName(), contentObjectTypeDefinition.getDisplayName().getLocalizedLabelForLocale(locale), null, "ComplexTypeSingleOccurrencePropertyNode", false, rootProperty, contentObjectTypeDefinition); } /** * The method creates an output stream for a byte array containing the data of a binary channel * The output stream is used by a UI object (a4j:mediaOutput) to either render or create a link to the binary data * @param out * @param data * @throws IOException */ public void binaryDataOutput(OutputStream out, Object data) throws IOException{ out.write((byte[]) data); //out.write(getThumbnailContent()); out.close(); } public void viewBinaryChannel_UIAction() { TreeNode selectedTreeNodeObject = uiComponentBinding.getContentObjectTreeComponent().getTreeNode(); LazyLoadingContentObjectPropertyTreeNodeRichFaces selectedPropertyNode; // There is possibly a bug in Rich Faces Tree Implementation. The first time a tree node is selected in the tree the selected tree node // that is returned has type <LazyLoadingContentObjectFolderTreeNodeRichFaces> as it should be. However any subsequent selected tree node // is returned as a <TreeNodeImpl> object which should not happen. // So we should check the returned type to decide how we will access the selected tree node. if (LazyLoadingContentObjectPropertyTreeNodeRichFaces.class.isInstance(selectedTreeNodeObject)) { selectedPropertyNode = (LazyLoadingContentObjectPropertyTreeNodeRichFaces) selectedTreeNodeObject; } else if (TreeNodeImpl.class.isInstance(selectedTreeNodeObject)) { selectedPropertyNode = (LazyLoadingContentObjectPropertyTreeNodeRichFaces) selectedTreeNodeObject.getData(); } else throw new RuntimeException("Cannot determine the class of the selected tree node"); selectedBinaryChannel = selectedPropertyNode.getBinaryChannel(); //pageController.loadPageComponentInDynamicUIArea(DynamicUIAreaPageComponent.BINARY_CHANNEL_VIEWER.getDynamicUIAreaPageComponent()); } public String getLocalizedLabelForLocale(String localeName){ try{ if (StringUtils.isNotBlank(localeName)){ //In case locale is the same with localeSelector if (localeName.equals(localeSelector.getLocaleString())) return localeSelector.getLocale().getDisplayName(); else{ //Try to find its name from supported locales Iterator<Locale> locales = FacesContext.getCurrentInstance().getApplication().getSupportedLocales(); while ( locales.hasNext() ) { Locale locale = locales.next(); if (localeName.equals(locale.toString())) return locale.getDisplayName(); } } } return localeName; } catch(Exception e) { return localeName; } } public String processAccessRight(String personOrRoleAccessRight){ return Utils.retrieveDisplayNameForRoleOrPerson(identityStoreRunAsSystem, personOrRoleAccessRight); } public String getContentObjectTitle() { return contentObjectTitle; } public HtmlModalPanel getContentObjectViewerPanel() { return contentObjectViewerPanel; } public void setContentObjectViewerPanel(HtmlModalPanel contentObjectViewerPanel) { this.contentObjectViewerPanel = contentObjectViewerPanel; } public TreeNode getContentObjectAsTreeData() { return contentObjectAsTreeData; } public ContentObjectUIWrapper getSelectedContentObjectForView() { return selectedContentObjectForView; } public BinaryChannel getSelectedBinaryChannel() { return selectedBinaryChannel; } public void setContentService(ContentService contentService) { this.contentService = contentService; } public void setContentObjectUIWrapperFactory( ContentObjectUIWrapperFactory contentObjectUIWrapperFactory) { this.contentObjectUIWrapperFactory = contentObjectUIWrapperFactory; } public void setContentObjectList( ContentObjectList contentObjectList) { this.contentObjectList = contentObjectList; } public void setDefinitionService(DefinitionService definitionService) { this.definitionService = definitionService; } public void setPageController(PageController pageController) { this.pageController = pageController; } }