/*******************************************************************************
 * Copyright (c) 2008-2014 Sonatype, Inc. 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
 *******************************************************************************/

package org.eclipse.m2e.wtp.mavenarchiver;

import org.apache.maven.plugin.MojoExecution;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectChangedEvent;
import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant;
import org.eclipse.m2e.core.project.configurator.ILifecycleMappingConfiguration;
import org.eclipse.m2e.core.project.configurator.MojoExecutionKey;
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
import org.eclipse.m2e.wtp.WTPProjectsUtil;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
import org.sonatype.m2e.mavenarchiver.internal.JarArchiverConfigurator;

/**
 * Base Maven Archiver configurator for WTP projects
 * 
 * @author Fred Bricon
 */
public class AbstractWTPArchiverConfigurator extends JarArchiverConfigurator {

	public void configure(ProjectConfigurationRequest request,
			IProgressMonitor monitor) throws CoreException {
		if (WTPProjectsUtil.isM2eWtpDisabled(request.getMavenProjectFacade(), monitor)) {
			return;
		}
		super.configure(request, monitor);
	}

	public void mavenProjectChanged(MavenProjectChangedEvent event,
			IProgressMonitor monitor) throws CoreException {
		if (WTPProjectsUtil.isM2eWtpDisabled(event.getMavenProject(), monitor)) {
			return;
		}
	    IMavenProjectFacade oldFacade = event.getOldMavenProject();
	    IMavenProjectFacade newFacade = event.getMavenProject();
	    if(oldFacade == null && newFacade == null) {
	      return;
	    }
	    mavenProjectChanged(newFacade, oldFacade, true, monitor);
	}
	
	public AbstractBuildParticipant getBuildParticipant(
			IMavenProjectFacade projectFacade, MojoExecution execution,
			IPluginExecutionMetadata executionMetadata) {
		if (WTPProjectsUtil.isM2eWtpDisabled(projectFacade, new NullProgressMonitor())) {
			return null;
		}		
		return super.getBuildParticipant(projectFacade, execution,
				executionMetadata);
	}

	/**
	 * Ensures the project is WTP enabled before generating the manifest.
	 */
	@Override
	protected boolean needsNewManifest(IFile manifest,
			IMavenProjectFacade oldFacade, IMavenProjectFacade newFacade,
			IProgressMonitor monitor) {

		if (!ModuleCoreNature.isFlexibleProject(newFacade.getProject())) {
			return false;
		}
		return super.needsNewManifest(manifest, oldFacade, newFacade, monitor);
	}
	
	@Override
	public boolean hasConfigurationChanged(IMavenProjectFacade newFacade,
			ILifecycleMappingConfiguration oldProjectConfiguration,
			MojoExecutionKey key, IProgressMonitor monitor) {
		return false;
	}
	
}
