/*
 * Copyright (C) 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.clearsilver;

import java.io.IOException;

/**
 * Utility class that delegates all methods of an CS object. Made to
 * facilitate the transition to CS being an interface and thus not
 * extensible in the same way as it was.
 * <p>
 * This class, and its subclasses must take care to wrap or unwrap HDF and CS
 * objects as they are passed through from the callers to the delegate object.
 *
 */
public abstract class DelegatedCs implements CS {
  private final CS cs;

  public DelegatedCs(CS cs) {
    // Give it an empty HDF. We aren't going to be using the super object anyways.
    this.cs = cs;
  }

  public CS getCs() {
    return cs;
  }

  /**
   * Method subclasses are required to override with a method that returns a
   * new DelegatedHdf object that wraps the specified HDF object.
   *
   * @param hdf an HDF object that should be wrapped in a new DelegatedHdf
   * object of the same type as this current object.
   * @return an object that is a subclass of DelegatedHdf and which wraps the
   * given HDF object.
   */
  protected abstract DelegatedHdf newDelegatedHdf(HDF hdf);

  public void setGlobalHDF(HDF global) {
    if (global != null && global instanceof DelegatedHdf) {
      global = ((DelegatedHdf)global).getHdf();
    }
    getCs().setGlobalHDF(global);
  }

  public HDF getGlobalHDF() {
    HDF hdf =  getCs().getGlobalHDF();
    return hdf != null ? newDelegatedHdf(hdf) : null;
  }

  public void close() {
    getCs().close();
  }

  public void parseFile(String filename) throws IOException {
    getCs().parseFile(filename);
  }
  public void parseStr(String content) {
    getCs().parseStr(content);
  }

  public String render() {
    return getCs().render();
  }

  public CSFileLoader getFileLoader() {
    return getCs().getFileLoader();
  }

  public void setFileLoader(CSFileLoader fileLoader) {
    getCs().setFileLoader(fileLoader);
  }

}