/*******************************************************************************
* Copyright (c) 2010 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
* 
* Contributors:
*     Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.jaxb.core.internal.gen;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jaxb.core.internal.JptJaxbCoreMessages;

/**
 *  GenerateJaxbClassesJob
 */
public class GenerateJaxbClassesJob extends WorkspaceJob {
	private final IJavaProject javaProject;
	private final String schemaPathOrUri;
	private final String outputDir;
	private final String targetPackage;
	private final String catalog;
	private final boolean usesMoxyGenerator;
	private final String[] bindingsFileNames;
	private final ClassesGeneratorOptions generatorOptions;
	private final ClassesGeneratorExtensionOptions generatorExtensionOptions;

	// ********** constructors **********
	
	public GenerateJaxbClassesJob(
		IJavaProject javaProject, 
		String schemaPathOrUri, 
		String outputDir,
		String targetPackage, 
		String catalog, 
		boolean usesMoxyGenerator,
		String[] bindingsFileNames,
		ClassesGeneratorOptions generatorOptions,
		ClassesGeneratorExtensionOptions generatorExtensionOptions) {
		
		super(JptJaxbCoreMessages.ClassesGenerator_generatingClasses);
		if(javaProject == null) {
			throw new RuntimeException("Project is null");		//$NON-NLS-1$
		}
		else if(StringTools.stringIsEmpty(schemaPathOrUri)) {
			throw new RuntimeException("Schema cannot be empty");	//$NON-NLS-1$
		}
		else if(StringTools.stringIsEmpty(outputDir)) {
				throw new RuntimeException("Output directory cannot be empty");	//$NON-NLS-1$
		}
		this.javaProject = javaProject;
		this.schemaPathOrUri = schemaPathOrUri;
		this.outputDir = outputDir;
		this.targetPackage = targetPackage;
		this.catalog = catalog;
		this.usesMoxyGenerator = usesMoxyGenerator;
		this.bindingsFileNames = bindingsFileNames;
		this.generatorOptions = generatorOptions;
		this.generatorExtensionOptions = generatorExtensionOptions;
		this.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(this.javaProject.getProject()));
	}

	@Override
	public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
		SubMonitor sm = SubMonitor.convert(monitor, JptJaxbCoreMessages.ClassesGenerator_generatingClassesTask, 1);
		try {
			this.classesGeneratorGenerate(this.javaProject, 
				this.schemaPathOrUri, 
				this.outputDir, 
				this.targetPackage, 
				this.catalog, 
				this.usesMoxyGenerator,
				this.bindingsFileNames,
				this.generatorOptions,
				this.generatorExtensionOptions, 
				sm.newChild(1));
		} 
		catch (OperationCanceledException e) {
			return Status.CANCEL_STATUS;
			// fall through and tell monitor we are done
		}
		catch (RuntimeException re) {
			throw new RuntimeException(re);
		}
		return Status.OK_STATUS;
}

	private void classesGeneratorGenerate(IJavaProject javaProject, 
		String schemaPathOrUri, 
		String outputDir, 
		String targetPackage, 
		String catalog, 
		boolean usesMoxyGenerator,
		String[] bindingsFileNames, 
		ClassesGeneratorOptions generatorOptions,
		ClassesGeneratorExtensionOptions generatorExtensionOptions,
		IProgressMonitor monitor) {

		ClassesGenerator.generate(javaProject, 
			schemaPathOrUri, 
			outputDir, 
			targetPackage, 
			catalog, 
			usesMoxyGenerator, 
			bindingsFileNames, 
			generatorOptions, 
			generatorExtensionOptions,
			monitor);
		return;
	}
}