/*******************************************************************************
 * 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.useradmin.internal;

import java.util.HashMap;
import java.util.Map;

import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;

import org.osgi.jmx.service.useradmin.UserAdminMBean;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;

/** 
 */
public final class OSGiGroup extends OSGiUser {
	
	/**
	 * the members
	 */
	private String[] members;
	
	/**
	 * the required members
	 */
	private String[] requiredMembers;

	/**
	 * Construct an instance from the OSGi group
	 * 
	 * @param group
	 */
	public OSGiGroup(Group group) {
		super(group);
		Role[] m = group.getMembers();
		if (m != null) {
			members = new String[m.length];
			int i = 0;
			for (Role role : m) {
				members[i++] = role.getName();
			}
		} else {
			members = new String[0];
		}
		Role[] rm = group.getRequiredMembers();
		if (rm != null) {
			requiredMembers = new String[rm.length];
			int i = 0;
			for (Role role : rm) {
				requiredMembers[i++] = role.getName();
			}
		} else {
			requiredMembers = new String[0];
		}
	}

	/**
	 * Construct an instance from the supplied composite data
	 * 
	 * @param data
	 */
	public OSGiGroup(CompositeData data) {
		super(data);
		members = (String[]) data.get(UserAdminMBean.MEMBERS);
		requiredMembers = (String[]) data.get(UserAdminMBean.REQUIRED_MEMBERS);
	}

	/**
	 * Convert the receiver into the composite data representation
	 * 
	 * @return the composite data representation of the receiver
	 * @throws OpenDataException
	 */
	public CompositeData asCompositeData() throws OpenDataException {
		Map<String, Object> items = new HashMap<String, Object>();
		items.put(UserAdminMBean.NAME, name);
		items.put(UserAdminMBean.TYPE, type);
		items.put(UserAdminMBean.MEMBERS, members);
		items.put(UserAdminMBean.REQUIRED_MEMBERS, requiredMembers);
		return new CompositeDataSupport(UserAdminMBean.GROUP_TYPE, items);
	}

	/**
	 * @return the members
	 */
	public String[] getMembers() {
		return members;
	}

	/**
	 * @return the requiredMembers
	 */
	public String[] getRequiredMembers() {
		return requiredMembers;
	}
}
