[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