186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectpackage org.clearsilver; 286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.io.FileNotFoundException; 486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.io.IOException; 586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.Calendar; 786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.Date; 886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.TimeZone; 986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 1086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project/** This class is a wrapper around the HDF C API. Many features of the C API 1186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * are not yet exposed through this wrapper. 1286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 1386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectpublic class HDF { 1486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long hdfptr; // stores the C HDF* pointer 1586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project HDF root; // If this is a child HDF node, points at the root node of 1686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // the tree. For root nodes this is null. A child node needs 1786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // to hold a reference on the root to prevent the root from 1886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // being GC-ed. 1986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project static { 2086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project JNI.loadLibrary(); 2186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 2286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 2386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Constructs an empty HDF dataset */ 2486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF() { 2586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project hdfptr = _init(); 2686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project root = null; 2786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 2886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 2986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Constructs an HDF child node. Used by other methods in this class when 3086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * a child node needs to be constructed. 3186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 3286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private HDF(long hdfptr, HDF parent) { 3386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project this.hdfptr = hdfptr; 3486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project this.root = (parent.root != null) ? parent.root : parent; 3586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 3686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 3786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Clean up allocated memory if neccesary. close() allows application 3886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * to force clean up. 3986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 4086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void close() { 4186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // Only root nodes have ownership of the C HDF pointer, so only a root 4286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // node needs to dealloc hdfptr.dir 4386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( root == null) { 4486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr != 0) { 4586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _dealloc(hdfptr); 4686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project hdfptr = 0; 4786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 4886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 4986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 5086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 5186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Call close() just in case when deallocating Java object. 5286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 5386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // Should be protected access (like Object). 5486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project protected void finalize() throws Throwable { 5586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project close(); 5686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project super.finalize(); 5786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 5886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 5986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Loads the contents of the specified HDF file from disk into the current 6086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * HDF object. The loaded contents are merged with the existing contents. 6186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 6286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public boolean readFile(String filename) throws IOException, 6386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project FileNotFoundException { 6486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 6586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 6686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 6786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _readFile(hdfptr, filename, fileLoader != null); 6886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 6986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 7086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project protected String fileLoad(String filename) throws IOException, 7186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project FileNotFoundException { 7286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 7386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 7486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 7586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project CSFileLoader aFileLoader = fileLoader; 7686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (aFileLoader == null) { 7786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("No fileLoader specified."); 7886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } else { 7986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String result = aFileLoader.load(this, filename); 8086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (result == null) { 8186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("CSFileLoader.load() returned null"); 8286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 8386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return result; 8486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 8586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 8686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 8786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // The optional CS file loader to use to read in files 8886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private CSFileLoader fileLoader = null; 8986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 9086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** 9186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Get the file loader in use, if any. 9286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * @return the file loader in use. 9386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 9486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public CSFileLoader getFileLoader() { 9586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return fileLoader; 9686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 9786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 9886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** 9986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Set the CS file loader to use 10086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * @param fileLoader the file loader that should be used. 10186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 10286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void setFileLoader(CSFileLoader fileLoader) { 10386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project this.fileLoader = fileLoader; 10486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 10586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 10686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Serializes HDF contents to a file (readable by readFile) 10786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 10886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public boolean writeFile(String filename) throws IOException { 10986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 11086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 11186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 11286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _writeFile(hdfptr, filename); 11386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 11486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 11586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Serializes HDF contents to a file (readable by readFile), but 11686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * writes the file atomically by writing to a temp file then doing a 11786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * rename(2) on it. 11886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 11986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public boolean writeFileAtomic(String filename) throws IOException { 12086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 12186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 12286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 12386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _writeFileAtomic(hdfptr, filename); 12486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 12586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 12686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Parses/loads the contents of the given string as HDF into the current 12786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * HDF object. The loaded contents are merged with the existing contents. 12886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 12986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public boolean readString(String data) { 13086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 13186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 13286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 13386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _readString(hdfptr, data); 13486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 13586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 13686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Serializes HDF contents to a string (readable by readString) 13786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 13886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public String writeString() { 13986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 14086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 14186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 14286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _writeString(hdfptr); 14386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 14486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 14586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Retrieves the integer value at the specified path in this HDF node's 14686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * subtree. If the value does not exist, or cannot be converted to an 14786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * integer, default_value will be returned. */ 14886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public int getIntValue(String hdfname, int default_value) { 14986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 15086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 15186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 15286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _getIntValue(hdfptr,hdfname,default_value); 15386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 15486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 15586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Retrieves the value at the specified path in this HDF node's subtree. 15686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 15786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public String getValue(String hdfname, String default_value) { 15886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 15986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 16086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 16186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _getValue(hdfptr,hdfname,default_value); 16286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 16386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 16486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Sets the value at the specified path in this HDF node's subtree. */ 16586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void setValue(String hdfname, String value) { 16686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 16786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 16886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 16986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _setValue(hdfptr,hdfname,value); 17086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 17186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 17286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Remove the specified subtree. */ 17386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void removeTree(String hdfname) { 17486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 17586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 17686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 17786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _removeTree(hdfptr,hdfname); 17886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 17986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 18086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Links the src hdf name to the dest. */ 18186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void setSymLink(String hdf_name_src, String hdf_name_dest) { 18286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 18386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 18486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 18586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _setSymLink(hdfptr,hdf_name_src,hdf_name_dest); 18686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 18786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 18886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Export a date to a clearsilver tree using a specified timezone */ 18986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void exportDate(String hdfname, TimeZone timeZone, Date date) { 19086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 19186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 19286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 19386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 19486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Calendar cal = Calendar.getInstance(timeZone); 19586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project cal.setTime(date); 19686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 19786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String sec = Integer.toString(cal.get(Calendar.SECOND)); 19886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".sec", sec.length() == 1 ? "0" + sec : sec); 19986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 20086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String min = Integer.toString(cal.get(Calendar.MINUTE)); 20186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".min", min.length() == 1 ? "0" + min : min); 20286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 20386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".24hour", 20486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.HOUR_OF_DAY))); 20586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // java.util.Calendar uses represents 12 o'clock as 0 20686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".hour", 20786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString( 20886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project cal.get(Calendar.HOUR) == 0 ? 12 : cal.get(Calendar.HOUR))); 20986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".am", 21086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project cal.get(Calendar.AM_PM) == Calendar.AM ? "1" : "0"); 21186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".mday", 21286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.DAY_OF_MONTH))); 21386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".mon", 21486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.MONTH)+1)); 21586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".year", 21686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.YEAR))); 21786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".2yr", 21886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.YEAR)).substring(2)); 21986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".wday", 22086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Integer.toString(cal.get(Calendar.DAY_OF_WEEK))); 22186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 22286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project boolean tzNegative = timeZone.getRawOffset() < 0; 22386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project int tzAbsolute = java.lang.Math.abs(timeZone.getRawOffset()/1000); 22486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String tzHour = Integer.toString(tzAbsolute/3600); 22586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String tzMin = Integer.toString(tzAbsolute/60 - (tzAbsolute/3600)*60); 22686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String tzString = (tzNegative ? "-" : "+") 22786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project + (tzHour.length() == 1 ? "0" + tzHour : tzHour) 22886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project + (tzMin.length() == 1 ? "0" + tzMin : tzMin); 22986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project setValue(hdfname + ".tzoffset", tzString); 23086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 23186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 23286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Export a date to a clearsilver tree using a specified timezone */ 23386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void exportDate(String hdfname, String tz, int tt) { 23486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 23586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 23686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 23786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 23886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project TimeZone timeZone = TimeZone.getTimeZone(tz); 23986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 24086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (timeZone == null) { 24186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new RuntimeException("Unknown timezone: " + tz); 24286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 24386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 24486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project Date date = new Date((long)tt * 1000); 24586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 24686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project exportDate(hdfname, timeZone, date); 24786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 24886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 24986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Retrieves the HDF object that is the root of the subtree at hdfpath, or 25086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * null if no object exists at that path. */ 25186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF getObj(String hdfpath) { 25286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 25386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 25486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 25586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long obj_ptr = _getObj(hdfptr, hdfpath); 25686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( obj_ptr == 0 ) { 25786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return null; 25886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 25986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return new HDF(obj_ptr, this); 26086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 26186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 26286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Retrieves the HDF for the first child of the root of the subtree 26386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * at hdfpath, or null if no child exists of that path or if the 26486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * path doesn't exist. */ 26586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF getChild(String hdfpath) { 26686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 26786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 26886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 26986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long obj_ptr = _getChild(hdfptr, hdfpath); 27086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( obj_ptr == 0 ) { 27186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return null; 27286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 27386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return new HDF(obj_ptr, this); 27486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 27586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 27686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Return the root of the tree where the current node lies. If the 27786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * current node is the root, return this. */ 27886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF getRootObj() { 27986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return root != null ? root : this; 28086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 28186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 28286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Retrieves the HDF object that is the root of the subtree at 28386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * hdfpath, create the subtree if it doesn't exist */ 28486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF getOrCreateObj(String hdfpath) { 28586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 28686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 28786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 28886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long obj_ptr = _getObj(hdfptr, hdfpath); 28986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( obj_ptr == 0 ) { 29086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project // Create a node 29186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _setValue(hdfptr, hdfpath, ""); 29286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project obj_ptr = _getObj( hdfptr, hdfpath ); 29386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( obj_ptr == 0 ) { 29486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return null; 29586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 29686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 29786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return new HDF(obj_ptr, this); 29886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 29986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 30086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Returns the name of this HDF node. The root node has no name, so 30186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * calling this on the root node will return null. */ 30286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public String objName() { 30386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 30486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 30586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 30686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _objName(hdfptr); 30786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 30886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 30986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Returns the value of this HDF node, or null if this node has no value. 31086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Every node in the tree can have a value, a child, and a next peer. */ 31186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public String objValue() { 31286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 31386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 31486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 31586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _objValue(hdfptr); 31686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 31786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 31886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Returns the child of this HDF node, or null if there is no child. 31986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Use this in conjunction with objNext to walk the HDF tree. Every node 32086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * in the tree can have a value, a child, and a next peer. */ 32186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF objChild() { 32286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 32386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 32486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 32586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long child_ptr = _objChild(hdfptr); 32686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( child_ptr == 0 ) { 32786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return null; 32886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 32986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return new HDF(child_ptr, this); 33086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 33186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 33286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** Returns the next sibling of this HDF node, or null if there is no next 33386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * sibling. Use this in conjunction with objChild to walk the HDF tree. 33486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Every node in the tree can have a value, a child, and a next peer. */ 33586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public HDF objNext() { 33686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 33786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 33886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 33986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project long next_ptr = _objNext(hdfptr); 34086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if ( next_ptr == 0 ) { 34186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return null; 34286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 34386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return new HDF(next_ptr, this); 34486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 34586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 34686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public void copy(String hdfpath, HDF src) { 34786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0 || src.hdfptr == 0) { 34886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 34986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 35086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project _copy(hdfptr, hdfpath, src.hdfptr); 35186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 35286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 35386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project /** 35486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * Generates a string representing the content of the HDF tree rooted at 35586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project * this node. 35686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */ 35786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project public String dump() { 35886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project if (hdfptr == 0) { 35986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project throw new NullPointerException("HDF is closed."); 36086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 36186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project return _dump(hdfptr); 36286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project } 36386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 36486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native long _init(); 36586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native void _dealloc(long ptr); 36686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private native boolean _readFile(long ptr, String filename, boolean use_cb); 36786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native boolean _writeFile(long ptr, String filename); 36886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native boolean _writeFileAtomic(long ptr, String filename); 36986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native boolean _readString(long ptr, String data); 37086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native String _writeString(long ptr); 37186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native int _getIntValue(long ptr, String hdfname, 37286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project int default_value); 37386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native String _getValue(long ptr, String hdfname, 37486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String default_value); 37586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native void _setValue(long ptr, String hdfname, 37686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String hdf_value); 37786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native void _removeTree(long ptr, String hdfname); 37886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native void _setSymLink(long ptr, String hdf_name_src, 37986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project String hdf_name_dest); 38086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native long _getObj(long ptr, String hdfpath); 38186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native long _getChild(long ptr, String hdfpath); 38286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native long _objChild(long ptr); 38386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native long _objNext(long ptr); 38486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native String _objName(long ptr); 38586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native String _objValue(long ptr); 38686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native void _copy(long destptr, String hdfpath, long srcptr); 38786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project 38886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project private static native String _dump(long ptr); 38986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project} 390