[kepler-dev] CloneNotSupportedException
Chad Berkley
berkley at nceas.ucsb.edu
Wed Apr 20 09:17:07 PDT 2005
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
org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEngine.java:426)
[java] at
org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEngine.java:442)
[java] at
org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEngine.java:442)
[java] at
org.ecoinformatics.seek.sms.AnnotationEngine.buildDefaultActorLibrary(AnnotationEngine.java:377)
[java] at
org.kepler.gui.TabbedLibraryPane.<init>(TabbedLibraryPane.java:108)
[java] at
org.kepler.gui.TabbedLibraryPane$Factory.createLibraryPane(TabbedLibraryPane.java:268)
[java] at
org.kepler.gui.LibraryPaneFactory.createLibraryPane(LibraryPaneFactory.java:121)
[java] at
ptolemy.vergil.basic.BasicGraphFrame.<init>(BasicGraphFrame.java:351)
[java] at
ptolemy.vergil.basic.ExtendedGraphFrame.<init>(ExtendedGraphFrame.java:98)
[java] at
ptolemy.vergil.actor.ActorGraphFrame.<init>(ActorGraphFrame.java:122)
[java] at
ptolemy.vergil.actor.ActorGraphTableau.<init>(ActorGraphTableau.java:103)
[java] at
ptolemy.vergil.actor.ActorGraphTableau$Factory.createTableau(ActorGraphTableau.java:159)
[java] at
ptolemy.actor.gui.PtolemyTableauFactory.createTableau(PtolemyTableauFactory.java:101)
[java] at
ptolemy.actor.gui.TableauFactory.createTableau(TableauFactory.java:123)
[java] at
ptolemy.actor.gui.Configuration.createPrimaryTableau(Configuration.java:202)
[java] at
ptolemy.actor.gui.TableauFrame$1.actionPerformed(TableauFrame.java:369)
[java] at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
[java] at
javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
[java] at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
[java] at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
[java] at
javax.swing.AbstractButton.doClick(AbstractButton.java:289)
[java] at
javax.swing.AbstractButton.doClick(AbstractButton.java:269)
[java] at
javax.swing.plaf.basic.BasicMenuUI$MenuKeyHandler.menuKeyPressed(BasicMenuUI.java:589)
[java] at
javax.swing.JMenuItem.fireMenuKeyPressed(JMenuItem.java:608)
[java] at
javax.swing.JMenuItem.processMenuKeyEvent(JMenuItem.java:499) [java]
at javax.swing.JMenuItem.processKeyEvent(JMenuItem.java:458)
[java] at
javax.swing.MenuSelectionManager.processKeyEvent(MenuSelectionManager.java:417)
[java] at
javax.swing.plaf.basic.BasicPopupMenuUI$MenuKeyboardHelper.keyPressed(BasicPopupMenuUI.java:1057)
[java] at java.awt.Component.processKeyEvent(Component.java:5058)
[java] at
javax.swing.JComponent.processKeyEvent(JComponent.java:2388)
[java] at java.awt.Component.processEvent(Component.java:4909)
[java] at java.awt.Container.processEvent(Container.java:1569)
[java] at
java.awt.Component.dispatchEventImpl(Component.java:3615)
[java] at
java.awt.Container.dispatchEventImpl(Container.java:1627)
[java] at java.awt.Component.dispatchEvent(Component.java:3477)
[java] at
java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1713)
[java] at
java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:627)
[java] at
java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:831)
[java] at
java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:741)
[java] at
java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:592)
[java] at
java.awt.Component.dispatchEventImpl(Component.java:3506)
[java] at
java.awt.Container.dispatchEventImpl(Container.java:1627)
[java] at java.awt.Window.dispatchEventImpl(Window.java:1606)
[java] at java.awt.Component.dispatchEvent(Component.java:3477)
[java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
[java] at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
[java] at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
[java] at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
[java] at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
[java] at
java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
[java] Caused by: ptolemy.kernel.util.IllegalActionException:
Could not find a port named 'startTrigger' or 'startTriggerPort'. This
can occur when the name of the variable does not match the name passed
to the constructor of the actor.
[java] Right:
[java] startTrigger = new TypedIOPort(this, "startTrigger",
true, false);
[java] Right:
[java] startTrigger = new TypedIOPort(this,
"startTriggerPort", true, false);
[java] Wrong:
[java] startTrigger = new TypedIOPort(this, "foo", true, false);
[java] in .configuration.actor library.Web Service
[java] at ptolemy.kernel.Entity.clone(Entity.java:199)
[java] ... 52 more
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 :)
chad
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(AnnotationEngin
> e.java:426)
> [java] at
> org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEngin
> e.java:442)
> [java] at
> org.ecoinformatics.seek.sms.AnnotationEngine.buildTreeModel(AnnotationEngin
> e.java:442)
> [java] at
> org.ecoinformatics.seek.sms.AnnotationEngine.buildDefaultActorLibrary(Annot
> ationEngine.java:377)
> [java] at
> org.kepler.gui.TabbedLibraryPane.<init>(TabbedLibraryPane.java:108)
> [java] at
> org.kepler.gui.TabbedLibraryPane$Factory.createLibraryPane(TabbedLibraryPan
> e.java:268)
> [java] at
> org.kepler.gui.LibraryPaneFactory.createLibraryPane(LibraryPaneFactory.java
> :121)
> [java] at
> ptolemy.vergil.basic.BasicGraphFrame.<init>(BasicGraphFrame.java:351)
> [java] at
> ptolemy.vergil.basic.ExtendedGraphFrame.<init>(ExtendedGraphFrame.java:98)
> [java] at
> ptolemy.vergil.actor.ActorGraphFrame.<init>(ActorGraphFrame.java:122)
> [java] at
> ptolemy.vergil.actor.ActorGraphTableau.<init>(ActorGraphTableau.java:103)
> [java] at
> ptolemy.vergil.actor.ActorGraphTableau$Factory.createTableau(ActorGraphTabl
> eau.java:159)
> [java] at
> ptolemy.actor.gui.PtolemyTableauFactory.createTableau(PtolemyTableauFactory
> .java:101)
> [java] at
> ptolemy.actor.gui.TableauFactory.createTableau(TableauFactory.java:123)
> [java] at
> ptolemy.actor.gui.Configuration.createPrimaryTableau(Configuration.java:202
> )
> [java] at
> ptolemy.actor.gui.TableauFrame$1.actionPerformed(TableauFrame.java:369)
> [java] at
> javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
> [java] at
> javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButt
> on.java:1839)
> [java] at
> javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:
> 420)
> [java] at
> javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
> [java] at
> javax.swing.AbstractButton.doClick(AbstractButton.java:289)
> [java] at
> javax.swing.AbstractButton.doClick(AbstractButton.java:269)
> [java] at
> javax.swing.plaf.basic.BasicMenuUI$MenuKeyHandler.menuKeyPressed(BasicMenuU
> I.java:589)
> [java] at
> javax.swing.JMenuItem.fireMenuKeyPressed(JMenuItem.java:608)
> [java] at
> javax.swing.JMenuItem.processMenuKeyEvent(JMenuItem.java:499) [java]
> at javax.swing.JMenuItem.processKeyEvent(JMenuItem.java:458)
> [java] at
> javax.swing.MenuSelectionManager.processKeyEvent(MenuSelectionManager.java:
> 417)
> [java] at
> javax.swing.plaf.basic.BasicPopupMenuUI$MenuKeyboardHelper.keyPressed(Basic
> PopupMenuUI.java:1057)
> [java] at java.awt.Component.processKeyEvent(Component.java:5058)
> [java] at
> javax.swing.JComponent.processKeyEvent(JComponent.java:2388)
> [java] at java.awt.Component.processEvent(Component.java:4909)
> [java] at java.awt.Container.processEvent(Container.java:1569)
> [java] at
> java.awt.Component.dispatchEventImpl(Component.java:3615)
> [java] at
> java.awt.Container.dispatchEventImpl(Container.java:1627)
> [java] at java.awt.Component.dispatchEvent(Component.java:3477)
> [java] at
> java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:171
> 3)
> [java] at
> java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusM
> anager.java:627)
> [java] at
> java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFoc
> usManager.java:831)
> [java] at
> java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFoc
> usManager.java:741)
> [java] at
> java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusMana
> ger.java:592)
> [java] at
> java.awt.Component.dispatchEventImpl(Component.java:3506)
> [java] at
> java.awt.Container.dispatchEventImpl(Container.java:1627)
> [java] at java.awt.Window.dispatchEventImpl(Window.java:1606)
> [java] at java.awt.Component.dispatchEvent(Component.java:3477)
> [java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
> [java] at
> java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.j
> ava:201)
> [java] at
> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.jav
> a:151)
> [java] at
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
> [java] at
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
> [java] at
> java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
> [java] Caused by: ptolemy.kernel.util.IllegalActionException:
> Could not find a port named 'outputLog' or 'outputLogPort'. This can
> occur when the name of the variable does not match the name passed to
> the constructor of the actor.
> [java] Right:
> [java] outputLog = new TypedIOPort(this, "outputLog", true,
> false);
> [java] Right:
> [java] outputLog = new TypedIOPort(this, "outputLogPort",
> true, false); [java] Wrong:
> [java] outputLog = new TypedIOPort(this, "foo", true, false);
> [java] in .configuration.actor library.Wmsd Actor
> [java] at ptolemy.kernel.Entity.clone(Entity.java:199)
> [java] ... 52 more
>
>
> ---------------------------------------------------------------------------
> -
> Posted to the ptolemy-hackers mailing list. Please send administrative
> mail for this list to: ptolemy-hackers-request at ptolemy.eecs.berkeley.edu
> --------
>
> ----------------------------------------------------------------------------
> Posted to the ptolemy-hackers mailing list. Please send administrative
> mail for this list to: ptolemy-hackers-request at ptolemy.eecs.berkeley.edu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: WebService.java
Type: text/x-java
Size: 56898 bytes
Desc: not available
URL: <http://mercury.nceas.ucsb.edu/kepler/pipermail/kepler-dev/attachments/20050420/f920bb40/attachment.bin>
More information about the Kepler-dev
mailing list