3789983e89
Reviewed-by: darcy, ihse
163 lines
4.9 KiB
Java
163 lines
4.9 KiB
Java
/*
|
|
* 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";
|
|
}
|
|
}
|