/****************************************************************************** * Copyright (c) 2005-2007 BEA Systems, Inc. * 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: * Konstantin Komissarchik ******************************************************************************/ package org.eclipse.jst.j2ee.ui.project.facet; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolutionGenerator; import org.eclipse.wst.common.project.facet.core.IFacetedProject; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.eclipse.wst.common.project.facet.core.runtime.IRuntime; import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager; /** * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a> */ public final class RuntimeMismatchMarkerResolutions implements IMarkerResolutionGenerator { private static final String ATTR_RUNTIME1 = "runtime1"; //$NON-NLS-1$ private static final String ATTR_RUNTIME2 = "runtime2"; //$NON-NLS-1$ private static final String ATTR_MODULE_PROJECT = "moduleProject"; //$NON-NLS-1$ public IMarkerResolution[] getResolutions( final IMarker marker ) { final List resolutions = new ArrayList( 2 ); try { final IProject earProject = marker.getResource().getProject(); final IFacetedProject earFacetedProject = ProjectFacetsManager.create( earProject ); final IProject modProject = getModuleProject( marker ); final IFacetedProject modFacetedProject = ProjectFacetsManager.create( modProject ); for( Iterator itr = getRuntimes( marker ).iterator(); itr.hasNext(); ) { final IRuntime runtime = (IRuntime) itr.next(); if( earFacetedProject.isTargetable( runtime ) && modFacetedProject.isTargetable( runtime ) ) { final Resolution resolution = new Resolution( earFacetedProject, modFacetedProject, runtime ); resolutions.add( resolution ); } } } catch( CoreException e ) { J2EEUIPlugin.logError( -1, null, e ); } IMarkerResolution[] array = new IMarkerResolution[ resolutions.size() ]; resolutions.toArray( array ); return array; } private static IProject getModuleProject( final IMarker marker ) { final IWorkspace ws = ResourcesPlugin.getWorkspace(); final String moduleProjectName = marker.getAttribute( ATTR_MODULE_PROJECT, null ); return ws.getRoot().getProject( moduleProjectName ); } private static List getRuntimes( final IMarker marker ) { final List runtimes = new ArrayList(); IRuntime r = getRuntimeByName( marker.getAttribute( ATTR_RUNTIME1, null ) ); if( r != null ) runtimes.add( r ); r = getRuntimeByName( marker.getAttribute( ATTR_RUNTIME2, null ) ); if( r != null ) runtimes.add( r ); return runtimes; } private static IRuntime getRuntimeByName( final String name ) { if( RuntimeManager.isRuntimeDefined( name ) ) { return RuntimeManager.getRuntime( name ); } return null; } private static final class Resolution implements IMarkerResolution { private final IFacetedProject earProject; private final IFacetedProject moduleProject; private final IRuntime runtime; public Resolution( final IFacetedProject earProject, final IFacetedProject moduleProject, final IRuntime runtime ) { this.earProject = earProject; this.moduleProject = moduleProject; this.runtime = runtime; } public String getLabel() { return NLS.bind( Resources.useSameRuntime, this.runtime.getLocalizedName() ); } public void run( final IMarker marker ) { try { setRuntime( this.earProject, this.runtime ); setRuntime( this.moduleProject, this.runtime ); } catch( CoreException e ) { ErrorDialog.openError( null, Resources.errorDialogTitle, Resources.errorDialogMessage, e.getStatus() ); } } private void setRuntime( final IFacetedProject fproj, final IRuntime runtime ) throws CoreException { final IRuntime currentPrimaryRuntime = fproj.getPrimaryRuntime(); if( currentPrimaryRuntime != null && ! currentPrimaryRuntime.getName().equals( runtime.getName() ) ) { if( ! fproj.isTargeted( runtime ) ) { fproj.addTargetedRuntime( runtime, null ); } fproj.setPrimaryRuntime( runtime, null ); } } } private static final class Resources extends NLS { public static String useSameRuntime; public static String errorDialogTitle; public static String errorDialogMessage; static { initializeMessages( RuntimeMismatchMarkerResolutions.class.getName(), Resources.class ); } } }