/*****************************************************************************
* Copyright (c) 2008 g-Eclipse Consortium
* 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
*
* Initial development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Moritz Post - initial API and implementation
*****************************************************************************/
package eu.geclipse.aws;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import eu.geclipse.aws.internal.Activator;
import eu.geclipse.aws.internal.Messages;
import eu.geclipse.aws.vo.AWSVirtualOrganization;
import eu.geclipse.core.model.IGridContainer;
import eu.geclipse.core.model.IGridInfoService;
import eu.geclipse.core.model.IGridResource;
import eu.geclipse.core.model.IGridResourceCategory;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.model.impl.AbstractGridInfoService;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.info.model.AbstractGlueStore;
import eu.geclipse.info.model.IExtendedGridInfoService;
import eu.geclipse.info.model.InfoTopTreeElement;
/**
* The {@link IGridInfoService} for the Amazon EC2 infrastructure.
*
* @author Moritz Post
*/
public class AWSInfoService extends AbstractGridInfoService
implements IExtendedGridInfoService
{
/** The name of the file to save this grid element in. */
public static String STORAGE_NAME = ".awsInfoService"; //$NON-NLS-1$
/** The virtual organization to used as underlying connection facility. */
private AWSVirtualOrganization awsVo;
/**
* Create a new {@link AWSInfoService} with the provided
* {@link AWSVirtualOrganization} acting as the connection source.
*
* @param virtualOrganization the vo to hold the connection details
*/
public AWSInfoService( final AWSVirtualOrganization virtualOrganization ) {
this.awsVo = virtualOrganization;
}
public AbstractGlueStore getStore() {
// not applicable
return null;
}
public ArrayList<InfoTopTreeElement> getTopTreeElements() {
// not applicable
return null;
}
public String getVoType() {
return this.awsVo.getTypeName();
}
public void scheduleFetch( final IProgressMonitor monitor ) {
// not applicable
}
public void setVO( final IVirtualOrganization vo ) {
this.awsVo = ( AWSVirtualOrganization )vo;
}
public IGridResource[] fetchResources( final IGridContainer parent,
final IVirtualOrganization vo,
final IGridResourceCategory category,
final boolean exclusive,
final Class<? extends IGridResource> typeFilter,
final IProgressMonitor monitor )
throws ProblemException
{
List<IAWSService> awsServices = null;
try {
awsServices = this.awsVo.getChildren( monitor, IAWSService.class );
} catch( ProblemException pEx ) {
Activator.log( "Could not load child services", pEx ); //$NON-NLS-1$
}
ArrayList<IGridResource> gridResourcesList = null;
if( awsServices != null ) {
gridResourcesList = new ArrayList<IGridResource>();
for( IAWSService service : awsServices ) {
IGridInfoService infoService = service.getInfoService();
if( infoService != null ) {
IGridResource[] gridResource = infoService.fetchResources( parent,
vo,
category,
exclusive,
typeFilter,
monitor );
Collections.addAll( gridResourcesList, gridResource );
}
}
}
if( gridResourcesList != null ) {
return gridResourcesList.toArray( new IGridResource[ gridResourcesList.size() ] );
}
return new IGridResource[ 0 ];
}
public String getHostName() {
return null;
}
public URI getURI() {
try {
return new URI( Messages.getString( "AWSInfoService.aws_uri" ) ); //$NON-NLS-1$
} catch( URISyntaxException e ) {
return null;
}
}
public IFileStore getFileStore() {
return getParent().getFileStore().getChild( AWSInfoService.STORAGE_NAME );
}
public String getName() {
return "AWS @ " + getURI(); //$NON-NLS-1$
}
public IGridContainer getParent() {
return this.awsVo;
}
public IPath getPath() {
return getParent().getPath().append( AWSInfoService.STORAGE_NAME );
}
public IResource getResource() {
return null;
}
public boolean isLocal() {
return true;
}
}