blob: ae2885f89ff5d635f6c5e236c43de82cfdb29901 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2016 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.odfbyhtml;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import org.eclipse.actf.model.dom.html.DocumentTypeUtil;
import org.eclipse.actf.model.dom.html.HTMLParserFactory;
import org.eclipse.actf.model.dom.html.IHTMLParser;
import org.eclipse.actf.model.ui.IModelService;
import org.eclipse.actf.util.FileUtils;
import org.eclipse.actf.util.dom.DomPrintUtil;
import org.eclipse.actf.util.logging.DebugPrintUtil;
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.BlindVizResourceUtil;
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.util.VisualizeReportUtil;
import org.eclipse.actf.visualization.eval.CheckTargetFactory;
import org.eclipse.actf.visualization.eval.EvaluationUtil;
import org.eclipse.actf.visualization.eval.ICheckTarget;
import org.eclipse.actf.visualization.eval.IChecker;
import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
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.eclipse.actf.visualization.eval.problem.ProblemItemImpl;
import org.eclipse.actf.visualization.util.html2view.Html2ViewMapData;
import org.eclipse.actf.visualization.util.html2view.Html2ViewMapMaker;
import org.w3c.dom.Document;
@SuppressWarnings("nls")
public class BlindVisualizerOdfByHtml extends BlindVisualizerBase implements IBlindVisualizer {
private final String ODF_HTML_FILE_NAME = "ODF.html";
private final String odf_html_fileS = tmpDirS + ODF_HTML_FILE_NAME;
private final String NO_ALT_IMAGE = "10101";
private static final String MAPPED_HTML_FILE_PRE = "MappedHTML";
private static final String HTML_SOURCE_FILE = "source.html";
public boolean setModelService(IModelService targetModel) {
if (super.setModelService(targetModel)) {
if (targetUrl.startsWith("file://")) {
targetUrl = targetUrl.substring(8);
}
targetUrl = targetUrl.replaceAll("%20", " ");
return true;
}
return false;
}
public int visualize() {
if (null == modelService) {
return ERROR;
}
GuidelineHolder.getInstance().setTargetMimeType(modelService.getCurrentMIMEType());
modelService.saveDocumentAsHTMLFile(odf_html_fileS);
checkResult = new EvaluationResultBlind();
try {
FileUtils.copyFile(odf_html_fileS, tmpDirS + HTML_SOURCE_FILE, true);
Vector<Html2ViewMapData> html2ViewMapV = new Vector<Html2ViewMapData>();
// IHTMLParser htmlParser = HTMLParserFactory.createHTMLParser();
// HtmlErrorLogListener errorLogListener = new
// HtmlErrorLogListener();
// htmlParser.addErrorLogListener(errorLogListener);
String targetFile = tmpDirS + MAPPED_HTML_FILE_PRE + ".html";
html2ViewMapV = Html2ViewMapMaker.makeMap(ODF_HTML_FILE_NAME, MAPPED_HTML_FILE_PRE + ".html", tmpDirS);
if (html2ViewMapV.size() == 0) {
targetFile = odf_html_fileS;
}
IHTMLParser tmpHtmlParser = HTMLParserFactory.createHTMLParser();
tmpHtmlParser.parse(new FileInputStream(targetFile));
Document document = tmpHtmlParser.getDocument();
if (document == null) {
return ERROR;
}
boolean isHTML5 = DocumentTypeUtil.isOriginalHTML5(document.getDoctype());
setStatusMessage(Messages.BlindView_Now_processing); //
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);
engine.setInvisibleIdSet(new HashSet<String>());
engine.setPageData(pageData);
engine.setHTML5(isHTML5);
engine.visualize();
maxReachingTime = engine.getMaxTime();
setInfoMessage(getMaxReachingTime());
resultDocument = engine.getResult();
checkResult.setProblemList(engine.getProbelems());
checkResult.setTargetUrl(targetUrl);
if (variantFile != null) {
variantFile.delete();
}
variantFile = engine.getVariantFile();
checkResult.addAssociateFile(variantFile);
IVisualizeMapData mapData = engine.getVisualizeMapData();
checkResult.setSourceFile(null);
ArrayList<IProblemItem> tmpResults = new ArrayList<IProblemItem>(1024);
Document odfDoc = modelService.getDocument();
ICheckTarget checkTarget = CheckTargetFactory.createCheckTarget(odfDoc, modelService.getURL());
checkTarget.setAdditionalDocument("html", document);
IChecker[] checkers = EvaluationUtil.getCheckers();
for (int i = 0; i < checkers.length; i++) {
// TODO mimetype -> ???
if (checkers[i].isTargetFormat(modelService.getCurrentMIMEType()) && checkers[i].isEnabled()) {
long startTime = System.currentTimeMillis();
tmpResults.addAll(checkers[i].check(checkTarget));
DebugPrintUtil.devOrDebugPrintln(System.currentTimeMillis() - startTime);
}
}
visualizeError(resultDocument, tmpResults);
// TODO support blind biz -> visitor
for (int i = 0; i < tmpResults.size(); i++) {
IProblemItem tmpItem = tmpResults.get(i);
HighlightTargetNodeInfo nodeInfo = tmpItem.getHighlightTargetNodeInfo();
if (nodeInfo != null) {
tmpItem.setHighlightTargetIds(nodeInfo.getHighlightTargetIds(mapData.getOrig2idMap()));
}
}
checkResult.addProblemItems(tmpResults);
checkResult.accept(pageData);
// TODO move (add Icons into result doc) here
if (resultFile != null) {
resultFile.delete();
}
resultFile = BlindVizResourceUtil.createTempFile(IVisualizationConst.PREFIX_RESULT,
IVisualizationConst.SUFFIX_HTML);
try {
// PrintWriter pw = new PrintWriter(new OutputStreamWriter(
// new FileOutputStream(resultFile), "UTF-8"));
// ((IHTMLDocumentACTF) resultDocument).printAsSGML(pw, true);
// pw.flush();
// pw.close();
DomPrintUtil dpu = new DomPrintUtil(resultDocument);
dpu.setHTML5(isHTML5);
dpu.writeToFile(resultFile);
} catch (Exception e3) {
e3.printStackTrace();
}
} catch (Exception e) {
setStatusMessage(Messages.Visualization_Error);
e.printStackTrace();
return ERROR;
}
return 0;
}
public boolean isTarget(IModelService modelService) {
return (null != modelService
&& modelService.getCurrentMIMEType().startsWith("application/vnd.oasis.opendocument."));
}
private void visualizeError(Document resultDoc, List<IProblemItem> problems) {
int size = problems.size();
for (int i = 0; i < size; i++) {
Object obj = problems.get(i);
if (obj instanceof ProblemItemImpl) {
ProblemItemImpl prob = (ProblemItemImpl) obj;
if (prob.getId().equals("O_" + NO_ALT_IMAGE)) {
VisualizeReportUtil.visualizeError(resultDoc, prob);
}
}
}
}
}