/*******************************************************************************
* Copyright (c) 2007, 2009 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.webflow.ui.graph;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.ui.IEditorPart;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.ui.editor.util.BeansEditorUtils;
import org.springframework.ide.eclipse.core.java.Introspector;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.core.model.validation.IValidationProblemMarker;
import org.springframework.ide.eclipse.core.model.validation.ValidationProblem;
import org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils;
import org.springframework.ide.eclipse.webflow.core.internal.model.validation.WebflowValidator;
import org.springframework.ide.eclipse.webflow.core.model.IState;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowConfig;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowModelElement;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowProject;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowState;
import org.springframework.ide.eclipse.webflow.ui.editor.Activator;
/**
* Some helper methods for {@link WebflowEditor}
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
@SuppressWarnings("restriction")
public abstract class WebflowUtils {
private static final Set<IMethod> NO_METHOD_MATCHES = new HashSet<IMethod>();
public static WebflowEditor getActiveFlowEditor() {
IEditorPart editorPart = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
if (editorPart instanceof WebflowEditor) {
return (WebflowEditor) editorPart;
}
return null;
}
public static WebflowEditorInput getActiveFlowEditorInput() {
WebflowEditor editor = getActiveFlowEditor();
if (editor != null) {
return (WebflowEditorInput) editor.getEditorInput();
}
return null;
}
public static IWebflowConfig getActiveWebflowConfig() {
WebflowEditorInput editorInput = getActiveFlowEditorInput();
if (editorInput != null && editorInput.getFile() != null) {
IWebflowProject project = org.springframework.ide.eclipse.webflow.core.Activator
.getModel().getProject(editorInput.getFile().getProject());
if (project != null) {
return project.getConfig(editorInput.getFile());
}
}
return null;
}
public static Set<IBean> getBeansFromEditorInput() {
return WebflowModelUtils.getBeans(getActiveWebflowConfig());
}
public static Set<IMethod> getActionMethods(IDOMNode node) {
Set<IBean> beans = getBeansFromEditorInput();
String className = null;
for (IBean bean : beans) {
if (bean.getElementName().equals(BeansEditorUtils.getAttribute(node, "bean"))) {
className = BeansModelUtils.getBeanClass(bean, null);
}
}
IType type = JdtUtils.getJavaType(getActiveFlowEditorInput().getFile().getProject(),
className);
if (type != null) {
if ("bean-action".equals(node.getLocalName())) {
return Introspector.findAllMethods(type, WebflowModelUtils.getBeanMethodFilter());
}
else {
return Introspector.findAllMethods(type, WebflowModelUtils
.getBeanActionMethodFilter());
}
}
return NO_METHOD_MATCHES;
}
public static String[] getWebflowConfigNames() {
IWebflowProject project = getActiveWebflowConfig().getProject();
return WebflowModelUtils.getWebflowConfigNames(project).toArray(new String[0]);
}
public static boolean isValid(IWebflowModelElement element) {
Set<ValidationProblem> validationProblems = validate(element);
return validationProblems == null || validationProblems.size() == 0;
}
public static Set<ValidationProblem> validate(IWebflowModelElement element) {
IWebflowState webflowState = WebflowModelUtils.getWebflowState(element, true);
if (webflowState != null) {
IWebflowConfig config = (IWebflowConfig) webflowState.getElementParent();
NoMarkerCreatingWebflowValidator validator = new NoMarkerCreatingWebflowValidator();
Set<IResource> affectedResources = new HashSet<IResource>();
affectedResources.add(config.getElementResource());
try {
validator.validate(affectedResources, IncrementalProjectBuilder.INCREMENTAL_BUILD,
new NullProgressMonitor());
return validator.getValidationProblems();
}
catch (CoreException e) {
}
}
return null;
}
public static String getErrorTooltip(IWebflowModelElement element) {
StringBuffer buf = new StringBuffer();
Set<ValidationProblem> validationProblems = validate(element);
if (validationProblems != null && validationProblems.size() > 0) {
buf.append("\n\nProblems:");
for (ValidationProblem problem : validationProblems) {
buf.append("\n");
buf.append(problem.getMessage());
}
}
return buf.toString();
}
public static String[] getStateId(IWebflowModelElement parent) {
IWebflowState webflowState = WebflowModelUtils.getWebflowState(parent, false);
List<String> stateIds = new ArrayList<String>();
if (webflowState != null) {
for (IState state : webflowState.getStates()) {
stateIds.add(state.getId());
}
}
return stateIds.toArray(new String[stateIds.size()]);
}
private static class NoMarkerCreatingWebflowValidator extends WebflowValidator {
private Set<ValidationProblem> validationProblems = new HashSet<ValidationProblem>();
public NoMarkerCreatingWebflowValidator() {
setMarkerId(VALIDATOR_ID);
}
protected void createProblemMarker(IResource resource, ValidationProblem problem) {
if (problem.getSeverity() == IValidationProblemMarker.SEVERITY_ERROR) {
validationProblems.add(problem);
}
}
public void cleanup(IResource resource, IProgressMonitor monitor) {
}
public Set<ValidationProblem> getValidationProblems() {
return this.validationProblems;
}
public boolean hasErrors() {
return this.validationProblems.size() > 0;
}
@Override
protected String getValidatorId() {
return VALIDATOR_ID;
}
}
}