| /******************************************************************************* |
| * Copyright (c) 2008 Innoopract Informationssysteme GmbH. |
| * 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: |
| * Innoopract Informationssysteme GmbH - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.rwt.internal.theme.css; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.text.MessageFormat; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.w3c.css.sac.*; |
| |
| |
| public class CssFileReader { |
| |
| private static final String CSS_ENCODING = "UTF-8"; |
| |
| private List problems; |
| |
| private Parser parser; |
| |
| /* BEGIN Modification for Theme Editor */ |
| private List errors; |
| private List warnings; |
| private String uri; |
| /* END Modification for Theme Editor */ |
| |
| public CssFileReader() { |
| try { |
| parser = new org.apache.batik.css.parser.Parser(); |
| } catch( Exception e ) { |
| throw new RuntimeException( "Failed to instantiate CSS parser", e ); |
| } |
| problems = new ArrayList(); |
| /* BEGIN Modification for Theme Editor */ |
| errors = new ArrayList(); |
| warnings = new ArrayList(); |
| /* END Modification for Theme Editor */ |
| } |
| |
| public StyleSheet parse( final InputStream inputStream, final String uri ) |
| throws CSSException, IOException |
| { |
| /* BEGIN Modification for Theme Editor */ |
| this.uri = uri; |
| /* END Modification for Theme Editor */ |
| InputSource source = new InputSource(); |
| source.setByteStream( inputStream ); |
| source.setEncoding( CSS_ENCODING ); |
| source.setURI( uri ); |
| parser.setConditionFactory( new ConditionFactoryImpl( this ) ); |
| parser.setSelectorFactory( new SelectorFactoryImpl( this ) ); |
| DocumentHandlerImpl documentHandler = new DocumentHandlerImpl( this ); |
| parser.setDocumentHandler( documentHandler ); |
| parser.setErrorHandler( new ErrorHandlerImpl( this ) ); |
| parser.parseStyleSheet( source ); |
| StyleRule[] styleRules = documentHandler.getStyleRules(); |
| StyleSheet result = new StyleSheet( styleRules ); |
| /* BEGIN Modification for Theme Editor */ |
| result.setHeaderComment( documentHandler.getHeaderComment() ); |
| /* END Modification for Theme Editor */ |
| return result; |
| } |
| |
| public CSSException[] getProblems() { |
| CSSException[] result = new CSSException[ problems.size() ]; |
| problems.toArray( result ); |
| return result; |
| } |
| |
| void addProblem( final CSSException exception ) { |
| // TODO [rst] Logging instead of sysout |
| System.err.println( exception ); |
| problems.add( exception ); |
| /* BEGIN Modification for Theme Editor */ |
| if( exception instanceof CSSParseException ) { |
| addWarning( ( CSSParseException )exception ); |
| } else if( parser instanceof org.apache.batik.css.parser.Parser ) { |
| CSSParseException parseException = new CSSParseException( exception.getMessage(), |
| uri, |
| getCurrentLine(), |
| 0 ); |
| addWarning( parseException ); |
| } |
| /* END Modification for Theme Editor */ |
| } |
| |
| public CSSParseException[] getErrors() { |
| CSSParseException[] result = new CSSParseException[ errors.size() ]; |
| errors.toArray( result ); |
| return result; |
| } |
| |
| public CSSParseException[] getWarnings() { |
| CSSParseException[] result = new CSSParseException[ warnings.size() ]; |
| warnings.toArray( result ); |
| return result; |
| } |
| |
| private void addError( final CSSParseException exception ) { |
| errors.add( exception ); |
| } |
| |
| private void addWarning( final CSSParseException exception ) { |
| warnings.add( exception ); |
| } |
| |
| public int getCurrentLine() { |
| int result = -1; |
| if( parser instanceof org.apache.batik.css.parser.Parser ) { |
| //result = ( ( org.apache.batik.css.parser.Parser )parser ).getLine(); |
| } |
| return result; |
| } |
| /* END Modification for Theme Editor */ |
| |
| |
| private static String createProblemDescription( final String type, |
| final CSSParseException exception ) |
| { |
| String pattern = "{0}: {1} in {2} at pos [{3}:{4}]"; |
| Object[] arguments = new Object[] { |
| type, |
| exception.getMessage(), |
| exception.getURI(), |
| String.valueOf( exception.getLineNumber() ), |
| String.valueOf( exception.getColumnNumber() ) |
| }; |
| return MessageFormat.format( pattern, arguments ); |
| } |
| |
| private static class ErrorHandlerImpl implements ErrorHandler { |
| |
| // private final List problems; |
| private final CssFileReader reader; |
| |
| public ErrorHandlerImpl( final CssFileReader reader ) { |
| // this.problems = reader.problems; |
| this.reader = reader; |
| } |
| |
| // TODO [rst] decent logging instead of sysout |
| public void warning( final CSSParseException exception ) throws CSSException { |
| // String problem = createProblemDescription( "WARNING: ", exception ); |
| // System.err.println( problem ); |
| // problems.add( exception ); |
| reader.addWarning( exception ); |
| } |
| |
| public void error( final CSSParseException exception ) throws CSSException { |
| // String problem = createProblemDescription( "ERROR: ", exception ); |
| // System.err.println( problem ); |
| // problems.add( exception ); |
| reader.addError( exception ); |
| } |
| |
| public void fatalError( final CSSParseException exception ) throws CSSException { |
| // String problem = createProblemDescription( "FATAL ERROR: ", exception ); |
| // System.err.println( problem ); |
| // problems.add( exception ); |
| reader.addError( exception ); |
| throw exception; |
| } |
| } |
| } |