Package org.springframework.ide.eclipse.webflow.core.internal.model

Source Code of org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils

/*******************************************************************************
* Copyright (c) 2007 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.core.internal.model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.document.DOMModelImpl;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
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.FlagsMethodFilter;
import org.springframework.ide.eclipse.core.java.IMethodFilter;
import org.springframework.ide.eclipse.core.java.Introspector;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.webflow.core.Activator;
import org.springframework.ide.eclipse.webflow.core.model.IInlineFlowState;
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.IWebflowModel;
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;

/**
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
@SuppressWarnings("restriction")
public class WebflowModelUtils {

  private static final Set<IMethod> NO_METHOD_MATCHES = new HashSet<IMethod>();
 
  private static final String EVENT_CLASS = "org.springframework.webflow.execution.Event";

  private static final String REQUEST_CONTEXT_CLASS = "org.springframework.webflow.execution.RequestContext";

  public static IMethodFilter getBeanMethodFilter() {
    return new FlagsMethodFilter(FlagsMethodFilter.PUBLIC
        | FlagsMethodFilter.NOT_INTERFACE
        | FlagsMethodFilter.NOT_CONSTRUCTOR, EVENT_CLASS,
        new String[] { REQUEST_CONTEXT_CLASS });
  }

  public static IMethodFilter getBeanActionMethodFilter() {
    return new FlagsMethodFilter(FlagsMethodFilter.PUBLIC
        | FlagsMethodFilter.NOT_INTERFACE
        | FlagsMethodFilter.NOT_CONSTRUCTOR);
  }
 
  public static IType getActionType(IWebflowConfig config, IDOMNode node) {
    Set<IBean> beans = getBeans(config);
    String className = null;
    for (IBean bean : beans) {
      if (bean.getElementName().equals(
          BeansEditorUtils.getAttribute(node, "bean"))) {
        className = BeansModelUtils.getBeanClass(bean, null);
        break;
      }
    }

    return JdtUtils.getJavaType(config.getProject().getProject(), className);
  }

  public static Set<IMethod> getActionMethods(IWebflowConfig config,
      IDOMNode node) {
    IType type = getActionType(config, node);
    if (type != null) {
      if ("bean-action".equals(node.getLocalName())) {
        return Introspector.findAllMethods(type, getBeanActionMethodFilter());
      }
      else {
        return Introspector.findAllMethods(type, getBeanMethodFilter());
      }
    }
    return NO_METHOD_MATCHES;
  }

  public static Set<IBean> getBeans(IWebflowConfig config) {
    Set<IModelElement> beansConfigs = config.getBeansConfigs();
    Set<IBean> beans = new HashSet<IBean>();

    if (beansConfigs != null) {
      for (IModelElement bc : beansConfigs) {
        beans.addAll(BeansModelUtils.getBeans(bc, null));
      }
    }

    return beans;
  }

  public static List<IFile> getFiles(IProject project) {
    IWebflowProject webflowProject = Activator.getModel().getProject(
        project);
    List<IFile> files = new ArrayList<IFile>();
    if (webflowProject != null) {
      for (IWebflowConfig config : webflowProject.getConfigs()) {
        files.add(config.getResource());
      }
    }
    return files;
  }

  public static IWebflowConfig getWebflowConfig(IFile file) {
    IWebflowModel model = Activator.getModel();
    return (file != null && file.getProject() != null
        && model.getProject(file.getProject()) != null
        && model.getProject(file.getProject()).getConfig(file) != null ? model
        .getProject(file.getProject()).getConfig(file)
        : null);
  }

  public static IWebflowState getWebflowState(IFile file) {
    IStructuredModel model = null;
    try {
      model = StructuredModelManager.getModelManager()
          .getExistingModelForRead(file);
      if (model == null) {
        model = StructuredModelManager.getModelManager()
            .getModelForRead(file);

      }
      if (model != null) {
        IDOMDocument document = ((DOMModelImpl) model).getDocument();
        IWebflowState webflowState = new WebflowState(WebflowModelUtils
            .getWebflowConfig(file));
        webflowState.init((IDOMNode) document.getDocumentElement(),
            null);
        return webflowState;
      }
    }
    catch (Exception e) {
    }
    finally {
      if (model != null) {
        model.releaseFromRead();
      }
    }
    return null;
  }

  public static boolean isReferencedBeanFound(IWebflowConfig config,
      String beanName) {
    Set<IModelElement> beansConfigs = config.getBeansConfigs();
    for (IModelElement beansConfig : beansConfigs) {
      if (BeansModelUtils.getBean(beanName, beansConfig) != null) {
        return true;
      }
    }
    return false;
  }

  public static IWebflowState getWebflowState(IWebflowModelElement element,
      boolean resolveToRoot) {
    if (element != null) {
      if (element instanceof IWebflowState) {
        if (resolveToRoot
            && element.getElementParent() instanceof InlineFlowState) {
          return getWebflowState((IWebflowModelElement) element
              .getElementParent(), resolveToRoot);
        }
        else {
          return (IWebflowState) element;
        }
      }
      else {
        return getWebflowState((IWebflowModelElement) element
            .getElementParent(), resolveToRoot);
      }
    }
    else {
      return null;
    }
  }

  public static IState getState(IWebflowModelElement element) {
    if (element != null) {
      if (element instanceof IState) {
        return (IState) element;
      }
      else {
        return getState((IWebflowModelElement) element
            .getElementParent());
      }
    }
    else {
      return null;
    }
  }

  public static boolean isWebflowConfig(IResource resource) {
    if (resource instanceof IFile && resource.isAccessible()) {
      return getWebflowConfig((IFile) resource) != null;
    }
    return false;
  }

  public static boolean isStateIdUnique(IState state) {
    IWebflowState webflowState = getWebflowState(state, false);
    List<IState> foundStates = new ArrayList<IState>();
    if (webflowState != null) {
      List<IState> states = new ArrayList<IState>();
      states.addAll(webflowState.getStates());
      states.addAll(webflowState.getInlineFlowStates());
      for (IState s : states) {
        if (s.getId().equals(state.getId())) {
          foundStates.add(s);
        }
      }
    }
    return foundStates.size() == 1;
  }

  public static Set<String> getWebflowConfigNames(IWebflowProject project) {
    Set<String> flowNames = new HashSet<String>();
    for (IWebflowConfig config : project.getConfigs()) {
      flowNames.add(config.getName());
    }
    return flowNames;
  }

  public static Set<String> getWebflowConfigNames(IWebflowState state) {
    Set<String> flowNames = new HashSet<String>();
    for (IInlineFlowState config : state.getInlineFlowStates()) {
      flowNames.add(config.getId());
    }
    return flowNames;
  }

}
TOP

Related Classes of org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.