You are viewing a plain text version of this content. The canonical link for it is here.
Posted to taglibs-dev@jakarta.apache.org by Richard Bondi <rb...@gmail.com> on 2006/03/14 18:31:30 UTC

Convert scoped attributes to scripting variables?

Dear All,

This email has a summary, background, and code.

Summary:
***********
1. How can I turn a scoped attribute (defined in a c:set or c:if tag) into a
scripting variable? I need to pass it into a tiles:put tag.
2. Where is there a definition of "scoped attribute"?

Background
**************
Java limits the size of bytecode bytes in a try{} to 64K. I have a page with
a huge form that keeps growing beyond that. It's five years old, and too
complicated for me to understand given my deadline (using
spring/hibernate/struts/ajax/i8n/spaghetti code), so I just need to break
out chunks of it into either servlet methods and/or separate servlets.
Furthermore, everything is inside a large logic:iterate loop liberally
sprinkled with c: and c-rt: tags.

My plan is to move chunks into tiles using code like this:

<tiles:insert page="tile1.jsp">
  <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
  <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
  ...
</tiles>

(tile1.jsp contains a tiles:useAttribute tag that plucks the named bean out
of the context specified in beanScope.)

This works just fine for old tags like logic:iterate.

For c: tags, it fails. There are plenty of variables defined with c:if that
I need to pass to the tile.

But I can't: because those variables are "scoped attributes". As best I can
tell, a scoped attribute is (1) a name/value pair that c: tags can pass
along to each other as long as they use them in their attributes, (2) that
cannot be accessed from scripting variables, and (3) are not kept in the
same context objects that Beans are, so eg pageContext.findAttributes() can'
get at them.

Code:
******
Take the struts-blank webapp that comes with struts, and add the relevant
tags. Then use these jsps and class:

Wecome.jsp:
<%@ page import=" aspen.Pebble" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c-rt" uri=" http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="fmt" uri=" http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql " %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri=" http://jakarta.apache.org/struts/tags-bean" prefix="bean"
%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"
%>

<html:html locale="true">
  <head>
    <title><bean:message key="welcome.title"/></title>
    <html:base/>
  </head>

  <body bgcolor="white">

  <%
    ArrayList pebbles = new ArrayList();
    pebbles.add( new Pebble( "one" ) );
    pebbles.add( new Pebble( "two" ) );
    pebbles.add( new Pebble( "three" ) );

  %>

    <logic:iterate id="pebble" collection="<%=pebbles%>" type=" aspen.Pebble
">

    <%--<bean:define id="pebble" name="pebble" type="aspen.Pebble"/>--%>
    <tiles:insert page="tile.jsp" flush="false">
      <tiles:put name="pebble" beanName="pebble" beanScope="page"/>
    </tiles:insert>
    <li>From jsp: <%=pebble%></li>

  </logic:iterate>

  </body>
</html:html>

tile.jsp:
********
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<tiles:useAttribute name="pebble" classname="aspen.Pebble"/>
<h1>I came from a tile: <%=pebble%></h1>

Pebble class:
***************
package aspen;

import java.io.Serializable;

public class Pebble implements Serializable {
  private String owner = "";

  public Pebble( String owner ) {
    this.owner = owner;
  }

  public String getOwner() {
    return owner;
  }

  public void setOwner( String owner ) {
    this.owner = owner;
  }

  public String toString() {
    return owner;
  }
}

Thanks much,
/r:b:

--
************************************************
Richard Bondi
33 Royal Ave #3
Cambridge, MA 02138-1301
Email: rbondi at gmail.com
Phone: (617) 938-9562
************************************************

Re: Convert scoped attributes to scripting variables?

Posted by Martin Cooper <ma...@apache.org>.
On 3/14/06, Richard Bondi <rb...@gmail.com> wrote:
>
> Thanks much! By the spec, do you mean "Java Server Pages Standard Tag
> Library 1.1" by Pierre DeLisle? Because there is no definition in there.


The Servlet spec. This isn't specific to JSP or JSTL.

Also, perhaps I'm misunderstanding you, but request.getAttribute() is not
> working. Here's my modified code:


Like I said, the default scope for <c:set>. Setting it in page scope and
then looking for it in request scope isn't going to work. Try setting it in
request scope in the first place.

--
Martin Cooper


  <%
>     ArrayList pebbles = new ArrayList();
>     pebbles.add( new Pebble( "one" ) );
>     pebbles.add( new Pebble( "two" ) );
>     pebbles.add( new Pebble( "three" ) );
>
>     Pebble rock = new Pebble("foo");
>   %>
>   <li>In jsp: <%=rock%></li> <!-- OK: comes back "foo" -->
>   <c:set var="pooh" value="${rock}" />
>   <% Pebble pooh = (Pebble) request.getAttribute( "pooh"); %>
>   <li>In jsp: <%=pooh%></li> <!-- Not OK: is null instead of "pooh" -->
>
>   <c:forEach var="pebble" items="${pebbles}" >
>   <%
>     rock = (Pebble) request.getAttribute( "pebble");
>   %>
>     <li>In jsp: <%=rock%></li> <!-- Not ok: is null instead of pooh -->
>
> Thanks for any further insight,
> /r:b:
>
>   </c:forEach>
>
> On 3/14/06, Martin Cooper <ma...@apache.org> wrote:
> >
> > On 3/14/06, Richard Bondi <rb...@gmail.com> wrote:
> > >
> > > Dear All,
> > >
> > > This email has a summary, background, and code.
> > >
> > > Summary:
> > > ***********
> > > 1. How can I turn a scoped attribute (defined in a c:set or c:if tag)
> > into
> > > a
> > > scripting variable? I need to pass it into a tiles:put tag.
> >
> >
> > A scoped attribute is just a plain old attribute, as in
> > request.getAttribute("foo"),
> > in one of page, request, session or application scope. That's all;
> nothing
> > magical. The default for <c:set> is page scope, which is why the values
> > aren't visible on other pages.
> >
> > 2. Where is there a definition of "scoped attribute"?
> >
> >
> > Um, in the spec, as you might expect...
> >
> > --
> > Martin Cooper
> >
> >
> > Background
> > > **************
> > > Java limits the size of bytecode bytes in a try{} to 64K. I have a
> page
> > > with
> > > a huge form that keeps growing beyond that. It's five years old, and
> too
> > > complicated for me to understand given my deadline (using
> > > spring/hibernate/struts/ajax/i8n/spaghetti code), so I just need to
> > break
> > > out chunks of it into either servlet methods and/or separate servlets.
> > > Furthermore, everything is inside a large logic:iterate loop liberally
> > > sprinkled with c: and c-rt: tags.
> > >
> > > My plan is to move chunks into tiles using code like this:
> > >
> > > <tiles:insert page="tile1.jsp">
> > >   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
> > >   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
> > >   ...
> > > </tiles>
> > >
> > > (tile1.jsp contains a tiles:useAttribute tag that plucks the named
> bean
> > > out
> > > of the context specified in beanScope.)
> > >
> > > This works just fine for old tags like logic:iterate.
> > >
> > > For c: tags, it fails. There are plenty of variables defined with c:if
> > > that
> > > I need to pass to the tile.
> > >
> > > But I can't: because those variables are "scoped attributes". As best
> I
> > > can
> > > tell, a scoped attribute is (1) a name/value pair that c: tags can
> pass
> > > along to each other as long as they use them in their attributes, (2)
> > that
> > > cannot be accessed from scripting variables, and (3) are not kept in
> the
> > > same context objects that Beans are, so eg pageContext.findAttributes
> ()
> > > can'
> > > get at them.
> > >
> > > Code:
> > > ******
> > > Take the struts-blank webapp that comes with struts, and add the
> > relevant
> > > tags. Then use these jsps and class:
> > >
> > > Wecome.jsp:
> > > <%@ page import=" aspen.Pebble" %>
> > > <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
> > > <%@ taglib prefix="c-rt" uri=" http://java.sun.com/jstl/core_rt" %>
> > > <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
> > > <%@ taglib prefix="fmt" uri=" http://java.sun.com/jsp/jstl/fmt" %>
> > > <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql " %>
> > > <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
> > > <%@ page import="java.util.ArrayList" %>
> > > <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
> > > <%@ taglib uri=" http://jakarta.apache.org/struts/tags-bean"
> > prefix="bean"
> > > %>
> > > <%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
> > prefix="html"
> > > %>
> > >
> > > <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic"
> > > prefix="logic"
> > > %>
> > >
> > > <html:html locale="true">
> > >   <head>
> > >     <title><bean:message key="welcome.title"/></title>
> > >     <html:base/>
> > >   </head>
> > >
> > >   <body bgcolor="white">
> > >
> > >   <%
> > >     ArrayList pebbles = new ArrayList();
> > >     pebbles.add( new Pebble( "one" ) );
> > >     pebbles.add( new Pebble( "two" ) );
> > >     pebbles.add( new Pebble( "three" ) );
> > >
> > >   %>
> > >
> > >     <logic:iterate id="pebble" collection="<%=pebbles%>" type="
> > > aspen.Pebble
> > > ">
> > >
> > >     <%--<bean:define id="pebble" name="pebble" type="aspen.Pebble
> "/>--%>
> > >     <tiles:insert page="tile.jsp" flush="false">
> > >       <tiles:put name="pebble" beanName="pebble" beanScope="page"/>
> > >     </tiles:insert>
> > >     <li>From jsp: <%=pebble%></li>
> > >
> > >   </logic:iterate>
> > >
> > >   </body>
> > > </html:html>
> > >
> > > tile.jsp:
> > > ********
> > > <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
> > > <tiles:useAttribute name="pebble" classname="aspen.Pebble"/>
> > > <h1>I came from a tile: <%=pebble%></h1>
> > >
> > > Pebble class:
> > > ***************
> > > package aspen;
> > >
> > > import java.io.Serializable;
> > >
> > > public class Pebble implements Serializable {
> > >   private String owner = "";
> > >
> > >   public Pebble( String owner ) {
> > >     this.owner = owner;
> > >   }
> > >
> > >   public String getOwner() {
> > >     return owner;
> > >   }
> > >
> > >   public void setOwner( String owner ) {
> > >     this.owner = owner;
> > >   }
> > >
> > >   public String toString() {
> > >     return owner;
> > >   }
> > > }
> > >
> > > Thanks much,
> > > /r:b:
> > >
> > > --
> > > ************************************************
> > > Richard Bondi
> > > 33 Royal Ave #3
> > > Cambridge, MA 02138-1301
> > > Email: rbondi at gmail.com
> > > Phone: (617) 938-9562
> > > ************************************************
> > >
> > >
> >
> >
>
>
> --
> ************************************************
> Richard Bondi
> 33 Royal Ave #3
> Cambridge, MA 02138-1301
> Email: rbondi at gmail.com
> Phone: (617) 938-9562
> ************************************************
>
>

Re: Convert scoped attributes to scripting variables?

Posted by Richard Bondi <rb...@gmail.com>.
Thanks much! By the spec, do you mean "Java Server Pages Standard Tag
Library 1.1" by Pierre DeLisle? Because there is no definition in there.

Also, perhaps I'm misunderstanding you, but request.getAttribute() is not
working. Here's my modified code:

  <%
    ArrayList pebbles = new ArrayList();
    pebbles.add( new Pebble( "one" ) );
    pebbles.add( new Pebble( "two" ) );
    pebbles.add( new Pebble( "three" ) );

    Pebble rock = new Pebble("foo");
  %>
  <li>In jsp: <%=rock%></li> <!-- OK: comes back "foo" -->
  <c:set var="pooh" value="${rock}" />
  <% Pebble pooh = (Pebble) request.getAttribute( "pooh"); %>
  <li>In jsp: <%=pooh%></li> <!-- Not OK: is null instead of "pooh" -->

  <c:forEach var="pebble" items="${pebbles}" >
  <%
    rock = (Pebble) request.getAttribute( "pebble");
  %>
    <li>In jsp: <%=rock%></li> <!-- Not ok: is null instead of pooh -->

Thanks for any further insight,
/r:b:

  </c:forEach>

On 3/14/06, Martin Cooper <ma...@apache.org> wrote:
>
> On 3/14/06, Richard Bondi <rb...@gmail.com> wrote:
> >
> > Dear All,
> >
> > This email has a summary, background, and code.
> >
> > Summary:
> > ***********
> > 1. How can I turn a scoped attribute (defined in a c:set or c:if tag)
> into
> > a
> > scripting variable? I need to pass it into a tiles:put tag.
>
>
> A scoped attribute is just a plain old attribute, as in
> request.getAttribute("foo"),
> in one of page, request, session or application scope. That's all; nothing
> magical. The default for <c:set> is page scope, which is why the values
> aren't visible on other pages.
>
> 2. Where is there a definition of "scoped attribute"?
>
>
> Um, in the spec, as you might expect...
>
> --
> Martin Cooper
>
>
> Background
> > **************
> > Java limits the size of bytecode bytes in a try{} to 64K. I have a page
> > with
> > a huge form that keeps growing beyond that. It's five years old, and too
> > complicated for me to understand given my deadline (using
> > spring/hibernate/struts/ajax/i8n/spaghetti code), so I just need to
> break
> > out chunks of it into either servlet methods and/or separate servlets.
> > Furthermore, everything is inside a large logic:iterate loop liberally
> > sprinkled with c: and c-rt: tags.
> >
> > My plan is to move chunks into tiles using code like this:
> >
> > <tiles:insert page="tile1.jsp">
> >   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
> >   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
> >   ...
> > </tiles>
> >
> > (tile1.jsp contains a tiles:useAttribute tag that plucks the named bean
> > out
> > of the context specified in beanScope.)
> >
> > This works just fine for old tags like logic:iterate.
> >
> > For c: tags, it fails. There are plenty of variables defined with c:if
> > that
> > I need to pass to the tile.
> >
> > But I can't: because those variables are "scoped attributes". As best I
> > can
> > tell, a scoped attribute is (1) a name/value pair that c: tags can pass
> > along to each other as long as they use them in their attributes, (2)
> that
> > cannot be accessed from scripting variables, and (3) are not kept in the
> > same context objects that Beans are, so eg pageContext.findAttributes()
> > can'
> > get at them.
> >
> > Code:
> > ******
> > Take the struts-blank webapp that comes with struts, and add the
> relevant
> > tags. Then use these jsps and class:
> >
> > Wecome.jsp:
> > <%@ page import=" aspen.Pebble" %>
> > <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
> > <%@ taglib prefix="c-rt" uri=" http://java.sun.com/jstl/core_rt" %>
> > <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
> > <%@ taglib prefix="fmt" uri=" http://java.sun.com/jsp/jstl/fmt" %>
> > <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql " %>
> > <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
> > <%@ page import="java.util.ArrayList" %>
> > <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
> > <%@ taglib uri=" http://jakarta.apache.org/struts/tags-bean"
> prefix="bean"
> > %>
> > <%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
> prefix="html"
> > %>
> >
> > <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic"
> > prefix="logic"
> > %>
> >
> > <html:html locale="true">
> >   <head>
> >     <title><bean:message key="welcome.title"/></title>
> >     <html:base/>
> >   </head>
> >
> >   <body bgcolor="white">
> >
> >   <%
> >     ArrayList pebbles = new ArrayList();
> >     pebbles.add( new Pebble( "one" ) );
> >     pebbles.add( new Pebble( "two" ) );
> >     pebbles.add( new Pebble( "three" ) );
> >
> >   %>
> >
> >     <logic:iterate id="pebble" collection="<%=pebbles%>" type="
> > aspen.Pebble
> > ">
> >
> >     <%--<bean:define id="pebble" name="pebble" type="aspen.Pebble"/>--%>
> >     <tiles:insert page="tile.jsp" flush="false">
> >       <tiles:put name="pebble" beanName="pebble" beanScope="page"/>
> >     </tiles:insert>
> >     <li>From jsp: <%=pebble%></li>
> >
> >   </logic:iterate>
> >
> >   </body>
> > </html:html>
> >
> > tile.jsp:
> > ********
> > <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
> > <tiles:useAttribute name="pebble" classname="aspen.Pebble"/>
> > <h1>I came from a tile: <%=pebble%></h1>
> >
> > Pebble class:
> > ***************
> > package aspen;
> >
> > import java.io.Serializable;
> >
> > public class Pebble implements Serializable {
> >   private String owner = "";
> >
> >   public Pebble( String owner ) {
> >     this.owner = owner;
> >   }
> >
> >   public String getOwner() {
> >     return owner;
> >   }
> >
> >   public void setOwner( String owner ) {
> >     this.owner = owner;
> >   }
> >
> >   public String toString() {
> >     return owner;
> >   }
> > }
> >
> > Thanks much,
> > /r:b:
> >
> > --
> > ************************************************
> > Richard Bondi
> > 33 Royal Ave #3
> > Cambridge, MA 02138-1301
> > Email: rbondi at gmail.com
> > Phone: (617) 938-9562
> > ************************************************
> >
> >
>
>


--
************************************************
Richard Bondi
33 Royal Ave #3
Cambridge, MA 02138-1301
Email: rbondi at gmail.com
Phone: (617) 938-9562
************************************************

Re: Convert scoped attributes to scripting variables?

Posted by Martin Cooper <ma...@apache.org>.
On 3/14/06, Richard Bondi <rb...@gmail.com> wrote:
>
> Dear All,
>
> This email has a summary, background, and code.
>
> Summary:
> ***********
> 1. How can I turn a scoped attribute (defined in a c:set or c:if tag) into
> a
> scripting variable? I need to pass it into a tiles:put tag.


A scoped attribute is just a plain old attribute, as in
request.getAttribute("foo"),
in one of page, request, session or application scope. That's all; nothing
magical. The default for <c:set> is page scope, which is why the values
aren't visible on other pages.

2. Where is there a definition of "scoped attribute"?


Um, in the spec, as you might expect...

--
Martin Cooper


Background
> **************
> Java limits the size of bytecode bytes in a try{} to 64K. I have a page
> with
> a huge form that keeps growing beyond that. It's five years old, and too
> complicated for me to understand given my deadline (using
> spring/hibernate/struts/ajax/i8n/spaghetti code), so I just need to break
> out chunks of it into either servlet methods and/or separate servlets.
> Furthermore, everything is inside a large logic:iterate loop liberally
> sprinkled with c: and c-rt: tags.
>
> My plan is to move chunks into tiles using code like this:
>
> <tiles:insert page="tile1.jsp">
>   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
>   <tiles:put name="somebean" beanName="somebean" beanScope="page"/>
>   ...
> </tiles>
>
> (tile1.jsp contains a tiles:useAttribute tag that plucks the named bean
> out
> of the context specified in beanScope.)
>
> This works just fine for old tags like logic:iterate.
>
> For c: tags, it fails. There are plenty of variables defined with c:if
> that
> I need to pass to the tile.
>
> But I can't: because those variables are "scoped attributes". As best I
> can
> tell, a scoped attribute is (1) a name/value pair that c: tags can pass
> along to each other as long as they use them in their attributes, (2) that
> cannot be accessed from scripting variables, and (3) are not kept in the
> same context objects that Beans are, so eg pageContext.findAttributes()
> can'
> get at them.
>
> Code:
> ******
> Take the struts-blank webapp that comes with struts, and add the relevant
> tags. Then use these jsps and class:
>
> Wecome.jsp:
> <%@ page import=" aspen.Pebble" %>
> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
> <%@ taglib prefix="c-rt" uri=" http://java.sun.com/jstl/core_rt" %>
> <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
> <%@ taglib prefix="fmt" uri=" http://java.sun.com/jsp/jstl/fmt" %>
> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql " %>
> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
> <%@ page import="java.util.ArrayList" %>
> <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
> <%@ taglib uri=" http://jakarta.apache.org/struts/tags-bean" prefix="bean"
> %>
> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"
> %>
>
> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic"
> prefix="logic"
> %>
>
> <html:html locale="true">
>   <head>
>     <title><bean:message key="welcome.title"/></title>
>     <html:base/>
>   </head>
>
>   <body bgcolor="white">
>
>   <%
>     ArrayList pebbles = new ArrayList();
>     pebbles.add( new Pebble( "one" ) );
>     pebbles.add( new Pebble( "two" ) );
>     pebbles.add( new Pebble( "three" ) );
>
>   %>
>
>     <logic:iterate id="pebble" collection="<%=pebbles%>" type="
> aspen.Pebble
> ">
>
>     <%--<bean:define id="pebble" name="pebble" type="aspen.Pebble"/>--%>
>     <tiles:insert page="tile.jsp" flush="false">
>       <tiles:put name="pebble" beanName="pebble" beanScope="page"/>
>     </tiles:insert>
>     <li>From jsp: <%=pebble%></li>
>
>   </logic:iterate>
>
>   </body>
> </html:html>
>
> tile.jsp:
> ********
> <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
> <tiles:useAttribute name="pebble" classname="aspen.Pebble"/>
> <h1>I came from a tile: <%=pebble%></h1>
>
> Pebble class:
> ***************
> package aspen;
>
> import java.io.Serializable;
>
> public class Pebble implements Serializable {
>   private String owner = "";
>
>   public Pebble( String owner ) {
>     this.owner = owner;
>   }
>
>   public String getOwner() {
>     return owner;
>   }
>
>   public void setOwner( String owner ) {
>     this.owner = owner;
>   }
>
>   public String toString() {
>     return owner;
>   }
> }
>
> Thanks much,
> /r:b:
>
> --
> ************************************************
> Richard Bondi
> 33 Royal Ave #3
> Cambridge, MA 02138-1301
> Email: rbondi at gmail.com
> Phone: (617) 938-9562
> ************************************************
>
>