001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Nuxeo - initial API and implementation
011 *
012 * $Id: DocumentPipeImpl.java 29029 2008-01-14 18:38:14Z ldoguin $
013 */
014
015package org.nuxeo.ecm.core.io.impl;
016
017import java.io.IOException;
018import java.util.ArrayList;
019import java.util.List;
020
021import org.nuxeo.ecm.core.io.DocumentPipe;
022import org.nuxeo.ecm.core.io.DocumentReader;
023import org.nuxeo.ecm.core.io.DocumentTransformer;
024import org.nuxeo.ecm.core.io.DocumentTranslationMap;
025import org.nuxeo.ecm.core.io.DocumentWriter;
026import org.nuxeo.ecm.core.io.ExportedDocument;
027
028/**
029 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
030 */
031public class DocumentPipeImpl implements DocumentPipe {
032
033    private final List<DocumentTransformer> transformers;
034
035    private final int pageSize;
036
037    private DocumentReader reader;
038
039    private DocumentWriter writer;
040
041    public DocumentPipeImpl(int pageSize) {
042        this.pageSize = pageSize;
043        transformers = new ArrayList<DocumentTransformer>();
044    }
045
046    public DocumentPipeImpl() {
047        this(0);
048    }
049
050    @Override
051    public void addTransformer(DocumentTransformer transformer) {
052        transformers.add(transformer);
053    }
054
055    @Override
056    public DocumentReader getReader() {
057        return reader;
058    }
059
060    @Override
061    public List<DocumentTransformer> getTransformers() {
062        return transformers;
063    }
064
065    @Override
066    public DocumentWriter getWriter() {
067        return writer;
068    }
069
070    @Override
071    public void removeTransformer(DocumentTransformer transformer) {
072        transformers.remove(transformer);
073    }
074
075    @Override
076    public void setReader(DocumentReader reader) {
077        this.reader = reader;
078    }
079
080    @Override
081    public void setWriter(DocumentWriter writer) {
082        this.writer = writer;
083    }
084
085    @Override
086    public DocumentTranslationMap run() throws IOException {
087        if (reader == null) {
088            throw new IllegalArgumentException("Pipe reader cannot be null");
089        }
090        if (writer == null) {
091            throw new IllegalArgumentException("Pipe writer cannot be null");
092        }
093
094        List<DocumentTranslationMap> maps = new ArrayList<DocumentTranslationMap>();
095        readAndWriteDocs(maps);
096        return DocumentTranslationMapImpl.merge(maps);
097    }
098
099    protected void handleBatchEnd() {
100        // NOP
101    }
102
103    protected void readAndWriteDocs(List<DocumentTranslationMap> maps) throws IOException {
104        if (pageSize == 0) {
105            // handle single doc case
106            ExportedDocument doc;
107            while ((doc = reader.read()) != null) {
108                applyTransforms(doc);
109                DocumentTranslationMap map = writer.write(doc);
110                maps.add(map);
111                handleBatchEnd();
112            }
113
114        } else {
115            // handle multiple doc case
116            ExportedDocument[] docs;
117            while ((docs = reader.read(pageSize)) != null) {
118                if (docs.length != 0) {
119                    applyTransforms(docs);
120                    DocumentTranslationMap map = writer.write(docs);
121                    if (map != null) {
122                        maps.add(map);
123                    }
124                    handleBatchEnd();
125                }
126            }
127        }
128    }
129
130    public void applyTransforms(ExportedDocument doc) throws IOException {
131        for (DocumentTransformer tr : transformers) {
132            tr.transform(doc);
133        }
134    }
135
136    public void applyTransforms(ExportedDocument[] docs) throws IOException {
137        for (DocumentTransformer tr : transformers) {
138            for (ExportedDocument doc : docs) {
139                tr.transform(doc);
140            }
141        }
142    }
143
144}