[kepler-dev] CloneNotSupportedException

Stephen Neuendorffer stephen.neuendorffer at xilinx.com
Wed Apr 20 09:10:29 PDT 2005


I believe there is some reasonable name-mangling done here... so you could name the
port "some input port" and name the field for that port "some_input_port"...  The
only major
disadvantage of this is that you can't effectively change "readable" description....
But I
would argue you shouldn't do that anyway... :)

Other tools, e.g., Simulink, do have a separate 'human readable description', which
personally
I find confusing. The difficulty is that if I am browsing an actor description, there
is no easily provided way
to get from the description back to the real name.

Steve

Chad Berkley wrote:

> Hi Christopher,
>
> Thanks for the detailed response.  I'm all for strong naming conventions
> within the java code, but I don't think that the java variable name
> needs to be exposed to users as the constructor passed port name is.  I
> think a user would much rather see the label "some input port" than
> "someInputPort".  Although I have no problem with that naming scheme, a
> large portion of our userbase are not programmers and are used to seeing
> standard windows or mac dialog boxes which would never have a camelCaps
> label name.  I know the passed port name is also the moml name, so maybe
> a solution to this problem is to add another constructor with a extra
> field for a plain english description or a boolean flag allowing it to
> skip the name checking.  I'm not sure how much work that would be and we
> would still have to change a lot of our actor code, so that's probably
> more trouble than its worth.
>
> I haven't looked at the cloning code, but I'm wondering why variable
> name and port name need to be the same for cloning via reflection to
> work.  Will cloning via this method only work if the port name and
> variable name are the same or is it just a convenience matter?
>
> thanks,
> 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
>
> ----------------------------------------------------------------------------
> 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