/* * 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; /** Provides ... * * @author Sean Geoghegan, Defence Science and Technology Organisation. * * @source $URL$ */ public class JoiningAttributeWriter implements AttributeWriter { private AttributeWriter[] writers; private int[] index; private AttributeDescriptor[] metaData; /** * */ public JoiningAttributeWriter(AttributeWriter[] writers) { this.writers = writers; metaData = joinMetaData(writers); } private AttributeDescriptor[] joinMetaData(AttributeWriter[] writers) { int total = 0; index = new int[writers.length]; for (int i = 0, ii = writers.length; i < ii; i++) { index[i] = total; total += writers[i].getAttributeCount(); } AttributeDescriptor[] md = new AttributeDescriptor[total]; int idx = 0; for (int i = 0, ii = writers.length; i < ii; i++) { for (int j = 0, jj = writers[i].getAttributeCount(); j < jj; j++) { md[idx] = writers[i].getAttributeType(j); idx++; } } return md; } /* (non-Javadoc) * @see org.geotools.data.AttributeWriter#close() */ public void close() throws IOException { IOException dse = null; for (int i = 0, ii = writers.length; i < ii; i++) { try { writers[i].close(); } catch (IOException e) { dse = e; } } if (dse != null) throw dse; } public boolean hasNext() throws IOException { for (int i = 0, ii = writers.length; i < ii; i++) { if (writers[i].hasNext()) { return true; } } return false; } public void next() throws IOException { for (int i = 0, ii = writers.length; i < ii; i++) { //if (writers[i].hasNext()) Dont want to check this, need to be able to insert writers[i].next(); } } /* (non-Javadoc) * @see org.geotools.data.AttributeWriter#write(int, java.lang.Object) */ public void write(int position, Object attribute) throws IOException { AttributeWriter writer = null; for (int i = index.length - 1; i >= 0; i--) { if (position >= index[i]) { position -= index[i]; writer = writers[i]; break; } } if (writer == null) throw new ArrayIndexOutOfBoundsException(position); writer.write(position, attribute); } public int getAttributeCount() { return metaData.length; } public AttributeDescriptor getAttributeType(int i) { return metaData[i]; } }