// $Header$
package org.exist.xmldb;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
import org.xmldb.api.base.ErrorCodes;
import org.xmldb.api.base.Resource;
import org.xmldb.api.base.ResourceIterator;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
/**
* Implementation of ResourceSet (a container of Resource objects), using internally both a Map and a Vector.
* The Map is keyed by the Id of each resource.
*
*@author Jean-Marc Vanel (2 April 2003)
*/
public class MapResourceSet implements ResourceSet
{
protected Map resources = new HashMap();
protected Vector resourcesVector = new Vector();
public MapResourceSet() {
}
/**
* Constructor
*/
public MapResourceSet(Map resources) {
this.resources = resources;
Iterator iter = resources.values().iterator();
while ( iter.hasNext() ) {
Resource res = (Resource)iter.next();
resourcesVector.add(res);
}
}
/**
* Constructor
*/
public MapResourceSet(ResourceSet rs) throws XMLDBException {
for ( int i=0; i<rs.getSize(); i++ ){
Resource res = rs.getResource( i );
resources.put(res.getId(), res);
resourcesVector.add( rs.getResource( i ) );
}
}
public Map getResourcesMap() {
return resources;
}
/**
* Adds a resource to the container
*
*@param resource The resource to be added to the object
*/
public void addResource( Resource resource ) throws XMLDBException {
resources.put(resource.getId(), resource);
resourcesVector.addElement( resource );
}
/**
* Make the container empty
*
*@exception XMLDBException
*/
public void clear() throws XMLDBException {
resources.clear();
}
/**
* Gets the iterator property
*
*@return The iterator value
*@exception XMLDBException
*/
public ResourceIterator getIterator() throws XMLDBException {
return new NewResourceIterator();
}
/**
* Gets the iterator property, starting from a given position
*
*@param start starting position>0 for the iterator
*@return The iterator value
*@exception XMLDBException thrown if pos is out of range
*/
public ResourceIterator getIterator( long start ) throws XMLDBException {
return new NewResourceIterator( start );
}
/**
* Gets the membersAsResource property of the object
*
*@return The membersAsResource value
*@exception XMLDBException Description of the Exception
*/
public Resource getMembersAsResource() throws XMLDBException {
throw new XMLDBException( ErrorCodes.NOT_IMPLEMENTED );
}
/**
* Gets the resource at a given position.
*
*@param pos position > 0
*@return The resource value
*@exception XMLDBException thrown if pos is out of range
*/
public Resource getResource( long pos ) throws XMLDBException {
if ( pos < 0 || pos >= resources.size() )
return null;
Object r = resourcesVector.get( (int) pos );
if(r instanceof Resource)
return (Resource)r;
return null;
}
/**
* Gets the size property
*
*@return The size value
*@exception XMLDBException
*/
public long getSize() throws XMLDBException {
return (long) resources.size();
}
/**
* Removes the resource at a given position.
*
*@param pos position > 0
*@exception XMLDBException thrown if pos is out of range
*/
public void removeResource( long pos ) throws XMLDBException {
Resource r = (Resource)resourcesVector.get( (int) pos );
resourcesVector.removeElementAt( (int) pos );
resources.remove( r.getId() );
}
/**
* Inner resource Iterator Class
*
*/
class NewResourceIterator implements ResourceIterator {
long pos = 0;
/** Constructor for the NewResourceIterator object */
public NewResourceIterator() { }
/**
* Constructor for the NewResourceIterator object
*
*@param start starting position>0 for the iterator
*/
public NewResourceIterator( long start ) {
pos = start;
}
/**
* Classical loop test.
*
*@return Description of the Return Value
*@exception XMLDBException Description of the Exception
*/
public boolean hasMoreResources() throws XMLDBException {
return pos < resources.size();
}
/**
* Classical accessor to next Resource
*
*@return the next Resource
*@exception XMLDBException
*/
public Resource nextResource() throws XMLDBException {
return getResource( pos++ );
}
}
}