I've been experimenting with Jelly Swing recently after finding Groovy
Swing problematic, trying to see whether it will make GUI prototyping
faster.  I may have missed it, but I couldn't find a tag in any of the
tag libraries to access a static class field.  There's invokeStatic
for invoking static methods.  For the project I'm working on, I
wrote a GetStaticTag that works like this:

 <v:getStatic var="closeOperation" className="javax.swing.JFrame"
              field="EXIT_ON_CLOSE"/>

That allowed me to then do:

 <frame title="Tree Frame" var="frame" size="400,400"
        defaultCloseOperation="${closeOperation}">
   ...
 </frame>

I think it's pretty important to be able to access static fields
and that a getStatic (or some other name) tag would be useful to have
in the core tag library.  If I convert my GetStaticTag class code to
the style convention used in the Jelly source and add a Jelly test
for it, is it all right for me to add it to the source tree?  I've
appended the simple class at the end of this message.  I guess the
question is a two-parter:
  1. Does the Jelly core tag library need a getStatic tag to complement
     getStatic?

     [ ] +1 Yes, it's generally useful.
     [ ] -1 No, it's easy for someone who needs it to make their own tag.

  2. May I commit code for the tag to the repository assuming I convert
     it to the proper style and provide a Jelly test?

     [ ] +1 Go right ahead, we can tweak the code after it's committed.
     [ ] -1 No, we need to agree on what to call the tag, you should
            try more than one class loader in doTag, some other reason ...

daniel

package org.savarese.vserv.jelly;

import org.apache.commons.jelly.*;

public class GetStaticTag extends TagSupport {

  private String __var;
  private String __field;
  private String __className;

  public void setVar(String var) {
    __var = var;
  }

  public void setField(String field) {
    __field = field;
  }

  public void setClassName(String className) {
    __className = className;
  }

  public void doTag(XMLOutput output) throws JellyTagException {
    String message = null;

    if(__var == null)
      message = "var";
    else if(__field == null)
      message = "field";
    else if(__className == null)
      message = "className";

    if(message != null)
      throw new MissingAttributeException(message);

    try {
      Class type     = getClass().getClassLoader().loadClass(__className);
      Object result  = type.getField(__field).get(null);
      JellyContext context = getContext();

      context.setVariable(__var, result);

    } catch(Throwable t) {
      throw new JellyTagException("Could not access " + __className + "." +
                                  __var + ".  Original exception message: " +
                                  t.getMessage(), t);
    }
  }

}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to