/***************************************************************************************************
 * Copyright (c) 2003, 2004 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.application.operations;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModel;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModel;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.ServerCore;

/**
 * This dataModel is a common super class used to import J2EE Modules.
 * 
 * This class (and all its fields and methods) is likely to change during the WTP 1.0 milestones as
 * the new project structures are adopted. Use at your own risk.
 * 
 * @since WTP 1.0
 */
public abstract class J2EEModuleImportDataModel extends J2EEArtifactImportDataModel {

	/**
	 * nested
	 */
	public static final String EAR_PROJECT = J2EEModuleCreationDataModel.EAR_PROJECT_NAME;
	public static final String ADD_TO_EAR = J2EEModuleCreationDataModel.ADD_TO_EAR;

	public static final String EXTENDED_IMPORT_FACTORY = "J2EEModuleImportDataModel.EXTENDED_IMPORT_FACTORY"; //$NON-NLS-1$

	protected void initValidBaseProperties() {
		super.initValidBaseProperties();
		addValidBaseProperty(EXTENDED_IMPORT_FACTORY);
	}

	private int getModuleSpecVersion() {
		if (!isSet(EXTENDED_IMPORT_FACTORY)) {
			return ArchiveUtil.getFastSpecVersion(getModuleFile());
		}
		ExtendedImportFactory factory = (ExtendedImportFactory) getProperty(EXTENDED_IMPORT_FACTORY);
		return factory.getSpecVersion(getModuleFile());
	}

	protected boolean doSetProperty(String propertyName, Object propertyValue) {
		if (propertyName.equals(PROJECT_NAME)) {
			IProject project = ProjectCreationDataModel.getProjectHandleFromProjectName((String) propertyValue);
			getJ2EEModuleCreationDataModel().setBooleanProperty(J2EEArtifactCreationDataModel.IS_ENABLED, null == project || !project.exists());
		}
		boolean doSet = super.doSetProperty(propertyName, propertyValue);
		if (doSet && (propertyName.equals(J2EEArtifactImportDataModel.FILE_NAME) || (propertyName.equals(J2EEArtifactImportDataModel.FILE)))) {
			J2EEModuleCreationDataModel moduleDM = getJ2EEModuleCreationDataModel();
			if (getModuleFile() != null) {
				moduleDM.setIntProperty(J2EEModuleCreationDataModel.J2EE_VERSION, getModuleSpecVersion());
				notifyValidValuesChange(PROJECT_NAME);
			}
		} else if (propertyName.equals(PROJECT_NAME)) {
			IProject project = getProject();
			if (null != project && project.exists()) {
				String[] requiredNatures = (String[]) getJ2EEModuleCreationDataModel().getProjectDataModel().getProperty(ProjectCreationDataModel.PROJECT_NATURES);
				if (null != requiredNatures) {
					try {
						for (int i = 0; i < requiredNatures.length; i++) {
							if (!project.hasNature(requiredNatures[i])) {
								return doSet;
							}
						}
					} catch (CoreException e) {
						return doSet;
					}
					IRuntime target = ServerCore.getProjectProperties(project).getRuntimeTarget();
					if (null != target) {
						setProperty(SERVER_TARGET_ID, target.getId());
					}
					setBooleanProperty(ADD_TO_EAR, false);
				}
			}
			getJ2EEModuleCreationDataModel().setBooleanProperty(J2EEArtifactCreationDataModel.IS_ENABLED, null == project || !project.exists());
		} else if (propertyName.equals(PRESERVE_PROJECT_METADATA)) {
			JavaProjectCreationDataModel jdm = getJ2EEModuleCreationDataModel().getJavaProjectCreationDataModel();
			jdm.setBooleanProperty(JavaProjectCreationDataModel.CREATE_SOURCE_FOLDERS, !getBooleanProperty(BINARY));
		}
		return doSet;
	}

	public final J2EEModuleCreationDataModel getJ2EEModuleCreationDataModel() {
		return (J2EEModuleCreationDataModel) getJ2eeArtifactCreationDataModel();
	}

	protected final int getJ2EEVersion() {
		return getJ2EEModuleCreationDataModel().getJ2EEVersion();
	}
}