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}