001: /*
002: * (c) Copyright 2007 by Volker Bergmann. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, is permitted under the terms of the
006: * GNU General Public License.
007: *
008: * For redistributing this software or a derivative work under a license other
009: * than the GPL-compatible Free Software License as defined by the Free
010: * Software Foundation or approved by OSI, you must first obtain a commercial
011: * license to this software product from Volker Bergmann.
012: *
013: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
014: * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
015: * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
016: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
017: * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
018: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
019: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
020: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
021: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
022: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
023: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
024: * POSSIBILITY OF SUCH DAMAGE.
025: */
026:
027: package org.databene.platform.flat;
028:
029: import org.databene.platform.array.Array2EntityConverter;
030: import org.databene.platform.bean.ArrayPropertyExtractor;
031: import org.databene.model.data.EntityIterable;
032: import org.databene.model.data.Entity;
033: import org.databene.model.data.EntityDescriptor;
034: import org.databene.document.flat.FlatFileColumnDescriptor;
035: import org.databene.document.flat.FlatFileLineIterable;
036: import org.databene.document.flat.FlatFileUtil;
037: import org.databene.commons.Converter;
038: import org.databene.commons.SystemInfo;
039: import org.databene.commons.converter.ArrayConverter;
040: import org.databene.commons.converter.ConverterChain;
041: import org.databene.commons.converter.ConvertingIterable;
042: import org.databene.commons.converter.NoOpConverter;
043: import org.databene.commons.format.PadFormat;
044:
045: import java.util.Iterator;
046:
047: /**
048: * Reads Entities from a flat file.<br/>
049: * <br/>
050: * Created: 26.08.2007 12:16:08
051: * @author Volker Bergmann
052: */
053: public class FlatFileEntityIterable extends
054: ConvertingIterable<String[], Entity> implements EntityIterable {
055:
056: private String uri;
057: private String encoding;
058: private EntityDescriptor entityDescriptor;
059: private FlatFileColumnDescriptor[] descriptors;
060: private boolean initialized;
061:
062: private Converter<String, String> preprocessor;
063:
064: public FlatFileEntityIterable() {
065: this (null, null, SystemInfo.fileEncoding());
066: }
067:
068: public FlatFileEntityIterable(String uri,
069: EntityDescriptor entityDescriptor, String encoding,
070: FlatFileColumnDescriptor... descriptors) {
071: this (uri, entityDescriptor, new NoOpConverter<String>(),
072: encoding, descriptors);
073: }
074:
075: public FlatFileEntityIterable(String uri,
076: EntityDescriptor entityDescriptor,
077: Converter<String, String> preprocessor, String encoding,
078: FlatFileColumnDescriptor... descriptors) {
079: super (null, null);
080: this .uri = uri;
081: this .encoding = encoding;
082: this .entityDescriptor = entityDescriptor;
083: this .descriptors = descriptors;
084: this .preprocessor = preprocessor;
085: this .initialized = false;
086: }
087:
088: // properties ------------------------------------------------------------------------------------------------------
089:
090: public void setUri(String uri) {
091: this .uri = uri;
092: }
093:
094: public String getEntity() {
095: return entityDescriptor.getName();
096: }
097:
098: public void setEntity(String entity) {
099: this .entityDescriptor = new EntityDescriptor(entity, false); // TODO v0.5 finalize case handling
100: }
101:
102: public void setProperties(String properties) {
103: this .descriptors = FlatFileUtil.parseProperties(properties);
104: }
105:
106: // Iterable interface ----------------------------------------------------------------------------------------------
107:
108: public Iterator<Entity> iterator() {
109: if (!initialized)
110: init();
111: return super .iterator();
112: }
113:
114: // private helpers -------------------------------------------------------------------------------------------------
115:
116: private void init() {
117: this .iterable = createIterable(uri, descriptors, encoding);
118: this .converter = createConverter(entityDescriptor, descriptors);
119: }
120:
121: private Converter<String[], Entity> createConverter(
122: EntityDescriptor entityDescriptor,
123: FlatFileColumnDescriptor[] descriptors) {
124: String[] featureNames = ArrayPropertyExtractor.convert(
125: descriptors, "name", String.class);
126: Array2EntityConverter<String> a2eConverter = new Array2EntityConverter<String>(
127: entityDescriptor, featureNames);
128: Converter<String[], String[]> aConv = new ArrayConverter<String, String>(
129: String.class, preprocessor);
130: Converter<String[], Entity> converter = new ConverterChain<String[], Entity>(
131: aConv, a2eConverter);
132: return converter;
133: }
134:
135: private static Iterable<String[]> createIterable(String uri,
136: FlatFileColumnDescriptor[] descriptors, String encoding) {
137: PadFormat[] formats = ArrayPropertyExtractor.convert(
138: descriptors, "format", PadFormat.class);
139: return new FlatFileLineIterable(uri, formats, true, encoding);
140: }
141:
142: }
|