Ticket #33 (closed enhancement: fixed)

Opened 4 years ago

Last modified 21 months ago

Use a plugin mechanism for loading implementations methods and their forms

Reported by: dumoulin Owned by: dumoulin
Priority: normal Milestone: 1.0
Component: ui.graphical Version:
Severity: normal Keywords:
Cc:

Description

For instance, implementations and their forms are registered by a java class.

A simple solution : http://java.sun.com/developer/technicalArticles/javase/extensible/

Change History

Changed 4 years ago by dumoulin

  • component changed from ide.core to ide.methods

Changed 4 years ago by dumoulin

Now, forms are loaded by class name (by appending Panel), see PanelFactory

Changed 3 years ago by thierry

Use the META-INF/service infrastructure (see previous link for description) and the netbeans lookup mechanism For example to load the implementation of the plan method you only have to Lookup.getDefault().lookupAll(PlanMethod.class) see [1682] et [1683] commit

Changed 3 years ago by dumoulin

  • milestone set to 0.3

Changed 3 years ago by dumoulin

Changed 3 years ago by dumoulin

See:

But the problem is that for processors, they don't have a default constructor !

For Panel, a solution could be to have a lookup for EditorPanel, and add a method that return processors class thas this EditorPanel stands for. Yeah, it looks like mime-type.

Changed 2 years ago by dumoulin

  • owner set to dumoulin
  • status changed from new to assigned
  • component changed from ide.methods to gui
  • milestone changed from 0.3 to 1.0

OhOUI can be also a good candidate.

Changed 2 years ago by dumoulin

Lookup use implemented for Panels in r2651. But the lookup fails to load GroovyTaskPanel with the errors:

    [exec] WARNING [org.netbeans.ProxyClassLoader]: Will not load class org.simexplorer.core.workflow.methods.task.GroovyTaskPanel arbitrarily from one of org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@1455cf0 and ModuleCL@149f041[org.simexplorer.ide.ui] starting from SystemClassLoader[52 modules]; see http://wiki.netbeans.org/DevFaqModuleCCE                                                                                                                                
     [exec] WARNING [org.openide.util.lookup.MetaInfServicesLookup]                                                                                              
     [exec] java.lang.ClassNotFoundException: Will not load class org.simexplorer.core.workflow.methods.task.GroovyTaskPanel arbitrarily from one of org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@1455cf0 and ModuleCL@149f041[org.simexplorer.ide.ui] starting from SystemClassLoader[52 modules]; see http://wiki.netbeans.org/DevFaqModuleCCE                                                                                                                                       
     [exec]     at org.netbeans.ProxyClassLoader.loadClass(ProxyClassLoader.java:241)                                                                            
     [exec]     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)                                                                                         
     [exec]     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)                                                                                 
     [exec]     at java.lang.Class.forName0(Native Method)                                                                                                       
     [exec]     at java.lang.Class.forName(Class.java:247)                                                                                                       
     [exec]     at org.openide.util.lookup.MetaInfServicesLookup.search(MetaInfServicesLookup.java:270)                                                          
     [exec]     at org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(MetaInfServicesLookup.java:126)                                                    
     [exec]     at org.openide.util.lookup.AbstractLookup$R.beforeLookup(AbstractLookup.java:1124)                                                               
     [exec]     at org.openide.util.lookup.ProxyLookup$R.myBeforeLookup(ProxyLookup.java:663)                                                                    
     [exec]     at org.openide.util.lookup.ProxyLookup$R.computeResult(ProxyLookup.java:517)                                                                     
     [exec]     at org.openide.util.lookup.ProxyLookup$R.allInstances(ProxyLookup.java:488)                                                                      
     [exec]     at org.openide.util.Lookup.lookupAll(Lookup.java:260)                                                                                            
     [exec]     at org.simexplorer.ide.ui.PanelFactory.<clinit>(PanelFactory.java:38)                                                                            
     [exec]     at org.simexplorer.ide.ui.processoreditor.TaskEditorTopComponent.resultChanged(TaskEditorTopComponent.java:138)                                  
     [exec]     at org.openide.util.lookup.ProxyLookup$1Notify.run(ProxyLookup.java:173)                                                                         
     [exec]     at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:179)                                                                          
     [exec]     at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:119)                                                                          
     [exec]     at org.openide.explorer.DefaultEMLookup.updateLookups(DefaultEMLookup.java:131)                                                                  
     [exec]     at org.openide.explorer.DefaultEMLookup.propertyChange(DefaultEMLookup.java:163)                                                                 
     [exec]     at org.openide.util.WeakListenerImpl$PropertyChange.propertyChange(WeakListenerImpl.java:188)                                                    
     [exec]     at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)                                                           
     [exec]     at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)                                                           
     [exec]     at org.openide.explorer.ExplorerManager$2.run(ExplorerManager.java:865)                                                                          
     [exec]     at org.openide.util.Mutex.doEvent(Mutex.java:1335)                                                                                               
     [exec]     at org.openide.util.Mutex.readAccess(Mutex.java:345)                                                                                             
     [exec]     at org.openide.explorer.ExplorerManager.fireInAWT(ExplorerManager.java:862)                                                                      
     [exec]     at org.openide.explorer.ExplorerManager$1AtomicSetSelectedNodes.fire(ExplorerManager.java:282)                                                   
     [exec]     at org.openide.explorer.ExplorerManager.setSelectedNodes(ExplorerManager.java:293)                                                               
     [exec]     at org.simexplorer.ide.ui.applicationexplorer.ApplicationsTopComponent.setApplication(ApplicationsTopComponent.java:53)                          
     [exec]     at org.simexplorer.ide.ui.actions.NewApplicationAction.actionPerformed(NewApplicationAction.java:54)                                             
     [exec]     at org.openide.awt.AlwaysEnabledAction$1.run(AlwaysEnabledAction.java:139)                                                                       
     [exec]     at org.netbeans.modules.openide.util.ActionsBridge.implPerformAction(ActionsBridge.java:83)                                                      
     [exec]     at org.netbeans.modules.openide.util.ActionsBridge.doPerformAction(ActionsBridge.java:67)                                                        
     [exec]     at org.openide.awt.AlwaysEnabledAction.actionPerformed(AlwaysEnabledAction.java:142)                                                             
     [exec]     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)                                                                      
     [exec]     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)                                                                  
     [exec]     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)                                                               
     [exec]     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)                                                                        
     [exec]     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)                                                        
     [exec]     at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)                                                                      
     [exec]     at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)                                                                      
     [exec]     at java.awt.Component.processMouseEvent(Component.java:6263)                                                                                     
     [exec]     at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)                                                                                
     [exec]     at java.awt.Component.processEvent(Component.java:6028)                                                                                          
     [exec]     at java.awt.Container.processEvent(Container.java:2041)                                                                                          
     [exec]     at java.awt.Component.dispatchEventImpl(Component.java:4630)                                                                                     
     [exec]     at java.awt.Container.dispatchEventImpl(Container.java:2099)                                                                                     
     [exec]     at java.awt.Component.dispatchEvent(Component.java:4460)                                                                                         
     [exec]     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)                                                                        
     [exec]     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)                                                                         
     [exec]     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)                                                                             
     [exec]     at java.awt.Container.dispatchEventImpl(Container.java:2085)                                                                                     
     [exec]     at java.awt.Window.dispatchEventImpl(Window.java:2475)                                                                                           
     [exec]     at java.awt.Component.dispatchEvent(Component.java:4460)                                                                                         
     [exec]     at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)                                                                                        
     [exec]     at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:125)                                                                 
     [exec]     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)                                                             
     [exec]     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)                                                                
     [exec]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)                                                             
     [exec]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)                                                                         
     [exec]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)                                                                         
     [exec] [catch] at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)                                                                            

Changed 2 years ago by dumoulin

The last error is only a warning but because of the exception brings a popup. It and can be disabled in logging configuration as the warning is also reported (without exception) by ProxyLookup logger.

Another annoying error looks like:

     [exec] java.lang.IllegalStateException: Duplicate pair in treePair1: java.lang.Object pair2: org.simexplorer.core.workflow.implementation.plan.QuantitativeDomain index1: 45 index2: 45 item1: null item2: org.simexplorer.core.workflow.implementation.plan.QuantitativeDomain@62e8c8 id1: 6f97cf id2: 57a184               
     [exec]                                                                                                                                                      
     [exec]     at org.openide.util.lookup.ALPairComparator.compare(ALPairComparator.java:80)                                                                    
     [exec]     at org.openide.util.lookup.ALPairComparator.compare(ALPairComparator.java:51)                                                                    
     [exec]     at java.util.TreeMap.put(TreeMap.java:530)                                                                                                       
     [exec]     at java.util.TreeSet.add(TreeSet.java:238)                                                                                                       
     [exec]     at org.openide.util.lookup.AbstractLookup.getPairsAsLHS(AbstractLookup.java:323)                                                                 
     [exec]     at org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(MetaInfServicesLookup.java:131)                                                    
     [exec]     at org.openide.util.lookup.AbstractLookup.lookupItem(AbstractLookup.java:418)                                                                    
     [exec]     at org.openide.util.lookup.AbstractLookup.lookup(AbstractLookup.java:412)                                                                        
     [exec]     at org.openide.util.lookup.ProxyLookup.lookup(ProxyLookup.java:205)                                                                              
     [exec]     at org.openide.LifecycleManager.getDefault(LifecycleManager.java:67)                                                                             
     [exec]     at org.netbeans.core.windows.view.ui.MainWindow$4.windowClosing(MainWindow.java:399)                                                             
     [exec]     at java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:332)                                                                      
     [exec]     at java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:332)                                                                      
     [exec]     at java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:332)                                                                      
     [exec]     at java.awt.Window.processWindowEvent(Window.java:1862)                                                                                          
     [exec]     at javax.swing.JFrame.processWindowEvent(JFrame.java:279)                                                                                        
     [exec]     at java.awt.Window.processEvent(Window.java:1820)                                                                                                
     [exec]     at java.awt.Component.dispatchEventImpl(Component.java:4630)                                                                                     
     [exec]     at java.awt.Container.dispatchEventImpl(Container.java:2099)                                                                                     
     [exec]     at java.awt.Window.dispatchEventImpl(Window.java:2475)                                                                                           
     [exec]     at java.awt.Component.dispatchEvent(Component.java:4460)                                                                                         
     [exec]     at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)                                                                                        
     [exec]     at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:125)                                                                 
     [exec]     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)                                                             
     [exec]     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)                                                                
     [exec]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)                                                             
     [exec]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)                                                                         
     [exec]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)                                                                         
     [exec] [catch] at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)                                                                            

For this last reason, all editors except groovy will disable in Meta-inf service file, as we keep the old discovering method.

Changed 22 months ago by dumoulin

This ticket has been referenced in ticket #227:

...K for LHS.

LHS editor is found by using classname and appending "Panel", see #33

Changed 21 months ago by dumoulin

  • status changed from assigned to closed
  • resolution set to fixed

Seems to be OK with r3454. We use @ServiceProvider in netbeans module for specifying EditorPanel implementations.

Note: See TracTickets for help on using tickets.

logo cemagref

logo iscpif

logo lifegrid

logo region auvergne

logo patres project