package org.jvnet.jaxb2_commons.plugin.model; import org.jvnet.jaxb2_commons.plugin.AbstractParameterizablePlugin; import org.jvnet.jaxb2_commons.xjc.generator.MModelOutlineGenerator; import org.jvnet.jaxb2_commons.xjc.generator.concrete.ModelOutlineGeneratorFactory; import org.jvnet.jaxb2_commons.xjc.model.concrete.XJCCMInfoFactory; import org.jvnet.jaxb2_commons.xjc.outline.MModelOutline; import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo; import org.xml.sax.ErrorHandler; import com.sun.tools.xjc.Options; import com.sun.tools.xjc.model.Model; import com.sun.tools.xjc.model.nav.NClass; import com.sun.tools.xjc.model.nav.NType; import com.sun.tools.xjc.outline.Outline; import com.sun.tools.xjc.reader.Ring; public abstract class AbstractModelPlugin extends AbstractParameterizablePlugin { protected MModelInfo<NType, NClass> getModel(Model model) { try { @SuppressWarnings("unchecked") final MModelInfo<NType, NClass> modelInfo = (MModelInfo<NType, NClass>) Ring .get(MModelInfo.class); return modelInfo; } catch (Throwable t) { final MModelInfo<NType, NClass> mmodel = new XJCCMInfoFactory(model) .createModel(); Ring.add(MModelInfo.class, mmodel); return mmodel; } } protected MModelOutline getModelOutline( MModelInfo<NType, NClass> modelInfo, Outline outline, Options options) { try { final MModelOutline modelOutline = (MModelOutline) Ring .get(MModelOutline.class); return modelOutline; } catch (Throwable t) { if (modelInfo.getOrigin() instanceof ModelOutlineGeneratorFactory) { MModelOutlineGenerator generator = ((ModelOutlineGeneratorFactory) modelInfo .getOrigin()).createGenerator(outline); MModelOutline modelOutline = generator.generate(modelInfo); Ring.add(MModelOutline.class, modelOutline); return modelOutline; } else { throw new AssertionError("Model is expected to be generateable"); } } } private MModelInfo<NType, NClass> modelInfo; @Override public void postProcessModel(Model model, ErrorHandler errorHandler) { this.modelInfo = getModel(model); postProcessModel(model, modelInfo, errorHandler); } protected void postProcessModel(Model model, MModelInfo<NType, NClass> modelInfo, ErrorHandler errorHandler) { // Template method to be overridden by classes } @Override protected boolean run(Outline outline, Options options) throws Exception { if (modelInfo.getOrigin() instanceof ModelOutlineGeneratorFactory) { MModelOutlineGenerator generator = ((ModelOutlineGeneratorFactory) modelInfo .getOrigin()).createGenerator(outline); MModelOutline modelOutline = generator.generate(modelInfo); Ring.add(MModelOutline.class, modelOutline); } else { throw new AssertionError("Model is expected to be generateable"); } return true; } }