mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-16 05:15:22 +00:00
Merge
This commit is contained in:
commit
4abc68cead
1
.hgtags
1
.hgtags
@ -321,3 +321,4 @@ f55df5cfe11c97e4b58998b76f5bd00a73cde12d jdk9-b75
|
||||
eeea9adfd1e3d075ef82148c00a4847a1aab4d26 jdk9-b76
|
||||
c25e882cee9622ec75c4e9d60633539a2f0a8809 jdk9-b77
|
||||
c8753d0be1778944dc512ec86a459941ea1ad2c3 jdk9-b78
|
||||
3966bd3b8167419aa05c6718a4af1cf54b1e3c58 jdk9-b79
|
||||
|
||||
@ -321,3 +321,4 @@ c706ef5ea5da00078dc5e4334660315f7d99c15b jdk9-b71
|
||||
d82072b699b880a1f647a5e2d7c0f86cec958941 jdk9-b76
|
||||
7972dc8f2a47f0c4cd8f02fa5662af41f028aa14 jdk9-b77
|
||||
8c40d4143ee13bdf8170c68cc384c36ab1e9fadb jdk9-b78
|
||||
ba08a9f79b9849716bae1f39f71333d47f604012 jdk9-b79
|
||||
|
||||
@ -321,3 +321,4 @@ f9f3706bd24c42c07cb260fe05730a749b8e52f4 jdk9-b72
|
||||
d8126bc88fa5cd1ae4e44d86a4b1280ca1c9e2aa jdk9-b76
|
||||
8bb2441c0fec8b28f7bf11a0ca3ec1642e7ef457 jdk9-b77
|
||||
182bb7accc5253bcfefd8edc1d4997ec8f9f8694 jdk9-b78
|
||||
4ab250b8fac66ef8cd15ee78c40f0c651c96e16a jdk9-b79
|
||||
|
||||
@ -481,3 +481,4 @@ fff6b54e9770ac4c12c2fb4cab5aa7672affa4bd jdk9-b74
|
||||
0bc8d1656d6f2b1fdfe803c1305a108bb9939f35 jdk9-b76
|
||||
e66c3813789debfc06f206afde1bf7a84cb08451 jdk9-b77
|
||||
20dc06b04fe5ec373879414d60ef82ac70faef98 jdk9-b78
|
||||
e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79
|
||||
|
||||
@ -321,3 +321,4 @@ eadcb2b55cd1daf77625813aad0f6f3967b1528a jdk9-b74
|
||||
36801a89a04201b59874ec776ffe85d6253c9ab5 jdk9-b76
|
||||
be357705874c4ba1a69c38fb211e5e31e35bf9cb jdk9-b77
|
||||
5b1899c9822db4a80a29cac82af492afea9f8f41 jdk9-b78
|
||||
cf809edc840ff7546677d38b13ebd8b3cae2bbda jdk9-b79
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright 2001-2004 The Apache Software Foundation.
|
||||
* Copyright 2005 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed 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
|
||||
* 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,
|
||||
@ -17,9 +17,6 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
* $Id: MultiDOM.java,v 1.5 2005/09/28 13:48:36 pvedula Exp $
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.xalan.internal.xsltc.dom;
|
||||
|
||||
@ -35,6 +32,7 @@ import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTMManager;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.DTMAxisIteratorBase;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.DTMAxisIterNodeList;
|
||||
import com.sun.org.apache.xml.internal.utils.SuballocatedIntVector;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
@ -569,7 +567,7 @@ public final class MultiDOM implements DOM {
|
||||
public NodeList makeNodeList(DTMAxisIterator iter) {
|
||||
int index = iter.next();
|
||||
if (index == DTM.NULL) {
|
||||
return null;
|
||||
return new DTMAxisIterNodeList(null, null);
|
||||
}
|
||||
iter.reset();
|
||||
return _adapters[getDTMId(index)].makeNodeList(iter);
|
||||
|
||||
@ -324,3 +324,4 @@ f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
|
||||
55bb88306dc57d07f2c854803465f6d9a7eb4aba jdk9-b76
|
||||
bd6ece68cf8aca34c8d992569892060c82cfd3f1 jdk9-b77
|
||||
ac1748bab0743137574be3451307b6a6361719eb jdk9-b78
|
||||
42ae657e0e104fa7877996b8095f2e3ab1596118 jdk9-b79
|
||||
|
||||
@ -321,3 +321,4 @@ f376824d4940f45719d91838f3f6249f873440db jdk9-b72
|
||||
4526c0da8fb362eebd7e88f4d44e86858cf9b80b jdk9-b76
|
||||
7fd081100f48828431e7c1bff65c906ee759069b jdk9-b77
|
||||
0940ce86c614458f5bdd72278b190abbf36b7b45 jdk9-b78
|
||||
d99c2ffdd0f15753e69126583688f2f075a0a5e8 jdk9-b79
|
||||
|
||||
@ -887,7 +887,8 @@ ifndef BUILD_HEADLESS_ONLY
|
||||
$(GIFLIB_CFLAGS) $(LIBJPEG_CFLAGS) $(PNG_CFLAGS), \
|
||||
DISABLED_WARNINGS_gcc := sign-compare type-limits unused-result maybe-uninitialized, \
|
||||
DISABLED_WARNINGS_clang := incompatible-pointer-types, \
|
||||
DISABLED_WARNINGS_solstudio := E_NEWLINE_NOT_LAST E_DECLARATION_IN_CODE, \
|
||||
DISABLED_WARNINGS_solstudio := E_NEWLINE_NOT_LAST E_DECLARATION_IN_CODE \
|
||||
E_STATEMENT_NOT_REACHED, \
|
||||
DISABLED_WARNINGS_microsoft := 4018 4244 4267, \
|
||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libsplashscreen/mapfile-vers, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
|
||||
@ -146,6 +146,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||
$(LIBJAVA_CFLAGS), \
|
||||
DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \
|
||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava/mapfile-vers, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
@ -307,7 +308,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJLI, \
|
||||
EXTRA_FILES := $(LIBJLI_EXTRA_FILES), \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(LIBJLI_CFLAGS), \
|
||||
DISABLED_WARNINGS_solstudio := E_ASM_DISABLES_OPTIMIZATION, \
|
||||
DISABLED_WARNINGS_solstudio := \
|
||||
E_ASM_DISABLES_OPTIMIZATION \
|
||||
E_STATEMENT_NOT_REACHED, \
|
||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjli/mapfile-vers, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
|
||||
@ -35,6 +35,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNET, \
|
||||
DISABLED_WARNINGS_gcc := format-nonliteral, \
|
||||
DISABLED_WARNINGS_clang := parentheses-equality constant-logical-operand, \
|
||||
DISABLED_WARNINGS_microsoft := 4244 4047 4133 4996, \
|
||||
DISABLED_WARNINGS_solstudio := E_ARG_INCOMPATIBLE_WITH_ARG_L, \
|
||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnet/mapfile-vers, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
|
||||
@ -47,7 +47,7 @@ endif
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
BUILD_LIBNIO_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnio/mapfile-$(OPENJDK_TARGET_OS)
|
||||
BUILD_LIBNIO_EXFILES += \
|
||||
GnomeFileTypeDetector.c \
|
||||
GioFileTypeDetector.c \
|
||||
#
|
||||
endif
|
||||
|
||||
|
||||
@ -135,8 +135,8 @@ SUNWprivate_1.1 {
|
||||
Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_accept0;
|
||||
Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_initIDs;
|
||||
Java_sun_nio_ch_UnixAsynchronousSocketChannelImpl_checkConnect;
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio;
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_probeGio;
|
||||
Java_sun_nio_fs_GioFileTypeDetector_initializeGio;
|
||||
Java_sun_nio_fs_GioFileTypeDetector_probeGio;
|
||||
Java_sun_nio_fs_MagicFileTypeDetector_initialize0;
|
||||
Java_sun_nio_fs_MagicFileTypeDetector_probe0;
|
||||
Java_sun_nio_fs_LinuxWatchService_eventSize;
|
||||
|
||||
@ -130,8 +130,8 @@ SUNWprivate_1.1 {
|
||||
Java_sun_nio_ch_SolarisEventPort_port_1get;
|
||||
Java_sun_nio_ch_SolarisEventPort_port_1getn;
|
||||
Java_sun_nio_ch_SolarisEventPort_port_1send;
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio;
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_probeGio;
|
||||
Java_sun_nio_fs_GioFileTypeDetector_initializeGio;
|
||||
Java_sun_nio_fs_GioFileTypeDetector_probeGio;
|
||||
Java_sun_nio_fs_UnixNativeDispatcher_init;
|
||||
Java_sun_nio_fs_UnixNativeDispatcher_getcwd;
|
||||
Java_sun_nio_fs_UnixNativeDispatcher_strerror;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2015, 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
|
||||
@ -106,7 +106,7 @@ public class LinuxFileSystemProvider extends UnixFileSystemProvider {
|
||||
new GetPropertyAction("user.home")), ".mime.types");
|
||||
Path etcMimeTypes = Paths.get("/etc/mime.types");
|
||||
|
||||
return chain(new GnomeFileTypeDetector(),
|
||||
return chain(new GioFileTypeDetector(),
|
||||
new MimeTypesFileTypeDetector(userMimeTypes),
|
||||
new MimeTypesFileTypeDetector(etcMimeTypes),
|
||||
new MagicFileTypeDetector());
|
||||
|
||||
@ -1611,8 +1611,13 @@ public class KeyStore {
|
||||
* First the keystore type is determined by probing the specified file.
|
||||
* Then a keystore object is instantiated and loaded using the data from
|
||||
* that file.
|
||||
* A password may be supplied to unlock the keystore data or perform an
|
||||
* integrity check.
|
||||
*
|
||||
* <p>
|
||||
* A password may be given to unlock the keystore
|
||||
* (e.g. the keystore resides on a hardware token device),
|
||||
* or to check the integrity of the keystore data.
|
||||
* If a password is not given for integrity checking,
|
||||
* then integrity checking is not performed.
|
||||
*
|
||||
* <p>
|
||||
* This method traverses the list of registered security
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2015, 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
|
||||
@ -89,7 +89,7 @@ public class SolarisFileSystemProvider extends UnixFileSystemProvider {
|
||||
new GetPropertyAction("user.home")), ".mime.types");
|
||||
Path etcMimeTypes = Paths.get("/etc/mime.types");
|
||||
|
||||
return chain(new GnomeFileTypeDetector(),
|
||||
return chain(new GioFileTypeDetector(),
|
||||
new MimeTypesFileTypeDetector(userMimeTypes),
|
||||
new MimeTypesFileTypeDetector(etcMimeTypes));
|
||||
}
|
||||
|
||||
@ -35,13 +35,13 @@ import java.security.PrivilegedAction;
|
||||
* MIME type of a file.
|
||||
*/
|
||||
|
||||
public class GnomeFileTypeDetector
|
||||
public class GioFileTypeDetector
|
||||
extends AbstractFileTypeDetector
|
||||
{
|
||||
// true if GIO is available
|
||||
private final boolean gioAvailable;
|
||||
|
||||
public GnomeFileTypeDetector() {
|
||||
public GioFileTypeDetector() {
|
||||
gioAvailable = initializeGio();
|
||||
}
|
||||
|
||||
@ -67,6 +67,10 @@ public class GnomeFileTypeDetector
|
||||
|
||||
// GIO
|
||||
private static native boolean initializeGio();
|
||||
//
|
||||
// The probeGIO() method is synchronized to avert potential problems
|
||||
// such as crashes due to a suspected lack of thread safety in GIO.
|
||||
//
|
||||
private static synchronized native byte[] probeGio(long pathAddress);
|
||||
|
||||
static {
|
||||
@ -73,11 +73,11 @@ static g_file_query_info_func g_file_query_info;
|
||||
static g_file_info_get_content_type_func g_file_info_get_content_type;
|
||||
|
||||
|
||||
#include "sun_nio_fs_GnomeFileTypeDetector.h"
|
||||
#include "sun_nio_fs_GioFileTypeDetector.h"
|
||||
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio
|
||||
Java_sun_nio_fs_GioFileTypeDetector_initializeGio
|
||||
(JNIEnv* env, jclass this)
|
||||
{
|
||||
void* gio_handle;
|
||||
@ -120,7 +120,7 @@ Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio
|
||||
}
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL
|
||||
Java_sun_nio_fs_GnomeFileTypeDetector_probeGio
|
||||
Java_sun_nio_fs_GioFileTypeDetector_probeGio
|
||||
(JNIEnv* env, jclass this, jlong pathAddress)
|
||||
{
|
||||
char* path = (char*)jlong_to_ptr(pathAddress);
|
||||
@ -65,8 +65,9 @@ public class ZipFileSystemProvider extends FileSystemProvider {
|
||||
// only support legacy JAR URL syntax jar:{uri}!/{entry} for now
|
||||
String spec = uri.getRawSchemeSpecificPart();
|
||||
int sep = spec.indexOf("!/");
|
||||
if (sep != -1)
|
||||
if (sep != -1) {
|
||||
spec = spec.substring(0, sep);
|
||||
}
|
||||
return Paths.get(new URI(spec)).toAbsolutePath();
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IllegalArgumentException(e.getMessage(), e);
|
||||
@ -107,6 +108,9 @@ public class ZipFileSystemProvider extends FileSystemProvider {
|
||||
// assume NOT a zip/jar file
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
if (realPath == null) { // newly created
|
||||
realPath = path.toRealPath();
|
||||
}
|
||||
filesystems.put(realPath, zipfs);
|
||||
return zipfs;
|
||||
}
|
||||
@ -132,7 +136,6 @@ public class ZipFileSystemProvider extends FileSystemProvider {
|
||||
|
||||
@Override
|
||||
public Path getPath(URI uri) {
|
||||
|
||||
String spec = uri.getSchemeSpecificPart();
|
||||
int sep = spec.indexOf("!/");
|
||||
if (sep == -1)
|
||||
|
||||
@ -32,10 +32,10 @@ import java.nio.file.*;
|
||||
import java.nio.file.DirectoryStream.Filter;
|
||||
import java.nio.file.attribute.*;
|
||||
import java.util.*;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.nio.file.StandardOpenOption.*;
|
||||
import static java.nio.file.StandardCopyOption.*;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Xueming Shen, Rajendra Gutupalli,Jaya Hangal
|
||||
@ -180,7 +180,7 @@ class ZipPath implements Path {
|
||||
public URI toUri() {
|
||||
try {
|
||||
return new URI("jar",
|
||||
zfs.getZipFile().toUri() +
|
||||
decodeUri(zfs.getZipFile().toUri().toString()) +
|
||||
"!" +
|
||||
zfs.getString(toAbsolutePath().path),
|
||||
null);
|
||||
@ -866,4 +866,57 @@ class ZipPath implements Path {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int decode(char c) {
|
||||
if ((c >= '0') && (c <= '9'))
|
||||
return c - '0';
|
||||
if ((c >= 'a') && (c <= 'f'))
|
||||
return c - 'a' + 10;
|
||||
if ((c >= 'A') && (c <= 'F'))
|
||||
return c - 'A' + 10;
|
||||
assert false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// to avoid double escape
|
||||
static String decodeUri(String s) {
|
||||
if (s == null)
|
||||
return s;
|
||||
int n = s.length();
|
||||
if (n == 0)
|
||||
return s;
|
||||
if (s.indexOf('%') < 0)
|
||||
return s;
|
||||
|
||||
StringBuilder sb = new StringBuilder(n);
|
||||
byte[] bb = new byte[n];
|
||||
boolean betweenBrackets = false;
|
||||
|
||||
for (int i = 0; i < n;) {
|
||||
char c = s.charAt(i);
|
||||
if (c == '[') {
|
||||
betweenBrackets = true;
|
||||
} else if (betweenBrackets && c == ']') {
|
||||
betweenBrackets = false;
|
||||
}
|
||||
if (c != '%' || betweenBrackets ) {
|
||||
sb.append(c);
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
int nb = 0;
|
||||
while (c == '%') {
|
||||
assert (n - i >= 2);
|
||||
bb[nb++] = (byte)(((decode(s.charAt(++i)) & 0xf) << 4) |
|
||||
(decode(s.charAt(++i)) & 0xf));
|
||||
if (++i >= n) {
|
||||
break;
|
||||
}
|
||||
c = s.charAt(i);
|
||||
}
|
||||
sb.append(new String(bb, 0, nb, UTF_8));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -122,6 +122,10 @@ java/beans/XMLEncoder/java_awt_GridBagLayout.java generic-all
|
||||
java/beans/XMLDecoder/8028054/TestConstructorFinder.java generic-all
|
||||
java/beans/XMLDecoder/8028054/TestMethodFinder.java generic-all
|
||||
|
||||
# 8132565
|
||||
java/beans/Introspector/8132566/OverridePropertyInfoTest.java generic-all
|
||||
java/beans/Introspector/8132566/OverrideUserDefPropertyInfoTest.java generic-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_lang
|
||||
@ -132,6 +136,9 @@ java/lang/ClassLoader/deadlock/GetResource.java generic-all
|
||||
# 8133552
|
||||
java/lang/ProcessHandle/InfoTest.java generic-all
|
||||
|
||||
# 8134677
|
||||
java/lang/SecurityManager/CheckPackageMatching.java windows-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_instrument
|
||||
@ -380,6 +387,11 @@ sun/tools/jstatd/TestJstatdExternalRegistry.java generic-all
|
||||
# 6456333
|
||||
sun/tools/jps/TestJpsJarRelative.java generic-all
|
||||
|
||||
# 8134420
|
||||
sun/tools/jps/TestJpsClass.java generic-all
|
||||
sun/tools/jps/TestJpsJar.java generic-all
|
||||
sun/tools/jps/TestJpsSanity.java generic-all
|
||||
|
||||
# 6734748
|
||||
sun/tools/jinfo/JInfoRunningProcessFlagTest.java generic-all
|
||||
|
||||
|
||||
@ -50,7 +50,8 @@ tier2 = \
|
||||
tier3 = \
|
||||
:jdk_rmi \
|
||||
:jdk_beans \
|
||||
:jdk_imageio
|
||||
:jdk_imageio \
|
||||
:jdk_sound
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.security.NoSuchAlgorithmException;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8048601
|
||||
* @library ../
|
||||
* @summary Test Blowfish cipher with different MODES and padding
|
||||
*/
|
||||
|
||||
public class TestCipherBlowfish extends TestCipher {
|
||||
|
||||
TestCipherBlowfish() throws NoSuchAlgorithmException {
|
||||
super("Blowfish",
|
||||
new String[]{"CBC", "CTR", "CTS", "ECB", "PCBC",
|
||||
//CFBx
|
||||
"CFB", "CFB8", "CFB16", "CFB24", "CFB32", "CFB40", "CFB48", "CFB56",
|
||||
"CFB64",
|
||||
//OFBx
|
||||
"OFB", "OFB8", "OFB16", "OFB24", "OFB32", "OFB40", "OFB48", "OFB56",
|
||||
"OFB64"},
|
||||
new String[]{"NoPaDDing", "PKCS5Padding"},
|
||||
true);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new TestCipherBlowfish().runAll();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8048601
|
||||
* @library ../
|
||||
* @summary Test DES/DESede cipher with different MODES and padding
|
||||
*/
|
||||
|
||||
public class TestCipherDES extends TestCipher {
|
||||
|
||||
TestCipherDES() {
|
||||
super("DES",
|
||||
new String[]{"CBC", "CTR", "CTS", "ECB", "PCBC",
|
||||
//CFBx
|
||||
"CFB", "CFB8", "CFB16", "CFB24", "CFB32", "CFB40", "CFB48", "CFB56",
|
||||
"CFB64",
|
||||
//OFBx
|
||||
"OFB", "OFB8", "OFB16", "OFB24", "OFB32", "OFB40", "OFB48", "OFB56",
|
||||
"OFB64"},
|
||||
new String[]{"NoPaDDing", "PKCS5Padding"});
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new TestCipherDES().runAll();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8048601
|
||||
* @library ../
|
||||
* @summary Test DES/DESede cipher with different MODES and padding
|
||||
*/
|
||||
|
||||
public class TestCipherDESede extends TestCipher {
|
||||
|
||||
TestCipherDESede() {
|
||||
super("DESede",
|
||||
new String[]{"CBC", "CTR", "CTS", "ECB", "PCBC",
|
||||
//CFBx
|
||||
"CFB", "CFB8", "CFB16", "CFB24", "CFB32", "CFB40", "CFB48", "CFB56",
|
||||
"CFB64",
|
||||
//OFBx
|
||||
"OFB", "OFB8", "OFB16", "OFB24", "OFB32", "OFB40", "OFB48", "OFB56",
|
||||
"OFB64"},
|
||||
new String[]{"NoPaDDing", "PKCS5Padding"});
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new TestCipherDESede().runAll();
|
||||
}
|
||||
}
|
||||
128
jdk/test/com/sun/crypto/provider/Cipher/PBE/TestCipherPBE.java
Normal file
128
jdk/test/com/sun/crypto/provider/Cipher/PBE/TestCipherPBE.java
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 static java.lang.System.out;
|
||||
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.SecretKeyFactory;
|
||||
import javax.crypto.ShortBufferException;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.crypto.spec.PBEParameterSpec;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8048601
|
||||
* @summary Tests for PBE ciphers
|
||||
*/
|
||||
public class TestCipherPBE {
|
||||
|
||||
private static final String[] ALGORITHMS = {"PBEWithMD5AndDES",
|
||||
"PBEWithMD5AndDES/CBC/PKCS5Padding", "PBEWithMD5AndTripleDES",
|
||||
"PBEWithMD5AndTripleDES/CBC/PKCS5Padding"};
|
||||
|
||||
private static final String KEY_ALGO = "pbeWithMD5ANDdes";
|
||||
private final byte[] SALT;
|
||||
private final byte[] PLAIN_TEXT;
|
||||
|
||||
public TestCipherPBE() {
|
||||
SALT = generateBytes(8);
|
||||
PLAIN_TEXT = generateBytes(200);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
new TestCipherPBE().runAll();
|
||||
}
|
||||
|
||||
private void runAll() throws Exception {
|
||||
for (String algorithm : ALGORITHMS) {
|
||||
runTest(algorithm);
|
||||
}
|
||||
}
|
||||
|
||||
private void runTest(String algorithm)
|
||||
throws InvalidKeySpecException, NoSuchAlgorithmException,
|
||||
InvalidAlgorithmParameterException, ShortBufferException,
|
||||
NoSuchPaddingException, IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException {
|
||||
|
||||
out.println("=> Testing: " + algorithm);
|
||||
|
||||
try {
|
||||
// Initialization
|
||||
AlgorithmParameterSpec algoParamSpec
|
||||
= new PBEParameterSpec(SALT, 6);
|
||||
|
||||
SecretKey secretKey
|
||||
= SecretKeyFactory.getInstance(KEY_ALGO).generateSecret(
|
||||
new PBEKeySpec(("Secret Key Value").toCharArray()));
|
||||
|
||||
Cipher ci = Cipher.getInstance(algorithm);
|
||||
ci.init(Cipher.ENCRYPT_MODE, secretKey, algoParamSpec);
|
||||
|
||||
// Encryption
|
||||
byte[] cipherText = ci.doFinal(PLAIN_TEXT);
|
||||
|
||||
// Decryption
|
||||
ci.init(Cipher.DECRYPT_MODE, secretKey, algoParamSpec);
|
||||
byte[] recoveredText = ci.doFinal(cipherText);
|
||||
|
||||
if (algorithm.contains("TripleDES")) {
|
||||
throw new RuntimeException(
|
||||
"Expected InvalidKeyException exception uncaugh");
|
||||
}
|
||||
|
||||
// Comparison
|
||||
if (!Arrays.equals(PLAIN_TEXT, recoveredText)) {
|
||||
throw new RuntimeException(
|
||||
"Test failed: plainText is not equal to recoveredText");
|
||||
}
|
||||
out.println("Test Passed.");
|
||||
} catch (InvalidKeyException ex) {
|
||||
if (algorithm.contains("TripleDES")) {
|
||||
out.println("Expected InvalidKeyException raised");
|
||||
} else {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] generateBytes(int length) {
|
||||
byte[] bytes = new byte[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
bytes[i] = (byte) (i & 0xff);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
}
|
||||
220
jdk/test/com/sun/crypto/provider/Cipher/TestCipher.java
Normal file
220
jdk/test/com/sun/crypto/provider/Cipher/TestCipher.java
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 static java.lang.System.out;
|
||||
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.ShortBufferException;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* This is a abstract class used to test various ciphers
|
||||
*/
|
||||
public abstract class TestCipher {
|
||||
|
||||
private final String SUNJCE = "SunJCE";
|
||||
private final String ALGORITHM;
|
||||
private final String[] MODES;
|
||||
private final String[] PADDINGS;
|
||||
|
||||
/* Used to test cipher with different key strengths
|
||||
Key size tested is increment of KEYCUTTER from MINIMUM_KEY_SIZE to
|
||||
maximum allowed keysize.
|
||||
DES/DESede/Blowfish work with currently selected key sizes.
|
||||
*/
|
||||
private final int variousKeySize;
|
||||
private final int KEYCUTTER = 8;
|
||||
private final int MINIMUM_KEY_SIZE = 32;
|
||||
|
||||
// Used to assert that Encryption/Decryption works with same buffer
|
||||
// TEXT_LEN is multiple of blocks in order to work against ciphers w/ NoPadding
|
||||
private final int TEXT_LEN = 800;
|
||||
private final int ENC_OFFSET = 6;
|
||||
private final int STORAGE_OFFSET = 3;
|
||||
private final int PAD_BYTES = 16;
|
||||
|
||||
private final byte[] IV;
|
||||
private final byte[] INPUT_TEXT;
|
||||
|
||||
TestCipher(String algo, String[] modes, String[] paddings,
|
||||
boolean keyStrength) throws NoSuchAlgorithmException {
|
||||
ALGORITHM = algo;
|
||||
MODES = modes;
|
||||
PADDINGS = paddings;
|
||||
this.variousKeySize
|
||||
= keyStrength ? Cipher.getMaxAllowedKeyLength(ALGORITHM) : 0;
|
||||
|
||||
IV = generateBytes(8);
|
||||
INPUT_TEXT = generateBytes(TEXT_LEN + PAD_BYTES + ENC_OFFSET);
|
||||
}
|
||||
|
||||
TestCipher(String algo, String[] modes, String[] paddings) {
|
||||
ALGORITHM = algo;
|
||||
MODES = modes;
|
||||
PADDINGS = paddings;
|
||||
variousKeySize = 0;
|
||||
|
||||
IV = generateBytes(8);
|
||||
INPUT_TEXT = generateBytes(TEXT_LEN + PAD_BYTES + ENC_OFFSET);
|
||||
}
|
||||
|
||||
private static byte[] generateBytes(int length) {
|
||||
byte[] bytes = new byte[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
bytes[i] = (byte) (i & 0xff);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
private boolean isKeyStrenthSupported() {
|
||||
return (variousKeySize != 0);
|
||||
}
|
||||
|
||||
public void runAll() throws InvalidKeyException,
|
||||
NoSuchPaddingException, InvalidAlgorithmParameterException,
|
||||
ShortBufferException, IllegalBlockSizeException,
|
||||
BadPaddingException, NoSuchAlgorithmException,
|
||||
NoSuchProviderException {
|
||||
|
||||
for (String mode : MODES) {
|
||||
for (String padding : PADDINGS) {
|
||||
if (!isKeyStrenthSupported()) {
|
||||
runTest(mode, padding, 0);
|
||||
} else {
|
||||
int keySize = variousKeySize;
|
||||
while (keySize >= MINIMUM_KEY_SIZE) {
|
||||
out.println("With Key Strength: " + keySize);
|
||||
runTest(mode, padding, keySize);
|
||||
keySize -= KEYCUTTER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void runTest(String mo, String pad, int keySize)
|
||||
throws NoSuchPaddingException, BadPaddingException,
|
||||
ShortBufferException, IllegalBlockSizeException,
|
||||
InvalidAlgorithmParameterException, InvalidKeyException,
|
||||
NoSuchAlgorithmException, NoSuchProviderException {
|
||||
|
||||
String TRANSFORMATION = ALGORITHM + "/" + mo + "/" + pad;
|
||||
out.println("Testing: " + TRANSFORMATION);
|
||||
|
||||
// Initialization
|
||||
Cipher ci = Cipher.getInstance(TRANSFORMATION, SUNJCE);
|
||||
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM, SUNJCE);
|
||||
if (keySize != 0) {
|
||||
kg.init(keySize);
|
||||
}
|
||||
SecretKey key = kg.generateKey();
|
||||
SecretKeySpec skeySpec = new SecretKeySpec(key.getEncoded(), ALGORITHM);
|
||||
|
||||
AlgorithmParameterSpec aps = new IvParameterSpec(IV);
|
||||
if (mo.equalsIgnoreCase("ECB")) {
|
||||
ci.init(Cipher.ENCRYPT_MODE, key);
|
||||
} else {
|
||||
ci.init(Cipher.ENCRYPT_MODE, key, aps);
|
||||
}
|
||||
|
||||
// Encryption
|
||||
int PAD_LEN = 0;
|
||||
if (pad.equalsIgnoreCase("PKCS5Padding")) {
|
||||
// Need to consider pad bytes
|
||||
PAD_LEN = 8;
|
||||
}
|
||||
|
||||
byte[] plainText = INPUT_TEXT.clone();
|
||||
|
||||
// Generate cipher and save to separate buffer
|
||||
byte[] cipherText = ci.doFinal(INPUT_TEXT, ENC_OFFSET, TEXT_LEN);
|
||||
|
||||
// Generate cipher and save to same buffer
|
||||
int offset = ci.update(
|
||||
INPUT_TEXT, ENC_OFFSET, TEXT_LEN, INPUT_TEXT, STORAGE_OFFSET);
|
||||
ci.doFinal(INPUT_TEXT, offset + STORAGE_OFFSET);
|
||||
|
||||
if (!equalsBlock(
|
||||
INPUT_TEXT, STORAGE_OFFSET, cipherText, 0, cipherText.length)) {
|
||||
throw new RuntimeException(
|
||||
"Different ciphers generated with same buffer");
|
||||
}
|
||||
|
||||
// Decryption
|
||||
if (mo.equalsIgnoreCase("ECB")) {
|
||||
ci.init(Cipher.DECRYPT_MODE, skeySpec);
|
||||
} else {
|
||||
ci.init(Cipher.DECRYPT_MODE, skeySpec, aps);
|
||||
}
|
||||
|
||||
// Recover text from cipher and save to separate buffer
|
||||
byte[] recoveredText = ci.doFinal(cipherText, 0, cipherText.length);
|
||||
|
||||
if (!equalsBlock(
|
||||
plainText, ENC_OFFSET, recoveredText, 0,
|
||||
recoveredText.length)) {
|
||||
throw new RuntimeException(
|
||||
"Recovered text not same as plain text");
|
||||
} else {
|
||||
out.println("Recovered and plain text are same");
|
||||
}
|
||||
|
||||
// Recover text from cipher and save to same buffer
|
||||
ci.update(INPUT_TEXT, STORAGE_OFFSET, TEXT_LEN + PAD_LEN, INPUT_TEXT,
|
||||
ENC_OFFSET);
|
||||
ci.doFinal(INPUT_TEXT, ENC_OFFSET);
|
||||
|
||||
if (!equalsBlock(
|
||||
plainText, ENC_OFFSET, recoveredText, 0,
|
||||
recoveredText.length)) {
|
||||
throw new RuntimeException(
|
||||
"Recovered text not same as plain text with same buffer");
|
||||
} else {
|
||||
out.println("Recovered and plain text are same with same buffer");
|
||||
}
|
||||
|
||||
out.println("Test Passed.");
|
||||
}
|
||||
|
||||
private static boolean equalsBlock(byte[] b1, int off1, byte[] b2, int off2,
|
||||
int len) {
|
||||
for (int i = off1, j = off2, k = 0; k < len; i++, j++, k++) {
|
||||
if (b1[i] != b2[j]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 static java.lang.System.out;
|
||||
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.ShortBufferException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
|
||||
/**
|
||||
* Wrapper class to test a given DES algorithm.
|
||||
*/
|
||||
public class DESCipherWrapper {
|
||||
|
||||
private final Cipher ci;
|
||||
private final byte[] iv;
|
||||
private final SecretKey key;
|
||||
private final String algo;
|
||||
private final String mode;
|
||||
private final String pad;
|
||||
private final int keyStrength;
|
||||
private byte[] resultText = null;
|
||||
|
||||
public DESCipherWrapper(String algo, String mode, String pad)
|
||||
throws NoSuchAlgorithmException, NoSuchPaddingException {
|
||||
ci = Cipher.getInstance(algo + "/" + mode + "/" + pad);
|
||||
|
||||
iv = new byte[8];
|
||||
for (int i = 0; i < 8; i++) {
|
||||
iv[i] = (byte) (i & 0xff);
|
||||
}
|
||||
|
||||
KeyGenerator kg = KeyGenerator.getInstance(algo);
|
||||
key = kg.generateKey();
|
||||
keyStrength = algo.equalsIgnoreCase("DESede") ? 112
|
||||
: key.getEncoded().length * 8;
|
||||
|
||||
this.algo = algo;
|
||||
this.mode = mode;
|
||||
this.pad = pad;
|
||||
}
|
||||
|
||||
public byte[] getResult() {
|
||||
return resultText.clone();
|
||||
}
|
||||
|
||||
public void execute(int edMode, byte[] inputText)
|
||||
throws InvalidKeyException, InvalidAlgorithmParameterException,
|
||||
IllegalBlockSizeException, BadPaddingException,
|
||||
ShortBufferException, NoSuchAlgorithmException {
|
||||
AlgorithmParameterSpec aps = null;
|
||||
|
||||
try {
|
||||
if (!mode.equalsIgnoreCase("ECB")) {
|
||||
aps = new IvParameterSpec(iv);
|
||||
}
|
||||
ci.init(edMode, key, aps);
|
||||
|
||||
// Generate a resultText using a single-part enc/dec
|
||||
resultText = ci.doFinal(inputText);
|
||||
|
||||
// Generate outputText for each multi-part en/de-cryption
|
||||
/* Combination #1:
|
||||
update(byte[], int, int)
|
||||
doFinal(byte[], int, int)
|
||||
*/
|
||||
byte[] part11 = ci.update(inputText, 0, inputText.length);
|
||||
byte[] part12 = ci.doFinal();
|
||||
byte[] outputText1 = new byte[part11.length + part12.length];
|
||||
System.arraycopy(part11, 0, outputText1, 0, part11.length);
|
||||
System.arraycopy(part12, 0, outputText1, part11.length,
|
||||
part12.length);
|
||||
|
||||
List<byte[]> outputTexts = new ArrayList<>(4);
|
||||
outputTexts.add(outputText1);
|
||||
|
||||
/* Combination #2:
|
||||
update(byte[], int, int)
|
||||
doFinal(byte[], int, int, byte[], int)
|
||||
*/
|
||||
byte[] part21 = ci.update(inputText, 0, inputText.length - 5);
|
||||
byte[] part22 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len2 = ci
|
||||
.doFinal(inputText, inputText.length - 5, 5, part22, 0);
|
||||
byte[] outputText2 = new byte[part21.length + len2];
|
||||
System.arraycopy(part21, 0, outputText2, 0, part21.length);
|
||||
System.arraycopy(part22, 0, outputText2, part21.length, len2);
|
||||
|
||||
outputTexts.add(outputText2);
|
||||
|
||||
/* Combination #3:
|
||||
update(byte[], int, int, byte[], int)
|
||||
doFinal(byte[], int, int)
|
||||
*/
|
||||
byte[] part31 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len3 = ci.update(inputText, 0, inputText.length - 8, part31, 0);
|
||||
byte[] part32 = ci.doFinal(inputText, inputText.length - 8, 8);
|
||||
byte[] outputText3 = new byte[len3 + part32.length];
|
||||
System.arraycopy(part31, 0, outputText3, 0, len3);
|
||||
System.arraycopy(part32, 0, outputText3, len3, part32.length);
|
||||
|
||||
outputTexts.add(outputText3);
|
||||
|
||||
/* Combination #4:
|
||||
update(byte[], int, int, byte[], int)
|
||||
doFinal(byte[], int, int, byte[], int)
|
||||
*/
|
||||
byte[] part41 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len4 = ci.update(inputText, 0, inputText.length - 8, part41, 0);
|
||||
int rest4 = ci.doFinal(inputText, inputText.length - 8, 8, part41,
|
||||
len4);
|
||||
byte[] outputText4 = new byte[len4 + rest4];
|
||||
System.arraycopy(part41, 0, outputText4, 0, outputText4.length);
|
||||
|
||||
outputTexts.add(outputText4);
|
||||
|
||||
// Compare results
|
||||
for (int k = 0; k < outputTexts.size(); k++) {
|
||||
if (!Arrays.equals(resultText, outputTexts.get(k))) {
|
||||
out.println(" Testing: " + algo + "/" + mode + "/" + pad);
|
||||
throw new RuntimeException(
|
||||
"Compare value of resultText and combination " + k
|
||||
+ " are not same. Test failed.");
|
||||
}
|
||||
}
|
||||
if (keyStrength > Cipher.getMaxAllowedKeyLength(algo)) {
|
||||
throw new RuntimeException(
|
||||
"Expected exception uncaught, keyStrength "
|
||||
+ keyStrength);
|
||||
}
|
||||
} catch (InvalidKeyException ex) {
|
||||
if (keyStrength <= Cipher.getMaxAllowedKeyLength(algo)) {
|
||||
out.println("Unexpected exception in " + algo + "/" + mode
|
||||
+ "/" + pad + " , KeySize " + keyStrength);
|
||||
throw ex;
|
||||
}
|
||||
out.println("Caught InvalidKeyException as expected");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,258 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.security.AlgorithmParameters;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.spec.InvalidParameterSpecException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.SecretKeyFactory;
|
||||
import javax.crypto.ShortBufferException;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.crypto.spec.PBEParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* PBECipherWrapper is the abstract class for all concrete PBE Cipher wrappers.
|
||||
*/
|
||||
public abstract class PBECipherWrapper {
|
||||
|
||||
public static final int ITERATION_COUNT = 1000;
|
||||
private final String algorithm;
|
||||
private final byte[] salt;
|
||||
protected SecretKey key;
|
||||
protected Cipher ci;
|
||||
protected String baseAlgo;
|
||||
protected byte[] resultText = null;
|
||||
protected AlgorithmParameterSpec aps = null;
|
||||
|
||||
public PBECipherWrapper(String algorithm, int saltSize) {
|
||||
this.algorithm = algorithm;
|
||||
baseAlgo = algorithm.split("/")[0].toUpperCase();
|
||||
salt = generateSalt(saltSize);
|
||||
}
|
||||
|
||||
protected abstract void initCipher(int mode) throws InvalidKeyException,
|
||||
InvalidAlgorithmParameterException, InvalidParameterSpecException;
|
||||
|
||||
public void execute(int edMode, byte[] inputText)
|
||||
throws InvalidAlgorithmParameterException,
|
||||
InvalidParameterSpecException, IllegalBlockSizeException,
|
||||
BadPaddingException, ShortBufferException, InvalidKeyException {
|
||||
// Initialize
|
||||
initCipher(edMode);
|
||||
|
||||
// Generate a resultText using a single-part enc/dec
|
||||
resultText = ci.doFinal(inputText);
|
||||
|
||||
// Generate outputText for each multi-part en/de-cryption
|
||||
/* Combination #1:
|
||||
update(byte[], int, int)
|
||||
doFinal(byte[], int, int)
|
||||
*/
|
||||
byte[] part11 = ci.update(inputText, 0, inputText.length);
|
||||
byte[] part12 = ci.doFinal();
|
||||
byte[] outputText1 = new byte[part11.length + part12.length];
|
||||
System.arraycopy(part11, 0, outputText1, 0, part11.length);
|
||||
System.arraycopy(part12, 0, outputText1, part11.length, part12.length);
|
||||
|
||||
List<byte[]> outputTexts = new ArrayList<>(4);
|
||||
outputTexts.add(outputText1);
|
||||
|
||||
/* Combination #2:
|
||||
update(byte[], int, int)
|
||||
doFinal(byte[], int, int, byte[], int)
|
||||
*/
|
||||
byte[] part21 = ci.update(inputText, 0, inputText.length - 5);
|
||||
byte[] part22 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len2 = ci.doFinal(inputText, inputText.length - 5, 5, part22, 0);
|
||||
byte[] outputText2 = new byte[part21.length + len2];
|
||||
System.arraycopy(part21, 0, outputText2, 0, part21.length);
|
||||
System.arraycopy(part22, 0, outputText2, part21.length, len2);
|
||||
|
||||
outputTexts.add(outputText2);
|
||||
|
||||
/* Combination #3:
|
||||
update(byte[], int, int, byte[], int)
|
||||
doFinal(byte[], int, int)
|
||||
*/
|
||||
byte[] part31 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len3 = ci.update(inputText, 0, inputText.length - 8, part31, 0);
|
||||
byte[] part32 = ci.doFinal(inputText, inputText.length - 8, 8);
|
||||
byte[] outputText3 = new byte[len3 + part32.length];
|
||||
System.arraycopy(part31, 0, outputText3, 0, len3);
|
||||
System.arraycopy(part32, 0, outputText3, len3, part32.length);
|
||||
|
||||
outputTexts.add(outputText3);
|
||||
|
||||
/* Combination #4:
|
||||
update(byte[], int, int, byte[], int)
|
||||
doFinal(byte[], int, int, byte[], int)
|
||||
*/
|
||||
byte[] part41 = new byte[ci.getOutputSize(inputText.length)];
|
||||
int len4 = ci.update(inputText, 0, inputText.length - 8, part41, 0);
|
||||
int rest4 = ci
|
||||
.doFinal(inputText, inputText.length - 8, 8, part41, len4);
|
||||
byte[] outputText4 = new byte[len4 + rest4];
|
||||
System.arraycopy(part41, 0, outputText4, 0, outputText4.length);
|
||||
|
||||
outputTexts.add(outputText4);
|
||||
|
||||
// Compare results
|
||||
for (int k = 0; k < outputTexts.size(); k++) {
|
||||
if (!Arrays.equals(resultText, outputTexts.get(k))) {
|
||||
throw new RuntimeException(
|
||||
"Compare value of resultText and combination " + k
|
||||
+ " are not same. Test failed.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public final byte[] generateSalt(int numberOfBytes) {
|
||||
byte[] aSalt = new byte[numberOfBytes];
|
||||
for (int i = 0; i < numberOfBytes; i++) {
|
||||
aSalt[i] = (byte) (i & 0xff);
|
||||
}
|
||||
return aSalt;
|
||||
}
|
||||
|
||||
public byte[] getResult() {
|
||||
return resultText;
|
||||
}
|
||||
|
||||
public String getAlgorithm() {
|
||||
return algorithm;
|
||||
}
|
||||
|
||||
public byte[] getSalt() {
|
||||
return salt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class to test a given SecretKeyFactory.PBKDF2 algorithm.
|
||||
*/
|
||||
public static class PBKDF2 extends PBECipherWrapper {
|
||||
|
||||
private static final int PBKDF2_SALT_SIZE = 64;
|
||||
private static final int CIPHER_KEY_SIZE = 128;
|
||||
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
|
||||
private static final String KEY_ALGORITHM = "AES";
|
||||
private byte[] iv = null;
|
||||
|
||||
public PBKDF2(String algo, String passwd)
|
||||
throws InvalidKeySpecException, NoSuchAlgorithmException,
|
||||
NoSuchPaddingException {
|
||||
super(algo, PBKDF2_SALT_SIZE);
|
||||
|
||||
ci = Cipher.getInstance(CIPHER_TRANSFORMATION);
|
||||
|
||||
PBEKeySpec pbeKeySpec = new PBEKeySpec(passwd.toCharArray(), getSalt(),
|
||||
ITERATION_COUNT, CIPHER_KEY_SIZE);
|
||||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algo);
|
||||
key = keyFactory.generateSecret(pbeKeySpec);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initCipher(int mode) throws InvalidKeyException,
|
||||
InvalidAlgorithmParameterException, InvalidParameterSpecException {
|
||||
if (Cipher.ENCRYPT_MODE == mode) {
|
||||
ci.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getEncoded(),
|
||||
KEY_ALGORITHM));
|
||||
iv = ci.getParameters().getParameterSpec(IvParameterSpec.class)
|
||||
.getIV();
|
||||
} else {
|
||||
ci.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getEncoded(),
|
||||
KEY_ALGORITHM), new IvParameterSpec(iv));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class to test a given AES-based PBE algorithm.
|
||||
*/
|
||||
public static class AES extends PBECipherWrapper {
|
||||
|
||||
private AlgorithmParameters pbeParams;
|
||||
|
||||
public AES(String algo, String passwd)
|
||||
throws NoSuchAlgorithmException, NoSuchPaddingException,
|
||||
InvalidKeySpecException {
|
||||
super(algo, 0);
|
||||
|
||||
ci = Cipher.getInstance(algo);
|
||||
|
||||
SecretKeyFactory skf = SecretKeyFactory.getInstance(algo);
|
||||
key = skf.generateSecret(new PBEKeySpec(passwd.toCharArray()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initCipher(int mode) throws InvalidKeyException,
|
||||
InvalidAlgorithmParameterException, InvalidParameterSpecException {
|
||||
if (Cipher.ENCRYPT_MODE == mode) {
|
||||
ci.init(Cipher.ENCRYPT_MODE, key);
|
||||
pbeParams = ci.getParameters();
|
||||
} else {
|
||||
ci.init(Cipher.DECRYPT_MODE, key, pbeParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class to test a given PBE algorithm.
|
||||
*/
|
||||
public static class Legacy extends PBECipherWrapper {
|
||||
|
||||
private static final int PBE_SALT_SIZE = 8;
|
||||
|
||||
public Legacy(String algo, String passwd)
|
||||
throws NoSuchAlgorithmException, NoSuchPaddingException,
|
||||
InvalidKeySpecException {
|
||||
super(algo, PBE_SALT_SIZE);
|
||||
|
||||
SecretKeyFactory skf = SecretKeyFactory.getInstance(algo.split("/")[0]);
|
||||
key = skf.generateSecret(new PBEKeySpec(passwd.toCharArray()));
|
||||
|
||||
aps = new PBEParameterSpec(getSalt(), ITERATION_COUNT);
|
||||
|
||||
ci = Cipher.getInstance(algo);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initCipher(int mode) throws InvalidKeyException,
|
||||
InvalidAlgorithmParameterException, InvalidParameterSpecException {
|
||||
ci.init(mode, key, aps);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 static java.lang.System.out;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.util.Arrays;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8048601
|
||||
* @summary Performs multiple-part encryption/decryption depending on the
|
||||
* specified encryption mode and check if the results obtained by
|
||||
* different ways are the same.
|
||||
*/
|
||||
public class TestCipherTextLength {
|
||||
|
||||
/* Algorithms tested by DESCipherWrapper */
|
||||
private static final String[] DES_ALGORITHMS = {"DES", "DESede",
|
||||
"Blowfish"};
|
||||
private static final String[] DES_MODES = {"ECB", "CBC", "PCBC"};
|
||||
private static final String[] DES_PADDING = {"PKCS5Padding"};
|
||||
|
||||
/* Algorithms tested by PBECipherWrapper */
|
||||
private static final String[] PBE_ALGORITHMS = {"PBEWithMD5AndDES",
|
||||
"PBEWithMD5AndDES/CBC/PKCS5Padding", "PBEWithMD5ANDTripleDES",
|
||||
"PBEWithMD5AndTripleDES/CBC/PKCS5Padding", "PBEwithSHA1AndDESede",
|
||||
"PBEwithSHA1AndDESede/CBC/PKCS5Padding", "PBEwithSHA1AndRC2_40",
|
||||
"PBEwithSHA1Andrc2_40/CBC/PKCS5Padding", "PBEWithSHA1AndRC2_128",
|
||||
"PBEWithSHA1andRC2_128/CBC/PKCS5Padding", "PBEWithSHA1AndRC4_40",
|
||||
"PBEWithsha1AndRC4_40/ECB/NoPadding", "PBEWithSHA1AndRC4_128",
|
||||
"PBEWithSHA1AndRC4_128/ECB/NoPadding", "PBEWithHmacSHA1AndAES_128",
|
||||
"PBEWithHmacSHA224AndAES_128", "PBEWithHmacSHA256AndAES_128",
|
||||
"PBEWithHmacSHA384AndAES_128", "PBEWithHmacSHA512AndAES_128",
|
||||
"PBEWithHmacSHA1AndAES_256", "PBEWithHmacSHA224AndAES_256",
|
||||
"PBEWithHmacSHA256AndAES_256", "PBEWithHmacSHA384AndAES_256",
|
||||
"PBEWithHmacSHA512AndAES_256", "PBKDF2WithHmacSHA1",
|
||||
"PBKDF2WithHmacSHA224", "PBKDF2WithHmacSHA256",
|
||||
"PBKDF2WithHmacSHA384", "PBKDF2WithHmacSHA512"};
|
||||
private static final String PBE_PASSWORD = "Hush, it's a secret!!";
|
||||
|
||||
// Algorithm tested by PBKDF2Wrappter
|
||||
private static final String PBKDF2 = "PBKDF2";
|
||||
|
||||
// Algorithm tested by AESPBEWrapper
|
||||
private static final String AES = "AES";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
byte[] plainText = new byte[64];
|
||||
for (int i = 0; i < 64; i++) {
|
||||
plainText[i] = (byte) (i & 0xff);
|
||||
}
|
||||
|
||||
new TestCipherTextLength().runAll(plainText);
|
||||
}
|
||||
|
||||
public void runAll(byte[] plainText) throws Exception {
|
||||
|
||||
// Testing DES/Blowfish Cipher
|
||||
for (String algorithm : DES_ALGORITHMS) {
|
||||
for (String desMode : DES_MODES) {
|
||||
for (String padding : DES_PADDING) {
|
||||
out.println("=>Testing: " + algorithm + "/" + desMode
|
||||
+ "/" + padding);
|
||||
DESCipherWrapper desCi = new DESCipherWrapper(algorithm,
|
||||
desMode, padding);
|
||||
desCi.execute(Cipher.ENCRYPT_MODE, plainText);
|
||||
desCi.execute(Cipher.DECRYPT_MODE, desCi.getResult());
|
||||
if (!Arrays.equals(plainText, desCi.getResult())) {
|
||||
throw new RuntimeException(
|
||||
"Plain and recovered texts are not same for:"
|
||||
+ algorithm + "/" + desMode + "/"
|
||||
+ padding);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Testing PBE Cipher
|
||||
for (String algorithm : PBE_ALGORITHMS) {
|
||||
int maxKeyLen = Cipher.getMaxAllowedKeyLength(algorithm);
|
||||
boolean isUnlimited = maxKeyLen == Integer.MAX_VALUE;
|
||||
if (!isUnlimited
|
||||
&& (algorithm.contains("TripleDES") || algorithm
|
||||
.contains("AES_256"))) {
|
||||
out.println("Test " + algorithm + " will be ignored");
|
||||
continue;
|
||||
}
|
||||
|
||||
out.println("=>Testing: " + algorithm);
|
||||
PBECipherWrapper pbeCi = createWrapper(algorithm, PBE_PASSWORD);
|
||||
pbeCi.execute(Cipher.ENCRYPT_MODE, plainText);
|
||||
pbeCi.execute(Cipher.DECRYPT_MODE, pbeCi.getResult());
|
||||
if (!Arrays.equals(plainText, pbeCi.getResult())) {
|
||||
throw new RuntimeException(
|
||||
"Plain and recovered texts are not same for:"
|
||||
+ algorithm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PBECipherWrapper createWrapper(String algo, String passwd)
|
||||
throws InvalidKeySpecException, NoSuchAlgorithmException,
|
||||
NoSuchPaddingException {
|
||||
if (algo.contains(PBKDF2)) {
|
||||
return new PBECipherWrapper.PBKDF2(algo, passwd);
|
||||
} else if (algo.contains(AES)) {
|
||||
return new PBECipherWrapper.AES(algo, passwd);
|
||||
} else {
|
||||
return new PBECipherWrapper.Legacy(algo, passwd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -77,7 +77,8 @@ final class RestrictedPackages {
|
||||
"jdk.nashorn.internal.",
|
||||
"jdk.nashorn.tools.",
|
||||
"jdk.tools.jimage.",
|
||||
"com.sun.activation.registries."
|
||||
"com.sun.activation.registries.",
|
||||
"com.sun.java.accessibility.util.internal."
|
||||
};
|
||||
|
||||
/*
|
||||
@ -126,6 +127,9 @@ final class RestrictedPackages {
|
||||
if (OS_NAME.contains("OS X")) {
|
||||
pkgs.add("apple."); // add apple package for OS X
|
||||
}
|
||||
if (OS_NAME.contains("Win")) {
|
||||
pkgs.add("com.sun.java.accessibility.internal."); // add Win only package
|
||||
}
|
||||
return pkgs;
|
||||
}
|
||||
|
||||
|
||||
@ -21,17 +21,18 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* @test
|
||||
* @summary Test probing content type simultaneously from multiple threads.
|
||||
* @requires (os.family == "linux") | (os.family == "solaris")
|
||||
* @build ParallelProbes SimpleFileTypeDetector
|
||||
* @run main/othervm ParallelProbes 10
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ParallelProbes {
|
||||
|
||||
private static final int REPEATS = 1000;
|
||||
|
||||
@ -28,6 +28,7 @@ import javax.sound.midi.MidiSystem;
|
||||
/**
|
||||
* @test
|
||||
* @bug 8068412
|
||||
* @key headful
|
||||
* @author Sergey Bylokhov
|
||||
*/
|
||||
public final class InitializationHang {
|
||||
|
||||
@ -26,6 +26,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URI;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.SeekableByteChannel;
|
||||
@ -69,6 +70,7 @@ import static java.nio.file.StandardCopyOption.*;
|
||||
* @test
|
||||
* @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596
|
||||
* 7157656 8002390 7012868 7012856 8015728 8038500 8040059 8069211
|
||||
* 8131067
|
||||
* @summary Test Zip filesystem provider
|
||||
* @run main ZipFSTester
|
||||
* @run main/othervm/java.security.policy=test.policy ZipFSTester
|
||||
@ -91,6 +93,7 @@ public class ZipFSTester {
|
||||
}
|
||||
testTime(jarFile);
|
||||
test8069211();
|
||||
test8131067();
|
||||
}
|
||||
|
||||
static void test0(FileSystem fs)
|
||||
@ -441,11 +444,34 @@ public class ZipFSTester {
|
||||
}
|
||||
}
|
||||
|
||||
static void test8131067() throws Exception {
|
||||
Map<String, Object> env = new HashMap<String, Object>();
|
||||
env.put("create", "true");
|
||||
|
||||
// file name with space character for URI to quote it
|
||||
File tmp = File.createTempFile("test zipfs", "zip");
|
||||
tmp.delete(); // we need a clean path, no file
|
||||
Path fsPath = tmp.toPath();
|
||||
try (FileSystem fs = newZipFileSystem(fsPath, env);) {
|
||||
Files.write(fs.getPath("/foo"), "hello".getBytes());
|
||||
URI fooUri = fs.getPath("/foo").toUri();
|
||||
if (!Arrays.equals(Files.readAllBytes(Paths.get(fooUri)),
|
||||
"hello".getBytes())) {
|
||||
throw new RuntimeException("entry close() failed");
|
||||
}
|
||||
} finally {
|
||||
Files.delete(fsPath);
|
||||
}
|
||||
}
|
||||
|
||||
private static FileSystem newZipFileSystem(Path path, Map<String, ?> env)
|
||||
throws Exception
|
||||
{
|
||||
// Use URLDecoder (for test only) to remove the double escaped space
|
||||
// character
|
||||
return FileSystems.newFileSystem(
|
||||
new URI("jar", path.toUri().toString(), null), env, null);
|
||||
new URI("jar", URLDecoder.decode(path.toUri().toString(), "utf8"),
|
||||
null), env, null);
|
||||
}
|
||||
|
||||
private static Path getTempPath() throws IOException
|
||||
|
||||
@ -34,14 +34,18 @@ import java.net.DatagramSocket;
|
||||
import java.security.Security;
|
||||
|
||||
public class MaxRetries {
|
||||
|
||||
static int idlePort = -1;
|
||||
|
||||
public static void main(String[] args)
|
||||
throws Exception {
|
||||
|
||||
System.setProperty("sun.security.krb5.debug", "true");
|
||||
new OneKDC(null).writeJAASConf();
|
||||
|
||||
// An idle UDP socket to revent PortUnreachableException
|
||||
DatagramSocket ds = new DatagramSocket(33333);
|
||||
// An idle UDP socket to prevent PortUnreachableException
|
||||
DatagramSocket ds = new DatagramSocket();
|
||||
idlePort = ds.getLocalPort();
|
||||
|
||||
System.setProperty("java.security.krb5.conf", "alternative-krb5.conf");
|
||||
|
||||
@ -200,7 +204,7 @@ public class MaxRetries {
|
||||
fw.write(" kdc_timeout = " + BadKdc.toReal(value*1000) + "\n");
|
||||
}
|
||||
// Add a bad KDC as the first candidate
|
||||
fw.write(" kdc = localhost:33333\n");
|
||||
fw.write(" kdc = localhost:" + idlePort + "\n");
|
||||
}
|
||||
fw.write(s + "\n");
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8134250
|
||||
* @bug 8134250 8134520
|
||||
* @summary Tests CLDR/LDML features are correctly reflected in JDK.
|
||||
* @run main/othervm -Djava.locale.providers=CLDR Bug8134250
|
||||
*/
|
||||
@ -61,6 +61,7 @@ public class Bug8134250 {
|
||||
Chronology chrono = Chronology.ofLocale(locale);
|
||||
dtf = DateTimeFormatter
|
||||
.ofLocalizedDate(FormatStyle.FULL)
|
||||
.withLocale(locale)
|
||||
.withChronology(chrono);
|
||||
result = dtf.format(d);
|
||||
System.out.println(dtf.format(d));
|
||||
|
||||
@ -321,3 +321,4 @@ dc35e315436d21eab68ef44909922fb3424917f3 jdk9-b71
|
||||
80ab772222fb6b85f8174bf97261178ee4026620 jdk9-b76
|
||||
6ec3d5cb1bfcfba135c8d18866e567f1b1ada861 jdk9-b77
|
||||
7fd155b7041c8aba7084f03e2fd1d6f74cceda75 jdk9-b78
|
||||
eaab8a16dcfb807acacdb6d133f3ecd502667a8c jdk9-b79
|
||||
|
||||
@ -138,7 +138,7 @@ public class ClassWriter extends ClassFile {
|
||||
/** The bootstrap methods to be written in the corresponding class attribute
|
||||
* (one for each invokedynamic)
|
||||
*/
|
||||
Map<DynamicMethod, MethodHandle> bootstrapMethods;
|
||||
Map<DynamicMethod.BootstrapMethodsKey, DynamicMethod.BootstrapMethodsValue> bootstrapMethods;
|
||||
|
||||
/** The log to use for verbose output.
|
||||
*/
|
||||
@ -401,8 +401,16 @@ public class ClassWriter extends ClassFile {
|
||||
//invokedynamic
|
||||
DynamicMethodSymbol dynSym = (DynamicMethodSymbol)m;
|
||||
MethodHandle handle = new MethodHandle(dynSym.bsmKind, dynSym.bsm, types);
|
||||
DynamicMethod dynMeth = new DynamicMethod(dynSym, types);
|
||||
bootstrapMethods.put(dynMeth, handle);
|
||||
DynamicMethod.BootstrapMethodsKey key = new DynamicMethod.BootstrapMethodsKey(dynSym, types);
|
||||
|
||||
// Figure out the index for existing BSM; create a new BSM if no key
|
||||
DynamicMethod.BootstrapMethodsValue val = bootstrapMethods.get(key);
|
||||
if (val == null) {
|
||||
int index = bootstrapMethods.size();
|
||||
val = new DynamicMethod.BootstrapMethodsValue(handle, index);
|
||||
bootstrapMethods.put(key, val);
|
||||
}
|
||||
|
||||
//init cp entries
|
||||
pool.put(names.BootstrapMethods);
|
||||
pool.put(handle);
|
||||
@ -410,7 +418,7 @@ public class ClassWriter extends ClassFile {
|
||||
pool.put(staticArg);
|
||||
}
|
||||
poolbuf.appendByte(CONSTANT_InvokeDynamic);
|
||||
poolbuf.appendChar(bootstrapMethods.size() - 1);
|
||||
poolbuf.appendChar(val.index);
|
||||
poolbuf.appendChar(pool.put(nameType(dynSym)));
|
||||
}
|
||||
} else if (value instanceof VarSymbol) {
|
||||
@ -1024,15 +1032,14 @@ public class ClassWriter extends ClassFile {
|
||||
void writeBootstrapMethods() {
|
||||
int alenIdx = writeAttr(names.BootstrapMethods);
|
||||
databuf.appendChar(bootstrapMethods.size());
|
||||
for (Map.Entry<DynamicMethod, MethodHandle> entry : bootstrapMethods.entrySet()) {
|
||||
DynamicMethod dmeth = entry.getKey();
|
||||
DynamicMethodSymbol dsym = (DynamicMethodSymbol)dmeth.baseSymbol();
|
||||
for (Map.Entry<DynamicMethod.BootstrapMethodsKey, DynamicMethod.BootstrapMethodsValue> entry : bootstrapMethods.entrySet()) {
|
||||
DynamicMethod.BootstrapMethodsKey bsmKey = entry.getKey();
|
||||
//write BSM handle
|
||||
databuf.appendChar(pool.get(entry.getValue()));
|
||||
databuf.appendChar(pool.get(entry.getValue().mh));
|
||||
Object[] uniqueArgs = bsmKey.getUniqueArgs();
|
||||
//write static args length
|
||||
databuf.appendChar(dsym.staticArgs.length);
|
||||
databuf.appendChar(uniqueArgs.length);
|
||||
//write static args array
|
||||
Object[] uniqueArgs = dmeth.uniqueStaticArgs;
|
||||
for (Object o : uniqueArgs) {
|
||||
databuf.appendChar(pool.get(o));
|
||||
}
|
||||
|
||||
@ -190,7 +190,11 @@ public class Pool {
|
||||
|
||||
@Override @DefinedBy(Api.LANGUAGE_MODEL)
|
||||
public boolean equals(Object any) {
|
||||
if (!super.equals(any)) return false;
|
||||
return equalsImpl(any, true);
|
||||
}
|
||||
|
||||
protected boolean equalsImpl(Object any, boolean includeDynamicArgs) {
|
||||
if (includeDynamicArgs && !super.equals(any)) return false;
|
||||
if (!(any instanceof DynamicMethod)) return false;
|
||||
DynamicMethodSymbol dm1 = (DynamicMethodSymbol)other;
|
||||
DynamicMethodSymbol dm2 = (DynamicMethodSymbol)((DynamicMethod)any).other;
|
||||
@ -202,7 +206,11 @@ public class Pool {
|
||||
|
||||
@Override @DefinedBy(Api.LANGUAGE_MODEL)
|
||||
public int hashCode() {
|
||||
int hash = super.hashCode();
|
||||
return hashCodeImpl(true);
|
||||
}
|
||||
|
||||
protected int hashCodeImpl(boolean includeDynamicArgs) {
|
||||
int hash = includeDynamicArgs ? super.hashCode() : 0;
|
||||
DynamicMethodSymbol dm = (DynamicMethodSymbol)other;
|
||||
hash += dm.bsmKind * 7 +
|
||||
dm.bsm.hashCode() * 11;
|
||||
@ -223,6 +231,36 @@ public class Pool {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static class BootstrapMethodsKey extends DynamicMethod {
|
||||
BootstrapMethodsKey(DynamicMethodSymbol m, Types types) {
|
||||
super(m, types);
|
||||
}
|
||||
|
||||
@Override @DefinedBy(Api.LANGUAGE_MODEL)
|
||||
public boolean equals(Object any) {
|
||||
return equalsImpl(any, false);
|
||||
}
|
||||
|
||||
@Override @DefinedBy(Api.LANGUAGE_MODEL)
|
||||
public int hashCode() {
|
||||
return hashCodeImpl(false);
|
||||
}
|
||||
|
||||
Object[] getUniqueArgs() {
|
||||
return uniqueStaticArgs;
|
||||
}
|
||||
}
|
||||
|
||||
static class BootstrapMethodsValue {
|
||||
final MethodHandle mh;
|
||||
final int index;
|
||||
|
||||
public BootstrapMethodsValue(MethodHandle mh, int index) {
|
||||
this.mh = mh;
|
||||
this.index = index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class Variable extends DelegatedSymbol<VarSymbol> {
|
||||
|
||||
@ -42,9 +42,9 @@ import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
* The clean properties transform should not be necessary.
|
||||
@ -64,7 +64,7 @@ public class CleanProperties implements Transformer {
|
||||
// Any extra information is ignored for clean properties.
|
||||
}
|
||||
|
||||
public boolean transform(Sjavac sjavac,
|
||||
public boolean transform(CompilationService sjavac,
|
||||
Map<String,Set<URI>> pkgSrcs,
|
||||
Set<URI> visibleSrcs,
|
||||
Map<URI,Set<String>> visibleClasses,
|
||||
|
||||
@ -32,12 +32,13 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.CompilationResult;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
import com.sun.tools.sjavac.server.CompilationSubResult;
|
||||
import com.sun.tools.sjavac.server.SysInfo;
|
||||
|
||||
/**
|
||||
@ -68,7 +69,7 @@ public class CompileJavaPackages implements Transformer {
|
||||
args = a;
|
||||
}
|
||||
|
||||
public boolean transform(final Sjavac sjavac,
|
||||
public boolean transform(final CompilationService sjavac,
|
||||
Map<String,Set<URI>> pkgSrcs,
|
||||
final Set<URI> visibleSources,
|
||||
final Map<URI,Set<String>> visibleClasses,
|
||||
@ -91,16 +92,11 @@ public class CompileJavaPackages implements Transformer {
|
||||
boolean concurrentCompiles = true;
|
||||
|
||||
// Fetch the id.
|
||||
final String id = Util.extractStringOption("id", sjavac.serverSettings());
|
||||
final String id = String.valueOf(new Random().nextInt());
|
||||
// Only keep portfile and sjavac settings..
|
||||
//String psServerSettings = Util.cleanSubOptions(Util.set("portfile","sjavac","background","keepalive"), sjavac.serverSettings());
|
||||
|
||||
// Get maximum heap size from the server!
|
||||
SysInfo sysinfo = sjavac.getSysInfo();
|
||||
if (sysinfo == null) {
|
||||
Log.error("Could not query server for sysinfo!");
|
||||
return false;
|
||||
}
|
||||
int numMBytes = (int)(sysinfo.maxMemory / ((long)(1024*1024)));
|
||||
Log.debug("Server reports "+numMBytes+"MiB of memory and "+sysinfo.numCores+" cores");
|
||||
|
||||
@ -205,7 +201,7 @@ public class CompileJavaPackages implements Transformer {
|
||||
}
|
||||
|
||||
// The return values for each chunked compile.
|
||||
final CompilationResult[] rn = new CompilationResult[numCompiles];
|
||||
final CompilationSubResult[] rn = new CompilationSubResult[numCompiles];
|
||||
// The requets, might or might not run as a background thread.
|
||||
final Thread[] requests = new Thread[numCompiles];
|
||||
|
||||
|
||||
@ -44,9 +44,9 @@ import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
* Compile properties transform a properties file into a Java source file.
|
||||
@ -71,7 +71,7 @@ public class CompileProperties implements Transformer {
|
||||
public void setExtra(Options a) {
|
||||
}
|
||||
|
||||
public boolean transform(Sjavac sjavac,
|
||||
public boolean transform(CompilationService compilationService,
|
||||
Map<String,Set<URI>> pkgSrcs,
|
||||
Set<URI> visibleSrcs,
|
||||
Map<URI,Set<String>> visibleClasses,
|
||||
|
||||
@ -37,9 +37,9 @@ import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
* The copy file transform simply copies a matching file from -src to -d .
|
||||
@ -58,7 +58,7 @@ public class CopyFile implements Transformer {
|
||||
public void setExtra(Options a) {
|
||||
}
|
||||
|
||||
public boolean transform(Sjavac sjavac,
|
||||
public boolean transform(CompilationService compilationService,
|
||||
Map<String,Set<URI>> pkgSrcs,
|
||||
Set<URI> visibleSrcs,
|
||||
Map<URI,Set<String>> visibleClasses,
|
||||
|
||||
@ -45,9 +45,9 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
* The javac state class maintains the previous (prev) and the current (now)
|
||||
@ -748,7 +748,7 @@ public class JavacState {
|
||||
/**
|
||||
* Compile all the java sources. Return true, if it needs to be called again!
|
||||
*/
|
||||
public boolean performJavaCompilations(Sjavac sjavac,
|
||||
public boolean performJavaCompilations(CompilationService sjavac,
|
||||
Options args,
|
||||
Set<String> recentlyCompiled,
|
||||
boolean[] rcValue) {
|
||||
@ -790,7 +790,7 @@ public class JavacState {
|
||||
* For all packages, find all sources belonging to the package, group the sources
|
||||
* based on their transformers and apply the transformers on each source code group.
|
||||
*/
|
||||
private boolean perform(Sjavac sjavac,
|
||||
private boolean perform(CompilationService sjavac,
|
||||
File outputDir,
|
||||
Map<String,Transformer> suffixRules) {
|
||||
boolean rc = true;
|
||||
|
||||
@ -30,9 +30,9 @@ import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.comp.CompilationService;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
* The transform interface is used to transform content inside a package, from one form to another.
|
||||
@ -83,7 +83,7 @@ public interface Transformer {
|
||||
* If num_cores is set to a non-zero value. The transform should attempt to use no more than these
|
||||
* number of threads for heavy work.
|
||||
*/
|
||||
boolean transform(Sjavac sjavac,
|
||||
boolean transform(CompilationService sjavac,
|
||||
Map<String,Set<URI>> pkgSrcs,
|
||||
Set<URI> visibleSources,
|
||||
Map<URI,Set<String>> visibleClasses,
|
||||
|
||||
@ -25,29 +25,13 @@
|
||||
|
||||
package com.sun.tools.sjavac.client;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.JavacState;
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.Module;
|
||||
import com.sun.tools.sjavac.ProblemException;
|
||||
import com.sun.tools.sjavac.Source;
|
||||
import com.sun.tools.sjavac.Transformer;
|
||||
import com.sun.tools.sjavac.Util;
|
||||
import com.sun.tools.sjavac.comp.PooledSjavac;
|
||||
import com.sun.tools.sjavac.comp.SjavacImpl;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.options.SourceLocation;
|
||||
import com.sun.tools.sjavac.server.CompilationResult;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
|
||||
/**
|
||||
@ -74,282 +58,34 @@ public class ClientMain {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Log.setLogLevel(options.getLogLevel());
|
||||
|
||||
if (!validateOptions(options))
|
||||
return -1;
|
||||
|
||||
if (!createIfMissing(options.getDestDir()))
|
||||
return -1;
|
||||
|
||||
if (!createIfMissing(options.getStateDir()))
|
||||
return -1;
|
||||
|
||||
Path gensrc = options.getGenSrcDir();
|
||||
if (gensrc != null && !createIfMissing(gensrc))
|
||||
return -1;
|
||||
|
||||
Path hdrdir = options.getHeaderDir();
|
||||
if (hdrdir != null && !createIfMissing(hdrdir))
|
||||
return -1;
|
||||
|
||||
Log.debug("==========================================================");
|
||||
Log.debug("Launching sjavac client with the following parameters:");
|
||||
Log.debug(" " + options.getStateArgsString());
|
||||
Log.debug("==========================================================");
|
||||
|
||||
// Load the prev build state database.
|
||||
JavacState javac_state = JavacState.load(options, out, err);
|
||||
|
||||
// Setup the suffix rules from the command line.
|
||||
Map<String, Transformer> suffixRules = new HashMap<>();
|
||||
|
||||
// Handling of .java-compilation
|
||||
suffixRules.putAll(javac_state.getJavaSuffixRule());
|
||||
|
||||
// Handling of -copy and -tr
|
||||
suffixRules.putAll(options.getTranslationRules());
|
||||
|
||||
// All found modules are put here.
|
||||
Map<String,Module> modules = new HashMap<>();
|
||||
// We start out in the legacy empty no-name module.
|
||||
// As soon as we stumble on a module-info.java file we change to that module.
|
||||
Module current_module = new Module("", "");
|
||||
modules.put("", current_module);
|
||||
|
||||
// Find all sources, use the suffix rules to know which files are sources.
|
||||
Map<String,Source> sources = new HashMap<>();
|
||||
|
||||
// Find the files, this will automatically populate the found modules
|
||||
// with found packages where the sources are found!
|
||||
findSourceFiles(options.getSources(),
|
||||
suffixRules.keySet(),
|
||||
sources,
|
||||
modules,
|
||||
current_module,
|
||||
options.isDefaultPackagePermitted(),
|
||||
false);
|
||||
|
||||
if (sources.isEmpty()) {
|
||||
Log.error("Found nothing to compile!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Create a map of all source files that are available for linking. Both -src and
|
||||
// -sourcepath point to such files. It is possible to specify multiple
|
||||
// -sourcepath options to enable different filtering rules. If the
|
||||
// filters are the same for multiple sourcepaths, they may be concatenated
|
||||
// using :(;). Before sending the list of sourcepaths to javac, they are
|
||||
// all concatenated. The list created here is used by the SmartFileWrapper to
|
||||
// make sure only the correct sources are actually available.
|
||||
// We might find more modules here as well.
|
||||
Map<String,Source> sources_to_link_to = new HashMap<>();
|
||||
|
||||
List<SourceLocation> sourceResolutionLocations = new ArrayList<>();
|
||||
sourceResolutionLocations.addAll(options.getSources());
|
||||
sourceResolutionLocations.addAll(options.getSourceSearchPaths());
|
||||
findSourceFiles(sourceResolutionLocations,
|
||||
Collections.singleton(".java"),
|
||||
sources_to_link_to,
|
||||
modules,
|
||||
current_module,
|
||||
options.isDefaultPackagePermitted(),
|
||||
true);
|
||||
|
||||
// Find all class files allowable for linking.
|
||||
// And pickup knowledge of all modules found here.
|
||||
// This cannot currently filter classes inside jar files.
|
||||
// Map<String,Source> classes_to_link_to = new HashMap<String,Source>();
|
||||
// findFiles(args, "-classpath", Util.set(".class"), classes_to_link_to, modules, current_module, true);
|
||||
|
||||
// Find all module sources allowable for linking.
|
||||
// Map<String,Source> modules_to_link_to = new HashMap<String,Source>();
|
||||
// findFiles(args, "-modulepath", Util.set(".class"), modules_to_link_to, modules, current_module, true);
|
||||
|
||||
// Add the set of sources to the build database.
|
||||
javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
|
||||
javac_state.now().checkInternalState("checking sources", false, sources);
|
||||
javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
|
||||
javac_state.setVisibleSources(sources_to_link_to);
|
||||
|
||||
int round = 0;
|
||||
printRound(round);
|
||||
|
||||
// If there is any change in the source files, taint packages
|
||||
// and mark the database in need of saving.
|
||||
javac_state.checkSourceStatus(false);
|
||||
|
||||
// Find all existing artifacts. Their timestamp will match the last modified timestamps stored
|
||||
// in javac_state, simply because loading of the JavacState will clean out all artifacts
|
||||
// that do not match the javac_state database.
|
||||
javac_state.findAllArtifacts();
|
||||
|
||||
// Remove unidentified artifacts from the bin, gensrc and header dirs.
|
||||
// (Unless we allow them to be there.)
|
||||
// I.e. artifacts that are not known according to the build database (javac_state).
|
||||
// For examples, files that have been manually copied into these dirs.
|
||||
// Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
|
||||
// in javac_state) have already been removed when the javac_state was loaded.
|
||||
if (!options.areUnidentifiedArtifactsPermitted()) {
|
||||
javac_state.removeUnidentifiedArtifacts();
|
||||
}
|
||||
// Go through all sources and taint all packages that miss artifacts.
|
||||
javac_state.taintPackagesThatMissArtifacts();
|
||||
|
||||
// Check recorded classpath public apis. Taint packages that depend on
|
||||
// classpath classes whose public apis have changed.
|
||||
javac_state.taintPackagesDependingOnChangedClasspathPackages();
|
||||
|
||||
// Now clean out all known artifacts belonging to tainted packages.
|
||||
javac_state.deleteClassArtifactsInTaintedPackages();
|
||||
// Copy files, for example property files, images files, xml files etc etc.
|
||||
javac_state.performCopying(Util.pathToFile(options.getDestDir()), suffixRules);
|
||||
// Translate files, for example compile properties or compile idls.
|
||||
javac_state.performTranslation(Util.pathToFile(gensrc), suffixRules);
|
||||
// Add any potentially generated java sources to the tobe compiled list.
|
||||
// (Generated sources must always have a package.)
|
||||
Map<String,Source> generated_sources = new HashMap<>();
|
||||
|
||||
try {
|
||||
|
||||
Source.scanRoot(Util.pathToFile(options.getGenSrcDir()), Util.set(".java"), null, null, null, null,
|
||||
generated_sources, modules, current_module, false, true, false);
|
||||
javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
|
||||
// Recheck the the source files and their timestamps again.
|
||||
javac_state.checkSourceStatus(true);
|
||||
|
||||
// Now do a safety check that the list of source files is identical
|
||||
// to the list Make believes we are compiling. If we do not get this
|
||||
// right, then incremental builds will fail with subtility.
|
||||
// If any difference is detected, then we will fail hard here.
|
||||
// This is an important safety net.
|
||||
javac_state.compareWithMakefileList(Util.pathToFile(options.getSourceReferenceList()));
|
||||
|
||||
// Do the compilations, repeatedly until no tainted packages exist.
|
||||
boolean again;
|
||||
// Collect the name of all compiled packages.
|
||||
Set<String> recently_compiled = new HashSet<>();
|
||||
boolean[] rc = new boolean[1];
|
||||
boolean background = Util.extractBooleanOption("background", options.getServerConf(), true);
|
||||
Sjavac sjavac;
|
||||
// Create an sjavac implementation to be used for compilation
|
||||
if (background) {
|
||||
// Prepare sjavac object
|
||||
boolean background = Util.extractBooleanOption("background", options.getServerConf(), true);
|
||||
Sjavac sjavac;
|
||||
// Create an sjavac implementation to be used for compilation
|
||||
if (background) {
|
||||
try {
|
||||
sjavac = new SjavacClient(options);
|
||||
} else {
|
||||
int poolsize = Util.extractIntOption("poolsize", options.getServerConf());
|
||||
if (poolsize <= 0)
|
||||
poolsize = Runtime.getRuntime().availableProcessors();
|
||||
sjavac = new PooledSjavac(new SjavacImpl(), poolsize);
|
||||
} catch (PortFileInaccessibleException e) {
|
||||
Log.error("Port file inaccessible.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
do {
|
||||
if (round > 0)
|
||||
printRound(round);
|
||||
// Clean out artifacts in tainted packages.
|
||||
javac_state.deleteClassArtifactsInTaintedPackages();
|
||||
again = javac_state.performJavaCompilations(sjavac, options, recently_compiled, rc);
|
||||
if (!rc[0]) {
|
||||
Log.debug("Compilation failed.");
|
||||
break;
|
||||
}
|
||||
if (!again) {
|
||||
Log.debug("Nothing left to do.");
|
||||
}
|
||||
round++;
|
||||
} while (again);
|
||||
Log.debug("No need to do another round.");
|
||||
|
||||
// Only update the state if the compile went well.
|
||||
if (rc[0]) {
|
||||
javac_state.save();
|
||||
// Reflatten only the artifacts.
|
||||
javac_state.now().flattenArtifacts(modules);
|
||||
// Remove artifacts that were generated during the last compile, but not this one.
|
||||
javac_state.removeSuperfluousArtifacts(recently_compiled);
|
||||
}
|
||||
if (!background)
|
||||
sjavac.shutdown();
|
||||
|
||||
return rc[0] ? 0 : -1;
|
||||
} catch (ProblemException e) {
|
||||
Log.error(e.getMessage());
|
||||
return -1;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace(err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean validateOptions(Options options) {
|
||||
|
||||
String err = null;
|
||||
|
||||
if (options.getDestDir() == null) {
|
||||
err = "Please specify output directory.";
|
||||
} else if (options.isJavaFilesAmongJavacArgs()) {
|
||||
err = "Sjavac does not handle explicit compilation of single .java files.";
|
||||
} else if (options.getServerConf() == null) {
|
||||
err = "No server configuration provided.";
|
||||
} else if (!options.getImplicitPolicy().equals("none")) {
|
||||
err = "The only allowed setting for sjavac is -implicit:none";
|
||||
} else if (options.getSources().isEmpty()) {
|
||||
err = "You have to specify -src.";
|
||||
} else if (options.getTranslationRules().size() > 1
|
||||
&& options.getGenSrcDir() == null) {
|
||||
err = "You have translators but no gensrc dir (-s) specified!";
|
||||
} else {
|
||||
sjavac = new SjavacImpl();
|
||||
}
|
||||
|
||||
if (err != null)
|
||||
Log.error(err);
|
||||
CompilationResult cr = sjavac.compile(args);
|
||||
|
||||
return err == null;
|
||||
out.print(cr.stdout);
|
||||
err.print(cr.stderr);
|
||||
|
||||
if (!background)
|
||||
sjavac.shutdown();
|
||||
|
||||
return cr.returnCode;
|
||||
}
|
||||
|
||||
private static boolean createIfMissing(Path dir) {
|
||||
|
||||
if (Files.isDirectory(dir))
|
||||
return true;
|
||||
|
||||
if (Files.exists(dir)) {
|
||||
Log.error(dir + " is not a directory.");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
Files.createDirectories(dir);
|
||||
} catch (IOException e) {
|
||||
Log.error("Could not create directory: " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Find source files in the given source locations. */
|
||||
public static void findSourceFiles(List<SourceLocation> sourceLocations,
|
||||
Set<String> sourceTypes,
|
||||
Map<String,Source> foundFiles,
|
||||
Map<String, Module> foundModules,
|
||||
Module currentModule,
|
||||
boolean permitSourcesInDefaultPackage,
|
||||
boolean inLinksrc) {
|
||||
|
||||
for (SourceLocation source : sourceLocations) {
|
||||
source.findSourceFiles(sourceTypes,
|
||||
foundFiles,
|
||||
foundModules,
|
||||
currentModule,
|
||||
permitSourcesInDefaultPackage,
|
||||
inLinksrc);
|
||||
}
|
||||
}
|
||||
|
||||
private static void printRound(int round) {
|
||||
Log.debug("****************************************");
|
||||
Log.debug("* Round " + round + " *");
|
||||
Log.debug("****************************************");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.tools.sjavac.client;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class PortFileInaccessibleException extends IOException {
|
||||
|
||||
private static final long serialVersionUID = -4755261881545398973L;
|
||||
|
||||
public PortFileInaccessibleException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -26,32 +26,27 @@
|
||||
package com.sun.tools.sjavac.client;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.Util;
|
||||
import com.sun.tools.sjavac.options.OptionHelper;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.server.CompilationSubResult;
|
||||
import com.sun.tools.sjavac.server.CompilationResult;
|
||||
import com.sun.tools.sjavac.server.PortFile;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
import com.sun.tools.sjavac.server.SjavacServer;
|
||||
import com.sun.tools.sjavac.server.SysInfo;
|
||||
|
||||
/**
|
||||
* Sjavac implementation that delegates requests to a SjavacServer.
|
||||
@ -89,9 +84,7 @@ public class SjavacClient implements Sjavac {
|
||||
// Store the server conf settings here.
|
||||
private final String settings;
|
||||
|
||||
// This constructor should not throw FileNotFoundException (to be resolved
|
||||
// in JDK-8060030)
|
||||
public SjavacClient(Options options) throws FileNotFoundException {
|
||||
public SjavacClient(Options options) throws PortFileInaccessibleException {
|
||||
String tmpServerConf = options.getServerConf();
|
||||
String serverConf = (tmpServerConf!=null)? tmpServerConf : "";
|
||||
String tmpId = Util.extractStringOption("id", serverConf);
|
||||
@ -103,8 +96,7 @@ public class SjavacClient implements Sjavac {
|
||||
String portfileName = Util.extractStringOption("portfile", serverConf, defaultPortfile);
|
||||
try {
|
||||
portFile = SjavacServer.getPortFile(portfileName);
|
||||
} catch (FileNotFoundException e) {
|
||||
// Reached for instance if directory of port file does not exist
|
||||
} catch (PortFileInaccessibleException e) {
|
||||
Log.error("Port file inaccessable: " + e);
|
||||
throw e;
|
||||
}
|
||||
@ -126,40 +118,8 @@ public class SjavacClient implements Sjavac {
|
||||
return settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a request to the server only to get the maximum possible heap size to use for compilations.
|
||||
*/
|
||||
@Override
|
||||
public SysInfo getSysInfo() {
|
||||
try (Socket socket = tryConnect()) {
|
||||
// The ObjectInputStream constructor will block until the
|
||||
// corresponding ObjectOutputStream has written and flushed the
|
||||
// header, so it is important that the ObjectOutputStreams on server
|
||||
// and client are opened before the ObjectInputStreams.
|
||||
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
|
||||
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
|
||||
oos.writeObject(id);
|
||||
oos.writeObject(SjavacServer.CMD_SYS_INFO);
|
||||
oos.flush();
|
||||
return (SysInfo) ois.readObject();
|
||||
} catch (IOException | ClassNotFoundException ex) {
|
||||
Log.error("[CLIENT] Exception caught: " + ex);
|
||||
Log.debug(Util.getStackTrace(ex));
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt(); // Restore interrupt
|
||||
Log.error("[CLIENT] getSysInfo interrupted.");
|
||||
Log.debug(Util.getStackTrace(ie));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompilationResult compile(String protocolId,
|
||||
String invocationId,
|
||||
String[] args,
|
||||
List<File> explicitSources,
|
||||
Set<URI> sourcesToCompile,
|
||||
Set<URI> visibleSources) {
|
||||
public CompilationResult compile(String[] args) {
|
||||
CompilationResult result;
|
||||
try (Socket socket = tryConnect()) {
|
||||
// The ObjectInputStream constructor will block until the
|
||||
@ -170,22 +130,17 @@ public class SjavacClient implements Sjavac {
|
||||
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
|
||||
oos.writeObject(id);
|
||||
oos.writeObject(SjavacServer.CMD_COMPILE);
|
||||
oos.writeObject(protocolId);
|
||||
oos.writeObject(invocationId);
|
||||
oos.writeObject(args);
|
||||
oos.writeObject(explicitSources);
|
||||
oos.writeObject(sourcesToCompile);
|
||||
oos.writeObject(visibleSources);
|
||||
oos.flush();
|
||||
result = (CompilationResult) ois.readObject();
|
||||
} catch (IOException | ClassNotFoundException ex) {
|
||||
Log.error("[CLIENT] Exception caught: " + ex);
|
||||
result = new CompilationResult(CompilationResult.ERROR_FATAL);
|
||||
result = new CompilationResult(CompilationSubResult.ERROR_FATAL);
|
||||
result.stderr = Util.getStackTrace(ex);
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt(); // Restore interrupt
|
||||
Log.error("[CLIENT] compile interrupted.");
|
||||
result = new CompilationResult(CompilationResult.ERROR_FATAL);
|
||||
result = new CompilationResult(CompilationSubResult.ERROR_FATAL);
|
||||
result.stderr = Util.getStackTrace(ie);
|
||||
}
|
||||
return result;
|
||||
|
||||
@ -0,0 +1,171 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.sun.tools.sjavac.comp;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.net.URI;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.StandardLocation;
|
||||
import javax.tools.ToolProvider;
|
||||
|
||||
import com.sun.tools.javac.api.JavacTaskImpl;
|
||||
import com.sun.tools.javac.api.JavacTool;
|
||||
import com.sun.tools.javac.util.Context;
|
||||
import com.sun.tools.javac.util.Dependencies;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.Util;
|
||||
import com.sun.tools.sjavac.comp.dependencies.NewDependencyCollector;
|
||||
import com.sun.tools.sjavac.comp.dependencies.PublicApiCollector;
|
||||
import com.sun.tools.sjavac.server.CompilationSubResult;
|
||||
import com.sun.tools.sjavac.server.SysInfo;
|
||||
|
||||
/**
|
||||
* <p><b>This is NOT part of any supported API.
|
||||
* If you write code that depends on this, you do so at your own risk.
|
||||
* This code and its internal interfaces are subject to change or
|
||||
* deletion without notice.</b>
|
||||
*/
|
||||
public class CompilationService {
|
||||
|
||||
public SysInfo getSysInfo() {
|
||||
return new SysInfo(Runtime.getRuntime().availableProcessors(),
|
||||
Runtime.getRuntime().maxMemory());
|
||||
}
|
||||
|
||||
public CompilationSubResult compile(String protocolId,
|
||||
String invocationId,
|
||||
String[] args,
|
||||
List<File> explicitSources,
|
||||
Set<URI> sourcesToCompile,
|
||||
Set<URI> visibleSources) {
|
||||
|
||||
JavacTool compiler = (JavacTool) ToolProvider.getSystemJavaCompiler();
|
||||
try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
|
||||
SmartFileManager sfm = new SmartFileManager(fm);
|
||||
Context context = new Context();
|
||||
|
||||
Dependencies.GraphDependencies.preRegister(context);
|
||||
|
||||
// Now setup the actual compilation
|
||||
CompilationSubResult compilationResult = new CompilationSubResult(0);
|
||||
|
||||
// First deal with explicit source files on cmdline and in at file
|
||||
ListBuffer<JavaFileObject> explicitJFOs = new ListBuffer<>();
|
||||
for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(explicitSources)) {
|
||||
explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
|
||||
}
|
||||
// Now deal with sources supplied as source_to_compile
|
||||
ListBuffer<File> sourcesToCompileFiles = new ListBuffer<>();
|
||||
for (URI u : sourcesToCompile)
|
||||
sourcesToCompileFiles.append(new File(u));
|
||||
|
||||
for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(sourcesToCompileFiles))
|
||||
explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
|
||||
|
||||
// Create a new logger
|
||||
StringWriter stdoutLog = new StringWriter();
|
||||
StringWriter stderrLog = new StringWriter();
|
||||
PrintWriter stdout = new PrintWriter(stdoutLog);
|
||||
PrintWriter stderr = new PrintWriter(stderrLog);
|
||||
com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK;
|
||||
PublicApiCollector pubApiCollector = new PublicApiCollector(context, explicitJFOs);
|
||||
PathAndPackageVerifier papVerifier = new PathAndPackageVerifier();
|
||||
NewDependencyCollector depsCollector = new NewDependencyCollector(context, explicitJFOs);
|
||||
try {
|
||||
if (explicitJFOs.size() > 0) {
|
||||
sfm.setVisibleSources(visibleSources);
|
||||
sfm.cleanArtifacts();
|
||||
sfm.setLog(stdout);
|
||||
|
||||
// Do the compilation!
|
||||
JavacTaskImpl task =
|
||||
(JavacTaskImpl) compiler.getTask(stderr,
|
||||
sfm,
|
||||
null,
|
||||
Arrays.asList(args),
|
||||
null,
|
||||
explicitJFOs,
|
||||
context);
|
||||
sfm.setSymbolFileEnabled(!com.sun.tools.javac.util.Options.instance(context).isSet("ignore.symbol.file"));
|
||||
task.addTaskListener(depsCollector);
|
||||
task.addTaskListener(pubApiCollector);
|
||||
task.addTaskListener(papVerifier);
|
||||
logJavacInvocation(args);
|
||||
rc = task.doCall();
|
||||
Log.debug("javac returned with code " + rc);
|
||||
sfm.flush();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.error(Util.getStackTrace(e));
|
||||
stderrLog.append(Util.getStackTrace(e));
|
||||
rc = com.sun.tools.javac.main.Main.Result.ERROR;
|
||||
}
|
||||
|
||||
compilationResult.packageArtifacts = sfm.getPackageArtifacts();
|
||||
|
||||
if (papVerifier.errorsDiscovered())
|
||||
rc = com.sun.tools.javac.main.Main.Result.ERROR;
|
||||
|
||||
compilationResult.packageDependencies = depsCollector.getDependencies(false);
|
||||
compilationResult.packageCpDependencies = depsCollector.getDependencies(true);
|
||||
|
||||
compilationResult.packagePubapis = pubApiCollector.getPubApis(true);
|
||||
compilationResult.dependencyPubapis = pubApiCollector.getPubApis(false);
|
||||
compilationResult.stdout = stdoutLog.toString();
|
||||
compilationResult.stderr = stderrLog.toString();
|
||||
compilationResult.returnCode = rc.exitCode;
|
||||
|
||||
return compilationResult;
|
||||
} catch (IOException e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void logJavacInvocation(String[] args) {
|
||||
Log.debug("Invoking javac with args");
|
||||
Iterator<String> argIter = Arrays.asList(args).iterator();
|
||||
while (argIter.hasNext()) {
|
||||
String arg = argIter.next();
|
||||
String line = " " + arg;
|
||||
if (arg.matches("\\-(d|cp|classpath|sourcepath|source|target)")
|
||||
&& argIter.hasNext()) {
|
||||
line += " " + argIter.next();
|
||||
}
|
||||
Log.debug(line);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -24,11 +24,7 @@
|
||||
*/
|
||||
package com.sun.tools.sjavac.comp;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@ -36,7 +32,6 @@ import java.util.concurrent.TimeUnit;
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.server.CompilationResult;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
import com.sun.tools.sjavac.server.SysInfo;
|
||||
|
||||
/**
|
||||
* An sjavac implementation that limits the number of concurrent calls by
|
||||
@ -59,30 +54,10 @@ public class PooledSjavac implements Sjavac {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysInfo getSysInfo() {
|
||||
try {
|
||||
return pool.submit(() -> delegate.getSysInfo()).get();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Error during getSysInfo", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompilationResult compile(final String protocolId,
|
||||
final String invocationId,
|
||||
final String[] args,
|
||||
final List<File> explicitSources,
|
||||
final Set<URI> sourcesToCompile,
|
||||
final Set<URI> visibleSources) {
|
||||
public CompilationResult compile(String[] args) {
|
||||
try {
|
||||
return pool.submit(() -> {
|
||||
return delegate.compile(protocolId,
|
||||
invocationId,
|
||||
args,
|
||||
explicitSources,
|
||||
sourcesToCompile,
|
||||
visibleSources);
|
||||
return delegate.compile(args);
|
||||
}).get();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -112,8 +87,4 @@ public class PooledSjavac implements Sjavac {
|
||||
delegate.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String serverSettings() {
|
||||
return delegate.serverSettings();
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,34 +24,33 @@
|
||||
*/
|
||||
package com.sun.tools.sjavac.comp;
|
||||
|
||||
import java.io.File;
|
||||
import static com.sun.tools.sjavac.server.CompilationResult.ERROR_FATAL;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.net.URI;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.StandardLocation;
|
||||
import javax.tools.ToolProvider;
|
||||
|
||||
import com.sun.tools.javac.api.JavacTaskImpl;
|
||||
import com.sun.tools.javac.api.JavacTool;
|
||||
import com.sun.tools.javac.util.Context;
|
||||
import com.sun.tools.javac.util.Dependencies;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
import com.sun.tools.javac.util.Options;
|
||||
import com.sun.tools.sjavac.JavacState;
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.Module;
|
||||
import com.sun.tools.sjavac.ProblemException;
|
||||
import com.sun.tools.sjavac.Source;
|
||||
import com.sun.tools.sjavac.Transformer;
|
||||
import com.sun.tools.sjavac.Util;
|
||||
import com.sun.tools.sjavac.comp.dependencies.NewDependencyCollector;
|
||||
import com.sun.tools.sjavac.comp.dependencies.PublicApiCollector;
|
||||
import com.sun.tools.sjavac.options.Options;
|
||||
import com.sun.tools.sjavac.options.SourceLocation;
|
||||
import com.sun.tools.sjavac.server.CompilationResult;
|
||||
import com.sun.tools.sjavac.server.Sjavac;
|
||||
import com.sun.tools.sjavac.server.SysInfo;
|
||||
|
||||
/**
|
||||
* The sjavac implementation that interacts with javac and performs the actual
|
||||
@ -65,123 +64,282 @@ import com.sun.tools.sjavac.server.SysInfo;
|
||||
public class SjavacImpl implements Sjavac {
|
||||
|
||||
@Override
|
||||
public SysInfo getSysInfo() {
|
||||
return new SysInfo(Runtime.getRuntime().availableProcessors(),
|
||||
Runtime.getRuntime().maxMemory());
|
||||
}
|
||||
public CompilationResult compile(String[] args) {
|
||||
|
||||
@Override
|
||||
public CompilationResult compile(String protocolId,
|
||||
String invocationId,
|
||||
String[] args,
|
||||
List<File> explicitSources,
|
||||
Set<URI> sourcesToCompile,
|
||||
Set<URI> visibleSources) {
|
||||
ByteArrayOutputStream outBaos = new ByteArrayOutputStream();
|
||||
ByteArrayOutputStream errBaos = new ByteArrayOutputStream();
|
||||
PrintStream out = new PrintStream(outBaos);
|
||||
PrintStream err = new PrintStream(errBaos);
|
||||
|
||||
JavacTool compiler = (JavacTool) ToolProvider.getSystemJavaCompiler();
|
||||
try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
|
||||
SmartFileManager sfm = new SmartFileManager(fm);
|
||||
Context context = new Context();
|
||||
Options options;
|
||||
try {
|
||||
options = Options.parseArgs(args);
|
||||
} catch (IllegalArgumentException e) {
|
||||
Log.error(e.getMessage());
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
}
|
||||
|
||||
Dependencies.GraphDependencies.preRegister(context);
|
||||
Log.setLogLevel(options.getLogLevel());
|
||||
|
||||
// Now setup the actual compilation
|
||||
CompilationResult compilationResult = new CompilationResult(0);
|
||||
if (!validateOptions(options))
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
|
||||
// First deal with explicit source files on cmdline and in at file
|
||||
ListBuffer<JavaFileObject> explicitJFOs = new ListBuffer<>();
|
||||
for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(explicitSources)) {
|
||||
explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
|
||||
}
|
||||
// Now deal with sources supplied as source_to_compile
|
||||
ListBuffer<File> sourcesToCompileFiles = new ListBuffer<>();
|
||||
for (URI u : sourcesToCompile)
|
||||
sourcesToCompileFiles.append(new File(u));
|
||||
if (!createIfMissing(options.getDestDir()))
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
|
||||
for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(sourcesToCompileFiles))
|
||||
explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
|
||||
if (!createIfMissing(options.getStateDir()))
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
|
||||
// Create a new logger
|
||||
StringWriter stdoutLog = new StringWriter();
|
||||
StringWriter stderrLog = new StringWriter();
|
||||
PrintWriter stdout = new PrintWriter(stdoutLog);
|
||||
PrintWriter stderr = new PrintWriter(stderrLog);
|
||||
com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK;
|
||||
PublicApiCollector pubApiCollector = new PublicApiCollector(context, explicitJFOs);
|
||||
PathAndPackageVerifier papVerifier = new PathAndPackageVerifier();
|
||||
NewDependencyCollector depsCollector = new NewDependencyCollector(context, explicitJFOs);
|
||||
try {
|
||||
if (explicitJFOs.size() > 0) {
|
||||
sfm.setVisibleSources(visibleSources);
|
||||
sfm.cleanArtifacts();
|
||||
sfm.setLog(stdout);
|
||||
Path gensrc = options.getGenSrcDir();
|
||||
if (gensrc != null && !createIfMissing(gensrc))
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
|
||||
// Do the compilation!
|
||||
JavacTaskImpl task =
|
||||
(JavacTaskImpl) compiler.getTask(stderr,
|
||||
sfm,
|
||||
null,
|
||||
Arrays.asList(args),
|
||||
null,
|
||||
explicitJFOs,
|
||||
context);
|
||||
sfm.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
|
||||
task.addTaskListener(depsCollector);
|
||||
task.addTaskListener(pubApiCollector);
|
||||
task.addTaskListener(papVerifier);
|
||||
logJavacInvocation(args);
|
||||
rc = task.doCall();
|
||||
Log.debug("javac returned with code " + rc);
|
||||
sfm.flush();
|
||||
Path hdrdir = options.getHeaderDir();
|
||||
if (hdrdir != null && !createIfMissing(hdrdir))
|
||||
return new CompilationResult(ERROR_FATAL);
|
||||
|
||||
// Load the prev build state database.
|
||||
JavacState javac_state = JavacState.load(options, out, err);
|
||||
|
||||
// Setup the suffix rules from the command line.
|
||||
Map<String, Transformer> suffixRules = new HashMap<>();
|
||||
|
||||
// Handling of .java-compilation
|
||||
suffixRules.putAll(javac_state.getJavaSuffixRule());
|
||||
|
||||
// Handling of -copy and -tr
|
||||
suffixRules.putAll(options.getTranslationRules());
|
||||
|
||||
// All found modules are put here.
|
||||
Map<String,Module> modules = new HashMap<>();
|
||||
// We start out in the legacy empty no-name module.
|
||||
// As soon as we stumble on a module-info.java file we change to that module.
|
||||
Module current_module = new Module("", "");
|
||||
modules.put("", current_module);
|
||||
|
||||
// Find all sources, use the suffix rules to know which files are sources.
|
||||
Map<String,Source> sources = new HashMap<>();
|
||||
|
||||
// Find the files, this will automatically populate the found modules
|
||||
// with found packages where the sources are found!
|
||||
findSourceFiles(options.getSources(),
|
||||
suffixRules.keySet(),
|
||||
sources,
|
||||
modules,
|
||||
current_module,
|
||||
options.isDefaultPackagePermitted(),
|
||||
false);
|
||||
|
||||
if (sources.isEmpty()) {
|
||||
Log.error("Found nothing to compile!");
|
||||
return new CompilationResult(CompilationResult.ERROR_FATAL,
|
||||
new String(outBaos.toByteArray(), UTF_8),
|
||||
new String(errBaos.toByteArray(), UTF_8));
|
||||
}
|
||||
|
||||
|
||||
// Create a map of all source files that are available for linking. Both -src and
|
||||
// -sourcepath point to such files. It is possible to specify multiple
|
||||
// -sourcepath options to enable different filtering rules. If the
|
||||
// filters are the same for multiple sourcepaths, they may be concatenated
|
||||
// using :(;). Before sending the list of sourcepaths to javac, they are
|
||||
// all concatenated. The list created here is used by the SmartFileWrapper to
|
||||
// make sure only the correct sources are actually available.
|
||||
// We might find more modules here as well.
|
||||
Map<String,Source> sources_to_link_to = new HashMap<>();
|
||||
|
||||
List<SourceLocation> sourceResolutionLocations = new ArrayList<>();
|
||||
sourceResolutionLocations.addAll(options.getSources());
|
||||
sourceResolutionLocations.addAll(options.getSourceSearchPaths());
|
||||
findSourceFiles(sourceResolutionLocations,
|
||||
Collections.singleton(".java"),
|
||||
sources_to_link_to,
|
||||
modules,
|
||||
current_module,
|
||||
options.isDefaultPackagePermitted(),
|
||||
true);
|
||||
|
||||
// Add the set of sources to the build database.
|
||||
javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
|
||||
javac_state.now().checkInternalState("checking sources", false, sources);
|
||||
javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
|
||||
javac_state.setVisibleSources(sources_to_link_to);
|
||||
|
||||
int round = 0;
|
||||
printRound(round);
|
||||
|
||||
// If there is any change in the source files, taint packages
|
||||
// and mark the database in need of saving.
|
||||
javac_state.checkSourceStatus(false);
|
||||
|
||||
// Find all existing artifacts. Their timestamp will match the last modified timestamps stored
|
||||
// in javac_state, simply because loading of the JavacState will clean out all artifacts
|
||||
// that do not match the javac_state database.
|
||||
javac_state.findAllArtifacts();
|
||||
|
||||
// Remove unidentified artifacts from the bin, gensrc and header dirs.
|
||||
// (Unless we allow them to be there.)
|
||||
// I.e. artifacts that are not known according to the build database (javac_state).
|
||||
// For examples, files that have been manually copied into these dirs.
|
||||
// Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
|
||||
// in javac_state) have already been removed when the javac_state was loaded.
|
||||
if (!options.areUnidentifiedArtifactsPermitted()) {
|
||||
javac_state.removeUnidentifiedArtifacts();
|
||||
}
|
||||
// Go through all sources and taint all packages that miss artifacts.
|
||||
javac_state.taintPackagesThatMissArtifacts();
|
||||
|
||||
// Check recorded classpath public apis. Taint packages that depend on
|
||||
// classpath classes whose public apis have changed.
|
||||
javac_state.taintPackagesDependingOnChangedClasspathPackages();
|
||||
|
||||
// Now clean out all known artifacts belonging to tainted packages.
|
||||
javac_state.deleteClassArtifactsInTaintedPackages();
|
||||
// Copy files, for example property files, images files, xml files etc etc.
|
||||
javac_state.performCopying(Util.pathToFile(options.getDestDir()), suffixRules);
|
||||
// Translate files, for example compile properties or compile idls.
|
||||
javac_state.performTranslation(Util.pathToFile(gensrc), suffixRules);
|
||||
// Add any potentially generated java sources to the tobe compiled list.
|
||||
// (Generated sources must always have a package.)
|
||||
Map<String,Source> generated_sources = new HashMap<>();
|
||||
|
||||
try {
|
||||
|
||||
Source.scanRoot(Util.pathToFile(options.getGenSrcDir()), Util.set(".java"), null, null, null, null,
|
||||
generated_sources, modules, current_module, false, true, false);
|
||||
javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
|
||||
// Recheck the the source files and their timestamps again.
|
||||
javac_state.checkSourceStatus(true);
|
||||
|
||||
// Now do a safety check that the list of source files is identical
|
||||
// to the list Make believes we are compiling. If we do not get this
|
||||
// right, then incremental builds will fail with subtility.
|
||||
// If any difference is detected, then we will fail hard here.
|
||||
// This is an important safety net.
|
||||
javac_state.compareWithMakefileList(Util.pathToFile(options.getSourceReferenceList()));
|
||||
|
||||
// Do the compilations, repeatedly until no tainted packages exist.
|
||||
boolean again;
|
||||
// Collect the name of all compiled packages.
|
||||
Set<String> recently_compiled = new HashSet<>();
|
||||
boolean[] rc = new boolean[1];
|
||||
|
||||
CompilationService compilationService = new CompilationService();
|
||||
do {
|
||||
if (round > 0)
|
||||
printRound(round);
|
||||
// Clean out artifacts in tainted packages.
|
||||
javac_state.deleteClassArtifactsInTaintedPackages();
|
||||
again = javac_state.performJavaCompilations(compilationService, options, recently_compiled, rc);
|
||||
if (!rc[0]) {
|
||||
Log.debug("Compilation failed.");
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.error(Util.getStackTrace(e));
|
||||
stderrLog.append(Util.getStackTrace(e));
|
||||
rc = com.sun.tools.javac.main.Main.Result.ERROR;
|
||||
if (!again) {
|
||||
Log.debug("Nothing left to do.");
|
||||
}
|
||||
round++;
|
||||
} while (again);
|
||||
Log.debug("No need to do another round.");
|
||||
|
||||
// Only update the state if the compile went well.
|
||||
if (rc[0]) {
|
||||
javac_state.save();
|
||||
// Reflatten only the artifacts.
|
||||
javac_state.now().flattenArtifacts(modules);
|
||||
// Remove artifacts that were generated during the last compile, but not this one.
|
||||
javac_state.removeSuperfluousArtifacts(recently_compiled);
|
||||
}
|
||||
|
||||
compilationResult.packageArtifacts = sfm.getPackageArtifacts();
|
||||
|
||||
if (papVerifier.errorsDiscovered())
|
||||
rc = com.sun.tools.javac.main.Main.Result.ERROR;
|
||||
|
||||
compilationResult.packageDependencies = depsCollector.getDependencies(false);
|
||||
compilationResult.packageCpDependencies = depsCollector.getDependencies(true);
|
||||
|
||||
compilationResult.packagePubapis = pubApiCollector.getPubApis(true); // pubApis.getPubapis(explicitJFOs, true);
|
||||
compilationResult.dependencyPubapis = pubApiCollector.getPubApis(false); // pubApis.getPubapis(explicitJFOs, false);
|
||||
compilationResult.stdout = stdoutLog.toString();
|
||||
compilationResult.stderr = stderrLog.toString();
|
||||
compilationResult.returnCode = rc.exitCode;
|
||||
|
||||
return compilationResult;
|
||||
} catch (IOException e) {
|
||||
throw new Error(e);
|
||||
return new CompilationResult(rc[0] ? 0 : ERROR_FATAL,
|
||||
new String(outBaos.toByteArray(), UTF_8),
|
||||
new String(errBaos.toByteArray(), UTF_8));
|
||||
} catch (ProblemException e) {
|
||||
Log.error(e.getMessage());
|
||||
return new CompilationResult(ERROR_FATAL,
|
||||
new String(outBaos.toByteArray(), UTF_8),
|
||||
new String(errBaos.toByteArray(), UTF_8));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace(err);
|
||||
return new CompilationResult(ERROR_FATAL,
|
||||
new String(outBaos.toByteArray(), UTF_8),
|
||||
new String(errBaos.toByteArray(), UTF_8));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
// Nothing to clean up
|
||||
// ... maybe we should wait for any current request to finish?
|
||||
}
|
||||
|
||||
@Override
|
||||
public String serverSettings() {
|
||||
return "";
|
||||
private static boolean validateOptions(Options options) {
|
||||
|
||||
String err = null;
|
||||
|
||||
if (options.getDestDir() == null) {
|
||||
err = "Please specify output directory.";
|
||||
} else if (options.isJavaFilesAmongJavacArgs()) {
|
||||
err = "Sjavac does not handle explicit compilation of single .java files.";
|
||||
} else if (options.getServerConf() == null) {
|
||||
err = "No server configuration provided.";
|
||||
} else if (!options.getImplicitPolicy().equals("none")) {
|
||||
err = "The only allowed setting for sjavac is -implicit:none";
|
||||
} else if (options.getSources().isEmpty()) {
|
||||
err = "You have to specify -src.";
|
||||
} else if (options.getTranslationRules().size() > 1
|
||||
&& options.getGenSrcDir() == null) {
|
||||
err = "You have translators but no gensrc dir (-s) specified!";
|
||||
}
|
||||
|
||||
if (err != null)
|
||||
Log.error(err);
|
||||
|
||||
return err == null;
|
||||
|
||||
}
|
||||
|
||||
private void logJavacInvocation(String[] args) {
|
||||
Log.debug("Invoking javac with args");
|
||||
Iterator<String> argIter = Arrays.asList(args).iterator();
|
||||
while (argIter.hasNext()) {
|
||||
String arg = argIter.next();
|
||||
String line = " " + arg;
|
||||
if (arg.matches("\\-(d|cp|classpath|sourcepath|source|target)")
|
||||
&& argIter.hasNext()) {
|
||||
line += " " + argIter.next();
|
||||
}
|
||||
Log.debug(line);
|
||||
private static boolean createIfMissing(Path dir) {
|
||||
|
||||
if (Files.isDirectory(dir))
|
||||
return true;
|
||||
|
||||
if (Files.exists(dir)) {
|
||||
Log.error(dir + " is not a directory.");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
Files.createDirectories(dir);
|
||||
} catch (IOException e) {
|
||||
Log.error("Could not create directory: " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Find source files in the given source locations. */
|
||||
public static void findSourceFiles(List<SourceLocation> sourceLocations,
|
||||
Set<String> sourceTypes,
|
||||
Map<String,Source> foundFiles,
|
||||
Map<String, Module> foundModules,
|
||||
Module currentModule,
|
||||
boolean permitSourcesInDefaultPackage,
|
||||
boolean inLinksrc) {
|
||||
|
||||
for (SourceLocation source : sourceLocations) {
|
||||
source.findSourceFiles(sourceTypes,
|
||||
foundFiles,
|
||||
foundModules,
|
||||
currentModule,
|
||||
permitSourcesInDefaultPackage,
|
||||
inLinksrc);
|
||||
}
|
||||
}
|
||||
|
||||
private static void printRound(int round) {
|
||||
Log.debug("****************************************");
|
||||
Log.debug("* Round " + round + " *");
|
||||
Log.debug("****************************************");
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,15 +26,8 @@
|
||||
package com.sun.tools.sjavac.server;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
|
||||
/**
|
||||
*
|
||||
* <p><b>This is NOT part of any supported API.
|
||||
* If you write code that depends on this, you do so at your own risk.
|
||||
* This code and its internal interfaces are subject to change or
|
||||
@ -47,17 +40,18 @@ public class CompilationResult implements Serializable {
|
||||
// Return code constants
|
||||
public final static int ERROR_FATAL = -1;
|
||||
|
||||
public String stdout;
|
||||
public String stderr;
|
||||
public int returnCode;
|
||||
public Map<String, Set<URI>> packageArtifacts = new HashMap<>();
|
||||
public Map<String, Map<String, Set<String>>> packageDependencies = new HashMap<>();
|
||||
public Map<String, Map<String, Set<String>>> packageCpDependencies = new HashMap<>();
|
||||
public Map<String, PubApi> packagePubapis = new HashMap<>();
|
||||
public Map<String, PubApi> dependencyPubapis = new HashMap<>();
|
||||
public String stdout = "";
|
||||
public String stderr = "";
|
||||
|
||||
public CompilationResult(int returnCode) {
|
||||
this(returnCode, "", "");
|
||||
}
|
||||
|
||||
public CompilationResult(int returnCode, String stdout, String stderr) {
|
||||
this.returnCode = returnCode;
|
||||
this.stdout = stdout;
|
||||
this.stderr = stderr;
|
||||
}
|
||||
|
||||
public void setReturnCode(int returnCode) {
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2015, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.sun.tools.sjavac.server;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.pubapi.PubApi;
|
||||
|
||||
/**
|
||||
*
|
||||
* <p><b>This is NOT part of any supported API.
|
||||
* If you write code that depends on this, you do so at your own risk.
|
||||
* This code and its internal interfaces are subject to change or
|
||||
* deletion without notice.</b>
|
||||
*/
|
||||
public class CompilationSubResult implements Serializable {
|
||||
|
||||
static final long serialVersionUID = 46739181113L;
|
||||
|
||||
// Return code constants
|
||||
public final static int ERROR_FATAL = -1;
|
||||
|
||||
public int returnCode;
|
||||
public Map<String, Set<URI>> packageArtifacts = new HashMap<>();
|
||||
public Map<String, Map<String, Set<String>>> packageDependencies = new HashMap<>();
|
||||
public Map<String, Map<String, Set<String>>> packageCpDependencies = new HashMap<>();
|
||||
public Map<String, PubApi> packagePubapis = new HashMap<>();
|
||||
public Map<String, PubApi> dependencyPubapis = new HashMap<>();
|
||||
public String stdout = "";
|
||||
public String stderr = "";
|
||||
|
||||
public CompilationSubResult(int returnCode) {
|
||||
this.returnCode = returnCode;
|
||||
}
|
||||
|
||||
public void setReturnCode(int returnCode) {
|
||||
this.returnCode = returnCode;
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -24,10 +24,6 @@
|
||||
*/
|
||||
package com.sun.tools.sjavac.server;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
@ -64,30 +60,10 @@ public class IdleResetSjavac implements Sjavac {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysInfo getSysInfo() {
|
||||
public CompilationResult compile(String[] args) {
|
||||
startCall();
|
||||
try {
|
||||
return delegate.getSysInfo();
|
||||
} finally {
|
||||
endCall();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompilationResult compile(String protocolId,
|
||||
String invocationId,
|
||||
String[] args,
|
||||
List<File> explicitSources,
|
||||
Set<URI> sourcesToCompile,
|
||||
Set<URI> visibleSources) {
|
||||
startCall();
|
||||
try {
|
||||
return delegate.compile(protocolId,
|
||||
invocationId,
|
||||
args,
|
||||
explicitSources,
|
||||
sourcesToCompile,
|
||||
visibleSources);
|
||||
return delegate.compile(args);
|
||||
} finally {
|
||||
endCall();
|
||||
}
|
||||
@ -129,8 +105,4 @@ public class IdleResetSjavac implements Sjavac {
|
||||
delegate.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String serverSettings() {
|
||||
return delegate.serverSettings();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -37,6 +37,7 @@ import java.util.concurrent.Semaphore;
|
||||
|
||||
import com.sun.tools.javac.util.Assert;
|
||||
import com.sun.tools.sjavac.Log;
|
||||
import com.sun.tools.sjavac.client.PortFileInaccessibleException;
|
||||
|
||||
/**
|
||||
* The PortFile class mediates access to a short binary file containing the tcp/ip port (for the localhost)
|
||||
@ -80,11 +81,16 @@ public class PortFile {
|
||||
* Create a new portfile.
|
||||
* @param fn is the path to the file.
|
||||
*/
|
||||
public PortFile(String fn) throws FileNotFoundException {
|
||||
public PortFile(String fn) throws PortFileInaccessibleException {
|
||||
filename = fn;
|
||||
file = new File(filename);
|
||||
stopFile = new File(filename+".stop");
|
||||
rwfile = new RandomAccessFile(file, "rw");
|
||||
try {
|
||||
rwfile = new RandomAccessFile(file, "rw");
|
||||
} catch (FileNotFoundException e) {
|
||||
// Reached if file for instance already exists and is a directory
|
||||
throw new PortFileInaccessibleException(e);
|
||||
}
|
||||
// The rwfile should only be readable by the owner of the process
|
||||
// and no other! How do we do that on a RandomAccessFile?
|
||||
channel = rwfile.getChannel();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -24,16 +24,12 @@
|
||||
*/
|
||||
package com.sun.tools.sjavac.server;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.net.Socket;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.sjavac.Log;
|
||||
|
||||
@ -71,8 +67,7 @@ public class RequestHandler implements Runnable {
|
||||
String cmd = (String) oin.readObject();
|
||||
Log.info("Handling request, id: " + id + " cmd: " + cmd);
|
||||
switch (cmd) {
|
||||
case SjavacServer.CMD_SYS_INFO: handleSysInfoRequest(oin, oout); break;
|
||||
case SjavacServer.CMD_COMPILE: handleCompileRequest(oin, oout); break;
|
||||
case SjavacServer.CMD_COMPILE: handleCompileRequest(oin, oout); break;
|
||||
default: Log.error("Unknown command: " + cmd);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
@ -85,31 +80,15 @@ public class RequestHandler implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
private void handleSysInfoRequest(ObjectInputStream oin,
|
||||
ObjectOutputStream oout) throws IOException {
|
||||
oout.writeObject(sjavac.getSysInfo());
|
||||
oout.flush();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void handleCompileRequest(ObjectInputStream oin,
|
||||
ObjectOutputStream oout) throws IOException {
|
||||
try {
|
||||
// Read request arguments
|
||||
String protocolId = (String) oin.readObject();
|
||||
String invocationId = (String) oin.readObject();
|
||||
String[] args = (String[]) oin.readObject();
|
||||
List<File> explicitSources = (List<File>) oin.readObject();
|
||||
Set<URI> sourcesToCompile = (Set<URI>) oin.readObject();
|
||||
Set<URI> visibleSources = (Set<URI>) oin.readObject();
|
||||
|
||||
// Perform compilation
|
||||
CompilationResult cr = sjavac.compile(protocolId,
|
||||
invocationId,
|
||||
args,
|
||||
explicitSources,
|
||||
sourcesToCompile,
|
||||
visibleSources);
|
||||
CompilationResult cr = sjavac.compile(args);
|
||||
|
||||
// Write request response
|
||||
oout.writeObject(cr);
|
||||
oout.flush();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -24,10 +24,6 @@
|
||||
*/
|
||||
package com.sun.tools.sjavac.server;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Interface of the SjavacImpl, the sjavac client and all wrappers such as
|
||||
@ -39,16 +35,6 @@ import java.util.Set;
|
||||
* deletion without notice.</b>
|
||||
*/
|
||||
public interface Sjavac {
|
||||
|
||||
SysInfo getSysInfo();
|
||||
|
||||
CompilationResult compile(String protocolId,
|
||||
String invocationId,
|
||||
String[] args,
|
||||
List<File> explicitSources,
|
||||
Set<URI> sourcesToCompile,
|
||||
Set<URI> visibleSources);
|
||||
|
||||
CompilationResult compile(String[] args);
|
||||
void shutdown();
|
||||
String serverSettings();
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2015, 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
|
||||
@ -39,6 +39,7 @@ import java.util.Random;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.sun.tools.sjavac.Util;
|
||||
import com.sun.tools.sjavac.client.PortFileInaccessibleException;
|
||||
import com.sun.tools.sjavac.comp.PooledSjavac;
|
||||
import com.sun.tools.sjavac.comp.SjavacImpl;
|
||||
|
||||
@ -54,7 +55,6 @@ public class SjavacServer implements Terminable {
|
||||
|
||||
// Used in protocol to indicate which method to invoke
|
||||
public final static String CMD_COMPILE = "compile";
|
||||
public final static String CMD_SYS_INFO = "sys-info";
|
||||
|
||||
final private String portfilename;
|
||||
final private String logfile;
|
||||
@ -122,7 +122,7 @@ public class SjavacServer implements Terminable {
|
||||
/**
|
||||
* Acquire the port file. Synchronized since several threads inside an smart javac wrapper client acquires the same port file at the same time.
|
||||
*/
|
||||
public static synchronized PortFile getPortFile(String filename) throws FileNotFoundException {
|
||||
public static synchronized PortFile getPortFile(String filename) throws PortFileInaccessibleException {
|
||||
if (allPortFiles == null) {
|
||||
allPortFiles = new HashMap<>();
|
||||
}
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
* 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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user