/*
+---------------------------------------------------------------------------+
| OpenX v2.8                                                                |
| =========                                                                 |
|                                                                           |
| Copyright (c) 2003-2009 OpenX Limited                                     |
| For contact details, see: http://www.openx.org/                           |
|                                                                           |
| This program is free software; you can redistribute it and/or modify      |
| it under the terms of the GNU General Public License as published by      |
| the Free Software Foundation; either version 2 of the License, or         |
| (at your option) any later version.                                       |
|                                                                           |
| 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 |
+---------------------------------------------------------------------------+
$Id:$
*/

package org.openads.proxy;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Map;
import java.util.Vector;

import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;

/**
 * The Class AbstractService.
 *
 * @author     Andriy Petlyovanyy <apetlyovanyy@lohika.com>
 */
abstract class AbstractService {
	private XmlRpcClient client;
	private String sessionId;

	/**
	 * Gets the service.
	 *
	 * @return the service
	 */
	abstract String getService();

	/**
	 * Instantiates a new abstract service.
	 *
	 * @param client the client
	 * @param basepath the basepath
	 * @throws MalformedURLException
	 */
	public AbstractService(String basepath) throws MalformedURLException {
		super();
		this.client = new XmlRpcClient(basepath + "/" + getService());
	}


	/**
	 * Sets the session id.
	 *
	 * @param sessionId the new session id
	 */
	public void setSessionId(String sessionId) {
		this.sessionId = sessionId;
	}

	/**
	 * Execute.
	 *
	 * @param methodName the method name
	 * @param params the params
	 *
	 * @return the object
	 *
	 * @throws XmlRpcException the xml rpc exception
	 * @throws IOException
	 */
	public Object execute(String methodName, Object... params)
			throws XmlRpcException, IOException {

		Vector paramsWithSessionId = new Vector(params.length + 1);
		paramsWithSessionId.add(sessionId);

		for (int i = 0; i < params.length; i++) {
			paramsWithSessionId.add(params[i]);
		}

		Object result = client.execute(methodName, paramsWithSessionId);

		if (result instanceof XmlRpcException) {
			throw (XmlRpcException) result;
		}

		return result;
	}

	/**
	 * Execute without session id.
	 *
	 * @param methodName the method name
	 * @param params the params
	 *
	 * @return the object
	 *
	 * @throws XmlRpcException the xml rpc exception
	 * @throws IOException
	 */
	public Object executeWithoutSessionId(String methodName, Object... params)
			throws XmlRpcException, IOException {
		Vector paramsVector = new Vector();
		for(int i = 0; i < params.length; i++) {
			paramsVector.add(params[i]);
		}

		Object result = client.execute(methodName, paramsVector);

		if (result instanceof XmlRpcException) {
			throw (XmlRpcException) result;
		}

		return result;
	}

	/**
	 * Object to array maps.
	 *
	 * @param arrayObjects the array objects
	 *
	 * @return the Map[]
	 */
	public Map[] vectorToArrayMaps(Object arrayObjects) {
		Map[] arrayMaps;

		try {
			Vector vector = (Vector) arrayObjects;

			arrayMaps = new Map[vector.size()];

			for (int i = 0; i < arrayMaps.length; i++) {
				arrayMaps[i] = (Map) vector.get(i);
			}
		} catch (Exception e) {
			throw new IllegalArgumentException(e.getMessage());
		}

		return arrayMaps;
	}

}
