blob: 99fe50e53aa24c15bc3b1800bb3ceb18b7dfdc1c [file] [log] [blame]
/*
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package autodeploy.slowtest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;
/*
* SlowCopy.java
*
* Created on November 23, 2004, 12:39 PM
*/
/**
*Provides a way to test autodeployer's behavior when an autodeployed file is
*copied into the autodeploy directory slowly.
*
*Usage:
*
* java -classpath ... SlowCopy timed existing-file target-file-spec [delay-in-ms]
*
*where
*<ul>
*<le>"timed" is a keyword
*<le>existing-file is the existing archive to be copied
*<le>target-file-spec is the file spec of the copy to be created
*<le>delay-in-ms is the optional time delay (in ms) to wait between writes
*</ul>
*
* @author tjquinn
*/
public class SlowCopy {
/** Creates a new instance of SlowCopy */
public SlowCopy() {
}
/** default delay between successive writes of data to the output file */
private static final long DEFAULT_DELAY = 200; // milliseconds
/** size of read and write buffer */
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) {
try {
new SlowCopy().run(args);
System.exit(0);
} catch (Throwable thr) {
thr.printStackTrace(System.err);
System.exit(1);
}
}
private void run(String [] args) throws FileNotFoundException, IOException, InterruptedException {
System.out.println(Arrays.toString(args));
if (args.length < 3) {
throw new IllegalArgumentException("Command line args must specify prompt/timed, the original file, and the target file");
}
/*
*Get delay from default and override the default if the delay is
*specified on the command line.
*/
long delay = DEFAULT_DELAY;
if (args.length > 3) {
delay = Integer.decode(args[3]);
}
/*
*For interactive use, the tool would like to let the user press a
*key each time a read/write is to occur. This doesn't yet work and
*is not used in the devtests anyway.
*/
boolean usePromptDelay = args[0].equalsIgnoreCase("prompt");
File oldF = new File(args[1]);
File newF = new File(args[2]);
System.out.println("Slow copy starting\n" +
" mode: " + args[0] + "\n" +
" input file: " + oldF.getAbsolutePath() + "\n" +
" output file: " + newF.getAbsolutePath() + "\n" +
" delay (if mode=timed): " + delay + "\n" +
" starting time: " + new Date().toString()
);
FileOutputStream fos = new FileOutputStream(newF);
FileInputStream fis = new FileInputStream(oldF);
byte [] data = new byte [BUFFER_SIZE];
int bytesRead;
Scanner scanner = null;
boolean continuePrompting = usePromptDelay;
String lineSep = System.getProperty("line.separator");
if (usePromptDelay) {
scanner = new Scanner(System.in);
}
int totalBytesRead = 0;
/*
*Repeat the cycle of reading from the input file and writing to the
*output file, stalling for either a key press or the timed delay
*between successive cycles.
*/
try {
while ((bytesRead = fis.read(data)) != -1) {
totalBytesRead += bytesRead;
fos.write(data, 0, bytesRead);
if (usePromptDelay) {
if (scanner.hasNext(".")) {
String input = scanner.next(".");
continuePrompting = ! input.equals("q"); // just like Unix utilities - q ends
System.out.println("Continue prompting is now set to " + continuePrompting);
}
} else {
/*
*The user wants to use timed delays, so wait for the
*delay period before continuing the loop.
*/
Thread.currentThread().sleep(delay);
}
}
System.out.println("Finished copying " + totalBytesRead + " bytes at " + new Date().toString());
} finally {
if (fos != null) {
fos.close();
fos = null;
}
if (fis != null) {
fis.close();
fis = null;
}
}
}
}