/*******************************************************************************
* Copyright (c) 2012 BMW Car IT and others.
* 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
*******************************************************************************/
package org.jnario.suite.ui.launching;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtend.core.xtend.XtendFile;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.common.types.JvmIdentifiableElement;
import org.eclipse.xtext.generator.IDerivedResourceMarkers;
import org.eclipse.xtext.ui.resource.IResourceSetProvider;
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations;
import org.eclipse.xtext.xbase.ui.launching.JavaElementDelegateJunitLaunch;
import org.jnario.suite.jvmmodel.SuiteClassNameProvider;
import org.jnario.suite.suite.Suite;
import org.jnario.suite.suite.SuiteFile;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
/**
* @author Sebastian Benz - Initial contribution and API
*/
@SuppressWarnings("restriction")
public class SuiteJavaElementDelegate extends JavaElementDelegateJunitLaunch {
private final static Logger log = Logger.getLogger(SuiteJavaElementDelegate.class);
@Inject
private IJvmModelAssociations associations;
@Inject private IResourceSetProvider resourceSetProvider;
@Inject private SuiteClassNameProvider nameProvider;
@Inject private IDerivedResourceMarkers derivedResourceMarkers;
protected IJavaElement getJavaElementForResource(IResource resource) {
try {
final URI uri = URI.createPlatformResourceURI(resource.getFullPath().toString(), true);
String mainClassName = loadSuite(resource, uri);
if(mainClassName == null){
return null;
}
List<IFile> resources = derivedResourceMarkers.findDerivedResources(resource.getProject(), uri.toString());
for (IFile file : resources) {
if (file.getName().equals(mainClassName)){
return JavaCore.create(file);
}
}
} catch (CoreException e) {
if (log.isDebugEnabled()) {
log.debug(e.getMessage(), e);
}
}
return null;
}
protected String loadSuite(IResource resource, final URI uri) {
ResourceSet resourceSet = resourceSetProvider.get(resource.getProject());
Resource r = resourceSet.getResource(uri, true);
if(r == null || r.getContents().isEmpty()){
return null;
}
SuiteFile suiteFile = Iterables.filter(r.getContents(), SuiteFile.class).iterator().next();
if(suiteFile.getXtendTypes().isEmpty()){
return null;
}
Suite suite = (Suite) suiteFile.getXtendTypes().get(0);
return nameProvider.toJavaClassName(suite) + ".java";
}
@Override
protected JvmIdentifiableElement findAssociatedJvmElement(EObject element) {
if (element == null)
return null;
if (element instanceof XtendFile) {
XtendFile specFile = (XtendFile) element;
if(!specFile.getXtendTypes().isEmpty()){
element = specFile.getXtendTypes().get(0);
}
}else{
element = EcoreUtil2.getContainerOfType(element, XtendClass.class);
}
Set<EObject> elements = associations.getJvmElements(element);
if (elements.isEmpty()) {
return findAssociatedJvmElement(element.eContainer());
}
return super.findAssociatedJvmElement(element);
}
}