I am developing a tag, see tag example below. This tag should produce a json
object using the elements into the value stack.

I need to know how to repeat the execution of the content in this case
<jsongl:jsonproperty/> , also every execution need to push a new item into
the valuestack.

So I develop the tag using Component#start() and Component#end() methods,
the tag work but it isn't iterate the list of elements, and only produce
this output with the last element:

"array3": ["m2"]

correct output:

"array3": ["m1","m2"]

tag example:
                <jsongl:jsonarray name="machines" items="%{machine}">
                        <jsongl:jsonproperty value="%{code}"/>
                </jsongl:jsonarray>

source code:
==================
//start
public boolean start(Writer writer) {
        LOG.debug("starting");
        boolean result = super.start(writer);

        try{         
            if (mItemsPropertySet) {
                coerceItemsToIterator();
                
                // An items property has been set - if there's anything in
it, then iterate over the items
                if (iterator != null && iterator.hasNext()){
                    iterateOverItems();
                }      
            } else {
                // No collection, so just process the body which should add
items to the array
                // Writer passed here is used to prevent any body content
being written to output stream
                
            }
        } catch (JspException e){
            // Just rethrow if we got a JspException - it's probably from a
nested tag - no new
            // info for us to add here.
            LOG.error("Just rethrow if we got a JspException - it's probably
from a nested tag");
        } catch (Exception e){
            LOG.error("Unable to create JSON array");
        }

        LOG.debug("finish");
        return result;
    }

// end method
public boolean end(Writer writer, String body) {
        LOG.debug("starting");
        
        boolean result = false; 
        ValueStack stack = getStack();
        
        if (iterator != null) {
            stack.pop();
        }

        if (iterator != null && iterator.hasNext()) {
            Object currentItem = iterator.next();
            stack.push(currentItem);
            
            LOG.debug("repeat with next element on array body");
            return true;            
        } //else {
            try {
                LOG.debug("Adding a new Json array object to parent
JsonObject");
                
                // Pop the array jsonEntity off of the stack
                this.getEntityStack().pop();
                
                // add the child array object to the parent jsonObject
                this.getCurrentEntity().add(jsonEntity.getWrappedObject(),
this.name);
            } catch (JSONException e) {
                LOG.error("Unable to create JSON array object", e);
                // TODO: handle exception
            }
//        }

// helper method
    private void iterateOverItems() throws JspException, IOException {
        ValueStack valueStack = getStack();
        
        // Iterator over 'items' collection
        while (iterator.hasNext()){
            Object currentItem = iterator.next();
            
            valueStack.push(currentItem);
            
            LOG.debug("item: " + currentItem);
        }
    }

-- 
View this message in context: 
http://www.nabble.com/Problem-developing-a-tag-using-Struts-2-Arch-for-Tags-tf4939292.html#a14138771
Sent from the Struts - User mailing list archive at Nabble.com.


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

Reply via email to