/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2003-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data; import java.io.IOException; import org.opengis.feature.type.AttributeDescriptor; /** * Attribute Reader that joins. * * @author Ian Schneider * @source $URL$ * @version $Id$ */ public class JoiningAttributeReader implements AttributeReader { private AttributeReader[] readers; private int[] index; private AttributeDescriptor[] metaData; /** * Creates a new instance of JoiningAttributeReader * * @param readers Readers to join */ public JoiningAttributeReader(AttributeReader[] readers) { this.readers = readers; this.metaData = joinMetaData(readers); } private AttributeDescriptor[] joinMetaData(AttributeReader[] readers) { int total = 0; index = new int[readers.length]; for (int i = 0, ii = readers.length; i < ii; i++) { index[i] = total; total += readers[i].getAttributeCount(); } AttributeDescriptor[] md = new AttributeDescriptor[total]; int idx = 0; for (int i = 0, ii = readers.length; i < ii; i++) { for (int j = 0, jj = readers[i].getAttributeCount(); j < jj; j++) { md[idx] = readers[i].getAttributeType(j); idx++; } } return md; } public void close() throws IOException { IOException dse = null; for (int i = 0, ii = readers.length; i < ii; i++) { try { readers[i].close(); } catch (IOException e) { dse = e; } } if (dse != null) { throw dse; } } public boolean hasNext() throws IOException { for (int i = 0, ii = readers.length; i < ii; i++) { if (readers[i].hasNext()) { return true; } } return false; } public void next() throws IOException { for (int i = 0, ii = readers.length; i < ii; i++) { if (readers[i].hasNext()) { readers[i].next(); } } } public Object read(int idx) throws IOException { AttributeReader reader = null; for (int i = index.length - 1; i >= 0; i--) { if (idx >= index[i]) { idx -= index[i]; reader = readers[i]; break; } } if (reader == null) { throw new ArrayIndexOutOfBoundsException(idx); } return reader.read(idx); } public int getAttributeCount() { return metaData.length; } public AttributeDescriptor getAttributeType(int i) { return metaData[i]; } }