Package org.springframework.ide.eclipse.ajdt.ui.visualiser

Source Code of org.springframework.ide.eclipse.ajdt.ui.visualiser.AopReferenceModelMarkupProvider

/*******************************************************************************
* Copyright (c) 2007, 2008 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.ajdt.ui.visualiser;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

import org.eclipse.contribution.visualiser.core.ProviderManager;
import org.eclipse.contribution.visualiser.core.Stripe;
import org.eclipse.contribution.visualiser.interfaces.IMember;
import org.eclipse.contribution.visualiser.jdtImpl.JDTContentProvider;
import org.eclipse.contribution.visualiser.jdtImpl.JDTMember;
import org.eclipse.contribution.visualiser.simpleImpl.SimpleMarkupKind;
import org.eclipse.contribution.visualiser.simpleImpl.SimpleMarkupProvider;
import org.eclipse.contribution.visualiser.utils.JDTUtils;
import org.eclipse.contribution.visualiser.utils.MarkupUtils;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.springframework.ide.eclipse.aop.core.Activator;
import org.springframework.ide.eclipse.aop.core.internal.model.AopReferenceModel;
import org.springframework.ide.eclipse.aop.core.model.IAopModelChangedListener;
import org.springframework.ide.eclipse.aop.core.model.IAopReference;
import org.springframework.ide.eclipse.aop.core.model.IIntroductionDefinition;
import org.springframework.ide.eclipse.aop.core.model.IAopReference.ADVICE_TYPE;
import org.springframework.ide.eclipse.aop.ui.navigator.util.AopReferenceModelNavigatorUtils;

/**
* Implementation of AJDT's {@link SimpleMarkupProvider} that contributes
* elements from the {@link AopReferenceModel}.
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
public class AopReferenceModelMarkupProvider extends SimpleMarkupProvider
    implements IAopModelChangedListener {

  // Cache: IMember -> List(Stripe)
  private static Hashtable<IMember, List<Stripe>> markupCache = new Hashtable<IMember, List<Stripe>>();

  public static void resetCache() {
    markupCache.clear();
  }

  /**
   * Get a List of Stripes for the given member, which are its markups.
   */
  @Override
  public List<Stripe> getMemberMarkups(IMember member) {

    List<Stripe> cachedValue = markupCache.get(member);
    if (cachedValue != null) {
      return cachedValue;
    }

    List<Stripe> stripeList = new ArrayList<Stripe>();
    if (ProviderManager.getContentProvider() instanceof JDTContentProvider) {
      List<IAopReference> references = org.springframework.ide.eclipse.aop.core.Activator
          .getModel().getAllReferences();
      if (references != null && references.size() > 0) {
        for (IAopReference reference : references) {
          IType advisedType = null;
          if (reference.getTarget() instanceof IType) {
            advisedType = (IType) reference.getTarget();
          }
          else {
            advisedType = reference.getTarget().getDeclaringType();
          }
          ICompilationUnit advisedCu = advisedType
              .getCompilationUnit();
          if (member instanceof JDTMember) {
            IJavaElement je = ((JDTMember) member).getResource();
            if (je.equals(advisedCu)) {
              String label = getText(reference);
              Stripe stripe = new Stripe(new SimpleMarkupKind(
                  label), AopReferenceModelNavigatorUtils
                  .getLineNumber(reference.getTarget()) + 1);
              stripeList.add(stripe);
              addMarkup(member.getFullname(), stripe);
            }
          }
        }
      }
    }
    MarkupUtils.processStripes(stripeList);
    markupCache.put(member, stripeList);
    return stripeList;
  }

  /**
   * Get all the markup kinds
   * @return a Set of Strings
   */
  @Override
  public SortedSet<SimpleMarkupKind> getAllMarkupKinds() {
    SortedSet<SimpleMarkupKind> kinds = new TreeSet<SimpleMarkupKind>();
    List<String> advices = new ArrayList<String>();
    if (ProviderManager.getContentProvider() instanceof JDTContentProvider) {
      List<IAopReference> references = Activator.getModel()
          .getAllReferences();
      if (references != null && references.size() > 0) {
        for (IAopReference reference : references) {
          String label = getText(reference);
          if (!advices.contains(label)) {
            kinds.add(new SimpleMarkupKind(label));
            advices.add(label);
          }
        }
      }
    }
    if (kinds.size() > 0) {
      return kinds;
    }
    return null;
  }

  /**
   * Process a mouse click on a stripe. This method opens the editor at the
   * line of the stripe clicked.
   * @see org.eclipse.contribution.visualiser.interfaces.IMarkupProvider#processMouseclick(org.eclipse.contribution.visualiser.interfaces.IMember,
   * org.eclipse.contribution.visualiser.core.Stripe, int)
   */
  @Override
  public boolean processMouseclick(IMember member, Stripe stripe,
      int buttonClicked) {
    if (buttonClicked == 1) {
      if (member instanceof JDTMember) {
        IJavaElement jEl = ((JDTMember) member).getResource();
        if (jEl != null) {
          JDTUtils
              .openInEditor(jEl.getResource(), stripe.getOffset());
        }
      }
      return false;
    }
    return true;
  }

  private String getText(IAopReference reference) {
    ADVICE_TYPE type = reference.getAdviceType();
    String text = "";
    if (type == ADVICE_TYPE.AFTER) {
      text += "after()";
    }
    else if (type == ADVICE_TYPE.AFTER_RETURNING) {
      text += "after-returning()";
    }
    else if (type == ADVICE_TYPE.AFTER_THROWING) {
      text += "after-throwing()";
    }
    else if (type == ADVICE_TYPE.BEFORE) {
      text += "before()";
    }
    else if (type == ADVICE_TYPE.AROUND) {
      text += "around()";
    }
    else if (type == ADVICE_TYPE.DECLARE_PARENTS) {
      text += "declare parents:";
      text += " implements "
          + ((IIntroductionDefinition) reference.getDefinition())
              .getImplInterfaceName();
    }
    text += " <";
    text += reference.getDefinition().getAspectName();
    text += "> [";
    text += reference.getDefinition().getResource()
        .getProjectRelativePath().toString();
    text += "]";
    return text;
  }

  public void changed() {
    resetCache();
  }

  /**
   * Activate the provider
   */
  @Override
  public void activate() {
    Activator.getModel().registerAopModelChangedListener(this);
  }

  /**
   * Deactivate the provider
   */
  @Override
  public void deactivate() {
    super.deactivate();
    Activator.getModel().unregisterAopModelChangedListener(this);
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.ajdt.ui.visualiser.AopReferenceModelMarkupProvider

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.