001: package com.technoetic.xplanner.tags;
002:
003: import java.io.IOException;
004: import java.util.ResourceBundle;
005: import javax.servlet.jsp.JspException;
006: import javax.servlet.jsp.JspWriter;
007:
008: import org.apache.commons.beanutils.PropertyUtils;
009: import org.apache.struts.taglib.html.SelectTag;
010: import org.apache.struts.util.RequestUtils;
011:
012: import com.technoetic.xplanner.domain.CharacterEnum;
013:
014: public class CharacterEnumSelectTag extends SelectTag {
015: public static final String EDIT_MODE = "edit";
016: public static final String VIEW_MODE = "view";
017: private String mode;
018: private String enumProperty;
019: private Object object;
020: private String objectName;
021: private ResourceBundle resourceBundle;
022: private String resourceType;
023:
024: public int doStartTag() throws JspException {
025: resourceBundle = ResourceBundle.getBundle("ResourceBundle");
026: if (EDIT_MODE.equals(mode)) {
027: return super .doStartTag();
028: } else {
029: renderHtmlText();
030: return EVAL_BODY_BUFFERED;
031: }
032: }
033:
034: public int doEndTag() throws JspException {
035: try {
036: if (EDIT_MODE.equals(mode)) {
037: JspWriter out = pageContext.getOut();
038: CharacterEnum[] enums = getEnumObject().listEnums();
039: for (int i = 0; i < enums.length; i++) {
040: CharacterEnum enumm = enums[i];
041: out.println(renderSelectOptionElement(enumm));
042: }
043: out.println("</select>");
044: }
045: } catch (IOException e) {
046: throw new JspException(e);
047: }
048: return EVAL_PAGE;
049: }
050:
051: private void renderHtmlText() throws JspException {
052: try {
053: JspWriter out = pageContext.getOut();
054: CharacterEnum e = getEnumObject();
055: out.write(resourceBundle.getString(e.getNameKey()));
056: } catch (IOException e) {
057: throw new JspException(e);
058: }
059: }
060:
061: private String renderSelectOptionElement(CharacterEnum anEnum) {
062: StringBuffer sb = new StringBuffer();
063: sb.append("<option ");
064: sb.append("value='").append(anEnum.getCode()).append("'");
065: if (this
066: .isMatched(new String(String.valueOf(anEnum.getCode())))) {
067: sb.append(" selected='selected'");
068: }
069: sb.append(">");
070: sb.append(resourceBundle.getString(anEnum.getNameKey()));
071: sb.append("</option>");
072: return sb.toString();
073: }
074:
075: private CharacterEnum getEnumObject() throws JspException {
076: Object resource = getResource();
077: try {
078: return (CharacterEnum) PropertyUtils.getProperty(resource,
079: enumProperty);
080: } catch (Exception e) {
081: throw new JspException(e);
082: }
083: }
084:
085: private Object getResource() throws JspException {
086: Object resource = object;
087: if (object instanceof String) {
088: resource = pageContext.findAttribute((String) object);
089: }
090: if (resource == null && name != null) {
091: resource = RequestUtils.lookup(pageContext, objectName,
092: enumProperty, null);
093: }
094: if (resource == null) {
095: resource = pageContext.findAttribute("project");
096: }
097: if (resource == null && resourceType == null) {
098: throw new JspException(
099: "object or resource type/id must be specified");
100: }
101: return resource;
102: }
103:
104: public void setMode(String mode) {
105: this .mode = mode;
106: }
107:
108: public void setEnumProperty(String enumProperty) {
109: this .enumProperty = enumProperty;
110: }
111:
112: public void setObjectName(String objectName) {
113: this .objectName = objectName;
114: }
115:
116: public void setObject(Object object) {
117: this .object = object;
118: }
119:
120: public void setName(String name) {
121: this .name = name;
122: }
123:
124: public void setResourceType(String resourceType) {
125: this.resourceType = resourceType;
126: }
127: }
|