Package org.springframework.ide.eclipse.beans.mylyn.core

Source Code of org.springframework.ide.eclipse.beans.mylyn.core.BeansContextStructureBridge

/*******************************************************************************
* Copyright (c) 2007, 2010 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.beans.mylyn.core;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge;
import org.eclipse.swt.widgets.Display;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.metadata.model.IBeanMetadata;
import org.springframework.ide.eclipse.beans.core.metadata.model.IClassMetadata;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansModel;
import org.springframework.ide.eclipse.beans.core.model.IBeansProject;
import org.springframework.ide.eclipse.beans.ui.model.metadata.BeanMetadataNode;
import org.springframework.ide.eclipse.beans.ui.model.metadata.BeanMetadataReference;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.model.ILazyInitializedModelElement;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.ISpringProject;

/**
* {@link AbstractContextStructureBridge} extension that integrates the {@link IBeansModel} with Mylyn.
* @author Christian Dupuis
* @since 2.0
*/
@SuppressWarnings("restriction")
public class BeansContextStructureBridge extends AbstractContextStructureBridge {

  public static final String CONTENT_TYPE = "spring/beans";

  @Override
  public boolean acceptsObject(Object object) {
    return object instanceof IModelElement
        // Make this bridge aware of meta data contributions
        || object instanceof BeanMetadataNode || object instanceof BeanMetadataReference
        || object instanceof IBeanMetadata || (object instanceof IFile && isBeansConfig((IFile) object));
  }

  @Override
  public boolean canBeLandmark(String handle) {
    return true;
  }

  @Override
  public boolean canFilter(Object obj) {
    if (obj instanceof IModelElement) {
      IModelElement modelElement = (IModelElement) obj;

      // not necessary, context propagation will make all parent elements interesting
      // IModelElement[] children = modelElement.getElementChildren();
      // for (IModelElement child : children) {
      // IInteractionElement node = ContextCore.getContextManager().getElement(
      // getHandleIdentifier(child));
      // if (node != null && node.getInterest().isInteresting()) {
      // return false;
      // }
      // if (!canFilter(child)) {
      // return false;
      // }
      // }

      if (modelElement instanceof ISpringProject) {
        IBeansProject beansProject = BeansModelUtils.getProject(modelElement);
        return canFilter(beansProject);
      }
      if (obj instanceof IBeansConfig) {
        return true;
      }

      IInteractionElement node = ContextCore.getContextManager().getElement(getHandleIdentifier(obj));
      if (node != null && node.getInterest().isInteresting()) {
        return false;
      }
    }
    else if ((obj instanceof IFile && isBeansConfig((IFile) obj))) {
      IInteractionElement node = ContextCore.getContextManager().getElement(getHandleIdentifier(obj));
      if (node != null && node.getInterest().isInteresting()) {
        return false;
      }
    }
    // Support for meta data
    else if (obj instanceof BeanMetadataReference) {
      for (Object child : ((BeanMetadataReference) obj).getChildren()) {
        if (!canFilter(child)) {
          return false;
        }
      }
    }
    else if (obj instanceof BeanMetadataNode) {
      IInteractionElement node = ContextCore.getContextManager().getElement(
          ((BeanMetadataNode) obj).getHandleIdentifier());
      if (node != null && node.getInterest().isInteresting()) {
        return false;
      }
      for (Object child : ((BeanMetadataNode) obj).getChildren()) {
        if (!canFilter(child)) {
          return false;
        }
      }
    }
    else if (obj instanceof IClassMetadata) {
      IInteractionElement node = ContextCore.getContextManager().getElement(
          ((IBeanMetadata) obj).getHandleIdentifier());
      if (node != null && node.getInterest().isInteresting()) {
        return false;
      }
      for (Object child : ((IClassMetadata) obj).getMethodMetaData()) {
        if (!canFilter(child)) {
          return false;
        }
      }
    }
    else if (obj instanceof IBeanMetadata) {
      IInteractionElement node = ContextCore.getContextManager().getElement(
          ((IBeanMetadata) obj).getHandleIdentifier());
      if (node != null && node.getInterest().isInteresting()) {
        return false;
      }
    }

    AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
    if (parentBridge != null && !parentBridge.canFilter(obj)) {
      return false;
    }

    return true;
  }

  @Override
  public List<String> getChildHandles(String handle) {
    Object obj = getObjectForHandle(handle);
    if (obj != null && obj instanceof IModelElement) {
      List<String> childHandles = new ArrayList<String>();
      IModelElement[] children = ((IModelElement) obj).getElementChildren();
      for (IModelElement child : children) {
        childHandles.add(child.getElementID());
      }
      return childHandles;
    }
    return Collections.emptyList();
  }

  @Override
  public String getContentType() {
    return CONTENT_TYPE;
  }

  @Override
  public String getContentType(String handle) {
    Object obj = getObjectForHandle(handle);
    if (obj instanceof IModelElement) {
      return CONTENT_TYPE;
    }
    else {
      return ContextCore.CONTENT_TYPE_RESOURCE;
    }
  }

  @Override
  public String getHandleForOffsetInObject(Object arg0, int arg1) {
    return null;
  }

  @Override
  public String getHandleIdentifier(Object obj) {
    if (obj instanceof IModelElement) {
      return ((IModelElement) obj).getElementID();
    }
    else if (obj instanceof IBeanMetadata) {
      return ((IBeanMetadata) obj).getHandleIdentifier();
    }
    else if ((obj instanceof IFile && isBeansConfig((IFile) obj))) {
      return BeansModelUtils.getResourceModelElement(obj).getElementID();
    }
    return null;
  }

  @Override
  public String getLabel(Object obj) {
    if (obj instanceof IModelElement) {
      return ((IModelElement) obj).getElementName();
    }
    else if ((obj instanceof IFile && isBeansConfig((IFile) obj))) {
      return BeansModelUtils.getResourceModelElement(obj).getElementName();
    }
    return null;
  }

  @Override
  public Object getObjectForHandle(String handle) {
    Object obj = null;
    if (handle != null) {
      obj = BeansCorePlugin.getModel().getElement(handle);
      if (obj != null) {
        return obj;
      }
      obj = SpringCore.getModel().getElement(handle);
      if (obj != null) {
        return obj;
      }
    }
    AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
    if (parentBridge != null) {
      obj = parentBridge.getObjectForHandle(handle);
    }

    return obj;
  }

  @Override
  public String getParentHandle(String handle) {
    Object obj = getObjectForHandle(handle);
    if (obj instanceof IBeansProject) {
      return SpringCore.getModel().getProject(((IBeansProject) obj).getProject()).getElementID();
    }
    else if (obj instanceof ISpringProject) {
      AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
      if (parentBridge != null && parentBridge instanceof ResourceStructureBridge) {
        return parentBridge.getHandleIdentifier(((ISpringProject) obj).getProject());
      }
    }
    else if (obj != null && obj instanceof IModelElement) {
      IModelElement parent = ((IModelElement) obj).getElementParent();
      if (parent != null) {
        return parent.getElementID();
      }
    }
    else {
      AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);

      if (parentBridge != null && parentBridge instanceof ResourceStructureBridge) {
        return parentBridge.getParentHandle(handle);
      }
    }
    return null;
  }

  @Override
  public boolean isDocument(String handle) {
    Object obj = getObjectForHandle(handle);
    if (obj != null && obj instanceof IBeansConfig) {
      return true;
    }
    return false;
  }

  public static boolean isBeansConfig(IFile configFile) {
    return isBeansConfig(configFile, true);
  }

  private static IBeansConfig getBeansConfig(IFile configFile, IBeansProject project, boolean includeImports) {
    for (String suffix : project.getConfigSuffixes()) {
      if (configFile.getName().endsWith(suffix)) {
        if (includeImports && Display.getCurrent() != null && project instanceof ILazyInitializedModelElement
            && !((ILazyInitializedModelElement) project).isInitialized()) {
          // skip: it's too expensive to load the model on the UI thread
          includeImports = false;
        }
        IBeansConfig bc = project.getConfig(configFile, includeImports);
        if (bc != null) {
          return bc;
        }
      }
    }
    return null;
  }

  private static boolean isBeansConfig(IFile configFile, boolean includeImports) {
    IBeansProject project = BeansCorePlugin.getModel().getProject(configFile.getProject());
    if (project != null) {
      IBeansConfig bc = getBeansConfig(configFile, project, includeImports);
      if (bc != null)
        return true;
    }

    for (IBeansProject p : BeansCorePlugin.getModel().getProjects()) {
      IBeansConfig bc = getBeansConfig(configFile, p, includeImports);
      if (bc != null)
        return true;
    }

    return false;
  }

}
TOP

Related Classes of org.springframework.ide.eclipse.beans.mylyn.core.BeansContextStructureBridge

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.