1/* 2 * Copyright (C) 2010 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.google.clearsilver.jsilver.data; 18 19import com.google.clearsilver.jsilver.exceptions.JSilverBadSyntaxException; 20import com.google.clearsilver.jsilver.resourceloader.ResourceLoader; 21 22import java.io.FileNotFoundException; 23import java.io.IOException; 24import java.io.Reader; 25 26/** 27 * Loads data in Hierarchical Data Format (HDF) into Data objects. 28 */ 29public class HDFDataFactory implements DataFactory { 30 private final Parser hdfParser; 31 private final boolean ignoreAttributes; 32 33 public HDFDataFactory(boolean ignoreAttributes) { 34 this(ignoreAttributes, new NoOpStringInternStrategy()); 35 } 36 37 public HDFDataFactory(boolean ignoreAttributes, StringInternStrategy stringInternStrategy) { 38 this(NewHdfParser.newFactory(stringInternStrategy), ignoreAttributes); 39 } 40 41 public HDFDataFactory(ParserFactory hdfParserFactory, boolean ignoreAttributes) { 42 this.ignoreAttributes = ignoreAttributes; 43 this.hdfParser = hdfParserFactory.newInstance(); 44 } 45 46 @Override 47 public Data createData() { 48 return new DefaultData(); 49 } 50 51 @Override 52 public void loadData(final String dataFileName, ResourceLoader resourceLoader, Data output) 53 throws JSilverBadSyntaxException, IOException { 54 Reader reader = resourceLoader.open(dataFileName); 55 if (reader == null) { 56 throw new FileNotFoundException(dataFileName); 57 } 58 try { 59 hdfParser.parse(reader, output, new Parser.ErrorHandler() { 60 public void error(int line, String lineContent, String fileName, String errorMessage) { 61 throw new JSilverBadSyntaxException("HDF parsing error : '" + errorMessage + "'", 62 lineContent, fileName, line, JSilverBadSyntaxException.UNKNOWN_POSITION, null); 63 } 64 }, resourceLoader, dataFileName, ignoreAttributes); 65 } finally { 66 resourceLoader.close(reader); 67 } 68 } 69 70 @Override 71 public Data loadData(String dataFileName, ResourceLoader resourceLoader) throws IOException { 72 Data result = createData(); 73 loadData(dataFileName, resourceLoader, result); 74 return result; 75 } 76 77 @Override 78 public Parser getParser() { 79 return hdfParser; 80 } 81} 82