package org.apache.taverna.biocatalogue.model.connectivity;
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.InputStream;

/**
 * This class is a custom version of ServerResponse which contains the
 * InputStream with the the actual server response data.
 * 
 * @author Sergejs Aleksejevs
 */
public class ServerResponseStream extends ServerResponse
{
  private InputStream responseStream;
  
  public ServerResponseStream(int responseCode, InputStream serverResponseStream, String requestURL)
  {
    super(responseCode, requestURL);
    this.setResponseStream(serverResponseStream);
  }
  
  public void setResponseStream(InputStream responseStream)
  {
    this.responseStream = responseStream;
  }
  
  public InputStream getResponseStream()
  {
    return responseStream;
  }
}
