Home | History | Annotate | Download | only in jni
      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 
     17 package org.clearsilver.jni;
     18 
     19 import org.clearsilver.CS;
     20 import org.clearsilver.CSFileLoader;
     21 import org.clearsilver.HDF;
     22 
     23 import java.io.FileNotFoundException;
     24 import java.io.IOException;
     25 
     26 /**
     27  * JNI implementation of the CS interface.
     28  */
     29 public class JniCs implements CS {
     30   long csptr;
     31 
     32   protected JniHdf globalHDF;
     33   protected JniHdf localHDF;
     34 
     35   static {
     36     JNI.loadLibrary();
     37   }
     38 
     39   JniCs(JniHdf ho) {
     40     this.globalHDF = null;
     41     this.localHDF = ho;
     42     csptr = _init(ho.hdfptr);
     43   }
     44 
     45   JniCs(JniHdf ho, JniHdf global) {
     46     this(ho);
     47 
     48     this.globalHDF = global;
     49     if (global != null) {
     50       _setGlobalHdf(csptr,global.hdfptr);
     51     }
     52   }
     53 
     54   // Specify a new/different global HDF
     55   public void setGlobalHDF(HDF global) {
     56     JniHdf globalHdf = JniHdf.cast(global);
     57     _setGlobalHdf(csptr, globalHdf.hdfptr);
     58     this.globalHDF = globalHdf;
     59   }
     60 
     61   // Return global hdf in use
     62   public HDF getGlobalHDF() {
     63     return this.globalHDF;
     64   }
     65 
     66   public void close() {
     67     if (csptr != 0) {
     68       _dealloc(csptr);
     69       csptr = 0;
     70     }
     71   }
     72 
     73   // Don't rely on this being called.
     74   protected void finalize() {
     75     close();
     76   }
     77 
     78   /**
     79    * Parses the specified file as if it has template content. The file will
     80    * be located using the HDF's loadpaths.
     81    * @param filename the name of file to read in and parse.
     82    * @throws java.io.FileNotFoundException if the specified file does not
     83    * exist.
     84    * @throws IOException other problems reading the file.
     85    */
     86   public void parseFile(String filename) throws IOException {
     87     if (csptr == 0) {
     88      throw new NullPointerException("CS is closed.");
     89     }
     90     _parseFile(csptr, filename, fileLoader != null);
     91   }
     92 
     93   public void parseStr(String content) {
     94     if (csptr == 0) {
     95       throw new NullPointerException("CS is closed.");
     96     }
     97     _parseStr(csptr,content);
     98   }
     99 
    100   public String render() {
    101     if (csptr == 0) {
    102       throw new NullPointerException("CS is closed.");
    103     }
    104     return _render(csptr, fileLoader != null);
    105   }
    106 
    107 
    108   protected String fileLoad(String filename) throws IOException,
    109       FileNotFoundException {
    110     if (csptr == 0) {
    111       throw new NullPointerException("CS is closed.");
    112     }
    113     CSFileLoader aFileLoader = fileLoader;
    114     if (aFileLoader == null) {
    115       throw new NullPointerException("No fileLoader specified.");
    116     } else {
    117       String result = aFileLoader.load(localHDF, filename);
    118       if (result == null) {
    119         throw new NullPointerException("CSFileLoader.load() returned null");
    120       }
    121       return result;
    122     }
    123   }
    124 
    125   // The optional CS file loader to use to read in files
    126   private CSFileLoader fileLoader = null;
    127 
    128   /**
    129    * Get the file loader in use, if any.
    130    * @return the file loader in use.
    131    */
    132   public CSFileLoader getFileLoader() {
    133     return fileLoader;
    134   }
    135 
    136   /**
    137    * Set the CS file loader to use
    138    * @param fileLoader the file loader that should be used.
    139    */
    140   public void setFileLoader(CSFileLoader fileLoader) {
    141     this.fileLoader = fileLoader;
    142   }
    143 
    144 
    145   // Native methods
    146   private native long    _init(long ptr);
    147   private native void   _dealloc(long ptr);
    148   private native void   _parseFile(long ptr, String filename,
    149       boolean use_cb) throws IOException;
    150   private native void   _parseStr(long ptr, String content);
    151   private native String _render(long ptr, boolean use_cb);
    152   private native void   _setGlobalHdf(long csptr, long hdfptr);
    153 }
    154