blob: 1bada0a2b59ac84dfa783db4a6a8bb517e2b2bd2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ua.tests.doc.internal.linkchecker;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.help.internal.webapp.servlet.FilterUtils;
import org.eclipse.help.webapp.IFilter;
import org.eclipse.ua.tests.doc.internal.dialogs.SelectTocDialog;
public class OnLoadFilter implements IFilter {
private static long uniqueId = 0;
private class OutFilter extends OutputStream {
private OutputStream out;
private int state = 0;
private String pathPrefix;
public void updateState(int b) throws IOException {
if (state == 0 && b == '<') {
state = 1;
} else if (state == 1 && (b == 'b' || b == 'B')) {
state = 2;
} else if (state == 2 && (b == 'o' || b == 'O')) {
state = 3;
} else if (state == 3 && (b == 'd' || b == 'D')) {
state = 4;
} else if (state == 4 && (b == 'y' || b == 'Y')) {
state = 20;
out.write(b);
if (linkProvider.hasNext()) {
String location = linkProvider.next();
String onload = getOnloadText(pathPrefix + location, testKind);
out.write(onload.getBytes());
//System.out.println("Onload = " + onload);
} else {
linkProvider = null;
String announceComplete = getCompletionText(testKind);
out.write(announceComplete.getBytes());
//System.out.println("announceComplete = " + announceComplete);
}
} else if (state == 20 && b == '>') {
state = 21;
} else if (state == 1 && (b == 'h' || b == 'H')) {
state = 11;
} else if (state == 11 && (b == 'e' || b == 'e')) {
state = 12;
} else if (state == 12 && (b == 'a' || b == 'a')) {
state = 13;
} else if (state == 13 && (b == 'm' || b == 'M')) {
state = 14;
} else if (state == 14 && (b == 'e' || b == 'E')) {
state = 15;
} else if (state == 15 && (b == 's' || b == 'S')) {
state = 16;
} else if (state == 16 && (b == 'e' || b == 'E')) {
state = 17;
} else if (state == 17 && (b == 't' || b == 'T')) {
state = 20;
} else if (state > 0 && state < 20) {
state = 0;
}
}
private String getOnloadText(String location, int testKind) {
String onload = " onload = \"";
if (testKind == SelectTocDialog.FOLLOW_LINKS) {
onload += "ua_test_doc_record_links();";
}
onload += " window.location = '";
String uniqParam = "?uniq=" + ++uniqueId;
int anchor = location.indexOf('#');
if (anchor == -1) {
onload = onload + location + uniqParam + "'";
} else {
onload = onload + location.substring(0, anchor) + uniqParam
+ location.substring(anchor) + "'";
}
onload += '"';
return onload;
}
private String getCompletionText(int testKind) {
if (testKind == SelectTocDialog.FOLLOW_LINKS) {
return " onload = \"ua_test_doc_check_links();\" ";
} else {
return " onload = \"ua_test_doc_complete();\" ";
}
}
public OutFilter(OutputStream out, String prefix) {
this.out = out;
this.pathPrefix = prefix;
}
@Override
public void write(int b) throws IOException {
updateState(b);
if (state != 20) {
out.write(b);
}
}
@Override
public void close() throws IOException {
out.close();
super.close();
}
}
private int testKind;
public OnLoadFilter(int testKind) {
this.testKind = testKind;
}
private static Iterator<String> linkProvider;
protected String getCommentText() {
return "comment";
}
@Override
public OutputStream filter(HttpServletRequest req, OutputStream out) {
if (linkProvider == null) {
return out;
}
String pathPrefix = FilterUtils.getRelativePathPrefix(req);
if (pathPrefix.length() >= 4) {
return new OutFilter(out, pathPrefix.substring(0, pathPrefix.length() - 4));
}
return new OutFilter(out, "PLUGINS_ROOT");
}
public static void setLinkProvider(Iterator<String> provider) {
linkProvider = provider;
}
}