/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

package org.bodington.server.ims;

import java.util.Enumeration;
import javax.swing.tree.*;
import org.w3c.dom.*;
import org.w3c.dom.*;

public class PackageManifest extends PackageNode
	{
	public PackageManifest( Package p, org.w3c.dom.Node n )
		throws ImsException
		{
		super( p, n );

		if ( !(n instanceof Element) )
			throw new ImsException( "Invalid package file. Manifest must by type of node." );
		Element e = (Element)n;
		if ( !e.getTagName().equals( "manifest" ) )
			throw new ImsException( "Invalid package file. Manifest must have manifest tag element." );
			
		
		boolean has_m=false, has_o=false, has_r=false;
		
		NodeList nl = e.getChildNodes();
		Element child;
		String tagname;
		for ( int i=0; i<nl.getLength(); i++ )
			{
			if ( !(nl.item( i ) instanceof Element) )
				continue;
				//throw new ImsException( "Invalid package file. Manifest can only contain elements." );
			child = (Element)nl.item( i );
			tagname = child.getTagName();
			if ( tagname.equals( "metadata" ) )
				{
				if ( has_m )
					throw new ImsException( "Invalid package file. Manifest can only has one top level metadata element." );
				add( new PackageMetadata( ims_package, child ) );
				has_m = true;
				}
			else if ( tagname.equals( "organizations" ) )
				{
				if ( !has_m )
					throw new ImsException( "Invalid package file. Organizations section must come after a metadata section in the manifest element." );
				if ( has_o )
					throw new ImsException( "Invalid package file. Manifest can only has one top level organizations element." );
				add( new PackageOrganizations( ims_package, child ) );
				has_o = true;
				}
			else if ( tagname.equals( "resources" ) )
				{
				if ( !has_o )
					throw new ImsException( "Invalid package file. Resources section must come after an organizations section in the manifest element." );
				if ( has_r )
					throw new ImsException( "Invalid package file. Manifest can only has one top level resources element." );
				add( new PackageResources( ims_package, child ) );
				has_r = true;
				}
			else
				throw new ImsException( "Invalid package file. Unsupported element in manifest." );
			}
		}

	public void canAdd( MutableTreeNode child )
		{
		if ( !(child instanceof PackageMetadata) &&
				!(child instanceof PackageOrganizations) &&
				!(child instanceof PackageResources) 	)
			throw new IllegalStateException( "This node only accepts metadata, organization or resources nodes." );
		}
		
		
	}
