001: /**
002: * Sequoia: Database clustering technology.
003: * Copyright (C) 2006 Continuent, Inc.
004: * Contact: sequoia@continuent.org
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * Initial developer(s): Emmanuel Cecchet.
019: * Contributor(s): ______________________.
020: */package org.continuent.sequoia.controller.backup.backupers;
021:
022: import java.io.BufferedOutputStream;
023: import java.io.IOException;
024: import java.io.InputStream;
025: import java.io.OutputStream;
026:
027: /**
028: * This class defines a NativeCommandInputSource, which provides input
029: * to processes. Current implementation could be extended to use
030: * interfaces but this works for now.
031: *
032: * @author <a href="mailto:robert.hodges@continuent.com">Robert Hodges</a>
033: * @version 1.0
034: */
035: public class NativeCommandInputSource {
036: String[] inputStringArray;
037: InputStream inputStream;
038:
039: /**
040: * Creates a new <code>NativeCommandInputSource</code> object to read
041: * from a strings of arrays.
042: */
043: public NativeCommandInputSource(String[] arrayInput) {
044: this .inputStringArray = arrayInput;
045: }
046:
047: /**
048: * Creates a new <code>NativeCommandInputSource</code> object to read
049: * from an InputStream.
050: * @param inputStream An open input stream
051: */
052: public NativeCommandInputSource(InputStream inputStream) {
053: this .inputStream = inputStream;
054: }
055:
056: /**
057: * Factory method to create an input source that reads arrays.
058: *
059: * @param inputArray Array of string inputs.
060: * @return Configured input source
061: */
062: public static NativeCommandInputSource createArrayInputSource(
063: String[] inputArray) {
064: if (inputArray == null)
065: return null;
066: else
067: return new NativeCommandInputSource(inputArray);
068: }
069:
070: /**
071: * Factory method to create an input source that reads arrays.
072: *
073: * @param inputStream An open InputStream containing input
074: * @return Configured input source
075: */
076: public static NativeCommandInputSource createInputStreamSource(
077: InputStream inputStream) {
078: if (inputStream == null)
079: return null;
080: else
081: return new NativeCommandInputSource(inputStream);
082: }
083:
084: /**
085: * Writes all available input to the native command process, returning
086: * when the input source is exhausted.
087: *
088: * @param outputStream Stream that feeds input to process
089: * @throws IOException Thrown if there is an IO error
090: */
091: public void write(OutputStream outputStream) throws IOException {
092: if (inputStringArray != null) {
093: // Write array input.
094: BufferedOutputStream feed = new BufferedOutputStream(
095: outputStream);
096: for (int i = 0; i < inputStringArray.length; i++) {
097: feed.write(inputStringArray[i].getBytes());
098: feed.write("\n".getBytes());
099: feed.flush();
100: }
101: } else {
102: // Write output from stream.
103: byte[] buff = new byte[1024];
104: int len = 0;
105: while ((len = inputStream.read(buff)) > 0) {
106: outputStream.write(buff, 0, len);
107: }
108: }
109: }
110:
111: /**
112: * Closes the input source.
113: *
114: * @throws IOException Thrown if there is an error during the close
115: * operation
116: */
117: public void close() throws IOException {
118: if (inputStringArray != null) {
119: // Do nothing
120: } else {
121: inputStream.close();
122: }
123: }
124: }
|