/*
* Copyright 2006 The Apache Software Foundation
*
* 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.jcommons.file.java.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.jcommons.common.StringUtils;
import org.jcommons.io.PrintUtils;
/**
* @author Jeff Butler
*/
public class Interface extends JavaElement implements CompilationUnit {
private Set<FullyQualifiedJavaType> importedTypes;
private Set<String> staticImports;
private FullyQualifiedJavaType type;
private Set<FullyQualifiedJavaType> superInterfaceTypes;
private List<Method> methods;
private List<String> fileCommentLines;
/**
*
*/
public Interface(FullyQualifiedJavaType type) {
super();
this.type = type;
superInterfaceTypes = new LinkedHashSet<FullyQualifiedJavaType>();
methods = new ArrayList<Method>();
importedTypes = new TreeSet<FullyQualifiedJavaType>();
fileCommentLines = new ArrayList<String>();
staticImports = new TreeSet<String>();
}
public Interface(String type) {
this(new FullyQualifiedJavaType(type));
}
public Set<FullyQualifiedJavaType> getImportedTypes() {
return Collections.unmodifiableSet(importedTypes);
}
public void addImportedType(FullyQualifiedJavaType importedType) {
if (importedType.isExplicitlyImported()
&& !importedType.getPackageName().equals(type.getPackageName())) {
importedTypes.add(importedType);
}
}
public String getFormattedContent() {
StringBuilder sb = new StringBuilder();
for (String commentLine : fileCommentLines) {
sb.append(commentLine);
PrintUtils.newLine(sb);
}
if (StringUtils.hasValue(getType().getPackageName())) {
sb.append("package "); //$NON-NLS-1$
sb.append(getType().getPackageName());
sb.append(';');
PrintUtils.newLine(sb);
PrintUtils.newLine(sb);
}
for (String staticImport : staticImports) {
sb.append("import static "); //$NON-NLS-1$
sb.append(staticImport);
sb.append(';');
PrintUtils.newLine(sb);
}
if (staticImports.size() > 0) {
PrintUtils.newLine(sb);
}
Set<String> importStrings = PrintUtils.calculateImports(importedTypes);
for (String importString : importStrings) {
sb.append(importString);
PrintUtils.newLine(sb);
}
if (importStrings.size() > 0) {
PrintUtils.newLine(sb);
}
int indentLevel = 0;
addFormattedJavadoc(sb, indentLevel);
addFormattedAnnotations(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(fqjt.getShortName());
}
}
sb.append(" {"); //$NON-NLS-1$
indentLevel++;
Iterator<Method> mtdIter = getMethods().iterator();
while (mtdIter.hasNext()) {
PrintUtils.newLine(sb);
Method method = mtdIter.next();
sb.append(method.getFormattedContent(indentLevel, true));
if (mtdIter.hasNext()) {
PrintUtils.newLine(sb);
}
}
indentLevel--;
PrintUtils.newLine(sb);
PrintUtils.javaIndent(sb, indentLevel);
sb.append('}');
return sb.toString();
}
public void addSuperInterface(FullyQualifiedJavaType superInterface) {
superInterfaceTypes.add(superInterface);
}
/**
* @return Returns the methods.
*/
public List<Method> getMethods() {
return methods;
}
public void addMethod(Method method) {
methods.add(method);
}
/**
* @return Returns the type.
*/
public FullyQualifiedJavaType getType() {
return type;
}
public FullyQualifiedJavaType getSuperClass() {
// interfaces do not have superclasses
return null;
}
public Set<FullyQualifiedJavaType> getSuperInterfaceTypes() {
return superInterfaceTypes;
}
public boolean isJavaInterface() {
return true;
}
public boolean isJavaEnumeration() {
return false;
}
public void addFileCommentLine(String commentLine) {
fileCommentLines.add(commentLine);
}
public List<String> getFileCommentLines() {
return fileCommentLines;
}
public void addImportedTypes(Set<FullyQualifiedJavaType> importedTypes) {
this.importedTypes.addAll(importedTypes);
}
public Set<String> getStaticImports() {
return staticImports;
}
public void addStaticImport(String staticImport) {
staticImports.add(staticImport);
}
public void addStaticImports(Set<String> staticImports) {
this.staticImports.addAll(staticImports);
}
}