/**
* 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.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.mybatis.generator.api.dom.OutputUtilities;
import static org.mybatis.generator.api.dom.OutputUtilities.javaIndent;
import static org.mybatis.generator.api.dom.OutputUtilities.newLine;
/**
* The Class Interface.
*
* @author Jeff Butler
*/
public class InnerInterface extends JavaElement {
private List<Field> fields;
/** The type. */
private FullyQualifiedJavaType type;
/** The inner interfaces. */
private List<InnerInterface> innerInterfaces;
/** The super interface types. */
private Set<FullyQualifiedJavaType> superInterfaceTypes;
/** The methods. */
private List<Method> methods;
/**
* Instantiates a new interface.
*
* @param type
* the type
*/
public InnerInterface(FullyQualifiedJavaType type) {
super();
this.type = type;
innerInterfaces = new ArrayList<InnerInterface>();
superInterfaceTypes = new LinkedHashSet<FullyQualifiedJavaType>();
methods = new ArrayList<Method>();
fields = new ArrayList<Field>();
}
/**
* Instantiates a new interface.
*
* @param type
* the type
*/
public InnerInterface(String type) {
this(new FullyQualifiedJavaType(type));
}
public List<Field> getFields() {
return fields;
}
public void addField(Field field) {
fields.add(field);
}
/**
* Gets the formatted content.
*
* @param indentLevel
* the indent level
* @param compilationUnit the compilation unit
* @return the formatted content
*/
public String getFormattedContent(int indentLevel, CompilationUnit compilationUnit) {
StringBuilder sb = new StringBuilder();
addFormattedJavadoc(sb, indentLevel);
addFormattedAnnotations(sb, indentLevel);
javaIndent(sb, indentLevel);
sb.append(getVisibility().getValue());
if (isStatic()) {
sb.append("static "); //$NON-NLS-1$
}
if (isFinal()) {
sb.append("final "); //$NON-NLS-1$
}
sb.append("interface "); //$NON-NLS-1$
sb.append(getType().getShortName());
if (getSuperInterfaceTypes().size() > 0) {
sb.append(" extends "); //$NON-NLS-1$
boolean comma = false;
for (FullyQualifiedJavaType fqjt : getSuperInterfaceTypes()) {
if (comma) {
sb.append(", "); //$NON-NLS-1$
} else {
comma = true;
}
sb.append(JavaDomUtils.calculateTypeName(compilationUnit, fqjt));
}
}
sb.append(" {"); //$NON-NLS-1$
indentLevel++;
Iterator<Field> fldIter = fields.iterator();
while (fldIter.hasNext()) {
OutputUtilities.newLine(sb);
Field field = fldIter.next();
sb.append(field.getFormattedContent(indentLevel, compilationUnit));
}
if (fields.size() > 0 && methods.size() > 0) {
OutputUtilities.newLine(sb);
}
Iterator<Method> mtdIter = getMethods().iterator();
while (mtdIter.hasNext()) {
newLine(sb);
Method method = mtdIter.next();
sb.append(method.getFormattedContent(indentLevel, true, compilationUnit));
if (mtdIter.hasNext()) {
newLine(sb);
}
}
if (innerInterfaces.size() > 0) {
newLine(sb);
}
Iterator<InnerInterface> iiIter = innerInterfaces.iterator();
while (iiIter.hasNext()) {
newLine(sb);
InnerInterface innerInterface = iiIter.next();
sb.append(innerInterface.getFormattedContent(indentLevel, compilationUnit));
if (iiIter.hasNext()) {
newLine(sb);
}
}
indentLevel--;
newLine(sb);
javaIndent(sb, indentLevel);
sb.append('}');
return sb.toString();
}
/**
* Adds the super interface.
*
* @param superInterface
* the super interface
*/
public void addSuperInterface(FullyQualifiedJavaType superInterface) {
superInterfaceTypes.add(superInterface);
}
/**
* Gets the methods.
*
* @return Returns the methods.
*/
public List<Method> getMethods() {
return methods;
}
/**
* Adds the method.
*
* @param method
* the method
*/
public void addMethod(Method method) {
methods.add(method);
}
/**
* Gets the type.
*
* @return Returns the type.
*/
public FullyQualifiedJavaType getType() {
return type;
}
/* (non-Javadoc)
* @see org.mybatis.generator.api.dom.java.CompilationUnit#getSuperClass()
*/
public FullyQualifiedJavaType getSuperClass() {
// interfaces do not have superclasses
return null;
}
/* (non-Javadoc)
* @see org.mybatis.generator.api.dom.java.CompilationUnit#getSuperInterfaceTypes()
*/
public Set<FullyQualifiedJavaType> getSuperInterfaceTypes() {
return superInterfaceTypes;
}
/**
* Gets the inner interface.
*
* @return Returns the innerInterfaces.
*/
public List<InnerInterface> getInnerInterfaces() {
return innerInterfaces;
}
/**
* Adds the inner interface.
*
* @param innerInterface
* the inner interface
*/
public void addInnerInterfaces(InnerInterface innerInterface) {
innerInterfaces.add(innerInterface);
}
/* (non-Javadoc)
* @see org.mybatis.generator.api.dom.java.CompilationUnit#isJavaInterface()
*/
public boolean isJavaInterface() {
return true;
}
/* (non-Javadoc)
* @see org.mybatis.generator.api.dom.java.CompilationUnit#isJavaEnumeration()
*/
public boolean isJavaEnumeration() {
return false;
}
}