/**
 * ***************************************************************
 * JADE - Java Agent DEvelopment Framework is a framework to develop
 * multi-agent systems in compliance with the FIPA specifications.
 * Copyright (C) 2000 CSELT S.p.A.
 * 
 * GNU Lesser General Public License
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation,
 * version 2.1 of the License.
 * 
 * This library 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
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 * **************************************************************
 */
package jade.content;

import jade.core.AID;
import jade.util.leap.Iterator;

/**
 * Utility class that allow using an <code>AID</code> object
 * as an ontological concept.
 * @author Giovanni Caire - TILAB
 */
public class OntoAID extends AID implements Concept {

  /**
   * Constructs an ontological Agent-Identifier whose slot name is 
   * set to an empty string
   * @see AID#AID()
   */
	public OntoAID() {
		super();
	}
	
  /** 
   * Constructor for an ontological Agent-identifier
   * @param name is the value for the slot name for the agent. 
   * @param isGUID indicates if the passed <code>name</code>
   * is already a globally unique identifier or not. Two
   * constants <code>ISGUID</code>, <code>ISLOCALNAME</code>
   * have also been defined for setting a value for this parameter.
   * If the name is a local name, then the HAP (Home Agent Platform)
   * is concatenated to the name, separated by  "@".
   * @see AID#AID(String, boolean)
   */
	public OntoAID(String name, boolean isGUID) {
		super(name, isGUID);
	}
	
	/** 
	 * Create an ontological Agent identifier that wraps an existing 
	 * <code>AID</code>.
	 * @param id the <code>AID</code>to be wrapped. If <code>id</code>
	 * is already an ontological agent identifier no new object is 
	 * created and <code>id</code> is returned with the resolvers 
	 * (if any) properly wrapped.
	 */
	public static OntoAID wrap(AID id) {
		OntoAID wrapper = null;
		if (id != null) {
			if (id instanceof OntoAID) {
				wrapper = (OntoAID) id;
			}
			else {
				wrapper = new OntoAID(id.getName(), ISGUID);
				Iterator it = id.getAllAddresses();
				while (it.hasNext()) {
					wrapper.addAddresses((String) it.next());
				}
				it = id.getAllResolvers();
				while (it.hasNext()) {
					// This automatically performs the wrapping
					wrapper.addResolvers((AID) it.next()); 
				}
			}
		}
		return wrapper; 
	}
	
	/**
	 * This method is redefined so that resolvers AID are automatically
	 * wrapped into OntoAIDs
	 */
	public void addResolvers(AID aid) {
		super.addResolvers(wrap(aid));
	}
	
	// FIXME: clone method should be redefined too	
}

