package com.massfords.jaxb;

import com.sun.codemodel.JAnnotationUse;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JPackage;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.tools.xjc.outline.Outline;

import javax.annotation.Generated;
import java.util.Set;

/**
 * Base class for creating code. Pattern here is to run through the set of generated beans
 * and produce some new interface or class in the form of a JDefinedClass.
 * 
 * @author markford
 */
abstract class CodeCreator {

    protected final JPackage jpackage;
    protected final Outline outline;
    private JDefinedClass output;

    CodeCreator(Outline outline, JPackage jPackage) {
        this.outline = outline;
        this.jpackage = jPackage;
    }

    protected abstract void run(Set<ClassOutline> classes, Set<JClass> directClasses);

    JDefinedClass getOutput() {
        return output;
    }
    
    void setOutput(JDefinedClass output) {
        JAnnotationUse annotationUse = output.annotate(Generated.class);
        annotationUse.param("value", "Generated by jaxb-visitor");
        this.output = output;
    }

    protected JPackage getPackage() {
        return jpackage;
    }

    protected Outline getOutline() {
        return outline;
    }
}