871b417a57cab3336793a845810383ceae4233cbMark de Reeper/**
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper *
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper *
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * The contents of this file are subject to the terms
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * of the Common Development and Distribution License
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * (the License). You may not use this file except in
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * compliance with the License.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper *
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * You can obtain a copy of the License at
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * https://opensso.dev.java.net/public/CDDLv1.0.html or
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * opensso/legal/CDDLv1.0.txt
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * See the License for the specific language governing
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * permission and limitations under the License.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper *
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * When distributing Covered Code, include this CDDL
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * Header Notice in each file and include the License file
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * at opensso/legal/CDDLv1.0.txt.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * If applicable, add the following below the CDDL Header,
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * with the fields enclosed by brackets [] replaced by
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * your own identifying information:
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * "Portions Copyrighted [year] [name of copyright owner]"
871b417a57cab3336793a845810383ceae4233cbMark de Reeper *
871b417a57cab3336793a845810383ceae4233cbMark de Reeper * $Id: ServerClasspathBase.java,v 1.1 2009/01/21 18:43:56 kanduls Exp $
871b417a57cab3336793a845810383ceae4233cbMark de Reeper */
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper/**
5c39d8f041417518a02ce2c941d96c2d33b2a364Mark de Reeper * Portions Copyrighted 2013 ForgeRock AS.
871b417a57cab3336793a845810383ceae4233cbMark de Reeper */
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeperpackage com.sun.identity.agents.tools.jetty.v7;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport com.sun.identity.install.tools.configurator.IStateAccess;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport com.sun.identity.install.tools.util.ConfigUtil;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport com.sun.identity.install.tools.util.Debug;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport com.sun.identity.install.tools.util.FileUtils;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.File;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.FileInputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.FileOutputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.IOException;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.InputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.io.OutputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.ArrayList;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.Iterator;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.jar.JarEntry;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.jar.JarFile;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.jar.JarInputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.jar.JarOutputStream;
871b417a57cab3336793a845810383ceae4233cbMark de Reeperimport java.util.jar.Manifest;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeperpublic class ServerClasspathBase implements IConstants, IConfigKeys {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper protected boolean updateJettyStartupJarFile(IStateAccess stateAccess) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Update jar file");
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper boolean status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper ArrayList<String> agentClasspathsDirs = getAgentClasspathDirectories(stateAccess);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String homeDir = (String) stateAccess.get(STR_KEY_JETTY_HOME_DIR);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Home directory :" + homeDir);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String startJarPath = homeDir + STR_FORWARD_SLASH + JETTY_START_JAR;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String newJarPath = homeDir + STR_FORWARD_SLASH + "start-temp.jar";
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarInputStream oldJarInputStream = null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarOutputStream fos =null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarFile oldJarFile = new JarFile(startJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Manifest m = oldJarFile.getManifest();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper oldJarInputStream = new JarInputStream(new FileInputStream(new File(startJarPath)));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarEntry entry = oldJarInputStream.getNextJarEntry();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos = new JarOutputStream(new FileOutputStream(newJarPath), m);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper while (entry != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (!entry.isDirectory()) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.putNextEntry(new JarEntry(entry.getName()));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper writeToStream(oldJarInputStream, fos);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (entry.getName().indexOf(JETTY_CLASSPATH_CONF_FILE) > 0 ) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Iterator<String> itr = agentClasspathsDirs.iterator();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper while (itr.hasNext()) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String pathToAdd = itr.next() + "\n";
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Adding path " + pathToAdd);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.write(pathToAdd.getBytes(), 0, pathToAdd.getBytes().length);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.flush();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper entry = oldJarInputStream.getNextJarEntry();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = true;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex){
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Updating jar failed with exception: "
871b417a57cab3336793a845810383ceae4233cbMark de Reeper + ex.getMessage());
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } finally {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (fos != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (oldJarInputStream != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper oldJarInputStream.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper //ignore
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (status) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper FileUtils.copyFile(newJarPath, startJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Error copying jar file: " + ex.getMessage());
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } finally {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (newJarPath != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper File delFile = new File(newJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper delFile.delete();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper return status;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper private ArrayList<String> getAgentClasspathDirectories(IStateAccess stateAccess) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("UpdateJettyServerClasspath.getAgentClasspathDirectories(): Get Agent Classpath Directories");
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper ArrayList<String> pathDirs = new ArrayList<String>();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String homeDir = ConfigUtil.getHomePath();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String instanceName = stateAccess.getInstanceName();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper StringBuffer sb = new StringBuffer();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper sb.append(homeDir);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper sb.append(STR_FORWARD_SLASH);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper sb.append(instanceName);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper sb.append(STR_FORWARD_SLASH);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper sb.append(STR_INSTANCE_CONFIG_DIR_NAME);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String configDir = sb.toString();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String agentLibPath = ConfigUtil.getLibPath();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String agentJarPath = agentLibPath + STR_FORWARD_SLASH + AGENT_JAR;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String sdkJarPath = agentLibPath + STR_FORWARD_SLASH + OPENAM_CLIENT_SDK_JAR;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String agentLocaleDir = ConfigUtil.getLocaleDirPath();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper pathDirs.add(configDir);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper pathDirs.add(agentJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper pathDirs.add(sdkJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper pathDirs.add(agentLocaleDir);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper return pathDirs;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper protected boolean removeClasspath(IStateAccess stateAccess) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.removeClasspath(): Remove agent classpath from start.jar.");
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper boolean status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper ArrayList<String> agentClasspathsDirs = getAgentClasspathDirectories(stateAccess);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String homeDir = (String) stateAccess.get(STR_KEY_JETTY_HOME_DIR);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.removeClasspath(): Home directory :" + homeDir);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String startJarPath = homeDir + STR_FORWARD_SLASH + JETTY_START_JAR;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String newJarPath = homeDir + STR_FORWARD_SLASH + "start-temp.jar";
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarInputStream oldJarInputStream = null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarOutputStream fos =null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper FileOutputStream tempConfFileOut = null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper FileInputStream tempConfFileIn = null;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String tempFile = TEMP_DIR + STR_FORWARD_SLASH + "start-conf.temp";
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarFile oldJarFile = new JarFile(startJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Manifest m = oldJarFile.getManifest();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper oldJarInputStream = new JarInputStream(new FileInputStream(new File(startJarPath)));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper JarEntry entry = oldJarInputStream.getNextJarEntry();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos = new JarOutputStream(new FileOutputStream(newJarPath), m);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper while (entry != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (!entry.isDirectory()) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.putNextEntry(new JarEntry(entry.getName()));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (entry.getName().indexOf(JETTY_CLASSPATH_CONF_FILE) > 0) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileOut = new FileOutputStream(new File(tempFile));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper writeToStream(oldJarInputStream, tempConfFileOut);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileOut.flush();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileOut.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Iterator<String> itr = agentClasspathsDirs.iterator();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper int lineNo = 0;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper while (itr.hasNext()) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper String pathToDel = itr.next();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper lineNo = FileUtils.getFirstOccurence(tempFile, pathToDel, true, false, false);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper FileUtils.removeLinesByNum(tempFile, lineNo, 1);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper //Now write the file back to fos
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileIn = new FileInputStream(new File(tempFile));
871b417a57cab3336793a845810383ceae4233cbMark de Reeper writeToStream(tempConfFileIn, fos);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } else {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper writeToStream(oldJarInputStream, fos);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper entry = oldJarInputStream.getNextJarEntry();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = true;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex){
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Updating jar failed with exception: "
871b417a57cab3336793a845810383ceae4233cbMark de Reeper + ex.getMessage());
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } finally {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (fos != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper fos.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (oldJarInputStream != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper oldJarInputStream.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (tempConfFileOut != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileOut.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (tempConfFileIn != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper tempConfFileIn.close();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper //ignore
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper try {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (status) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper FileUtils.copyFile(newJarPath, startJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } catch (Exception ex) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper Debug.log("ServerClasspathBase.updateJettyStartupJarFile(): Error copying jar file: " + ex.getMessage());
871b417a57cab3336793a845810383ceae4233cbMark de Reeper status = false;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper } finally {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (newJarPath != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper File delFile = new File(newJarPath);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper delFile.delete();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper if (tempFile != null) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper File delFile = new File(tempFile);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper delFile.delete();
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper return status;
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper
871b417a57cab3336793a845810383ceae4233cbMark de Reeper protected void writeToStream(InputStream in, OutputStream out) throws IOException {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper byte[] bytes = new byte[BUFF_SIZE];
871b417a57cab3336793a845810383ceae4233cbMark de Reeper int read = in.read(bytes, 0, BUFF_SIZE);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper while (read > 0) {
871b417a57cab3336793a845810383ceae4233cbMark de Reeper out.write(bytes, 0, read);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper read = in.read(bytes, 0, BUFF_SIZE);
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper }
871b417a57cab3336793a845810383ceae4233cbMark de Reeper}