/*******************************************************************************
 * Copyright (c) 2003, 2005 IBM Corporation and others.
 * 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.wizard;

import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.ui.IImportWizard;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;

/**
 * <p>
 * Serves as a base class for Wizards which import J2EE module structures into Eclipse projects.
 * </p>
 * <p>
 * Import wizards must define the following methods:
 * <ul>
 * <li>{@link #getImportOperation()}
 * <li>{@link #getModuleValidatorStrings()}
 * </ul>
 * </p>
 * <p>
 * And optionally, they may override the following methods from
 * {@see org.eclipse.jst.j2ee.internal.wizard.J2EEArtifactImportWizard}:
 * <ul>
 * <li>{@link #getFinalPerspectiveID()}
 * <li>{@link #doInit()()}
 * <li>{@link #doDispose()()}
 * </ul>
 */
public abstract class J2EEComponentImportWizard extends J2EEArtifactImportWizard implements IImportWizard, IExecutableExtension {

//	private static final String[] VALIDATOR_STRINGS = new String[]{"org.eclipse.jst.j2ee.internal.validation.UIEarValidator"}; //$NON-NLS-1$

//	private static final Class IPROJECT_CLASS = IProject.class;

	/**
	 * <p>
	 * The default constructor. Creates a wizard with no selection, no model instance, and no
	 * operation instance. The model and operation will be created as needed.
	 * </p>
	 */
	public J2EEComponentImportWizard() {
		super();
		setWindowTitle(J2EEUIMessages.getResourceString("38")); //$NON-NLS-1$
	}

	/**
	 * <p>
	 * The model is used to prepopulate the wizard controls and interface with the operation.
	 * </p>
	 * 
	 * @param model
	 *            The model parameter is used to pre-populate wizard controls and interface with the
	 *            operation
	 */
	public J2EEComponentImportWizard(IDataModel model) {
		super(model);
		setWindowTitle(J2EEUIMessages.getResourceString("38"));//$NON-NLS-1$ 
	}

	// /**
	// * <p>
	// * Creates an Import Operation using {@link #getImportOperation()}and wraps it to run
	// * validation once the module has been imported.
	// * </p>
	// *
	// * @return Returns a wrapper operation around the result of getImportOperation() that also
	// runs
	// * validation as defined in getModuleValidatorStrings()
	// * @see #getImportOperation()
	// * @see #getModuleValidatorStrings()
	// */
	// protected final WTPOperation createBaseOperation() {
	// return new WTPOperation() {
	// protected void execute(IProgressMonitor monitor) throws CoreException,
	// InvocationTargetException, InterruptedException {
	// WTPOperation importOp = getImportOperation();
	// if (importOp == null)
	// return;
	// importOp.run(monitor);
	//
	// J2EEModuleImportDataModel importModel = (J2EEModuleImportDataModel)
	// getImportOperation().getOperationDataModel();
	// IProject moduleProject = importModel.getProject();
	// ValidatorSubsetOperation moduleValidator = new ValidatorSubsetOperation(moduleProject, true,
	// false);
	// moduleValidator.setValidators(getModuleValidatorStrings());
	// moduleValidator.run(monitor);
	//
	// if (importModel.getBooleanProperty(J2EEModuleImportDataModel.ADD_TO_EAR)) {
	// IProject earProject =
	// importModel.getJ2EEModuleCreationDataModel().getEarComponentCreationDataModel().getTargetProject();
	// ValidatorSubsetOperation earValidator = new ValidatorSubsetOperation(earProject, true,
	// false);
	// earValidator.setValidators(getEarValidatorStrings());
	// earValidator.run(monitor);
	// }
	// }
	// };
	// }

	// /**
	// *
	// * @return The appropriate import operation for the specific J2EE model type
	// */
	// protected abstract WTPOperation getImportOperation();

	/**
	 * <p>
	 * The Import Wizards can run arbitrary validators once the module has been created. These
	 * validators ensure that the structure created by the Import operation and the contents of that
	 * structure are valid. Any errors will be announced to the Problems view in Eclipse.
	 * </p>
	 * 
	 * @return An array of validator IDs that should be used for this module type
	 */
	protected abstract String[] getModuleValidatorStrings();

	// /**
	// * <p>
	// * Uses the selection supplied from the {@link #init(IWorkbench, IStructuredSelection)}method
	// * to set the associated EAR Module if an EAR artifact was selected.
	// * </p>
	// *
	// * @param importModel
	// * The Module Import data model to have its J2EEModuleImportDataModel.EAR_PROJECT
	// * field set.
	// */
	// protected final void updateEARToModelFromSelection(J2EEModuleImportDataModel importModel) {
	// /* Set the default ear selected if a ear is selected */
	// try {
	// if (getSelection() != null && !getSelection().isEmpty()) {
	// IProject targetEARProject = (IProject)
	// AdaptabilityUtility.getAdapter(getSelection().getFirstElement(), IPROJECT_CLASS);
	// if (targetEARProject != null && targetEARProject.hasNature(IEARNatureConstants.NATURE_ID))
	// importModel.setProperty(J2EEModuleImportDataModel.EAR_NAME, targetEARProject.getName());
	// }
	// } catch (Exception e) {
	// //Ignore
	// }
	// }

	// private String[] getEarValidatorStrings() {
	// return VALIDATOR_STRINGS;
	// }

}
