You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vk...@apache.org on 2015/03/05 04:36:20 UTC
[9/9] incubator-ignite git commit: IGNITE-141 - Marshallers
refactoring
IGNITE-141 - Marshallers refactoring
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/2866f02f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/2866f02f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/2866f02f
Branch: refs/heads/ignite-141
Commit: 2866f02f2efbc9a67ec5471ec532ea6583fc0c76
Parents: d4d96c4
Author: Valentin Kulichenko <vk...@gridgain.com>
Authored: Wed Mar 4 19:36:51 2015 -0800
Committer: Valentin Kulichenko <vk...@gridgain.com>
Committed: Wed Mar 4 19:36:51 2015 -0800
----------------------------------------------------------------------
.../ignite/internal/ClassesGenerator.java | 177 +++
.../ignite/internal/classnames.properties | 1010 ------------------
.../optimized/OptimizedClassDescriptor.java | 12 +-
.../optimized/OptimizedMarshallerUtils.java | 7 +
.../optimized/OptimizedObjectInputStream.java | 14 +
.../optimized/OptimizedObjectOutputStream.java | 66 +-
.../org/apache/ignite/ClassesGenerator.java | 167 ---
.../OptimizedObjectStreamSelfTest.java | 15 +
8 files changed, 259 insertions(+), 1209 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2866f02f/modules/core/src/main/java/org/apache/ignite/internal/ClassesGenerator.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/ClassesGenerator.java b/modules/core/src/main/java/org/apache/ignite/internal/ClassesGenerator.java
new file mode 100644
index 0000000..eec4076
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/ClassesGenerator.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal;
+
+import org.apache.ignite.internal.util.typedef.internal.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.net.*;
+import java.util.*;
+import java.util.jar.*;
+
+/**
+ * Serialized classes generator.
+ */
+public class ClassesGenerator {
+ /** */
+ private static final String PATH = "modules/core/src/main/java/org/apache/ignite/internal/classnames.properties";
+
+ /** */
+ private static final String HEADER =
+ "#\n" +
+ "# Licensed to the Apache Software Foundation (ASF) under one or more\n" +
+ "# contributor license agreements. See the NOTICE file distributed with\n" +
+ "# this work for additional information regarding copyright ownership.\n" +
+ "# The ASF licenses this file to You under the Apache License, Version 2.0\n" +
+ "# (the \"License\"); you may not use this file except in compliance with\n" +
+ "# the License. You may obtain a copy of the License at\n" +
+ "#\n" +
+ "# http://www.apache.org/licenses/LICENSE-2.0\n" +
+ "#\n" +
+ "# Unless required by applicable law or agreed to in writing, software\n" +
+ "# distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
+ "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
+ "# See the License for the specific language governing permissions and\n" +
+ "# limitations under the License.\n" +
+ "#";
+
+ /** */
+ private static final String[] INCLUDED_PACKAGES = {
+ "org.apache.ignite",
+ "org.jdk8.backport",
+ "org.pcollections",
+ "com.romix.scala",
+ "java.lang",
+ "java.util",
+ "java.net"
+ };
+
+ /**
+ * @param args Arguments.
+ * @throws Exception In case of error.
+ */
+ public static void main(String[] args) throws Exception {
+ PrintStream out = new PrintStream(new File(U.getIgniteHome(), PATH));
+
+ out.println(HEADER);
+ out.println();
+
+ for (Class cls : classes())
+ out.println(cls.getName());
+ }
+
+ /**
+ * @return Classes.
+ * @throws Exception In case of error.
+ */
+ private static Collection<Class> classes() throws Exception {
+ Collection<Class> col = new TreeSet<>(new Comparator<Class>() {
+ @Override public int compare(Class c1, Class c2) {
+ return c1.getName().compareTo(c2.getName());
+ }
+ });
+
+ URLClassLoader ldr = (URLClassLoader)ClassesGenerator.class.getClassLoader();
+
+ for (URL url : ldr.getURLs()) {
+ File file = new File(url.toURI());
+
+ int prefixLen = file.getPath().length() + 1;
+
+ processFile(file, ldr, prefixLen, col);
+ }
+
+ col.add(byte[].class);
+ col.add(short[].class);
+ col.add(int[].class);
+ col.add(long[].class);
+ col.add(float[].class);
+ col.add(double[].class);
+ col.add(char[].class);
+ col.add(boolean[].class);
+ col.add(Object[].class);
+
+ return col;
+ }
+
+ /**
+ * @param file File.
+ * @param ldr Class loader.
+ * @param prefixLen Prefix length.
+ * @param col Classes.
+ * @throws Exception In case of error.
+ */
+ private static void processFile(File file, ClassLoader ldr, int prefixLen, Collection<Class> col) throws Exception {
+ if (!file.exists())
+ throw new FileNotFoundException("File doesn't exist: " + file);
+
+ if (file.isDirectory()) {
+ for (File f : file.listFiles())
+ processFile(f, ldr, prefixLen, col);
+ }
+ else {
+ assert file.isFile();
+
+ String path = file.getPath();
+
+ if (path.toLowerCase().endsWith(".jar")) {
+ try (JarInputStream jin = new JarInputStream(new BufferedInputStream(new FileInputStream(path)))) {
+ JarEntry entry;
+
+ while ((entry = jin.getNextJarEntry()) != null) {
+ if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".class"))
+ processClassFile(entry.getName(), ldr, 0, col);
+ }
+ }
+ }
+ else if (path.toLowerCase().endsWith(".class"))
+ processClassFile(path, ldr, prefixLen, col);
+ }
+ }
+
+ /**
+ * @param path File path.
+ * @param ldr Class loader.
+ * @param prefixLen Prefix length.
+ * @param col Classes.
+ * @throws Exception In case of error.
+ */
+ private static void processClassFile(String path, ClassLoader ldr, int prefixLen, Collection<Class> col)
+ throws Exception {
+ String clsName = path.substring(prefixLen, path.length() - 6).replace(File.separatorChar, '.');
+
+ boolean included = false;
+
+ for (String pkg : INCLUDED_PACKAGES) {
+ if (clsName.startsWith(pkg)) {
+ included = true;
+
+ break;
+ }
+ }
+
+ if (included) {
+ Class<?> cls = Class.forName(clsName, false, ldr);
+
+ if (!cls.isInterface() && !Modifier.isAbstract(cls.getModifiers()) &&
+ Serializable.class.isAssignableFrom(cls))
+ col.add((Class)cls);
+ }
+ }
+}