0

I can't find more effective way to implement lookup method with groovy configuration (only groovy!) than that:

// abstract Java class with lookup method

public abstract class GMyFrame extends JFrame {

private Color startColor;

public GMyFrame() {
    super("Hello");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(200, 400));
    setSize(new Dimension(400, 400));
    setLocationRelativeTo(null);
}

public void setStartColor(Color color) {
    this.startColor = color;
    this.getContentPane().setBackground(color);
}

protected Color getStartColor() {
    return startColor;
}

public abstract Color getNewColor(); //lookup

}

//groovy config

...

Closure ctx() {
    def closure = { caller ->
        [this, caller]
    }
    return closure
}

beans {

    randomColorGenerator(GRandomColorGenerator) {
        new GRandomColorGenerator()
    }

    randomColor(Color) { bean ->
        bean.scope = 'prototype'
        bean.factoryBean = 'randomColorGenerator'
        bean.factoryMethod = 'generate'
    }

    startColor(Color, 0, 0, 255) {}

    myFrame(NFrame, ctx().getProperties()) {
        startColor = ref('startColor')
    }

    jFrameInvoker(GJFrameInvoker) { bean ->
        bean.initMethod = 'init'
        frame = ref('myFrame')
    }
}

class NFrame extends GMyFrame {

def configObj

NFrame(o) {
    configObj = o
}

@Override
Color getNewColor() {
    return configObj['thisObject'].getProperties().get('binding').getProperties().get('variables')['beans'].getApplicationContext().getBean('randomColor')
}

}

But it's too long and strange. Can you find a simple decision?

dSH
  • 143
  • 6

1 Answers1

0

The decision is to implement interface BeanFactoryAware:

class NFrame extends GMyFrame implements BeanFactoryAware {

    def factory

    @Override
    Color getNewColor() {
        return factory.getBean('randomColor')
    }

    @Override
    void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        factory = beanFactory
    }
}
dSH
  • 143
  • 6