[kepler-dev] CloneNotSupportedException

Christopher Brooks cxh at eecs.berkeley.edu
Wed Apr 20 10:37:14 PDT 2005


Hi Chad,

Ptolemy hackers has a limit of 40k for messages, and your last message
was over that limit (sorry).  I truncated your message in my response
below. 

Chad writes:

> Hey Christopher,
> 
> I forgot to address the problem of the actors with ports that actually 
> do follow the naming convention.  I've attached a class that is an 
> example of this.  Here's the port definition:
> 
> startTrigger = new TypedIOPort(this, "startTrigger", true, false);
> 
> and here's the stack trace:
> 
> [java] java.lang.CloneNotSupportedException: Problem cloning 
> 'startTrigger'     [java]     at 
> ptolemy.kernel.Entity.clone(Entity.java:224)
>       [java]     at 
> ptolemy.kernel.ComponentEntity.clone(ComponentEntity.java:125)
>       [java]     at ptolemy.actor.AtomicActor.clone(AtomicActor.java:121)
>       [java]     at 


The problem is in the constructor, where you create startTrigger:

     startTrigger = new TypedIOPort(this, "startTrigger", true, false);
     new Attribute(startTrigger, "_showName");
     startTrigger.setContainer(null);

If I remove the setContainer(null) line, then startTrigger is properly
cloned.  I think setting setContainer(null) on a port basically removes
it from the hierarchy, which causes no end of problems for clone,
since then startTrigger is not found.  The error message is wrong
though.

I created a test for this in kernel/Entity.tcl.
I'll see if I can come up with a better error message.

We have group lunch today, we'll talk over the clone issue and
get back to you.

> The only test I have for showing this error is to start up kepler and 
> open a new graph editor and watch the errors scroll by :)

ptolemy/configs/test/allConfigs.tcl has tests that clone all the
actors.


> chad
> 

_Christopher

> Christopher Brooks wrote:
> > Hi Chad,
> > The naming convention for ports is that the name of the port
> > is the name of the java field.
> > 
> > There are a couple of reasons for this:
> > 1) It means that many actors do not need their own clone(Workspace) method.
> > We found that most developers had a hard time properly implementing
> > the clone(Workspace) method so we modified Entity.clone(Workspace) 
> > so that it uses reflection to properly clone the ports.
> > 
> > Entity has had this sort of cloning since at least 2001.
> > 
> > What did change was that in October, 2004, I modified 
> > Entity.clone(Workspace) so that it handles misnamed ports in a 
> > cleaner fashion.  That should have triggered new Exceptions
> > being thrown though.
> > 
> > BTW - $PTII/ptolemy/configs/test/allConfigs.tcl includes tests that
> > check port names and check cloning to ensure that the proper type
> > constraints are cloned when necessary.  These tests run
> > on the configuration.
> > 
> > 
> > 2) I believe that the copernicus code generator might require
> > that the names of ports and parameters should match the names
> > of the variables.  See section 7.2 of Volume 2 of the Ptolemy Design
> > doc:
> > 
> >   In order for existing actor code to be leveraged by the code
> >   generator, it assumes that the code is written according to the
> >   Ptolemy style for writing actors. This style assumes naming
> >   conventions for the public fields of an actor class that refer to
> >   parameters and ports of the actor. The code generator also assumes
> >   that the ports and parameters of an actor are created in the class
> >   constructor and not modified later. Some actors do not fit these
> >   constraints and cannot be used directly in the code generator.  Such
> >   actor classes cannot be used directly by the code generator,
> >   although in some cases we have been able to have the code generator
> >   deal specially with such actors. In other cases, the actor class
> >   fits the constraints but cannot be effectively specialized using
> >   generic techniques. Such actors can also be dealt with specially by
> >   the code generator to more effectively generate code.
> > 
> > 3) I prefer strong naming conventions because I'm constantly looking
> > at other people's code and I don't like stumbling for the mapping
> > between the "a nice descriptive port name" and the name of the
> > variable.  
> > 
> > 
> > It sounds like there is a bug if the name of the Port that is set in
> > the constructor is the same as the name of the field and the exception
> > is being thrown.  
> > 
> > Do you have a test case I can take a look at?  Perhaps the port
> > is not public?
> > 
> > One issue is that you probably have lots of actors with "a nice
> > descriptive port name" as names.  Are these ports of these actors
> > properly being cloned?  Maybe you should run the tests in
> > ptolemy/configs/tests/allConfigs.tcl on you configuration and see what
> > comes up.
> > 
> > It would be nice to provide some sort of compatibility functionality
> > that would support your "a nice descriptive port name" ports and avoid
> > the exception.  We could check for a property or something here.
> > 
> > Let me know what you think.
> > 
> > _Christopher
> > 
> > 
> > --------
> > 
> >     Hi,
> >     
> >     Lately, we've been compiling kepler with the CVS version of PTII instead 
> >     of release 4.0.1.  We've started seeing errors (see bottom of email) 
> >     with a lot of our actors saying that a port cannot be cloned because the 
> >     variable name does not match the port name passed to the constructor. 
> >     I'm wondering why this suddenly started happening and why this should be 
> >     illegal behavior to begin with.  It seems reasonable to me to have a 
> >     declaration like
> >     
> >     TypedIOPort inputPort = new TypedIOPort(this, "a nice descriptive port 
> >     name", true, false);
> >     
> >     The error message seems to strictly forbid this.  On top of this, 
> >     sometimes the variable name *does* match the constructor name and it 
> >     still throws this exception.
> >     
> >     My questions are: Does anyone know why this suddenly started happening 
> >     and why is this a problem in the first place?  Is there anyway to fix 
> >     this, short of changing the variable names in all of our actors?
> >     
> >     thanks,
> >     chad
> >     
> >     java.lang.CloneNotSupportedException: Problem cloning 'outputLog'
> >           [java]     at ptolemy.kernel.Entity.clone(Entity.java:224)
> >           [java]     at 
> >     ptolemy.kernel.ComponentEntity.clone(ComponentEntity.java:125)
> >           [java]     at ptolemy.actor.AtomicActor.clone(AtomicActor.java:121)
> >           [java]     at 
> >     org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEng

> public class WebService
>     extends TypedAtomicActor {
> 
>   /** Construct a WebService actor with the given container and name.
>    *  @param container The container.
>    *  @param name The name of this actor.
>    *  @exception IllegalActionException If the actor cannot be contained
>    *   by the proposed container.
>    *  @exception NameDuplicationException If the container already has an
>    *   actor with this name.
>    */
>   public WebService(CompositeEntity container, String name) throws
>       NameDuplicationException, IllegalActionException {
> 
>     super(container, name);
> 
>     wsdlUrl = new StringParameter(this, "wsdlUrl");
>     //    wsdlUrl.setExpression("http://xml.nig.ac.jp/wsdl/DDBJ.wsdl");
>     methodName = new StringParameter(this, "methodName");
>     userName = new StringParameter(this, "userName");
>     password = new StringParameter(this, "password");
> 
>     startTrigger = new TypedIOPort(this, "startTrigger", true, false);
>     new Attribute(startTrigger, "_showName");
>     startTrigger.setContainer(null);
>     // Set the trigger Flag.
>     hasTrigger = new Parameter(this, "hasTrigger", new BooleanToken(false));
>     hasTrigger.setTypeEquals(BaseType.BOOLEAN);
> 
>     clientExecErrors = new TypedIOPort(this, "clientExecErrors", false, true);
>     clientExecErrors.setTypeEquals(BaseType.STRING);
>     
>     _attachText("_iconDescription",
>                 "<svg>\n"
>                 + "<rect x=\"0\" y=\"0\" "
>                 + "width=\"60\" height=\"30\" "
>                 + "style=\"fill:white\"/>\n"
>                 + "</svg>\n");
>   }
> 
>   ///////////////////////////////////////////////////////////////////
>   ////                     ports and parameters                  ////
> 
>   /** 
>    * @entity.description The parameter for the URL of the web service WSDL.
>    */
>   public StringParameter wsdlUrl;
>   /**
>    * @entity.description The parameter for the method name.
>    */
>   public StringParameter methodName;
>   /** 
>    * @entity.description The userName to invoke the web service if necessary.
>    */
>   public StringParameter userName;
>   /** 
>    * @entity.description The password to invoke the web service if necessary.
>    */
>   public StringParameter password;
>   /**
>    * @entity.description This is an parameter to activate the optional 
>    *  startTrigger port. <I>Please activate it <i>ONLY</I> when the actor 
>    *  has no input and it is required for scheduling of the actor.
>    */
>   public Parameter hasTrigger;
>   /**
>    * @entity.description This is an optional input port that can be used to 
>    * help the scheduling of the actor. 
>    * 
>    * <P>This port is activated by the hasTrigger parameter. Double-click on 
>    * the actor to enable. <I>Please enable it <i>ONLY</I> when the actor has 
>    * no input and it is required for scheduling of the actor.
>    */
>   public TypedIOPort startTrigger;
>   /**
>    * @entity.description It outputs the errors if any occured when actor is 
>    *    executing. It outputs "NO ERRORS." if there are no exceptional cases.
>    *     
>    */
>   public TypedIOPort clientExecErrors;

Christopher Brooks (cxh at eecs berkeley edu) University of California
Programmer/Analyst Chess/Ptolemy/Trust        US Mail: 558 Cory Hall #1770
ph: 510.643.9841 fax:510.642.2739	      Berkeley, CA 94720-1770
home: (F-Tu) 707.665.0131 (W-F) 510.655.5480  (office: 400A Cory)



More information about the Kepler-dev mailing list