package org.objectstyle.wolips.wodclipse.core.completion;
import java.util.LinkedList;
import java.util.List;
import jp.aonir.fuzzyxml.FuzzyXMLDocument;
import jp.aonir.fuzzyxml.FuzzyXMLParser;
import jp.aonir.fuzzyxml.event.FuzzyXMLErrorEvent;
import jp.aonir.fuzzyxml.event.FuzzyXMLErrorListener;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.Position;
import org.objectstyle.wolips.bindings.Activator;
import org.objectstyle.wolips.bindings.preferences.PreferenceConstants;
import org.objectstyle.wolips.bindings.wod.HtmlElementCache;
import org.objectstyle.wolips.variables.BuildProperties;
import org.objectstyle.wolips.wodclipse.core.util.WodHtmlUtils;
import org.objectstyle.wolips.wodclipse.core.validation.HtmlProblem;
import org.objectstyle.wolips.wodclipse.core.validation.TemplateValidator;
public class HtmlCacheEntry extends AbstractCacheEntry<FuzzyXMLDocument> implements FuzzyXMLErrorListener {
private HtmlElementCache _htmlElementCache;
private List<HtmlProblem> _parserProblems;
public HtmlCacheEntry(WodParserCache cache) {
super(cache);
}
public HtmlElementCache getHtmlElementCache() throws Exception {
getCache().parse();
getCache().validate(false, true);
return _htmlElementCache;
}
@Override
public void validate() throws Exception {
setValidated(true);
IFile htmlFile = getFile();
FuzzyXMLDocument htmlXmlDocument = _getModel();
if (htmlXmlDocument != null && (htmlFile == null || htmlFile.exists())) {
String htmlErrorsSeverity = Activator.getDefault().getPluginPreferences().getString(PreferenceConstants.HTML_ERRORS_SEVERITY_KEY);
if (!PreferenceConstants.IGNORE.equals(htmlErrorsSeverity)) {
if (htmlFile != null && htmlFile.exists()) {
for (HtmlProblem problem : getParserProblems()) {
problem.createMarker(htmlFile, htmlErrorsSeverity);
}
}
}
new TemplateValidator(getCache()).validate(htmlXmlDocument);
}
}
@Override
protected String _process(String contents) {
String processedHtmlContents = contents;
processedHtmlContents = processedHtmlContents.replaceAll("\r\n", " \n");
processedHtmlContents = processedHtmlContents.replaceAll("\r", "\n");
return processedHtmlContents;
}
@Override
protected FuzzyXMLDocument _parse(String contents) {
BuildProperties buildProperties = (BuildProperties)getCache().getProject().getAdapter(BuildProperties.class);
FuzzyXMLParser parser = new FuzzyXMLParser(buildProperties != null ? buildProperties.isWellFormedTemplateRequired() : false, true);
parser.addErrorListener(this);
FuzzyXMLDocument htmlXmlDocument = parser.parse(contents);
return htmlXmlDocument;
}
@Override
public void clear() {
super.clear();
_parserProblems = new LinkedList<HtmlProblem>();
_htmlElementCache = new HtmlElementCache();
}
public void error(FuzzyXMLErrorEvent event) {
int offset = event.getOffset();
int length = event.getLength();
String message = event.getMessage();
IFile htmlFile = getFile();
String contents = getContents();
HtmlProblem problem = new HtmlProblem(htmlFile, message, new Position(offset, length), WodHtmlUtils.getLineAtOffset(contents, offset), false);
_parserProblems.add(problem);
}
public List<HtmlProblem> getParserProblems() {
return _parserProblems;
}
}