/*******************************************************************************
 * Copyright (c) 2010 Oracle.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 * and the Apache License v2.0 is available at 
 *     http://www.opensource.org/licenses/apache2.0.php.
 * You may elect to redistribute this code under either of these licenses.
 *
 * Contributors:
 *     Hal Hildebrand - Initial JMX support 
 ******************************************************************************/

package org.eclipse.gemini.mgmt.configurationadmin;

import static org.eclipse.gemini.mgmt.internal.OSGiProperties.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.management.openmbean.TabularData;

import org.osgi.framework.InvalidSyntaxException;

import org.osgi.jmx.service.cm.ConfigurationAdminMBean;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;

/** 
 * 
 */
public final class ConfigAdminManager implements ConfigurationAdminMBean {

	private final ConfigurationAdmin admin;
	
	private static final Logger log = Logger.getLogger(ConfigAdminManager.class.getCanonicalName());

	public ConfigAdminManager(ConfigurationAdmin admin) {
		this.admin = admin;
	}

	/**
	 * {@inheritDoc}
	 */
	public String createFactoryConfiguration(String factoryPid) throws IOException {
		if (factoryPid == null) {
			throw new IOException("Factory PID must not be null");
		}
		Configuration c = admin.createFactoryConfiguration(factoryPid);
		c.setBundleLocation(null);
		return c.getPid();
	}

	/**
	 * {@inheritDoc}
	 */
	public String createFactoryConfigurationForLocation(String factoryPid, String location) throws IOException {
		if (factoryPid == null) {
			throw new IOException("Factory PID must not be null");
		}
		Configuration c = admin.createFactoryConfiguration(factoryPid);
		c.setBundleLocation(location);
		return c.getPid();
	}

	/**
	 * {@inheritDoc}
	 */
	public void delete(String pid) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		admin.getConfiguration(pid, null).delete();
	}

	/**
	 * {@inheritDoc}
	 */
	public void deleteForLocation(String pid, String location) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		admin.getConfiguration(pid, location).delete();
	}

	/**
	 * {@inheritDoc}
	 */
	public void deleteConfigurations(String filter) throws IOException {
		Configuration[] confs;
		try {
			confs = admin.listConfigurations(filter);
		} catch (InvalidSyntaxException e) {
			log.log(Level.SEVERE, "Invalid filter argument: " + filter, e);
			throw new IOException("Invalid filter: " + e);
		}
		if (confs != null) {
			for (Configuration conf : confs) {
				conf.delete();
			}
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public String getBundleLocation(String pid) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		return admin.getConfiguration(pid, null).getBundleLocation();
	}

	/**
	 * {@inheritDoc}
	 */
	public String getFactoryPid(String pid) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		return admin.getConfiguration(pid, null).getFactoryPid();
	}

	/**
	 * {@inheritDoc}
	 */
	public String getFactoryPidForLocation(String pid, String location)
			throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		return admin.getConfiguration(pid, location).getFactoryPid();
	}

	/**
	 * {@inheritDoc}
	 */
	public TabularData getProperties(String pid) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		@SuppressWarnings("unchecked")
		Dictionary<String, Object> properties = admin.getConfiguration(pid, null).getProperties();
		return properties == null ? null : tableFrom(properties);
	}

	/**
	 * {@inheritDoc}
	 */
	public TabularData getPropertiesForLocation(String pid, String location)
			throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		@SuppressWarnings("unchecked")
		Dictionary<String, Object> properties = admin.getConfiguration(pid, location).getProperties();
		return properties == null ? null : tableFrom(properties);
	}

	/**
	 * {@inheritDoc}
	 */
	public String[][] getConfigurations(String filter) throws IOException {
		ArrayList<String[]> pids = new ArrayList<String[]>();
		Configuration[] configurations;
		try {
			configurations = admin.listConfigurations(filter);
		} catch (InvalidSyntaxException e) {
			log.log(Level.SEVERE, "Invalid filter argument: " + filter, e);
			throw new IOException("Invalid filter: " + e);
		}
		if (configurations != null) {
			for (Configuration config : configurations) {
				pids.add(new String[] { config.getPid(), config.getBundleLocation() });
			}
		}
		return pids.toArray(new String[pids.size()][]);
	}

	/**
	 * {@inheritDoc}
	 */
	public void setBundleLocation(String pid, String location) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		admin.getConfiguration(pid).setBundleLocation(location);
	}

	/**
	 * {@inheritDoc}
	 */
	public void update(String pid, TabularData table) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		admin.getConfiguration(pid, null).update(propertiesFrom(table));
	}

	/**
	 * {@inheritDoc}
	 */
	public void updateForLocation(String pid, String location, TabularData table) throws IOException {
		if (pid == null) {
			throw new IOException("PID must not be null");
		}
		admin.getConfiguration(pid, location).update(propertiesFrom(table));
	}

}
