/*******************************************************************************
 * 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
 *******************************************************************************/
/*
 * Created on Sep 15, 2003
 */
package org.eclipse.jst.j2ee.internal.web.operations;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetHelper;
import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.web.internal.operation.ILibModule;

/**
 * Given a Web Project, this operation will sychronize all its Web Library Projects (WLPs), i.e., it
 * will change the target server of all WLPs to that of the Web Project.
 * 
 * @author Pratik Shah
 */
public class SynchronizeWLPoperation implements IHeadlessRunnableWithProgress {
	private IProject prj;

	/**
	 * Constructor
	 * 
	 * @param webProject
	 *            A Web Project whose WLPs' target servers have to be changed
	 */
	public SynchronizeWLPoperation(IProject webProject) {
		prj = webProject;
	}

	/**
	 * Synchronizes all WLPs to have the same target server as the given Web project.
	 * 
	 * @see org.eclipse.jst.j2ee.internal.internal.operations.IHeadlessRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
	 */
	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
		IRuntime target = ServerTargetUtil.getServerTarget(prj.getName());
		ILibModule[] wlps = J2EEWebNatureRuntimeUtilities.getJ2EERuntime(prj).getLibModules();
		monitor.beginTask(ProjectSupportResourceHandler.getString("Sync_WLP_Op"), wlps.length); //$NON-NLS-1$
		for (int i = 0; i < wlps.length; i++) {
			IProject module = wlps[i].getProject();
			if (target != null) {
				ServerTargetHelper.cleanUpNonServerTargetClasspath(module);
				try {
					ServerCore.getProjectProperties(module).setRuntimeTarget(target, monitor);
				} catch (CoreException ce) {
					// TODO - handle exception
				}
			}
			monitor.worked(1);
		}
		monitor.done();
	}
}