I still don't know the framework very well to report the bug, if opportune, someone more expert than me might open it.
I'll use your workaround.
Thanks for your support.

Kind regards


Il 12/01/2013 22:59, Chris Pratt ha scritto:
Looking through the code and the exception.  This appears to be a bug.  It
appears that OGNL is mistaking the TreeMap.Values Collection as a
java.util.Set, when it attempts to coerce it in ognl.SetPropertyAccessor,
you get the noted exception.  This should probably be reported as a bug,
but one workaround would be to change your PersonService code like this:

     static public Collection<Person> getPeople(){
         logger.debug(people.values());
         logger.debug(people.values().getClass().toString());
         return new ArrayList<>(people.values());
     }

   (*Chris*)


On Sat, Jan 12, 2013 at 1:22 PM, Chris Pratt <thechrispr...@gmail.com>wrote:

You're right Dave, somehow I replied to the wrong email.  Looking over the
code now.
   (*Chris*)


On Sat, Jan 12, 2013 at 1:08 PM, Dave Newton <davelnew...@gmail.com>wrote:

(Isn't it around where the iterator tag is in that source? I thought
that *was* the OP's code this second barf of source.)

Dave


On Sat, Jan 12, 2013 at 4:04 PM, Chris Pratt <thechrispr...@gmail.com>
wrote:
You said in your original post that you used the <s:iterator> tag,
correct?  Can I see how you used it?
   (*Chris*)


On Sat, Jan 12, 2013 at 3:06 AM, fusillator <fusilla...@gmail.com>
wrote:
Sorry for my misunderstanding, I changed the code of the wiki tutorial
about wildcard

These is the view:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/**DTD/xhtml1-transitional.dtd<
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
">
<html xmlns="http://www.w3.org/1999/**xhtml <
http://www.w3.org/1999/xhtml>
">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>List of people</title>
</head>
<body>
<h3>List of persons:</h3>
<s:if test="people.isEmpty">
<ol>
<s:iterator value="people">
<li>
<s:property value="firstName" /> <s:property value="lastName" />
<s:url action="removePerson" var="urlremove"><s:param name="code"
value="id" /></s:url>
<s:url action="editPerson" var="urledit"><s:param name="code"
value="id"
/></s:url>
<s:a href="%{urledit}">Edit</s:a>
<s:a href="%{urlremove}">Remove</s:**a>
</li>
</s:iterator>
</ol>
</s:if>
<s:else>
No person inserted
</s:else>
<s:url action="editPerson" var="urlnew" />
<s:a href="%{urlnew}">Insert a new person</s:a>
</body>
</html>

and this is the action class:

package org.apache.struts.tutorial.**wildcard.action;

import java.util.Collection;
//import java.util.List;
import org.apache.struts.tutorial.**wildcard.service.**PersonService;
import org.apache.struts.tutorial.**wildcard.model.Person;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.**ActionSupport;

public class PersonAction extends ActionSupport {

     private static final long serialVersionUID = 1L;

     private static final Logger logger =
Logger.getLogger(PersonAction.**
class.getName());

     private Collection<Person> people=PersonService.**getPeople();
     private int code=-1; //parametro passato da view
     private Person personBean;
     private PersonService personService=new PersonService();

     @Override
     public String execute(){
         return SUCCESS;
     }

     public String edit(){
         setPersonBean(personService.**getPerson(code));
         return INPUT;
     }

     public String save(){
         personService.savePerson(**getPersonBean());
         return SUCCESS;
     }

     public String remove(){
         personService.removePerson(**code);
         return SUCCESS;
     }

     public Collection<Person> getPeople() {
         return people;
     }

     public void setPeople(Collection<Person> people) {
         this.people = people;
     }

     public int getCode() {
         return code;
     }

     public void setCode(int code) {
         this.code = code;
     }

     public Person getPersonBean() {
         return personBean;
     }

     public void setPersonBean(Person personBean) {
         this.personBean = personBean;
     }

}

and my modified PersonService class:

package org.apache.struts.tutorial.**wildcard.service;

//import java.util.ArrayList;
import java.util.Collection;
//import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.log4j.Logger;
import org.apache.struts.tutorial.**wildcard.model.Person;

public class PersonService {

     private static final Logger logger = Logger.getLogger(**
PersonService.class.getName())**;

     //static private List<Person> peopleList=new ArrayList<Person>();
     static private SortedMap<Integer,Person> people=new
TreeMap<Integer,Person>();
     static {
         people.put(new Integer(1), new
Person(1,"Paolino","Paperino")**);
         people.put(new Integer(2), new Person(2,"Paperon","De
Paperoni"));
         people.put(new Integer(3), new Person(3,"Archimede","**
Pitagorica"));
         //generateList();
     }
     /*
     static void generateList(){
         peopleList.clear();
         for (Integer i : people.keySet()){
             peopleList.add(people.get(i));
         }
     }
     */
     static public Collection<Person> getPeople(){
         logger.debug(people.values());
         logger.debug(people.values().**getClass().toString());
         return people.values();
     }

     public Person getPerson(int code){
         if (code<0)
             return new Person(-1,"","");
         else
             return people.get(new Integer(code));
     }

     public void savePerson(Person person){
         logger.debug(person);
         if (person.getId()>=0){
             people.put(new Integer(person.getId()),**person);
         } else {
             int id = people.isEmpty() ? 1 :
people.lastKey().intValue()+1;
             person.setId(id);
             people.put(new Integer(id),person);
         }
         //generateList();
     }

     public void removePerson(int code){
         people.remove(new Integer(code));
         //generateList();
     }

}


The mapping definitions are:

<action name="*Person" class="org.apache.struts.**
tutorial.wildcard.action.**PersonAction" method="{1}">
             <result name="success">/view.jsp</**result>
             <result name="input">/input.jsp</**result>
</action>

The model Person is a pojo with 3 attributes: firstName, lastName, id

thanks for the support

Il 12/01/2013 11:50, Umesh Awasthi ha scritto:

  I believe what *Chris* has asked is to copy the code from your JSP
page
i believe you must be using <s:iterator> tag in your JSP page to
iterate
some list
so please copy that code from your JSP and provide here



On Sat, Jan 12, 2013 at 4:16 PM, fusillator <fusilla...@gmail.com>
wrote:
  Hi Chris, not really sure how to find that code... Anyway this has
been
my
steps:
$ for lib in /opt/struts-2.3.7/lib/* ; do jar tvf $lib | grep tld &&
echo
$lib; done
    3349 Wed Aug 10 12:51:32 CEST 2005
META-INF/sitemesh-decorator.****
tld
    3013 Sat May 15 11:55:14 CEST 2004 META-INF/sitemesh-page.tld
/opt/struts-2.3.7/lib/****sitemesh-2.4.2.jar
346038 Tue Nov 06 08:13:06 CET 2012 META-INF/struts-tags.tld
/opt/struts-2.3.7/lib/struts2-****core-2.3.7.jar
136496 Tue Nov 06 08:24:22 CET 2012 META-INF/struts-dojo-tags.tld
/opt/struts-2.3.7/lib/struts2-****dojo-plugin-2.3.7.jar
     752 Tue Nov 06 08:27:06 CET 2012 META-INF/tags/JsonPlugin.tld
/opt/struts-2.3.7/lib/struts2-****json-plugin-2.3.7.jar
       0 Tue May 13 21:39:54 CEST 2008 META-INF/tld/
   27808 Tue May 13 21:39:54 CEST 2008 META-INF/tld/tiles-jsp.tld
/opt/struts-2.3.7/lib/tiles-****jsp-2.0.6.jar

$ jar xvf /opt/struts-2.3.7/lib/struts2-****core-2.3.7.jar
META-INF/struts-tags.tld
   \decompresso: META-INF/struts-tags.tld

$ grep -n "<name>iterator</name>" META-INF/struts-tags.tld
4881:    <name>iterator</name>

and the tag definition in the tld file is:

<tag>
      <description><![CDATA[Iterate over a iterable
value]]></description>
      <name>iterator</name>

<tag-class>org.apache.struts2.****views.jsp.IteratorTag</tag-****class>
      <body-content>JSP</body-****content>
      <!-- here a lot of not interesting attributes-->
</tag>

$ find src -name IteratorTag.java
src/core/src/main/java/org/****apache/struts2/views/jsp/****
IteratorTag.java

$ cat src/core/src/main/java/org/****apache/struts2/views/jsp/**
IteratorTag.java
/*
   * $Id: IteratorTag.java 741179 2009-02-05 16:55:14Z musachy $
   *
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *  http://www.apache.org/****licenses/LICENSE-2.0<
http://www.apache.org/**licenses/LICENSE-2.0>
<http://**www.apache.org/licenses/**LICENSE-2.0<
http://www.apache.org/licenses/LICENSE-2.0>
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */

package org.apache.struts2.views.jsp;

import javax.servlet.http.****HttpServletRequest;
import javax.servlet.http.****HttpServletResponse;
import javax.servlet.jsp.****JspException;

import org.apache.struts2.components.****Component;
import org.apache.struts2.components.****IteratorComponent;

import com.opensymphony.xwork2.util.****ValueStack;

/**
   * @see IteratorComponent
   */
public class IteratorTag extends ContextBeanTag {

      private static final long serialVersionUID =
-1827978135193581901L;
      protected String statusAttr;
      protected String value;
      protected String begin;
      protected String end;
      protected String step;

      public Component getBean(ValueStack stack, HttpServletRequest
req,
HttpServletResponse res) {
          return new IteratorComponent(stack);
      }

      protected void populateParams() {
          super.populateParams();

          IteratorComponent tag = (IteratorComponent) getComponent();
          tag.setStatus(statusAttr);
          tag.setValue(value);
          tag.setBegin(begin);
          tag.setEnd(end);
          tag.setStep(step);
      }

      public void setStatus(String status) {
          this.statusAttr = status;
      }

      public void setValue(String value) {
          this.value = value;
      }

      public void setBegin(String begin) {
          this.begin = begin;
      }

      public void setEnd(String end) {
          this.end = end;
      }

      public void setStep(String step) {
          this.step = step;
      }

      public int doEndTag() throws JspException {
          component = null;
          return EVAL_PAGE;
      }

      public int doAfterBody() throws JspException {
          boolean again = component.end(pageContext.****getOut(),
getBody());

          if (again) {
              return EVAL_BODY_AGAIN;
          } else {
              if (bodyContent != null) {
                  try {
bodyContent.writeOut(****bodyContent.****getEnclosingWriter());
                  } catch (Exception e) {
                      throw new JspException(e.getMessage());
                  }
              }
              return SKIP_BODY;
          }
      }

}

Thanks a lot for your help.





Il 11/01/2013 20:21, Chris Pratt ha scritto:

  Can you cut and paste your <s:iterator> code into the email so we
can
see?
     (*Chris*)


On Fri, Jan 11, 2013 at 11:12 AM, fusillator <fusilla...@gmail.com>
wrote:

   Hi all, I'm new to struts2/java matters, so be sympathetic please.

I've a question about <s:iterator> tag

I recently used it to loop on a Iterable collection of type
java.util.TreeMap$Values retrieved by the method
java.util.TreeMap.values()

getting the following cast exception:

2013-01-11 18:45:00,520 DEBUG org.apache.struts.tutorial.**
wildcard.service.******PersonService.getPeople:33 [Person [1:
Paolino
Paperino], Person [2: Paperon De Paperoni], Person [3: Archimede
Pitagorica]]
2013-01-11 18:45:00,523 DEBUG org.apache.struts.tutorial.**
wildcard.service.******PersonService.getPeople:34 class
java.util.TreeMap$Values
2013-01-11 18:45:00,523 DEBUG org.apache.struts.tutorial.**
wildcard.service.******PersonService.getPeople:34 class
java.util.TreeMap$Values
gen 11, 2013 6:45:01 PM org.apache.jasper.compiler.*****
*TldLocationsCache
tldScanJar
WARNING: Caught an exception while evaluating expression
'people.isEmpty'
against value stack
java.lang.ClassCastException: java.util.TreeMap$Values cannot be
cast
to
java.util.Set
           at ognl.SetPropertyAccessor.******getProperty(**
SetPropertyAccessor.java:47)
           at com.opensymphony.xwork2.ognl.******accessor.**
XWorkCollectionPropertyAccesso******r.getProperty(**
XWorkCollectionPropertyAccesso******r.java:93)
           at
ognl.OgnlRuntime.getProperty(******OgnlRuntime.java:2300)
The used variable is reported by log4j.
Is there any restriction on the iterator tags?
Could someone suggest me a tutorial/howto about ognl/value stack?

Best regards




------------------------------******--------------------------**--**
--**---------
To unsubscribe, e-mail: user-unsubscribe@struts.****apac**he.org<
http://apache.org**>
<user-unsubscribe@**struts.**apache.org <http://struts.apache.org
<
user-unsubscribe@**struts.apache.org<
user-unsubscr...@struts.apache.org>
For additional commands, e-mail: user-h...@struts.apache.org



  ------------------------------****----------------------------**
--**---------
To unsubscribe, e-mail: user-unsubscribe@struts.**apac**he.org<
http://apache.org>
<user-unsubscribe@**struts.apache.org<
user-unsubscr...@struts.apache.org>
For additional commands, e-mail: user-h...@struts.apache.org




------------------------------**------------------------------**---------
To unsubscribe, e-mail: user-unsubscribe@struts.**apache.org<
user-unsubscr...@struts.apache.org>
For additional commands, e-mail: user-h...@struts.apache.org




--
e: davelnew...@gmail.com
m: 908-380-8699
s: davelnewton_skype
t: @dave_newton
b: Bucky Bits
g: davelnewton
so: Dave Newton

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to