156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/* 256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc. 356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License. 656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at 756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software 1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and 1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License. 1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage org.clearsilver.jni; 1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.CS; 2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.CSFileLoader; 2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.HDF; 2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.FileNotFoundException; 2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.IOException; 2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/** 2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * JNI implementation of the CS interface. 2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class JniCs implements CS { 3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson long csptr; 3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected JniHdf globalHDF; 3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected JniHdf localHDF; 3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson static { 3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JNI.loadLibrary(); 3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JniCs(JniHdf ho) { 4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.globalHDF = null; 4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.localHDF = ho; 4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson csptr = _init(ho.hdfptr); 4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JniCs(JniHdf ho, JniHdf global) { 4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this(ho); 4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.globalHDF = global; 4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (global != null) { 5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson _setGlobalHdf(csptr,global.hdfptr); 5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Specify a new/different global HDF 5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setGlobalHDF(HDF global) { 5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JniHdf globalHdf = JniHdf.cast(global); 5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson _setGlobalHdf(csptr, globalHdf.hdfptr); 5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.globalHDF = globalHdf; 5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Return global hdf in use 6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public HDF getGlobalHDF() { 6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return this.globalHDF; 6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void close() { 6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (csptr != 0) { 6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson _dealloc(csptr); 6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson csptr = 0; 7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Don't rely on this being called. 7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected void finalize() { 7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson close(); 7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Parses the specified file as if it has template content. The file will 8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * be located using the HDF's loadpaths. 8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @param filename the name of file to read in and parse. 8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @throws java.io.FileNotFoundException if the specified file does not 8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * exist. 8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @throws IOException other problems reading the file. 8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void parseFile(String filename) throws IOException { 8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (csptr == 0) { 8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("CS is closed."); 8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson _parseFile(csptr, filename, fileLoader != null); 9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void parseStr(String content) { 9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (csptr == 0) { 9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("CS is closed."); 9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson _parseStr(csptr,content); 9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String render() { 10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (csptr == 0) { 10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("CS is closed."); 10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return _render(csptr, fileLoader != null); 10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected String fileLoad(String filename) throws IOException, 10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson FileNotFoundException { 11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (csptr == 0) { 11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("CS is closed."); 11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson CSFileLoader aFileLoader = fileLoader; 11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (aFileLoader == null) { 11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("No fileLoader specified."); 11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } else { 11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson String result = aFileLoader.load(localHDF, filename); 11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (result == null) { 11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("CSFileLoader.load() returned null"); 12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return result; 12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // The optional CS file loader to use to read in files 12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private CSFileLoader fileLoader = null; 12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Get the file loader in use, if any. 13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @return the file loader in use. 13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public CSFileLoader getFileLoader() { 13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return fileLoader; 13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Set the CS file loader to use 13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @param fileLoader the file loader that should be used. 13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setFileLoader(CSFileLoader fileLoader) { 14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.fileLoader = fileLoader; 14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Native methods 14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native long _init(long ptr); 14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native void _dealloc(long ptr); 14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native void _parseFile(long ptr, String filename, 14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson boolean use_cb) throws IOException; 15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native void _parseStr(long ptr, String content); 15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native String _render(long ptr, boolean use_cb); 15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private native void _setGlobalHdf(long csptr, long hdfptr); 15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson} 154