/**
* Copyright 2006-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mybatis.generator.api.dom.java;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
import org.mybatis.generator.api.dom.OutputUtilities;
/**
* The Class Method.
*
* @author Jeff Butler
*/
public class Method extends JavaElement {
/** The body lines. */
private List<String> bodyLines;
/** The constructor. */
private boolean constructor;
/** The return type. */
private FullyQualifiedJavaType returnType;
/** The name. */
private String name;
/** The type parameters. */
private List<TypeParameter> typeParameters;
/** The parameters. */
private List<Parameter> parameters;
/** The exceptions. */
private List<FullyQualifiedJavaType> exceptions;
/** The is synchronized. */
private boolean isSynchronized;
/** The is native. */
private boolean isNative;
private boolean isDefault;
/**
* Instantiates a new method.
*/
public Method() {
// use a default name to avoid malformed code
this("bar"); //$NON-NLS-1$
}
/**
* Instantiates a new method.
*
* @param name
* the name
*/
public Method(String name) {
super();
bodyLines = new ArrayList<String>();
typeParameters = new ArrayList<TypeParameter>();
parameters = new ArrayList<Parameter>();
exceptions = new ArrayList<FullyQualifiedJavaType>();
this.name = name;
}
/**
* Copy constructor. Not a truly deep copy, but close enough for most purposes.
*
* @param original
* the original
*/
public Method(Method original) {
super(original);
bodyLines = new ArrayList<String>();
typeParameters = new ArrayList<TypeParameter>();
parameters = new ArrayList<Parameter>();
exceptions = new ArrayList<FullyQualifiedJavaType>();
this.bodyLines.addAll(original.bodyLines);
this.constructor = original.constructor;
this.exceptions.addAll(original.exceptions);
this.name = original.name;
this.typeParameters.addAll(original.typeParameters);
this.parameters.addAll(original.parameters);
this.returnType = original.returnType;
this.isNative = original.isNative;
this.isSynchronized = original.isSynchronized;
}
/**
* Gets the body lines.
*
* @return Returns the bodyLines.
*/
public List<String> getBodyLines() {
return bodyLines;
}
/**
* Adds the body line.
*
* @param line
* the line
*/
public void addBodyLine(String line) {
bodyLines.add(line);
}
/**
* Adds the body line.
*
* @param index
* the index
* @param line
* the line
*/
public void addBodyLine(int index, String line) {
bodyLines.add(index, line);
}
/**
* Adds the body lines.
*
* @param lines
* the lines
*/
public void addBodyLines(Collection<String> lines) {
bodyLines.addAll(lines);
}
/**
* Adds the body lines.
*
* @param index
* the index
* @param lines
* the lines
*/
public void addBodyLines(int index, Collection<String> lines) {
bodyLines.addAll(index, lines);
}
/**
* Gets the formatted content.
*
* @param indentLevel
* the indent level
* @param interfaceMethod
* the interface method
* @param compilationUnit the compilation unit
* @return the formatted content
*/
public String getFormattedContent(int indentLevel, boolean interfaceMethod, CompilationUnit compilationUnit) {
StringBuilder sb = new StringBuilder();
addFormattedJavadoc(sb, indentLevel);
addFormattedAnnotations(sb, indentLevel);
OutputUtilities.javaIndent(sb, indentLevel);
if (interfaceMethod) {
if (isStatic()) {
sb.append("static "); //$NON-NLS-1$
} else if (isDefault()) {
sb.append("default "); //$NON-NLS-1$
}
} else {
sb.append(getVisibility().getValue());
if (isStatic()) {
sb.append("static "); //$NON-NLS-1$
}
if (isFinal()) {
sb.append("final "); //$NON-NLS-1$
}
if (isSynchronized()) {
sb.append("synchronized "); //$NON-NLS-1$
}
if (isNative()) {
sb.append("native "); //$NON-NLS-1$
} else if (bodyLines.size() == 0) {
sb.append("abstract "); //$NON-NLS-1$
}
}
if (!getTypeParameters().isEmpty()) {
sb.append("<");
boolean comma = false;
for (TypeParameter typeParameter : getTypeParameters()) {
if (comma) {
sb.append(", "); //$NON-NLS-1$
} else {
comma = true;
}
sb.append(typeParameter.getFormattedContent(compilationUnit));
}
sb.append("> ");
}
if (!constructor) {
if (getReturnType() == null) {
sb.append("void"); //$NON-NLS-1$
} else {
sb.append(JavaDomUtils.calculateTypeName(compilationUnit, getReturnType()));
}
sb.append(' ');
}
sb.append(getName());
sb.append('(');
boolean comma = false;
for (Parameter parameter : getParameters()) {
if (comma) {
sb.append(", "); //$NON-NLS-1$
} else {
comma = true;
}
sb.append(parameter.getFormattedContent(compilationUnit));
}
sb.append(')');
if (getExceptions().size() > 0) {
sb.append(" throws "); //$NON-NLS-1$
comma = false;
for (FullyQualifiedJavaType fqjt : getExceptions()) {
if (comma) {
sb.append(", "); //$NON-NLS-1$
} else {
comma = true;
}
sb.append(JavaDomUtils.calculateTypeName(compilationUnit, fqjt));
}
}
// if no body lines, then this is an abstract method
if (bodyLines.size() == 0 || isNative()) {
sb.append(';');
} else {
sb.append(" {"); //$NON-NLS-1$
indentLevel++;
ListIterator<String> listIter = bodyLines.listIterator();
while (listIter.hasNext()) {
String line = listIter.next();
if (line.startsWith("}")) { //$NON-NLS-1$
indentLevel--;
}
OutputUtilities.newLine(sb);
OutputUtilities.javaIndent(sb, indentLevel);
sb.append(line);
if ((line.endsWith("{") && !line.startsWith("switch")) //$NON-NLS-1$ //$NON-NLS-2$
|| line.endsWith(":")) { //$NON-NLS-1$
indentLevel++;
}
if (line.startsWith("break")) { //$NON-NLS-1$
// if the next line is '}', then don't outdent
if (listIter.hasNext()) {
String nextLine = listIter.next();
if (nextLine.startsWith("}")) { //$NON-NLS-1$
indentLevel++;
}
// set back to the previous element
listIter.previous();
}
indentLevel--;
}
}
indentLevel--;
OutputUtilities.newLine(sb);
OutputUtilities.javaIndent(sb, indentLevel);
sb.append('}');
}
return sb.toString();
}
/**
* Checks if is constructor.
*
* @return Returns the constructor.
*/
public boolean isConstructor() {
return constructor;
}
/**
* Sets the constructor.
*
* @param constructor
* The constructor to set.
*/
public void setConstructor(boolean constructor) {
this.constructor = constructor;
}
/**
* Gets the name.
*
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* Sets the name.
*
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* Gets the type parameters.
*
* @return the type parameters
*/
public List<TypeParameter> getTypeParameters() {
return typeParameters;
}
/**
* Adds the type parameter.
*
* @param typeParameter
* the type parameter
*/
public void addTypeParameter(TypeParameter typeParameter) {
typeParameters.add(typeParameter);
}
/**
* Adds the parameter.
*
* @param index
* the index
* @param typeParameter
* the type parameter
*/
public void addTypeParameter(int index, TypeParameter typeParameter) {
typeParameters.add(index, typeParameter);
}
/**
* Gets the parameters.
*
* @return the parameters
*/
public List<Parameter> getParameters() {
return parameters;
}
/**
* Adds the parameter.
*
* @param parameter
* the parameter
*/
public void addParameter(Parameter parameter) {
parameters.add(parameter);
}
/**
* Adds the parameter.
*
* @param index
* the index
* @param parameter
* the parameter
*/
public void addParameter(int index, Parameter parameter) {
parameters.add(index, parameter);
}
/**
* Gets the return type.
*
* @return Returns the returnType.
*/
public FullyQualifiedJavaType getReturnType() {
return returnType;
}
/**
* Sets the return type.
*
* @param returnType
* The returnType to set.
*/
public void setReturnType(FullyQualifiedJavaType returnType) {
this.returnType = returnType;
}
/**
* Gets the exceptions.
*
* @return Returns the exceptions.
*/
public List<FullyQualifiedJavaType> getExceptions() {
return exceptions;
}
/**
* Adds the exception.
*
* @param exception
* the exception
*/
public void addException(FullyQualifiedJavaType exception) {
exceptions.add(exception);
}
/**
* Checks if is synchronized.
*
* @return true, if is synchronized
*/
public boolean isSynchronized() {
return isSynchronized;
}
/**
* Sets the synchronized.
*
* @param isSynchronized
* the new synchronized
*/
public void setSynchronized(boolean isSynchronized) {
this.isSynchronized = isSynchronized;
}
/**
* Checks if is native.
*
* @return true, if is native
*/
public boolean isNative() {
return isNative;
}
/**
* Sets the native.
*
* @param isNative
* the new native
*/
public void setNative(boolean isNative) {
this.isNative = isNative;
}
public boolean isDefault() {
return isDefault;
}
public void setDefault(boolean isDefault) {
this.isDefault = isDefault;
}
}