package org.biomoby.shared.data;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

/**
 * Groups together the primary and secondary data corresponding to a MOBY XML "mobyData" block, i.e.
 * a request for, or response from, a service.  One or more MobyDataJobs can be put in one MobyContentInstance
 * to form a service invocation request/response (they are symmetric in MOBY).  It is essentially just a Java Map,
 * but with some convenience methods for grabbing different types of data.  Put data into this object as you 
 * would with any Map.
 */

public class MobyDataJob extends HashMap<String, MobyDataInstance>{

    protected String id = "no id specified";

    public void setID(String ID){
	id = ID;
    }

    public String getID(){
	return id;
    }

    public MobyDataSecondaryInstance[] getSecondaryData(){
	Vector<MobyDataSecondaryInstance> contents = new Vector<MobyDataSecondaryInstance>();
	
	Iterator values = keySet().iterator();
	while(values.hasNext()){
	    String dataName = (String) values.next();
	    Object data = get(dataName);
	    if(data instanceof MobyDataSecondaryInstance){
		contents.add((MobyDataSecondaryInstance) data);
	    }
	}
	return (MobyDataSecondaryInstance[]) contents.toArray(new MobyDataSecondaryInstance[contents.size()]);
    }

    public MobyDataInstance[] getData(){
	Vector<MobyDataInstance> contents = new Vector<MobyDataInstance>();
	
	Iterator values = keySet().iterator();
	while(values.hasNext()){
	    String dataName = (String) values.next();
	    Object data = get(dataName);
	    if(data instanceof MobyDataInstance){
		contents.add((MobyDataInstance) data);
	    }
	}
	return (MobyDataInstance[]) contents.toArray(new MobyDataInstance[contents.size()]);
    }

    public MobyDataInstance[] getPrimaryData(){
	Vector<MobyDataInstance> contents = new Vector<MobyDataInstance>();
	
	Iterator values = keySet().iterator();
	while(values.hasNext()){
	    String dataName = (String) values.next();
	    Object data = get(dataName);
	    if(data instanceof MobyDataObject ||
	       data instanceof MobyDataObjectSet){
		contents.add((MobyDataInstance) data);
	    }
	}
	return (MobyDataInstance[]) contents.toArray(new MobyDataInstance[contents.size()]);
    }

    public MobyDataObject[] getPrimaryDataObjects(){
	Vector<MobyDataObject> contents = new Vector<MobyDataObject>();
	
	Iterator values = keySet().iterator();
	while(values.hasNext()){
	    String dataName = (String) values.next();
	    Object data = get(dataName);
	    if(data instanceof MobyDataObject){
		contents.add((MobyDataObject) data);
	    }
	}
	return (MobyDataObject[]) contents.toArray(new MobyDataObject[contents.size()]);
    }

    public MobyDataObjectSet[] getPrimaryDataObjectSets(){
	Vector<MobyDataObjectSet> contents = new Vector<MobyDataObjectSet>();
	
	Iterator values = keySet().iterator();
	while(values.hasNext()){
	    String dataName = (String) values.next();
	    Object data = get(dataName);
	    if(data instanceof MobyDataObjectSet){
		contents.add((MobyDataObjectSet) data);
	    }
	}
	return (MobyDataObjectSet[]) contents.toArray(new MobyDataObjectSet[contents.size()]);
    }
}
