package org.eclipse.jst.jsp.core.internal.java;

import org.eclipse.jdt.core.WorkingCopyOwner;

/**
 * To ensure there is only one instance of ProblemRequestor and WorkingCopyOwner
 * for JSP plugins.  These were removed from JSPTranslation to ensure that the
 * JSPTranslation was not held in memory by any type of JDT lists (caching
 * search results, etc...)
 * 
 * @author pavery
 */
public class CompilationUnitHelper {

    private JSPProblemRequestor fProblemRequestor = null;
    private WorkingCopyOwner fWorkingCopyOwner = null;
    private static CompilationUnitHelper instance;

    private CompilationUnitHelper() {
        // force use of instance
    }

    public synchronized static final CompilationUnitHelper getInstance() {

        if (instance == null)
            instance = new CompilationUnitHelper();
        return instance;
    }

    public JSPProblemRequestor getProblemRequestor() {

        if (fProblemRequestor == null)
            fProblemRequestor = new JSPProblemRequestor();
        return fProblemRequestor;
    }

    public WorkingCopyOwner getWorkingCopyOwner() {

        if (fWorkingCopyOwner == null) {
            fWorkingCopyOwner = new WorkingCopyOwner() {
                public String toString() {
                    return "JSP Working copy owner"; //$NON-NLS-1$
                }
            };
        }
        return fWorkingCopyOwner;
    }
}
