/*******************************************************************************
 * 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.internal;


import org.eclipse.jst.common.jdt.internal.integration.WorkingCopyManager;
import org.eclipse.jst.common.jdt.internal.integration.WorkingCopyManagerFactory;
import org.eclipse.jst.j2ee.internal.common.XMLResource;
import org.eclipse.jst.j2ee.internal.project.J2EENature;
import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesResource;
import org.eclipse.wst.common.frameworks.internal.activities.WTPActivityBridge;
import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;


/**
 * This class is used by clients (mainly editors) when there is an intent to modify a resource
 * within the Workbench. All clients with a specific key (this specifies a grouping of common
 * resources), will get the same instance of the J2EEEditModel. Clients will obtain resources
 * through this edit model. A client can add themselves as a listener (@see J2EEEditModelListener).
 * This will allow clients to fire property change notifications when a J2EEEditModelEvent is
 * detected. This helps to synchronize editors within the Workbench. There is no need for editors to
 * add themselves as CommandStack listeners because this edit model will catch CommandStack changes
 * and forward them to all listeners as J2EEEditModelEvents.
 * 
 * A J2EEEditModel is obtained from the J2EENature (@see getEditModel(Object)).
 * 
 * TIPS ON USING THIS EDIT MODEL:
 * 
 * To determine if a client needs to save (e.g., <code>isSaveNeeded()</code>), one should call
 * <code>isDirty()</code>.
 * 
 * To determine if a client needs to save when closing (e.g., <code>isSaveOnCloseNeeded()</code>),
 * one should call <code>needsToSave()</code>.
 * 
 * When the main client (editor) performs a save (e.g., <code>doSave()</code>), they should call
 * <code>save()</code>.
 * 
 * If a wizard or another client needs to save the resources but they are not the primary editor,
 * <code>saveIfNecessary()</code> should be called. This will save the resources only if there are
 * no other references to this edit model.
 * 
 * When disposing the client, <code>releaseAccess</code> should be called.
 * 
 * @deprecated
 * Use
 * <p>
 * 		ArtifactEdit
 * </p>
 */
public class J2EEEditModel extends EditModel {

	private WorkingCopyManager workingCopyManager = null;

	/**
	 * J2EEEditModel constructor comment.
	 */
	public J2EEEditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly) {
		super(editModelID, context, readOnly);
	}

	/**
	 * J2EEEditModel constructor comment.
	 */
	public J2EEEditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly, boolean accessUnkownResourcesAsReadOnly) {
		super(editModelID, context, readOnly);
	}

	/**
	 * This will be the type of the deployment descriptor docuemnt. Subclasses should override if
	 * they have a deployment descriptor.
	 * 
	 * @see XMLResource#APP_CLIENT_TYPE
	 * @see XMLResource#APPLICATION_TYPE
	 * @see XMLResource#EJB_TYPE
	 * @see XMLResource#WEB_APP_TYPE
	 * @see XMLResource#RAR_TYPE
	 */
	public int getDeploymentDescriptorType() {
		if (getJ2EENature() != null)
			return getJ2EENature().getDeploymentDescriptorType();
		return -1;
	}

	/**
	 * Subclasses should override to return the proper deployment descriptor resource.
	 */
	public XMLResource getDeploymentDescriptorResource() {
		return null;
	}

	public J2EENature getJ2EENature() {
		return J2EENature.getRegisteredRuntime(getProject());
	}


	public WebServicesResource get13WebServicesClientResource() {
		return null;
	}


	private ActivityEditModelListener activityEditModelListener = null;

	private class ActivityEditModelListener implements EditModelListener {
		public void editModelChanged(EditModelEvent anEvent) {
			if (anEvent.getEventCode() == EditModelEvent.DIRTY) {
				try {
					WTPActivityBridge.getInstance().enableActivity(getDevelopmentAcivityID(), true);
				} finally {
					removeListener(this);
					activityEditModelListener = null;
				}
			}
		}
	}

	public void notifyActivityChanges(boolean b) {
		if (null != activityEditModelListener || null == getDevelopmentAcivityID()) {
			return;
		}
		activityEditModelListener = new ActivityEditModelListener();
		getListeners().add(activityEditModelListener);
	}

	public String getDevelopmentAcivityID() {
		return null;
	}

	/**
	 * Returns the working copy remembered for the compilation unit.
	 * 
	 * @param input
	 *            ICompilationUnit
	 * @return the working copy of the compilation unit, or <code>null</code> if there is no
	 *         remembered working copy for this compilation unit
	 */
	public org.eclipse.jdt.core.ICompilationUnit getWorkingCopy(org.eclipse.jdt.core.ICompilationUnit cu, boolean forNewCU) throws org.eclipse.core.runtime.CoreException {
		if (isReadOnly())
			return null;
		return getWorkingCopyManager().getWorkingCopy(cu, forNewCU);
	}

	public WorkingCopyManager getWorkingCopyManager() {
		if (workingCopyManager == null)
			workingCopyManager = WorkingCopyManagerFactory.newRegisteredInstance();
		return workingCopyManager;
	}

	/**
	 * Reset the working copy manager because the ejb-jar.xml was removed without disposing.
	 */
	protected void resetWorkingCopyManager() {
		if (workingCopyManager != null) {
			workingCopyManager.dispose();
			workingCopyManager = null;
		}
	}
}