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 com.google.clearsilver.jsilver.adaptor;
1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.JSilverOptions;
2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.Data;
2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.DataFactory;
2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.Parser;
2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.exceptions.JSilverBadSyntaxException;
2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.CSFileLoader;
2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.HDF;
2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.FileWriter;
2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.IOException;
3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.StringReader;
3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.Date;
3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.TimeZone;
3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/**
3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Adaptor that wraps a JSilver Data object so it can be used as an HDF object.
3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */
3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class JHdf implements HDF {
3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  // Only changed to null on close()
4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private Data data;
4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final DataFactory dataFactory;
4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final JSilverOptions options;
4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final LoadPathToFileCache loadPathCache;
4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private ResourceLoaderAdaptor resourceLoader;
4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  JHdf(Data data, DataFactory dataFactory, LoadPathToFileCache loadPathCache, JSilverOptions options) {
4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.data = data;
5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.loadPathCache = loadPathCache;
5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.dataFactory = dataFactory;
5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.options = options;
5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.resourceLoader = new ResourceLoaderAdaptor(this, loadPathCache, null);
5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  static JHdf cast(HDF hdf) {
5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (!(hdf instanceof JHdf)) {
5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      throw new IllegalArgumentException("HDF object not of type JHdf.  "
5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          + "Make sure you use the same ClearsilverFactory to construct all "
6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          + "related HDF and CS objects.");
6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return (JHdf) hdf;
6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  Data getData() {
6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return data;
6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  ResourceLoaderAdaptor getResourceLoaderAdaptor() {
7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return resourceLoader;
7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void close() {
7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // This looks pointless but it actually reduces the lifetime of the large
7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Data object as far as the garbage collector is concerned and
7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // dramatically improves performance.
7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    data = null;
7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public boolean readFile(String filename) throws IOException {
8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    dataFactory.loadData(filename, resourceLoader, data);
8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return false;
8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public CSFileLoader getFileLoader() {
8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return resourceLoader.getCSFileLoader();
9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void setFileLoader(CSFileLoader fileLoader) {
9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.resourceLoader = new ResourceLoaderAdaptor(this, loadPathCache, fileLoader);
9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public boolean writeFile(String filename) throws IOException {
9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    FileWriter writer = new FileWriter(filename);
10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      data.write(writer, 2);
10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } finally {
10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      writer.close();
10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return true;
10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public boolean readString(String content) {
11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Parser hdfParser = dataFactory.getParser();
11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      hdfParser.parse(new StringReader(content), data, new Parser.ErrorHandler() {
11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        public void error(int line, String lineContent, String fileName, String errorMessage) {
11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          throw new JSilverBadSyntaxException("HDF parsing error : '" + errorMessage + "'",
11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson              lineContent, fileName, line, JSilverBadSyntaxException.UNKNOWN_POSITION, null);
11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        }
11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }, resourceLoader, null, options.getIgnoreAttributes());
11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return true;
11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } catch (IOException e) {
12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return false;
12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public int getIntValue(String hdfName, int defaultValue) {
12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return data.getIntValue(hdfName, defaultValue);
12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String getValue(String hdfName, String defaultValue) {
13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return data.getValue(hdfName, defaultValue);
13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void setValue(String hdfName, String value) {
13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    data.setValue(hdfName, value);
13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void removeTree(String hdfName) {
14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    data.removeTree(hdfName);
14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void setSymLink(String hdfNameSrc, String hdfNameDest) {
14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    data.setSymlink(hdfNameSrc, hdfNameDest);
14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void exportDate(String hdfName, TimeZone timeZone, Date date) {
15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    throw new UnsupportedOperationException("TBD");
15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
15456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
15556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void exportDate(String hdfName, String tz, int tt) {
15656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    throw new UnsupportedOperationException("TBD");
15756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
15856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
15956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
16056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF getObj(String hdfpath) {
16156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Data d = data.getChild(hdfpath);
16256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return d == null ? null : new JHdf(d, dataFactory, loadPathCache, options);
16356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
16456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
16556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
16656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF getChild(String hdfpath) {
16756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Data d = data.getChild(hdfpath);
16856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (d == null) {
16956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return null;
17056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
17156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (Data child : d.getChildren()) {
17256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      if (child.isFirstSibling()) {
17356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        return new JHdf(child, dataFactory, loadPathCache, options);
17456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      } else {
17556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        // The first child returned should be the first sibling. Throw an error
17656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        // if not.
17756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        throw new IllegalStateException("First child was not first sibling.");
17856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }
17956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
18056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return null;
18156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
18256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
18356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
18456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF getRootObj() {
18556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Data root = data.getRoot();
18656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (root == data) {
18756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return this;
18856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } else {
18956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return new JHdf(root, dataFactory, loadPathCache, options);
19056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
19156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
19256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
19356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
19456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public boolean belongsToSameRoot(HDF hdf) {
19556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    JHdf jHdf = cast(hdf);
19656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return this.data.getRoot() == jHdf.data.getRoot();
19756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
19856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
19956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
20056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF getOrCreateObj(String hdfpath) {
20156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return new JHdf(data.createChild(hdfpath), dataFactory, loadPathCache, options);
20256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
20356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
20456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
20556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String objName() {
20656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return data.getName();
20756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
20856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
20956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
21056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String objValue() {
21156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return data.getValue();
21256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
21356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
21456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
21556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF objChild() {
21656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (Data child : data.getChildren()) {
21756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      if (child.isFirstSibling()) {
21856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        return new JHdf(child, dataFactory, loadPathCache, options);
21956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }
22056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
22156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return null;
22256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
22356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
22456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
22556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public HDF objNext() {
22656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Data next = data.getNextSibling();
22756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return next == null ? null : new JHdf(next, dataFactory, loadPathCache, options);
22856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
22956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
23056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
23156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void copy(String hdfpath, HDF src) {
23256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    JHdf srcJHdf = cast(src);
23356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (hdfpath.equals("")) {
23456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      data.copy(srcJHdf.data);
23556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } else {
23656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      data.copy(hdfpath, srcJHdf.data);
23756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
23856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
23956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
24056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
24156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String dump() {
24256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    StringBuilder sb = new StringBuilder();
24356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
24456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      data.write(sb, 0);
24556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return sb.toString();
24656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } catch (IOException e) {
24756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return null;
24856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
24956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
25056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
25156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
25256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String writeString() {
25356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return dump();
25456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
25556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
25656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
25756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String toString() {
25856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return dump();
25956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
26056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
26156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
26256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * JSilver-specific method that optimizes the underlying data object. Should only be used on
26356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * long-lived HDF objects (e.g. global HDF).
26456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
26556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void optimize() {
26656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    data.optimize();
26756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
26856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson}
269