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.api;
021
022import org.apache.commons.lang.StringUtils;
023import org.sonar.api.resources.*;
024
025/**
026 * @since 2.6
027 */
028public final class JavaMethod extends Method {
029
030  public static final String QUALIFIER = Qualifiers.METHOD;
031
032  public static final int UNKNOWN_LINE = -1;
033  private static final String CLASS_SEPARATOR = "#";
034
035  private String signature;
036  private String className;
037  private int fromLine;
038  private int toLine;
039  private boolean isAccessor = false;
040
041  private JavaMethod(String className, String signature) {
042    super(toKey(className, signature), QUALIFIER, Java.INSTANCE);
043    this.className = className;
044    this.signature = signature;
045  }
046
047  private JavaMethod(String className, String signature, int fromLine, int toLine, boolean isAccessor) {
048    this(className, signature);
049    this.fromLine = fromLine;
050    this.toLine = toLine;
051    this.isAccessor = isAccessor;
052  }
053
054  public int getFromLine() {
055    return fromLine;
056  }
057
058  public int getToLine() {
059    return toLine;
060  }
061
062  public String getSignature() {
063    return signature;
064  }
065
066  public String getClassName() {
067    return className;
068  }
069
070  public boolean isAccessor() {
071    return isAccessor;
072  }
073
074  @Override
075  public String getName() {
076    return signature;
077  }
078
079  @Override
080  public String getLongName() {
081    return getKey();
082  }
083
084  @Override
085  public String getDescription() {
086    return null;
087  }
088
089  @Override
090  public Resource getParent() {
091    return null;
092  }
093
094  @Override
095  public String toString() {
096    return getKey();
097  }
098
099  public static JavaMethod createRef(String key) {
100    String[] parts = splitClassAndMethodFromKey(key);
101    return new JavaMethod(parts[0], parts[1]);
102  }
103
104  private static String[] splitClassAndMethodFromKey(String key) {
105    String[] parts = StringUtils.split(key, CLASS_SEPARATOR);
106    if (parts.length!=2) {
107      throw new IllegalArgumentException("Java method does not respect the format: org.foo.Bar#methodName(LString;)V. Got: " + key);
108    }
109    return parts;
110  }
111
112  public static JavaMethod createRef(JavaClass javaClass, String signature) {
113    return new JavaMethod(javaClass.getName(), signature);
114  }
115
116  static String toKey(JavaClass javaClass, String signature) {
117    return toKey(javaClass.getName(), signature);
118  }
119
120  static String toKey(String className, String signature) {
121    return new StringBuilder().append(className).append(CLASS_SEPARATOR).append(signature).toString();
122  }
123
124  public static class Builder {
125    private String className;
126    private String signature;
127    private int fromLine = UNKNOWN_LINE;
128    private int toLine = UNKNOWN_LINE;
129    private boolean isAccessor = false;
130
131    public Builder setKey(String key) {
132      String[] parts = splitClassAndMethodFromKey(key);
133      this.className = parts[0];
134      this.signature = parts[1];
135      return this;
136    }
137
138    public Builder setClass(String className) {
139      this.className = className;
140      return this;
141    }
142
143    public Builder setClass(JavaClass javaClass) {
144      this.className = javaClass.getName();
145      return this;
146    }
147
148    public Builder setSignature(String signature) {
149      this.signature = signature;
150      return this;
151    }
152
153    public Builder setFromLine(int fromLine) {
154      this.fromLine = Math.max(UNKNOWN_LINE, fromLine);
155      return this;
156    }
157
158    public Builder setToLine(int toLine) {
159      this.toLine = Math.max(UNKNOWN_LINE, toLine);
160      return this;
161    }
162
163    public Builder setAccessor(boolean accessor) {
164      isAccessor = accessor;
165      return this;
166    }
167
168    public JavaMethod create() {
169      return new JavaMethod(className, signature, fromLine, toLine, isAccessor);
170    }
171  }
172}