📄 operator.java
字号:
* <li><b>$$</b> with $</li>
* </ul>
* Returns null if str is null.
*/
private String expandString(String str) {
if (str == null) return null;
StringBuffer result = new StringBuffer();
int start = 0;
int end = 0;
while ((end = str.indexOf('%', start)) >= 0) {
result.append(str.substring(start, end));
if (end+1 < str.length()) {
switch (str.charAt(end+1)) {
case 'n': result.append(getName()); break;
case 'c': result.append(getClass().getName()); break;
case 'a': result.append(applyCount); break;
case 'b': result.append(applyCount + 1); break;
case 't': result.append(java.text.DateFormat.getDateTimeInstance().format(new java.util.Date())); break;
case '%': result.append('%'); break;
default: result.append(str.charAt(end+1)); break;
}
}
start = end+2;
}
result.append(str.substring(start));
return result.toString();
}
// --------------------------------------------------------------------------------
/** Returns a list of <tt>ParameterTypes</tt> describing the parameters of this operator.
* The default implementation returns an empty list. */
public List getParameterTypes() { return new ArrayList(); }
/** Writes the XML representation of this operator. */
public void writeXML(PrintWriter out, String indent) throws IOException {
out.println(getXML(indent));
}
/** Returns the XML representation of this operator. */
public String getXML(String indent) {
StringBuffer result = new StringBuffer();
String breakpointString = "";
if (breakPoint[BREAKPOINT_BEFORE] && breakPoint[BREAKPOINT_AFTER]) breakpointString = " breakpoints=\"both\"";
else if (breakPoint[BREAKPOINT_BEFORE]) breakpointString = " breakpoints=\"before\"";
else if (breakPoint[BREAKPOINT_AFTER]) breakpointString = " breakpoints=\"after\"";
result.append(indent + "<operator "+
"name=\""+name+"\" "+
"class=\""+OperatorService.getOperatorClassName(this.getClass())+"\""+
breakpointString +
(!enabled ? " activated=\"no\"" : "") +
">\n");
if ((userDescription != null) && (userDescription.length() != 0))
result.append(indent + " <description text=\"" + userDescription + "\"/>\n");
result.append(parameters.getXML(indent+" "));
result.append(getInnerOperatorsXML(indent+" "));
result.append(indent + "</operator>\n");
return result.toString();
}
/** Writes the XML representation of the inner operators. Since an Operator does not have any
* inner operators, the default implementation does nothing. Implemented by <tt>OperatorChain</tt>. */
protected String getInnerOperatorsXML(String indent) { return ""; }
/** Sets or clears a breakpoint at the given position.
* @param position One out of BREAKPOINT_BEFORE and BREAKPOINT_AFTER */
public void setBreakpoint(int position, boolean on) {
breakPoint[position] = on;
}
/** Returns true iff a breakpoint is set at the given position
* @param position One out of BREAKPOINT_BEFORE and BREAKPOINT_AFTER */
public boolean hasBreakpoint(int position) {
return breakPoint[position];
}
/** Clears the list of errors.
* @see #addError(String) */
public void clearErrorList() {
errorList.clear();
}
/** Adds an error message.
* @see #getErrorList() */
public void addError(String message) {
LogService.logMessage(this.getName()+": " + message, LogService.ERROR);
errorList.add(message);
}
/** Returns a List of Strings containing error messages.
* @see #addError(String) */
public List getErrorList() {
return errorList;
}
/** Returns the system time when the operator was started. */
public long getStartTime() {
return startTime;
}
/** Convenience method for logging a message prefixed by the operator name.
* @see LogService */
public void logMessage(String message, int verbosityLevel) {
LogService.logMessage(getName()+": "+message, verbosityLevel);
}
private static String createDescriptionFromXML(Element element) throws XMLException {
Attr textAttr = element.getAttributeNode("text");
if (textAttr == null) throw new XMLException("Attribute 'text' of <description> tag is not set.");
if (element.getChildNodes().getLength() > 0) throw new XMLException("No inner tags allowed for <description>");
return textAttr.getValue();
}
private static Object[] createParameterFromXML(Element element) throws XMLException {
Attr keyAttr = element.getAttributeNode("key");
Attr valueAttr = element.getAttributeNode("value");
if (keyAttr == null) throw new XMLException("Attribute 'key' of <parameter> tag is not set.");
if (valueAttr == null) throw new XMLException("Attribute 'value' of <parameter> tag is not set.");
if (element.getChildNodes().getLength() > 0) throw new XMLException("No inner tags allowed for <parameter>");
return new Object[] { keyAttr.getValue(), valueAttr.getValue() };
}
private static Object[] createParameterListFromXML(Element element) throws XMLException {
LinkedList values = new LinkedList();
Attr keyAttr = element.getAttributeNode("key");
if (keyAttr == null) throw new XMLException("Attribute 'key' of <list> tag is not set.");
NodeList children = element.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
if (node instanceof Element) {
Element inner = (Element)node;
if (inner.getTagName().toLowerCase().equals("parameter")) {
values.add(createParameterFromXML(inner));
} else if (inner.getTagName().toLowerCase().equals("list")) {
values.add(createParameterListFromXML(inner));
} else {
throw new XMLException("Ilegal inner tag for <list>: "+inner.getTagName());
}
}
}
return new Object[] { keyAttr.getValue(), values };
}
public static Operator createFromXML(Element element, Experiment experiment) throws XMLException {
if (!element.getTagName().toLowerCase().equals("operator")) {
throw new XMLException("<operator> expected!");
}
String className = null;
String name = null;
String breakpointString = null;
String activationString = null;
Attr classAttr = element.getAttributeNode("class");
if (classAttr != null) {
className = classAttr.getValue();
} else {
throw new XMLException("Attribute 'class' of <operator> tag is not defined! ");
}
Attr nameAttr = element.getAttributeNode("name");
if (nameAttr != null) {
name = nameAttr.getValue();
} else {
throw new XMLException("Attribute 'name' of <operator> tag is not defined! ");
}
Attr breakpointAttr = element.getAttributeNode("breakpoints");
if (breakpointAttr != null) {
breakpointString = breakpointAttr.getValue();
}
Attr activationAttr = element.getAttributeNode("activated");
if (activationAttr != null) {
activationString = activationAttr.getValue();
}
Class opClass = (Class)OperatorService.getOperatorClass(className);
if (opClass == null) throw new XMLException("Unknown operator class: '" + className + "'!");
Operator operator = null;
try {
operator = (Operator)opClass.newInstance();
} catch (InstantiationException e) {
throw new XMLException("Cannot instantiate '"+className+"'!", e);
} catch (IllegalAccessException e) {
throw new XMLException("Cannot access '"+className+"'!", e);
}
if (breakpointString != null) {
if (breakpointString.equals("both")) {
operator.setBreakpoint(BREAKPOINT_BEFORE, true);
operator.setBreakpoint(BREAKPOINT_AFTER, true);
} else if (breakpointString.equals("before")) {
operator.setBreakpoint(BREAKPOINT_BEFORE, true);
} else if (breakpointString.equals("after")) {
operator.setBreakpoint(BREAKPOINT_AFTER, true);
} else {
throw new XMLException("Breakpoint `"+breakpointString+"` is not defined!");
}
}
if (activationString != null) {
if (activationString.equals("no")) operator.setEnabled(false);
else if (activationString.equals("yes")) operator.setEnabled(true);
else {
throw new XMLException("Activation mode `"+activationString+"` is not defined!");
}
}
operator.register(experiment, name);
NodeList innerTags = element.getChildNodes();
for (int i = 0; i < innerTags.getLength(); i++) {
Node node = innerTags.item(i);
if (node instanceof Element) {
Element inner = (Element)node;
if (inner.getTagName().toLowerCase().equals("parameter")) {
Object[] parameter = createParameterFromXML(inner);
operator.getParameters().setParameter((String)parameter[0], parameter[1]);
} else if (inner.getTagName().toLowerCase().equals("list")) {
Object[] parameter = createParameterListFromXML(inner);
operator.getParameters().setParameter((String)parameter[0], parameter[1]);
} else if (inner.getTagName().toLowerCase().equals("operator")) {
if (operator instanceof OperatorChain) {
((OperatorChain)operator).addOperator(createFromXML(inner, experiment));
} else {
throw new XMLException("No inner operators allowed for '"+className+"'");
}
} else if (inner.getTagName().toLowerCase().equals("description")) {
String description = createDescriptionFromXML(inner);
operator.setUserDescription(description);
} else {
throw new XMLException("Ilegal inner tag for <operator>: "+inner.getTagName());
}
}
}
if (operator instanceof OperatorChain) {
OperatorChain chain = (OperatorChain)operator;
if (chain.getNumberOfOperators() < chain.getMinNumberOfInnerOperators()) {
LogService.logMessage("Less than " + chain.getMinNumberOfInnerOperators() + " inner operators for " + chain.getName() + "!",
LogService.WARNING);
}
if (chain.getNumberOfOperators() > chain.getMaxNumberOfInnerOperators()) {
LogService.logMessage("More than " + chain.getMaxNumberOfInnerOperators() + " inner operators for " + chain.getName() + "!",
LogService.WARNING);
}
}
return operator;
}
/** Returns true iff <code>o</code> is an operator of equal class and its name, parameters,
* and inner operators are equal to the ones of this operator. */
public boolean configurationEquals(Object o) {
if (!this.getClass().equals(o.getClass())) {
return false;
}
Operator op = (Operator)o;
return
this.name.equals(op.name) &&
this.parameters.equals(op.parameters);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -