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