package org.js.model.feature.csp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.handlers.HandlerUtil;
public abstract class AbstractFeatureModelCommandHandler extends AbstractHandler {
abstract protected Logger getLog();
String featureEditorId = "org.js.model.feature.editor.FeatureEditorID";
String featureTextEditorId = "org.js.model.feature.resource.eft.ui.EftEditor";
/**
* determine the selected files in the workbench.
*
* @return
*/
protected List<IFile> getSelectedWorkbenchFiles(ExecutionEvent event) {
List<IFile> files = new ArrayList<IFile>(5);
// handle workbench files in command
ISelection selection = HandlerUtil.getCurrentSelection(event);
if (selection instanceof IStructuredSelection) {
IStructuredSelection structSelection = (IStructuredSelection) selection;
List< ? > selected = structSelection.toList();
for (Iterator< ? > iterator = selected.iterator(); iterator.hasNext();) {
Object element = (Object) iterator.next();
if (element instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) element;
IResource resource = (IResource) adaptable.getAdapter(IResource.class);
try {
List<IFile> resourceFiles = getFiles(resource);
files.addAll(resourceFiles);
} catch (CoreException e) {
getLog().error("Could not load members of resource '" + resource + "'.");
e.printStackTrace();
}
}
}
}
if (files.size() == 0) {
String editorId = HandlerUtil.getActiveEditorId(event);
if (featureEditorId.equals(editorId) || featureTextEditorId.equals(editorId)) {
// handle editor input in command
IEditorInput editorInput = HandlerUtil.getActiveEditorInput(event);
Object adapter = editorInput.getAdapter(IFile.class);
if (adapter instanceof IFile) {
files.add((IFile) adapter);
}
}
}
return files;
}
/**
* get all files belonging to an iresource recursively.
*
* @param resource
* @return
* @throws CoreException
*/
protected List<IFile> getFiles(IResource resource) throws CoreException {
List<IFile> files = new ArrayList<IFile>(2);
if (resource != null) {
if (resource instanceof IFile) {
IFile file = (IFile) resource;
files.add(file);
getLog().debug("File " + file.getName());
} else if (resource instanceof IFolder) {
IFolder folder = (IFolder) resource;
IResource[] folderMember = folder.members();
for (IResource iResource : folderMember) {
files.addAll(getFiles(iResource));
}
} else if (resource instanceof IProject) {
IProject project = (IProject) resource;
IResource[] members = project.members();
for (IResource iResource : members) {
files.addAll(getFiles(iResource));
}
}
}
return files;
}
/**
* get a textual comma separated representation of the given files.
*
* @param files
* @return
*/
protected String getText(List<IFile> files) {
String result = "";
for (IFile iFile : files) {
if (result.length() > 0) {
result += ", ";
}
String name = iFile.getName();
result += name;
}
return result;
}
}