package org.oddjob.swing; import java.awt.Component; import java.io.Serializable; import java.util.concurrent.Callable; import org.oddjob.arooa.ArooaParseException; import org.oddjob.arooa.ArooaSession; import org.oddjob.arooa.ArooaType; import org.oddjob.arooa.design.DesignInstance; import org.oddjob.arooa.design.DesignParser; import org.oddjob.arooa.design.DesignSeedContext; import org.oddjob.arooa.design.GenericDesignFactory; import org.oddjob.arooa.design.screem.Form; import org.oddjob.arooa.design.view.SwingFormFactory; import org.oddjob.arooa.design.view.ValueDialog; import org.oddjob.arooa.life.ArooaSessionAware; import org.oddjob.arooa.parsing.ArooaContext; import org.oddjob.arooa.parsing.ArooaElement; import org.oddjob.arooa.reflect.PropertyAccessor; import org.oddjob.arooa.standard.StandardArooaParser; import org.oddjob.arooa.xml.XMLArooaParser; import org.oddjob.arooa.xml.XMLConfiguration; public class ConfigureBeanJob implements Serializable, Runnable, ArooaSessionAware { private static final long serialVersionUID = 2010030100L; private transient Object bean; private transient ArooaSession session; private String beanConfig; @Override public void setArooaSession(ArooaSession session) { this.session = session; } @Override public void run() { final Object bean = this.bean; if (bean == null) { throw new NullPointerException("No bean."); } DesignInstance design = null; PropertyAccessor accessor = session.getTools( ).getPropertyAccessor(); ArooaContext parentContext = new DesignSeedContext( ArooaType.VALUE, session); GenericDesignFactory designFactory = new GenericDesignFactory( accessor.getClassName(bean)); if (beanConfig == null) { ArooaElement element = new ArooaElement("bean"); design = designFactory.createDesign( element, parentContext); } else { DesignParser parser = new DesignParser( designFactory); try { parser.parse(new XMLConfiguration("BEAN-CONFIG", beanConfig)); } catch (ArooaParseException e) { throw new RuntimeException(e); } design = parser.getDesign(); } Form form = design.detail(); Component view = SwingFormFactory.create(form).dialog(); final DesignInstance finalDesign = design; ValueDialog dialog = new ValueDialog(view, new Callable<Boolean>() { @Override public Boolean call() throws Exception { StandardArooaParser parser = new StandardArooaParser( bean, session); try { parser.parse(finalDesign.getArooaContext().getConfigurationNode()); } catch (ArooaParseException e) { throw new RuntimeException(e); } XMLArooaParser xmlParser = new XMLArooaParser(); try { xmlParser.parse(finalDesign.getArooaContext().getConfigurationNode()); } catch (ArooaParseException e) { throw new RuntimeException(e); } beanConfig = xmlParser.getXml(); return null; } }); dialog.showDialog(null); } public Object getBean() { return bean; } public void setBean(Object bean) { if (this.bean == null) { this.bean = bean; } } }