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

import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
import org.eclipse.wst.common.project.facet.core.runtime.classpath.IClasspathProvider;

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

public final class StandardJreClasspathProvider

    implements IClasspathProvider
    
{
    private static final IProjectFacet JAVA_FEATURE
        = ProjectFacetsManager.getProjectFacet( "java" );
    
    private static final String STANDARD_VM_TYPE
        = "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType";

    
    private final IRuntimeComponent rc;
    
    public StandardJreClasspathProvider( final IRuntimeComponent rc )
    {
        this.rc = rc;
    }

    public List getClasspathEntries( final IProjectFacetVersion fv )
    {
        if( fv.getProjectFacet() == JAVA_FEATURE )
        {
            IPath path = new Path( JavaRuntime.JRE_CONTAINER );
            path = path.append( STANDARD_VM_TYPE );
            path = path.append( rc.getProperty( "name" ) );
            
            final IClasspathEntry cpentry = JavaCore.newContainerEntry( path );
            
            return Collections.singletonList( cpentry );
        }
        
        return null;
    }
    
    public static final class Factory

        implements IAdapterFactory
        
    {
        private static final Class[] ADAPTER_TYPES
            = { IClasspathProvider.class };
                        
        public Object getAdapter( final Object adaptable, 
                                  final Class adapterType )
        {
            final IRuntimeComponent rc = (IRuntimeComponent) adaptable;
            return new StandardJreClasspathProvider( rc );
        }
    
        public Class[] getAdapterList()
        {
            return ADAPTER_TYPES;
        }
    }
    

}
