/******************************************************************************
 * Copyright (C) 2012 Heng Sin Low                                            *
 * Copyright (C) 2012 Trek Global                 							  *
 * This program is free software; you can redistribute it and/or modify it    *
 * under the terms version 2 of the GNU General Public License as published   *
 * by the Free Software Foundation. This program is distributed in the hope   *
 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.           *
 * See the GNU General Public License for more details.                       *
 * You should have received a copy of the GNU General Public License along    *
 * with this program; if not, write to the Free Software Foundation, Inc.,    *
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
 *****************************************************************************/
package org.adempiere.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.Collection;
import java.util.Enumeration;
import java.util.InvalidPropertiesFormatException;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.adempiere.exceptions.AdempiereException;
/**
 * {@link Properties} wrapper for access to thread local server context.
 * Delegate all method calls to {@link ServerContext#getCurrentInstance()}.
 * @author hengsin
 */
public class ServerContextPropertiesWrapper extends Properties {
	/**
	 * generated serial id
	 */
	private static final long serialVersionUID = 4383867755398619422L;
	/**
	 * Default constructor
	 */
	public ServerContextPropertiesWrapper() {
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#setProperty(java.lang.String, java.lang.String)
	 */
	@Override
	public Object setProperty(String key, String value) {
		return ServerContext.getCurrentInstance().setProperty(key, value);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#load(java.io.Reader)
	 */
	@Override
	public void load(Reader reader) throws IOException {
		ServerContext.getCurrentInstance().load(reader);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#load(java.io.InputStream)
	 */
	@Override
	public void load(InputStream inStream) throws IOException {
		ServerContext.getCurrentInstance().load(inStream);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#save(java.io.OutputStream, java.lang.String)
	 */
	@Override
	public void save(OutputStream out, String comments) {
		try {
			ServerContext.getCurrentInstance().store(out, comments);
		} catch (IOException e) {
			throw new AdempiereException(e);
		}
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#store(java.io.Writer, java.lang.String)
	 */
	@Override
	public void store(Writer writer, String comments) throws IOException {
		ServerContext.getCurrentInstance().store(writer, comments);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#store(java.io.OutputStream, java.lang.String)
	 */
	@Override
	public void store(OutputStream out, String comments) throws IOException {
		ServerContext.getCurrentInstance().store(out, comments);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#loadFromXML(java.io.InputStream)
	 */
	@Override
	public void loadFromXML(InputStream in) throws IOException,
			InvalidPropertiesFormatException {
		ServerContext.getCurrentInstance().loadFromXML(in);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#storeToXML(java.io.OutputStream, java.lang.String)
	 */
	@Override
	public void storeToXML(OutputStream os, String comment)
			throws IOException {
		ServerContext.getCurrentInstance().storeToXML(os, comment);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#storeToXML(java.io.OutputStream, java.lang.String, java.lang.String)
	 */
	@Override
	public void storeToXML(OutputStream os, String comment,
			String encoding) throws IOException {
		ServerContext.getCurrentInstance().storeToXML(os, comment, encoding);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#getProperty(java.lang.String)
	 */
	@Override
	public String getProperty(String key) {
		return ServerContext.getCurrentInstance().getProperty(key);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#getProperty(java.lang.String, java.lang.String)
	 */
	@Override
	public String getProperty(String key, String defaultValue) {
		return ServerContext.getCurrentInstance().getProperty(key, defaultValue);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#propertyNames()
	 */
	@Override
	public Enumeration> propertyNames() {
		return ServerContext.getCurrentInstance().propertyNames();
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#stringPropertyNames()
	 */
	@Override
	public Set stringPropertyNames() {
		return ServerContext.getCurrentInstance().stringPropertyNames();
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#list(java.io.PrintStream)
	 */
	@Override
	public void list(PrintStream out) {
		ServerContext.getCurrentInstance().list(out);
	}
	/* (non-Javadoc)
	 * @see java.util.Properties#list(java.io.PrintWriter)
	 */
	@Override
	public void list(PrintWriter out) {
		ServerContext.getCurrentInstance().list(out);
	}
	/* (non-Javadoc)
	 * @see java.util.Hashtable#size()
	 */
	@Override
	public int size() {
		return ServerContext.getCurrentInstance().size();
	}
	/* (non-Javadoc)
	 * @see java.util.Hashtable#isEmpty()
	 */
	@Override
	public boolean isEmpty() {
		return ServerContext.getCurrentInstance().isEmpty();
	}
	/* (non-Javadoc)
	 * @see java.util.Hashtable#keys()
	 */
	@Override
	public Enumeration