[kepler-dev] CloneNotSupportedException
Christopher Brooks
cxh at eecs.berkeley.edu
Tue Apr 19 19:25:43 PDT 2005
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
--------
More information about the Kepler-dev
mailing list