/*   Copyright 2004 The Apache Software Foundation
 *
 *   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 averageCase.existing;

import org.apache.xmlbeans.XmlObject;

import interfaceFeature.xbean.averageCase.purchaseOrder.PurchaseOrderDocument ;
import interfaceFeature.xbean.averageCase.purchaseOrder.PurchaseOrderType;
import interfaceFeature.xbean.averageCase.purchaseOrder.Items.Item;

public class FooHandler
{
    public static int getTotal(XmlObject xo)
    {
        PurchaseOrderDocument poDoc= (PurchaseOrderDocument)xo;
	    int sum=0;
	    Item[] items=poDoc.getPurchaseOrder().getItems().getItemArray();

        for (int i=0; i<items.length; i++)
		    sum+=items[i].getUSPrice().intValue();
	    return sum;
    }
}