/*
* RapidMiner
*
* Copyright (C) 2001-2014 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.doc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import com.rapidminer.tools.Tools;
/**
* Delivers the class comments of the Javadoc comments of an operator class.
*
* @author Simon Fischer
*/
public class CommentStripper {
private File sourceDir;
public CommentStripper(File sourceDir) {
this.sourceDir = sourceDir;
}
@SuppressWarnings("fallthrough")
public String stripClassComment(Class clazz) throws IOException {
File sourceFile = new File(sourceDir, clazz.getName().replaceAll("\\.", File.separator) + ".java");
if (!sourceFile.exists())
throw new FileNotFoundException("No source file found for class " + clazz.getName() + "; source was expected in '" + sourceFile + "'.");
StringBuffer comment = null;
BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
try {
String line = null;
final int SCANNING_FOR_COMMENT = 0;
final int READING_COMMENT = 1;
final int FINISHED_COMMENT = 2;
int currentState = SCANNING_FOR_COMMENT;
while ((line = reader.readLine()) != null) {
line = line.trim();
switch (currentState) {
case SCANNING_FOR_COMMENT:
if (line.startsWith("/**")) {
comment = new StringBuffer();
line = line.substring("/**".length());
currentState = READING_COMMENT;
// ATTENTION (in case someone wants to read this code): there is no break here!
// Hence the fallthrough is ok and we add a warning suppression
} else {
break;
}
case READING_COMMENT:
int end = line.indexOf("*/");
if (end != -1) {
line = line.substring(0, end);
currentState = FINISHED_COMMENT;
}
line = stripAsteriks(line);
if (line.startsWith("@"))
continue;
comment.append(line + " ");
break;
case FINISHED_COMMENT:
if (line.length() > 0) {
int classIndex = line.indexOf("class");
int nameIndex = line.indexOf(clazz.getSimpleName());
if ((classIndex != -1) && (nameIndex > classIndex + "class".length())) {
return comment.toString().trim();
} else {
// this is not what we want
comment = null;
}
}
break;
}
}
}
finally {
/* Close the stream even if we return early. */
reader.close();
}
return null;
}
private static String stripAsteriks(String string) {
while (string.startsWith("*"))
string = string.substring(1).trim();
return string.trim();
}
}