001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.replication.plugin; 028 029 030 import java.io.IOException; 031 import java.io.OutputStream; 032 033 import org.opends.server.util.ServerConstants; 034 035 /** 036 * This class creates an output stream that can be used to export entries 037 * to a synchonization domain. 038 */ 039 public class ReplLDIFOutputStream 040 extends OutputStream 041 { 042 // The synchronization domain on which the export is done 043 ReplicationDomain domain; 044 045 // The number of entries to be exported 046 long numEntries; 047 048 // The current number of entries exported 049 private long numExportedEntries; 050 String entryBuffer = ""; 051 052 /** 053 * Creates a new ReplLDIFOutputStream related to a replication 054 * domain. 055 * 056 * @param domain The replication domain 057 * @param numEntries The max number of entry to process. 058 */ 059 public ReplLDIFOutputStream(ReplicationDomain domain, long numEntries) 060 { 061 this.domain = domain; 062 this.numEntries = numEntries; 063 } 064 065 /** 066 * {@inheritDoc} 067 */ 068 public void write(int i) throws IOException 069 { 070 throw new IOException("Invalid call"); 071 } 072 073 /** 074 * {@inheritDoc} 075 */ 076 public void write(byte b[], int off, int len) throws IOException 077 { 078 int endOfEntryIndex; 079 int endIndex; 080 081 String ebytes = ""; 082 ebytes = ebytes.concat(entryBuffer); 083 entryBuffer = ""; 084 085 ebytes = ebytes.concat(new String(b, off, len)); 086 endIndex = ebytes.length(); 087 088 while (true) 089 { 090 // if we have the bytes for an entry, let's make an entry and send it 091 endOfEntryIndex = ebytes.indexOf(ServerConstants.EOL + 092 ServerConstants.EOL); 093 094 if ( endOfEntryIndex >= 0 ) 095 { 096 endOfEntryIndex += 2; 097 entryBuffer = ebytes.substring(0, endOfEntryIndex); 098 099 // Send the entry 100 if ((numEntries>0) && (getNumExportedEntries() > numEntries)) 101 { 102 // This outputstream has reached the total number 103 // of entries to export. 104 throw(new IOException()); 105 } 106 domain.exportLDIFEntry(entryBuffer); 107 numExportedEntries++; 108 entryBuffer = ""; 109 110 if (endIndex == endOfEntryIndex) 111 { 112 // no more data to process 113 break; 114 } 115 else 116 { 117 // loop to the data of the next entry 118 ebytes = ebytes.substring(endOfEntryIndex, 119 endIndex); 120 endIndex = ebytes.length(); 121 } 122 } 123 else 124 { 125 // a next call to us will provide more bytes to make an entry 126 entryBuffer = entryBuffer.concat(ebytes); 127 break; 128 } 129 } 130 } 131 132 /** 133 * Return the number of exported entries. 134 * @return the numExportedEntries 135 */ 136 public long getNumExportedEntries() { 137 return numExportedEntries; 138 } 139 }