001/*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019 */
020package org.sonar.java.bytecode.asm;
021
022import java.util.ArrayList;
023import java.util.Collection;
024import java.util.HashSet;
025import java.util.List;
026import java.util.Set;
027
028import org.sonar.squid.api.SourceCodeEdgeUsage;
029
030public class AsmResource {
031
032  private int accessFlags;
033  AsmClass parent;
034  boolean used = false;
035  private List<AsmEdge> outgoingEdges = new ArrayList<AsmEdge>();
036
037  void setAccessFlags(int accessFlags) {
038    this.accessFlags = accessFlags;
039  }
040
041  void addUsesOfClasses(AsmClass[] asmClasses) {
042    for (AsmClass asmClass : asmClasses) {
043      addEdge(new AsmEdge(this, asmClass, SourceCodeEdgeUsage.USES));
044    }
045  }
046
047  public Set<AsmClass> getDistinctUsedAsmClasses() {
048    Set<AsmClass> distinctUsedAsmClasses = new HashSet<AsmClass>();
049    for (AsmEdge usage : getOutgoingEdges()) {
050      if (usage.getUsage() == SourceCodeEdgeUsage.USES) {
051        distinctUsedAsmClasses.add((AsmClass) usage.getTo());
052      }
053    }
054    return distinctUsedAsmClasses;
055  }
056
057  public Set<AsmClass> getImplementedInterfaces() {
058    Set<AsmClass> implementedInterfaces = new HashSet<AsmClass>();
059    for (AsmEdge usage : getOutgoingEdges()) {
060      if (usage.getUsage() == SourceCodeEdgeUsage.IMPLEMENTS) {
061        implementedInterfaces.add((AsmClass) usage.getTo());
062      }
063    }
064    return implementedInterfaces;
065  }
066
067  public void addEdge(AsmEdge edge) {
068    outgoingEdges.add(edge);
069  }
070
071  public Collection<AsmEdge> getOutgoingEdges() {
072    return outgoingEdges;
073  }
074
075  public AsmClass getParent() {
076    return parent;
077  }
078
079  public boolean isAbstract() {
080    return AsmAccessFlags.isAbstract(accessFlags);
081  }
082
083  public boolean isInterface() {
084    return AsmAccessFlags.isInterface(accessFlags);
085  }
086
087  public boolean isStatic() {
088    return AsmAccessFlags.isStatic(accessFlags);
089  }
090
091  boolean isPublic() {
092    return AsmAccessFlags.isPublic(accessFlags);
093  }
094
095  public boolean isPrivate() {
096    return AsmAccessFlags.isPrivate(accessFlags);
097  }
098
099  public boolean isProtected() {
100    return AsmAccessFlags.isProtected(accessFlags);
101  }
102
103  boolean isFinal() {
104    return AsmAccessFlags.isFinal(accessFlags);
105  }
106
107  public boolean isDeprecated() {
108    return AsmAccessFlags.isDeprecated(accessFlags);
109  }
110
111  public void setUsed(boolean used) {
112    this.used = used;
113  }
114
115  public boolean isUsed() {
116    return used;
117  }
118}