blob: f99822ca1f875df7a92a9fbb7dbd89424df47fe7 [file] [log] [blame]
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/*
* A custom output stream that saves the testing details to different files
* according to the current testing phase.
*/
public class PhaseOutputStream extends OutputStream {
public enum Phase {
PRE_SIGNING, // before jar signing
SIGNING, // jar signing
VERIFYING, // jar verifying
DELAY_VERIFYING, // jar verifying after certificates expire
POST_VERIFYING; // after jar verifying
}
private OutputStream signingOut = null;
private OutputStream verifyingOut = null;
private OutputStream delayVerifyingOut = null;
private Phase currentPhase = Phase.PRE_SIGNING;
public void transfer() {
switch (currentPhase) {
case PRE_SIGNING:
currentPhase = Phase.SIGNING;
break;
case SIGNING:
currentPhase = Phase.VERIFYING;
break;
case VERIFYING:
currentPhase = Compatibility.DELAY_VERIFY
? Phase.DELAY_VERIFYING
: Phase.POST_VERIFYING;
break;
case DELAY_VERIFYING:
currentPhase = Phase.POST_VERIFYING;
break;
case POST_VERIFYING:
currentPhase = Phase.POST_VERIFYING;
break;
}
}
// The core phases are SIGNING, VERIFYING and DELAY_VERIFYING.
public boolean isCorePhase() {
return currentPhase != PhaseOutputStream.Phase.PRE_SIGNING
&& currentPhase != PhaseOutputStream.Phase.POST_VERIFYING;
}
public Phase currentPhase() {
return currentPhase;
}
@Override
public void write(int b) throws IOException {
OutputStream output = phaseOut();
if (output != null) {
output.write(b);
}
}
@Override
public void write(byte[] b) throws IOException {
OutputStream output = phaseOut();
if (output != null) {
output.write(b);
}
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
OutputStream output = phaseOut();
if (output != null) {
output.write(b, off, len);
}
}
public void write(String str) throws IOException {
write(str.getBytes());
}
private OutputStream phaseOut() throws FileNotFoundException {
switch (currentPhase) {
case SIGNING:
return signingOut == null
? signingOut = createOutput(Phase.SIGNING)
: signingOut;
case VERIFYING:
return verifyingOut == null
? verifyingOut = createOutput(Phase.VERIFYING)
: verifyingOut;
case DELAY_VERIFYING:
return delayVerifyingOut == null
? delayVerifyingOut = createOutput(Phase.DELAY_VERIFYING)
: delayVerifyingOut;
default:
return null;
}
}
@Override
public void flush() throws IOException {
flush(signingOut);
flush(verifyingOut);
flush(delayVerifyingOut);
}
private void flush(OutputStream output) throws IOException {
if (output != null) {
output.flush();
}
}
@Override
public void close() throws IOException {
close(signingOut);
close(verifyingOut);
close(delayVerifyingOut);
}
private void close(OutputStream output) throws IOException {
if (output != null) {
output.close();
}
}
private static OutputStream createOutput(Phase phase)
throws FileNotFoundException {
return new FileOutputStream(fileName(phase), true);
}
public static String fileName(Phase phase) {
return phase.name() + ".html";
}
}