/**
 * $RCSfile$
 * $Revision$
 * $Date$
 *
 * Copyright (C) 2004 Jive Software. All rights reserved.
 *
 * This software is published under the terms of the GNU Public License (GPL),
 * a copy of which is included in this distribution.
 */

package org.jivesoftware.messenger.spi;

import org.jivesoftware.messenger.XMPPFragment;

import java.util.*;

abstract public class AbstractFragment implements XMPPFragment {

    protected LinkedList fragments;
    protected String namespace = "";
    protected String name = "";

    /**
     * <p>Returns a namespace associated with this meta-data or null if none has been associated.</p>
     *
     * @return The namespace associated with this meta-data
     */
    public String getNamespace() {
        return namespace;
    }

    /**
     * <p>Sets a namespace associated with this meta-data or null if none has been associated.</p>
     *
     * @param namespace The namespace associated with this meta-data
     */
    public void setNamespace(String namespace) {
        this.namespace = namespace;
    }

    /**
     * <p>Returns a name associated with this meta-data or null if none has been associated.</p>
     *
     * @return The name associated with this meta-data
     */
    public String getName() {
        return name;
    }

    /**
     * <p>Sets a namespace associated with this meta-data or null if none has been associated.</p>
     *
     * @param name The namespace associated with this meta-data
     */
    public void setName(String name) {
        this.name = name;
    }

    public int getSize() {
        // estimate it to be something smaller than a packet
        return 20;
    }

    public void addFragment(XMPPFragment fragment) {
        if (fragments == null) {
            fragments = new LinkedList();
        }
        else {
            // inspect for circular parent-child relationship
            if (fragment.equals(this)) {
                throw new IllegalArgumentException("Circular parent-child relationship");
            }
            Iterator frags = fragment.getFragments();
            while (frags.hasNext()) {
                if (frags.next().equals(this)) {
                    throw new IllegalArgumentException("Circular parent-child relationship");
                }
            }
        }
        fragments.addLast(fragment);
    }

    public Iterator getFragments() {
        if (fragments == null) {
            return Collections.EMPTY_LIST.iterator();
        }
        else {
            return fragments.iterator();
        }
    }

    public XMPPFragment getFragment(String name, String namespace) {
        if (fragments == null) {
            return null;
        }
        XMPPFragment frag;
        for (Iterator frags = fragments.iterator(); frags.hasNext();) {
            frag = (XMPPFragment)frags.next();
            if (name.equals(frag.getName()) && namespace.equals(frag.getNamespace())) {
                return frag;
            }
        }
        return null;
    }

    public void clearFragments() {
        if (fragments != null) {
            fragments.clear();
        }
    }
}