blob: 0aa01446dc31bd637d55141c1b8b4721d5a43b0c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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:
* Kentarou FUKUDA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.visualization.blind.html;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Vector;
import org.eclipse.actf.model.IModelService;
import org.eclipse.actf.model.IWebBrowserACTF;
import org.eclipse.actf.model.dom.html.impl.SHDocument;
import org.eclipse.actf.model.dom.html.util.HtmlParserUtil;
import org.eclipse.actf.util.DebugPrintUtil;
import org.eclipse.actf.util.html2view.Html2ViewMapMaker;
import org.eclipse.actf.visualization.IVisualizationConst;
import org.eclipse.actf.visualization.blind.BlindVisualizerBase;
import org.eclipse.actf.visualization.blind.IBlindVisualizer;
import org.eclipse.actf.visualization.blind.ui.internal.Messages;
import org.eclipse.actf.visualization.engines.blind.BlindVizEnginePlugin;
import org.eclipse.actf.visualization.engines.blind.eval.EvaluationResultBlind;
import org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData;
import org.eclipse.actf.visualization.engines.blind.html.VisualizeEngine;
import org.eclipse.actf.visualization.engines.blind.html.eval.HtmlErrorLogListener;
import org.eclipse.actf.visualization.engines.blind.html.util.HandleFramePage;
import org.eclipse.actf.visualization.engines.blind.util.ParamBlind;
import org.eclipse.actf.visualization.eval.EvaluationPreferencesUtil;
import org.eclipse.actf.visualization.eval.HtmlCheckTargetImpl;
import org.eclipse.actf.visualization.eval.IHtmlCheckTarget;
import org.eclipse.actf.visualization.eval.IHtmlChecker;
import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
import org.eclipse.actf.visualization.eval.html.HtmlEvalUtil;
import org.eclipse.actf.visualization.eval.html.statistics.PageData;
import org.eclipse.actf.visualization.eval.problem.HighlightTargetNodeInfo;
import org.eclipse.actf.visualization.eval.problem.IProblemItem;
import org.w3c.dom.Document;
public class BlindVisualizerHtml extends BlindVisualizerBase implements
IBlindVisualizer {
public static final int FRAME = 1;
public static final String ORIG_HTML_FILE = "origSource.html";
public static final String IE_HTML_FILE = "ieSource.html";
private IWebBrowserACTF webBrowser;
@Override
public boolean setModelService(IModelService targetModel) {
webBrowser = null;
if (super.setModelService(targetModel)) {
webBrowser = (IWebBrowserACTF) targetModel;
return true;
}
return false;
}
public boolean isTarget(IModelService modelService) {
if (null != modelService && modelService instanceof IWebBrowserACTF) {
return true;
}
return false;
}
public int visualize() {
GuidelineHolder.getInstance().setTargetMimeType("text/html");
int frameId = 0;
checkResult = new EvaluationResultBlind();
try {
webBrowser.saveOriginalDocument(tmpDirS + ORIG_HTML_FILE);
webBrowser.saveDocumentAsHTMLFile(tmpDirS + IE_HTML_FILE);
// for srcViewer
webBrowser.saveOriginalDocument(tmpDirS + HTML_SOURCE_FILE);
Html2ViewMapMaker h2vmm = new Html2ViewMapMaker();
Vector html2ViewMapV = new Vector();
HtmlParserUtil hpu = new HtmlParserUtil();
HtmlErrorLogListener errorLogListener = new HtmlErrorLogListener();
hpu.addErrorLogListener(errorLogListener);
String targetFile = tmpDirS + MAPPED_HTML_FILE_PRE + frameId
+ ".html";
boolean isIEhtml = false;
if (EvaluationPreferencesUtil.isOriginalDOM()) {
html2ViewMapV = h2vmm.makeMap(ORIG_HTML_FILE,
MAPPED_HTML_FILE_PRE + frameId + ".html", tmpDirS);
// decode miss
if (html2ViewMapV.size() == 0) {
isIEhtml = true;
}
} else {
isIEhtml = true;
}
// for line<>id mapping
// HtmlLine2Id htmlLine2Id = new HtmlLine2Id(html2ViewMapV);
Document document;
Document ieDom;
Document originalDocument;
if (isIEhtml) {
ieDom = webBrowser.getLiveDocument();
// TODO replace with DomByCom (need clone/write support)
HtmlParserUtil tmpHPU = new HtmlParserUtil();
tmpHPU.parse(new FileInputStream(tmpDirS + IE_HTML_FILE));
document = tmpHPU.getSHDocument();
tmpHPU.parse(new FileInputStream(tmpDirS + ORIG_HTML_FILE));
originalDocument = tmpHPU.getSHDocument();
} else {
hpu.parse(new FileInputStream(targetFile));
document = hpu.getSHDocument();
originalDocument = document;
ieDom = webBrowser.getLiveDocument();
}
// System.out.println(document+" "+ _originalDom+" "+ ieDom);
boolean hasFrame = false;
if (document == null) {
return ERROR;
} else if (HandleFramePage.hasFrameset(document, webBrowser) == true) {
hasFrame = true;
}
setStatusMessage(Messages.getString("BlindView.Now_processing")); // //$NON-NLS-1$
pageData = new PageData();
VisualizeEngine engine = new VisualizeEngine();
engine.setBaseUrl(""); //$NON-NLS-1$
// TODO "\"->"/" windows
// engine.setBaseUrl("file:///"+RESULT_DIR);
engine.setTargetUrl(targetUrl);
engine.setDocument(document);
engine.setHtml2viewMapV(html2ViewMapV);
// TODO invisibleElements
// HashSet invisibleIdSet = new HashSet();
// if (webBrowser != null) {
// String[] invisibleIds = webBrowser.getInvisibleEleId();
// for (int i = 0; i < invisibleIds.length; i++) {
// invisibleIdSet.add(invisibleIds[i]);
// }
// }
// engine.setInvisibleIdSet(invisibleIdSet);
engine.setInvisibleIdSet(new HashSet());
engine.setPageData(pageData);
engine.calculate();
maxReachingTime = engine.getMaxTime();
setInfoMessage(createMaxTimeString());
resultDocument = engine.getResult();
checkResult.setProblemList(engine.getProbelems());
checkResult.setTargetUrl(targetUrl);
checkResult.addAssociateFile(engine.getVariantFile());
IVisualizeMapData mapData = engine.getVisualizeMapData();
// TODO
checkResult.setSourceFile(new File(tmpDirS + HTML_SOURCE_FILE));
boolean isDBCS = false;
if (ParamBlind.getInstance().iLanguage == ParamBlind.JP) {
isDBCS = true;
}
HtmlEvalUtil edu = new HtmlEvalUtil(document, resultDocument,
targetUrl, mapData.getOrig2idMap(), originalDocument,
ieDom, pageData, isDBCS, isIEhtml);
ArrayList<IProblemItem> tmpResults = new ArrayList<IProblemItem>(
1024);
// TODO re-impl BrowserAndStyleInfo
//
// BrowserAndStyleInfo data =
// webBrowser.getBrowserAndStyleInfo();
IHtmlCheckTarget checkTarget = new HtmlCheckTargetImpl(document,
webBrowser.getURL(), null, edu);
for (int i = 0; i < checkers.length; i++) {
if (checkers[i] instanceof IHtmlChecker) {
tmpResults.addAll(((IHtmlChecker) checkers[i])
.checkHtml(checkTarget));
} else if (checkers[i].isTargetFormat(webBrowser
.getCurrentMIMEType())
&& checkers[i].isEnabled()) {
tmpResults.addAll(checkers[i].check(checkTarget));
}
}
// TODO support blind biz -> visitor
for (int i = 0; i < tmpResults.size(); i++) {
IProblemItem tmpItem = (IProblemItem) tmpResults.get(i);
HighlightTargetNodeInfo nodeInfo = tmpItem
.getHighlightTargetNodeInfo();
if (nodeInfo != null) {
tmpItem.setHighlightTargetIds(nodeInfo
.getHighlightTargetIds(mapData.getOrig2idMap()));
if (EvaluationPreferencesUtil.isOriginalDOM()) {
tmpItem.setHighlightTargetSourceInfo(nodeInfo
.getHighlightTargetSourceInfo(html2ViewMapV));
}
}
}
checkResult.addProblemItems(tmpResults);
checkResult
.addProblemItems(errorLogListener.getHtmlProblemVector());
checkResult.accept(pageData);
// TODO move (add Icons into result doc) here
resultFile = BlindVizEnginePlugin.createTempFile(
IVisualizationConst.PREFIX_RESULT,
IVisualizationConst.SUFFIX_HTML);
File tmpFile = BlindVizEnginePlugin.createTempFile("tmp",
IVisualizationConst.SUFFIX_HTML);
try {
HtmlParserUtil.saveHtmlDocumentAsUTF8(
(SHDocument) resultDocument, tmpFile, resultFile);
} catch (Exception e3) {
DebugPrintUtil
.devOrDebugPrintln("error: saveHtmlDocumentAsUTF8");
try {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(resultFile), "UTF-8"));
((SHDocument) resultDocument).printAsSGML(pw, true);
pw.flush();
pw.close();
} catch (Exception e4) {
}
}
if (hasFrame) {
return FRAME;
} else if (webBrowser != null && !webBrowser.isUrlExists()) {
// TODO
return ERROR;
}
return OK;
} catch (Exception e) {
setStatusMessage("Visualization Error");
e.printStackTrace();
return ERROR;
}
}
}