/******************************************************************************
* Copyright (c) 2010-2013, Linagora
*
* 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:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.services.sa.projectscnf;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectCategory;
import com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectContentProvider;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.JbiXmlUtils;
import com.ebmwebsourcing.petals.services.PetalsServicesPlugin;
import com.ebmwebsourcing.petals.services.su.projectscnf.SuProjectCategory;
import com.ebmwebsourcing.petals.services.utils.ServiceProjectRelationUtils;
/**
* @author Vincent Zurczak - EBM WebSourcing
*/
public class SaProjectContentProvider extends PetalsProjectContentProvider {
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.BaseWorkbenchContentProvider
* #getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren( Object element ) {
if( element instanceof IProject ) {
IProject p = (IProject) element;
if( ! p.isOpen())
return new Object[ 0 ];
try {
// SA project: show the pom.xml, the jbi.xml and the SU projects
if( ServiceProjectRelationUtils.isSaProject( p )) {
List<Object> result = new ArrayList<Object>();
IResource[] members = p.members();
for( IResource member : members ) {
if( ! member.isAccessible())
continue;
if( member instanceof IFile )
result.add( member );
else if( member instanceof IContainer && "target".equals( member.getName()))
result.add( member );
}
try {
IFile f = JbiXmlUtils.getJbiXmlFile( p );
result.add( f );
} catch( FileNotFoundException e ) {
PetalsServicesPlugin.log( e, IStatus.ERROR );
}
for( IProject refP : p.getReferencedProjects()) {
if( ! refP.isAccessible())
continue;
IPath loc = refP.getLocation();
if( loc == null ) {
PetalsServicesPlugin.log( "The location of the project " + refP.getName() + " could not be retrieved.", IStatus.ERROR );
continue;
}
if( ServiceProjectRelationUtils.isSuProject( refP ))
result.add( refP );
}
return result.toArray();
}
// SU project: show everything
else {
return p.members();
}
} catch( CoreException e ) {
PetalsServicesPlugin.log( e, IStatus.WARNING );
}
return new Object[ 0 ];
}
return super.getChildren( element );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.BaseWorkbenchContentProvider
* #getParent(java.lang.Object)
*/
@Override
public Object getParent( Object element ) {
if( element instanceof IFile ) {
IResource res = (IResource) element;
if( "jbi.xml".equals( res.getName())
|| "pom.xml".equals( res.getName()))
return res.getProject();
}
return super.getParent( element );
}
/*
* (non-Jsdoc)
* @see com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectContentProvider
* #resourceChanged(org.eclipse.core.resources.IResourceDelta)
*/
@Override
public void resourceChanged( IResourceDelta delta ) {
final IResource resource = delta.getResource();
if( resource instanceof IProject ) {
// Change in an association SU-SA <=> Change in a SA Project's description
if((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0
&& ServiceProjectRelationUtils.isSaProject((IProject) resource)) {
PetalsProjectCategory cat = getProjectCategoryById( SuProjectCategory.SU_CATEGORY_ID );
if( cat == null )
PetalsServicesPlugin.log( "The SU project category could not be found.", IStatus.ERROR );
else
this.runnables.add( getRefreshRunnable( cat ));
this.runnables.add( getRefreshRunnable( resource ));
}
}
super.resourceChanged( delta );
}
/*
* (non-Jsdoc)
* @see com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectContentProvider
* #resourcesRemoved(java.util.Collection)
*/
@Override
public void resourcesRemoved( Collection<IResource> resources ) {
if( !( this.viewer instanceof AbstractTreeViewer ))
return;
// Deletion of SU projects => if there are associated SA, refresh them
for( final IResource res : resources ) {
// Handle projects specifically
if( res instanceof IProject ) {
List<IProject> saProjects = ServiceProjectRelationUtils.getReferencingSaProjects((IProject) res);
for( IProject saProject : saProjects )
this.runnables.add( getRefreshRunnable( saProject ));
}
}
// And always apply the basic treatment
super.resourcesRemoved( resources );
}
}