Hello,

Let's say I want to write some UI to edit some complicated configuration split into multiple entities in multiple maven modules. The UI needs to have one entry point though. So:

Let's create the UI based on TabbedPanel. Each of the tabs will be provided by different maven modules by the means of factories:

 > public interface JukeboxConfigPanelFactory extends Ordered {
        public IModel<String> getPanelTitle();

        public Panel getPanel( String id, IModel<Jukebox> jukeboxModel );
}



Provided that I have a list of all panel factories (that is an actual problem!) I can do that:


                List<ITab> tabs = new ArrayList<ITab>();

                for ( JukeboxConfigPanelFactory factory : getPanelFactories() ) 
{
                        tabs.add( new 
JukeboxConfigPanelFactoryAwareAbstractTab( factory, getJukeboxModel() ) );
                }

                add( new AjaxTabbedPanel( "tabs", tabs ) );

The problem is: HOW do I get all the panel factories defined in Spring context?

I cannot do :

@SpringBean
private List<JukeboxConfigPanelFactory> factories;

because this is not supported by org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.

I could create another spring bean:

public interface JukeboxConfigPanelFactoryManager {
        public List<JukeboxConfigPanelFactory> getPanelFactoryList();
}


@Component
public class JukeboxConfigPanelFactoryManagerImpl implements 
JukeboxConfigPanelFactoryManager, InitializingBean {
        private List<JukeboxConfigPanelFactory>   factoryList;

        @Autowired
        public JukeboxConfigPanelFactoryManagerImpl( 
List<JukeboxConfigPanelFactory> factoryList ) {
                this.factoryList = factoryList;
        }

        @Override
        public List<JukeboxConfigPanelFactory> getPanelFactoryList() {
                return Collections.unmodifiableList( factoryList );
        }

        @Override
        public void afterPropertiesSet() throws Exception {
                Collections.sort(       factoryList,
                                                        new OrderComparator() );
        }
}

so now I am able to get all factory implementations in one place:

                List<ITab> tabs = new ArrayList<ITab>();

                for ( JukeboxConfigPanelFactory factory : 
panelFactoryManager.getPanelFactoryList() ) {
                        tabs.add( new 
JukeboxConfigPanelFactoryAwareAbstractTab( factory, getJukeboxModel() ) );
                }

                add( new AjaxTabbedPanel( "tabs", tabs ) );

But now the JukeboxConfigPanelFactoryAwareAbstractTab will fail miserably at serializing as only the manager has been wrapped with a proxy and not the factories underneath.

How can I approach the problem using current state of wicket-spring module? I haven't found a way to wrap the "factory" beans with proxy manually.

--
Leszek Gawron                              http://lgawron.blogspot.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to