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