/******************************************************************************
 * Copyright (c) 2005 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 - initial API and implementation
 ******************************************************************************/

package org.eclipse.jst.j2ee.project.facet;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectValidator;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;

/**
 * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
 */

public final class EarFacetValidator

    implements IFacetedProjectValidator
    
{
    private static final String MARKER_ID 
        = J2EEPlugin.PLUGIN_ID + ".differentRuntimesDetected"; //$NON-NLS-1$
    
    public void validate( final IFacetedProject fproj ) 
    
        throws CoreException
        
    {
        final IVirtualComponent vc 
            = ComponentCore.createComponent( fproj.getProject() );
        
        if( vc == null )
        {
            return;
        }
    
        if( fproj.hasProjectFacet( IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET ) )
        {
            fproj.getProject().deleteMarkers( MARKER_ID, false, 
                                              IResource.DEPTH_ZERO );
            
            final IVirtualReference[] refs = vc.getReferences();
            
            for( int i = 0; i < refs.length; i++ )
            {
                final IVirtualReference ref = refs[ i ];
                final IVirtualComponent refvc = ref.getReferencedComponent();
                
                if( refvc != null && !refvc.isBinary())
                {
                    final IProject refpj = refvc.getProject();
                    IFacetedProject facetedProject = ProjectFacetsManager.create( refpj );
                    if( facetedProject != null )
                    	validate( fproj, facetedProject );
                }
            }
        }
        else
        {
            final IVirtualComponent[] referencing 
                = vc.getReferencingComponents();
            
            for( int i = 0; i < referencing.length; i++ )
            {
                final IVirtualComponent refvc = referencing[ i ];
                
                final IFacetedProject reffpj
                    = ProjectFacetsManager.create( refvc.getProject() );
                
                if( reffpj.hasProjectFacet( IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET ) )
                {
                    validate( reffpj );
                }
            }
        }
    }
    
    private void validate( final IFacetedProject ear,
                           final IFacetedProject module )
    
        throws CoreException
        
    {
        final IRuntime earRuntime = ear.getRuntime();
        final IRuntime moduleRuntime = module.getRuntime();
        
        if( earRuntime == null && moduleRuntime != null )
        {
            // Should this also be a warning?
        }
        else if( earRuntime != null && moduleRuntime == null )
        {
            // Should this also be a warning?
        }
        else if( earRuntime != null && moduleRuntime != null &&
                 ! earRuntime.equals( moduleRuntime ) )
        {
            final String msg
                = NLS.bind( Resources.targetingDifferentRuntimes,
                            module.getProject().getName() );
            
            final IMarker m = ear.createWarningMarker( MARKER_ID, msg );
            
            m.setAttribute( "moduleProject", module.getProject().getName() ); //$NON-NLS-1$
            m.setAttribute( "runtime1", ear.getRuntime().getName() ); //$NON-NLS-1$
            m.setAttribute( "runtime2", module.getRuntime().getName() ); //$NON-NLS-1$
        }
    }
    
    private static final class Resources
    
        extends NLS
        
    {
        public static String targetingDifferentRuntimes;
        
        static
        {
            initializeMessages( EarFacetValidator.class.getName(), 
                                Resources.class );
        }
    }

}
