/*******************************************************************************
* Copyright (c) 2008, 2015 Angelo Zerr 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
* IBM Corporation
* Lars Vogel <Lars.Vogel@gmail.com> - Bug 422702
*******************************************************************************/
package org.eclipse.e4.ui.css.core.impl.dom.parsers;
import java.io.IOException;
import java.util.Stack;
import org.eclipse.e4.ui.css.core.dom.parsers.CSSParser;
import org.eclipse.e4.ui.css.core.impl.dom.CSSStyleDeclarationImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSValueFactory;
import org.eclipse.e4.ui.css.core.sac.DocumentHandlerFactory;
import org.eclipse.e4.ui.css.core.sac.ExtendedDocumentHandler;
import org.eclipse.e4.ui.css.core.sac.ISACParserFactory;
import org.eclipse.e4.ui.css.core.sac.ParserNotFoundException;
import org.eclipse.e4.ui.css.core.sac.SACParserFactory;
import org.w3c.css.sac.ConditionFactory;
import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.Parser;
import org.w3c.css.sac.SelectorFactory;
import org.w3c.css.sac.SelectorList;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.CSSValue;
/**
* Abstract {@link CSSParser} implementation.
*/
public class AbstractCSSParser implements CSSParser {
private static DocumentHandlerFactory defaultDocumentHandlerFactory;
private static ISACParserFactory defaultParserFactory;
static {
defaultDocumentHandlerFactory = DocumentHandlerFactory.newInstance();
defaultParserFactory = SACParserFactory.newInstance();
}
// SAC
private Parser parser;
private DocumentHandlerFactory documentHandlerFactory;
private ISACParserFactory parserFactory;
private ConditionFactory conditionFactory;
private SelectorFactory selectorFactory;
@Override
public CSSStyleSheet parseStyleSheet(InputSource source) throws IOException {
ExtendedDocumentHandler documentHandler = getDocumentHandlerFactory().makeDocumentHandler();
Parser parser = getParser();
parser.setDocumentHandler(documentHandler);
parser.parseStyleSheet(source);
return (CSSStyleSheet) documentHandler.getNodeRoot();
}
@Override
public CSSStyleDeclaration parseStyleDeclaration(InputSource source) throws IOException {
CSSStyleDeclarationImpl styleDeclaration = new CSSStyleDeclarationImpl(null);
parseStyleDeclaration(((styleDeclaration)), source);
return styleDeclaration;
}
@Override
public void parseStyleDeclaration(CSSStyleDeclaration styleDeclaration, InputSource source) throws IOException {
Stack<Object> stack = new Stack<>();
stack.push(styleDeclaration);
ExtendedDocumentHandler documentHandler = getDocumentHandlerFactory().makeDocumentHandler();
documentHandler.setNodeStack(stack);
Parser parser = getParser();
parser.setDocumentHandler(documentHandler);
parser.parseStyleDeclaration(source);
}
@Override
public CSSValue parsePropertyValue(InputSource source) throws IOException {
Parser parser = getParser();
ExtendedDocumentHandler documentHandler = getDocumentHandlerFactory().makeDocumentHandler();
parser.setDocumentHandler(documentHandler);
return CSSValueFactory.newValue(parser.parsePropertyValue(source));
}
@Override
public CSSRule parseRule(InputSource source) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public SelectorList parseSelectors(InputSource source) throws IOException {
ExtendedDocumentHandler documentHandler = getDocumentHandlerFactory().makeDocumentHandler();
Parser parser = getParser();
parser.setDocumentHandler(documentHandler);
return parser.parseSelectors(source);
}
@Override
public void setParentStyleSheet(CSSStyleSheet parentStyleSheet) {
}
/**
* Return instance of {@link DocumentHandlerFactory}.
*
* @return
*/
public DocumentHandlerFactory getDocumentHandlerFactory() {
if (documentHandlerFactory == null) {
return defaultDocumentHandlerFactory;
}
return documentHandlerFactory;
}
/**
* Set instance of {@link DocumentHandlerFactory}.
*
* @param documentHandlerFactory
*/
@Override
public void setDocumentHandlerFactory(DocumentHandlerFactory documentHandlerFactory) {
this.documentHandlerFactory = documentHandlerFactory;
}
/**
* Return SAC {@link Parser} to use.
*
* @return
*/
public Parser getParser() {
if (parser == null) {
try {
parser = getSACParserFactory().makeParser();
if (conditionFactory != null) {
parser.setConditionFactory(conditionFactory);
}
if (selectorFactory != null) {
parser.setSelectorFactory(selectorFactory);
}
} catch (Exception e) {
// TODO : manage error.
// e.printStackTrace();
throw new ParserNotFoundException(e);
}
}
return parser;
}
/**
* Set SAC {@link Parser} to use.
*
* @param parser
*/
public void setParser(Parser parser) {
this.parser = parser;
}
/**
* Return factory {@link ISACParserFactory} to use.
*
* @return
*/
public ISACParserFactory getSACParserFactory() {
if (parserFactory == null) {
return defaultParserFactory;
}
return parserFactory;
}
/**
* Set factory {@link ISACParserFactory} to use.
*
* @param parserFactory
*/
public void setSACParserFactory(ISACParserFactory parserFactory) {
this.parserFactory = parserFactory;
}
@Override
public ConditionFactory getConditionFactory() {
return conditionFactory;
}
@Override
public void setConditionFactory(ConditionFactory conditionFactory) {
this.conditionFactory = conditionFactory;
}
@Override
public SelectorFactory getSelectorFactory() {
return selectorFactory;
}
@Override
public void setSelectorFactory(SelectorFactory selectorFactory) {
this.selectorFactory = selectorFactory;
}
}