/*
* (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library 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.
*
* Contributors:
* <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*
* $Id: UIDirectorySelectItems.java 29556 2008-01-23 00:59:39Z jcarsique $
*/
package org.nuxeo.ecm.platform.ui.web.directory;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;
import org.nuxeo.common.utils.i18n.I18NUtils;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.platform.ui.web.component.UISelectItems;
/**
* Component that deals with a list of select items from a directory.
*
* @author <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*/
public class UIDirectorySelectItems extends UISelectItems {
public static final String COMPONENT_TYPE = UIDirectorySelectItems.class.getName();
protected enum DirPropertyKeys {
directoryName, keySeparator, itemOrdering, allValues,
//
displayAll, displayObsoleteEntries, filter, localize, dbl10n;
}
// setters & getters
public Long getItemOrdering() {
return (Long) getStateHelper().eval(DirPropertyKeys.itemOrdering);
}
public void setItemOrdering(Long itemOrdering) {
getStateHelper().put(DirPropertyKeys.itemOrdering, itemOrdering);
}
public String getKeySeparator() {
return (String) getStateHelper().eval(DirPropertyKeys.keySeparator, "/");
}
public void setKeySeparator(String keySeparator) {
getStateHelper().put(DirPropertyKeys.keySeparator, keySeparator);
}
public String getDirectoryName() {
return (String) getStateHelper().eval(DirPropertyKeys.directoryName);
}
public void setDirectoryName(String directoryName) {
getStateHelper().put(DirPropertyKeys.directoryName, directoryName);
}
public SelectItem[] getAllValues() {
return (SelectItem[]) getStateHelper().eval(DirPropertyKeys.allValues);
}
public void setAllValues(SelectItem[] allValues) {
getStateHelper().put(DirPropertyKeys.allValues, allValues);
}
@SuppressWarnings("boxing")
public boolean isDisplayAll() {
return (Boolean) getStateHelper().eval(DirPropertyKeys.displayAll,
Boolean.TRUE);
}
@SuppressWarnings("boxing")
public void setDisplayAll(boolean displayAll) {
getStateHelper().put(DirPropertyKeys.displayAll, displayAll);
}
@SuppressWarnings("boxing")
public boolean isDisplayObsoleteEntries() {
return (Boolean) getStateHelper().eval(
DirPropertyKeys.displayObsoleteEntries, Boolean.FALSE);
}
@SuppressWarnings("boxing")
public void setDisplayObsoleteEntries(boolean displayObsoleteEntries) {
getStateHelper().put(DirPropertyKeys.displayObsoleteEntries,
displayObsoleteEntries);
}
public String getFilter() {
return (String) getStateHelper().eval(DirPropertyKeys.filter);
}
public void setFilter(String filter) {
getStateHelper().put(DirPropertyKeys.filter, filter);
}
@SuppressWarnings("boxing")
public boolean isLocalize() {
return (Boolean) getStateHelper().eval(DirPropertyKeys.localize,
Boolean.FALSE);
}
@SuppressWarnings("boxing")
public void setLocalize(boolean localize) {
getStateHelper().put(DirPropertyKeys.localize, localize);
}
@SuppressWarnings("boxing")
public boolean isdbl10n() {
return (Boolean) getStateHelper().eval(DirPropertyKeys.dbl10n,
Boolean.FALSE);
}
@SuppressWarnings("boxing")
public void setdbl10n(boolean dbl10n) {
getStateHelper().put(DirPropertyKeys.dbl10n, dbl10n);
}
@Override
public Object getValue() {
DirectorySelectItemsFactory f = new DirectorySelectItemsFactory() {
@Override
protected String getVar() {
return UIDirectorySelectItems.this.getVar();
}
@Override
protected DirectorySelectItem createSelectItem(String label,
Long ordering) {
return UIDirectorySelectItems.this.createSelectItem(label,
ordering);
}
@Override
protected String getDirectoryName() {
return UIDirectorySelectItems.this.getDirectoryName();
}
@Override
protected boolean isDisplayObsoleteEntries() {
return UIDirectorySelectItems.this.isDisplayObsoleteEntries();
}
@Override
protected String getFilter() {
return UIDirectorySelectItems.this.getFilter();
}
@Override
protected String retrieveSelectEntryId() {
return UIDirectorySelectItems.this.retrieveSelectEntryId();
}
@Override
protected Object retrieveItemLabel() {
return UIDirectorySelectItems.this.getItemLabel();
}
@Override
protected String retrieveLabelFromEntry(DocumentModel directoryEntry) {
return UIDirectorySelectItems.this.retrieveLabelFromEntry(directoryEntry);
}
@Override
protected Long retrieveOrderingFromEntry(
DocumentModel directoryEntry) {
return UIDirectorySelectItems.this.retrieveOrderingFromEntry(directoryEntry);
}
};
List<DirectorySelectItem> items;
if (isDisplayAll()) {
items = f.createAllDirectorySelectItems();
} else {
Object value = getStateHelper().eval(PropertyKeys.value);
items = f.createDirectorySelectItems(value);
}
String ordering = getOrdering();
boolean caseSensitive = isCaseSensitive();
if (!StringUtils.isBlank(ordering)) {
Collections.sort(items, new DirectorySelectItemComparator(ordering,
Boolean.valueOf(caseSensitive)));
}
DirectorySelectItem[] res = items.toArray(new DirectorySelectItem[0]);
if (isDisplayAll()) {
setAllValues(res);
}
return res;
}
protected DirectorySelectItem createSelectItem(String label, Long ordering) {
if (!isItemRendered()) {
return null;
}
Object valueObject = getItemValue();
String value = valueObject == null ? null : valueObject.toString();
if (isDisplayIdAndLabel() && label != null) {
label = value + getDisplayIdAndLabelSeparator() + label;
}
// make sure label is never blank
if (StringUtils.isBlank(label)) {
label = value;
}
String labelPrefix = getItemLabelPrefix();
if (!StringUtils.isBlank(labelPrefix)) {
label = labelPrefix + getItemLabelPrefixSeparator() + label;
}
String labelSuffix = getItemLabelSuffix();
if (!StringUtils.isBlank(labelSuffix)) {
label = label + getItemLabelSuffixSeparator() + labelSuffix;
}
return new DirectorySelectItem(value, label, ordering == null ? 0L
: ordering.longValue(), isItemDisabled(), isItemEscaped());
}
protected String retrieveSelectEntryId() {
// assume option id and vocabulary entry id will match
Object itemValue = getItemValue();
String id = itemValue != null ? itemValue.toString() : null;
String keySeparator = getKeySeparator();
if (!StringUtils.isBlank(keySeparator)) {
String[] split = id.split(keySeparator);
return split[split.length - 1];
}
return id;
}
protected String retrieveLabelFromEntry(DocumentModel docEntry) {
if (docEntry == null) {
return null;
}
String schema = docEntry.getSchemas()[0];
// compute label
Object labelObject = getItemLabel();
String label = labelObject != null ? labelObject.toString() : null;
FacesContext ctx = FacesContext.getCurrentInstance();
Locale locale = ctx.getViewRoot().getLocale();
if (StringUtils.isBlank(label)) {
if (isLocalize() && isdbl10n()) {
// lookup label property, hardcode the "label_" prefix for
// now
String defaultPattern = "label_en";
String pattern = "label_" + locale.getLanguage();
if (docEntry.getProperties(schema).containsKey(pattern)) {
label = (String) docEntry.getProperties(schema).get(pattern);
} else {
label = (String) docEntry.getProperties(schema).get(
defaultPattern);
}
} else {
label = (String) docEntry.getProperties(schema).get("label");
if (isLocalize()) {
label = translate(ctx, locale, label);
}
}
} else if (isLocalize()) {
label = translate(ctx, locale, label);
}
return label;
}
protected Long retrieveOrderingFromEntry(DocumentModel docEntry) {
Long ordering = getItemOrdering();
if (ordering != null) {
return ordering;
}
// fallback on default ordering key
if (docEntry == null) {
return null;
}
String schema = docEntry.getSchemas()[0];
try {
ordering = (Long) docEntry.getProperties(schema).get("ordering");
} catch (ClassCastException e) {
// nevermind
}
return ordering;
}
protected String translate(FacesContext context, Locale locale, String label) {
if (StringUtils.isBlank(label)) {
return label;
}
String bundleName = context.getApplication().getMessageBundle();
label = I18NUtils.getMessageString(bundleName, label, null, locale);
return label;
}
}