/*
* RapidMiner
*
* Copyright (C) 2001-2011 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.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.tools.documentation;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import com.rapidminer.operator.OperatorDescription;
import com.rapidminer.tools.LogService;
import com.rapidminer.tools.OperatorService;
/**
* A resource bundle that maps operator names to {@link OperatorDocumentation} instances.
* Instances of this class always return {@link OperatorDocumentation}s from their {@link #getObject(String)} methods.
*
* @author Sebastian Land
*
*/
public class OperatorDocBundle extends ResourceBundle {
public static final String GROUP_PREFIX = "group.";
public static final String OPERATOR_PREFIX = "operator.";
private final Map<String, OperatorDocumentation> operatorKeyDescriptionMap;
private final Map<String, GroupDocumentation> groupMap;
public OperatorDocBundle() {
this.operatorKeyDescriptionMap = new HashMap<String, OperatorDocumentation>();
this.groupMap = new HashMap<String, GroupDocumentation>();
}
public OperatorDocBundle(Map<String, OperatorDocumentation> operatorKeyDescriptionMap, Map<String, GroupDocumentation> groupMap) {
this.operatorKeyDescriptionMap = operatorKeyDescriptionMap;
this.groupMap = groupMap;
}
protected void addOperatorDoc(String key, OperatorDocumentation documentation) {
this.operatorKeyDescriptionMap.put(key, documentation);
}
protected void addGroupDoc(String key, GroupDocumentation documentation) {
this.groupMap.put(key, documentation);
}
@Override
public Enumeration<String> getKeys() {
return Collections.enumeration(operatorKeyDescriptionMap.keySet());
}
@Override
protected Object handleGetObject(String key) {
if (key.startsWith(OPERATOR_PREFIX)) {
key = key.substring(OPERATOR_PREFIX.length());
OperatorDocumentation doc = operatorKeyDescriptionMap.get(key);
if (doc == null) {
doc = new OperatorDocumentation(key);
operatorKeyDescriptionMap.put(key, doc);
LogService.getRoot().fine("Creating new empty documentation for operator " + key);
}
return doc;
} else if (key.startsWith(GROUP_PREFIX)) {
key = key.substring(GROUP_PREFIX.length());
GroupDocumentation groupDocumentation = groupMap.get(key);
if (groupDocumentation == null) {
groupDocumentation = new GroupDocumentation(key);
groupMap.put(key, groupDocumentation);
LogService.getRoot().fine("Creating new empty documentation for group " + key);
}
return groupDocumentation;
}
return null;
}
/** Checks for empty documentation and documentation that has no associated operator. */
public void check() {
LogService.getRoot().info("Checking operator documentation");
int missing = 0;
int same = 0;
int deprecation = 0;
int different = 0;
int empty = 0;
for (Map.Entry<String, OperatorDocumentation> entry : operatorKeyDescriptionMap.entrySet()) {
String key = entry.getKey();
OperatorDocumentation doc = entry.getValue();
if (key.startsWith("W-")) {
continue;
}
if (doc.getDocumentation().trim().isEmpty()) {
LogService.getRoot().warning("Empty documentation for " + key);
empty++;
}
OperatorDescription desc = OperatorService.getOperatorDescription(key);
if (desc == null) {
missing++;
LogService.getRoot().warning("Documentation for nonexistent operator " + key);
}
String replacement = OperatorService.getReplacementForDeprecatedClass(key);
if (replacement != null) {
deprecation++;
String string;
OperatorDocumentation otherDoc = operatorKeyDescriptionMap.get(replacement);
if (otherDoc != null) {
if (otherDoc.getDocumentation().equals(doc.getDocumentation())) {
string = replacement + " has the same documentation entry.";
same++;
} else {
string = replacement + " has a different documentation entry.";
different++;
}
} else {
string = replacement + " has no documentation entry.";
}
LogService.getRoot().warning("Documentation for deprecated operator " + key + " replaced by " + replacement + ". " + string);
}
}
LogService.getRoot().info("Found " + empty + " empty documentations. Found documentation for " + missing + " nonexistent and " + (deprecation) + " replaced operators. Out of these, " + same + " documentations are identical to the documentation of the replacement and "
+ (deprecation - same - different) + " replacements have no documentation.");
}
}