/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic 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.
*
* FenixEdu Academic 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 FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created on Apr 18, 2005
*/
package org.fenixedu.academic.servlet.taglib;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.struts.Globals;
import org.apache.struts.taglib.TagUtils;
import org.apache.struts.util.LabelValueBean;
import org.apache.struts.util.MessageResources;
public class EnumTagLib extends BodyTagSupport {
private String id;
private String enumeration;
private String locale = Globals.LOCALE_KEY;
private String bundle;
private String excludedFields;
private String includedFields;
protected static MessageResources messages = MessageResources
.getMessageResources("org.apache.struts.taglib.bean.LocalStrings");
@Override
public int doStartTag() throws JspException {
Collection<LabelValueBean> labelValueBeans = getLabelValues();
pageContext.getRequest().setAttribute(id, labelValueBeans);
return super.doStartTag();
}
public void setBundle(String bundle) {
this.bundle = bundle;
}
public void setEnumeration(String enumeration) {
this.enumeration = enumeration;
}
@Override
public void setId(String id) {
this.id = id;
}
public void setLocale(String locale) {
this.locale = locale;
}
public void setExcludedFields(String excludedFields) {
this.excludedFields = excludedFields;
}
public void setIncludedFields(String includedFields) {
this.includedFields = includedFields;
}
public Collection<LabelValueBean> getLabelValues() {
return getLabelValuesLookup();
}
public Collection<LabelValueBean> getLabelValuesLookup() {
try {
Class clazz = Class.forName(this.enumeration);
if (!clazz.isEnum()) {
throw new IllegalArgumentException("Expected an enum type, got: " + this.enumeration);
}
if (this.excludedFields != null && this.includedFields != null) {
throw new IllegalArgumentException("includedFields and excludedFields are both not empty");
}
final Method method = clazz.getMethod("values", (Class[]) null);
final Object[] objects = (Object[]) method.invoke(clazz, (Object[]) null);
final Collection<LabelValueBean> labelValueBeans = new ArrayList<LabelValueBean>(objects.length);
final Set<String> excludedFieldsNames = new HashSet();
fillSetWithSplittedString(excludedFieldsNames, this.excludedFields);
final Set<String> includedFieldsNames = new HashSet();
fillSetWithSplittedString(includedFieldsNames, this.includedFields);
for (Object object : objects) {
String value = object.toString();
if ((!excludedFieldsNames.isEmpty() && !excludedFieldsNames.contains(value))
|| (!includedFieldsNames.isEmpty() && includedFieldsNames.contains(value))
|| (includedFieldsNames.isEmpty() && excludedFieldsNames.isEmpty())) {
String message = getMessage(clazz, value);
labelValueBeans.add(new LabelValueBean(message, value));
}
}
return labelValueBeans;
} catch (Exception e) {
throw new IllegalArgumentException("Expected an enum type, got: " + this.enumeration);
}
}
private String getMessage(Class clazz, String key) throws JspException {
String message = null;
message = getMessageFromBundle(clazz.getName() + "." + key);
if (message == null) {
message = getMessageFromBundle(clazz.getSimpleName() + "." + key);
}
if (message == null) {
message = getMessageFromBundle(key);
}
return (message != null) ? message : key;
}
private String getMessageFromBundle(String key) throws JspException {
return (TagUtils.getInstance().present(this.pageContext, this.bundle, this.locale, key)) ? TagUtils.getInstance()
.message(this.pageContext, this.bundle, this.locale, key) : null;
}
private void fillSetWithSplittedString(final Set<String> fieldsNamesSet, String fieldNamesString) {
if (fieldNamesString != null && fieldNamesString.length() > 0) {
String[] fieldsNamesArray = fieldNamesString.split(",");
for (String fieldName : fieldsNamesArray) {
fieldsNamesSet.add(fieldName.trim());
}
}
}
}