aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java')
-rw-r--r--third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java196
1 files changed, 196 insertions, 0 deletions
diff --git a/third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java b/third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java
new file mode 100644
index 0000000000..6558470d7d
--- /dev/null
+++ b/third_party/java/proguard/proguard5.3.3/src/proguard/GPL.java
@@ -0,0 +1,196 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2017 Eric Lafortune @ GuardSquare
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program 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 for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * This class checks and prints out information about the GPL.
+ *
+ * @author Eric Lafortune
+ */
+public class GPL
+{
+ /**
+ * Prints out a note about the GPL if ProGuard is linked against unknown
+ * code.
+ */
+ public static void check()
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ new Exception().printStackTrace(new PrintStream(out));
+ LineNumberReader reader = new LineNumberReader(
+ new InputStreamReader(
+ new ByteArrayInputStream(out.toByteArray())));
+
+ Set unknownPackageNames = unknownPackageNames(reader);
+
+ if (unknownPackageNames.size() > 0)
+ {
+ String uniquePackageNames = uniquePackageNames(unknownPackageNames);
+
+ System.out.println("ProGuard is released under the GNU General Public License. You therefore");
+ System.out.println("must ensure that programs that link to it ("+uniquePackageNames+"...)");
+ System.out.println("carry the GNU General Public License as well. Alternatively, you can");
+ System.out.println("apply for an exception with the author of ProGuard.");
+ }
+ }
+
+
+ /**
+ * Returns a set of package names from the given stack trace.
+ */
+ private static Set unknownPackageNames(LineNumberReader reader)
+ {
+ Set packageNames = new HashSet();
+
+ try
+ {
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+
+ line = line.trim();
+ if (line.startsWith("at "))
+ {
+ line = line.substring(2).trim();
+ line = trimSuffix(line, '(');
+ line = trimSuffix(line, '.');
+ line = trimSuffix(line, '.');
+
+ if (line.length() > 0 && !isKnown(line))
+ {
+ packageNames.add(line);
+ }
+ }
+ }
+ }
+ catch (IOException ex)
+ {
+ // We'll just stop looking for more names.
+ }
+
+ return packageNames;
+ }
+
+
+ /**
+ * Returns a comma-separated list of package names from the set, excluding
+ * any subpackages of packages in the set.
+ */
+ private static String uniquePackageNames(Set packageNames)
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ Iterator iterator = packageNames.iterator();
+ while (iterator.hasNext())
+ {
+ String packageName = (String)iterator.next();
+ if (!containsPrefix(packageNames, packageName))
+ {
+ buffer.append(packageName).append(", ");
+ }
+ }
+
+ return buffer.toString();
+ }
+
+
+ /**
+ * Returns a given string without the suffix, as defined by the given
+ * separator.
+ */
+ private static String trimSuffix(String string, char separator)
+ {
+ int index = string.lastIndexOf(separator);
+ return index < 0 ? "" : string.substring(0, index);
+ }
+
+
+ /**
+ * Returns whether the given set contains a prefix of the given name.
+ */
+ private static boolean containsPrefix(Set set, String name)
+ {
+ int index = 0;
+
+ while (!set.contains(name.substring(0, index)))
+ {
+ index = name.indexOf('.', index + 1);
+ if (index < 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Returns whether the given package name has been granted an exception
+ * against the GPL linking clause, by the copyright holder of ProGuard.
+ * This method is not legally binding, but of course the actual license is.
+ * Please contact the copyright holder if you would like an exception for
+ * your code as well.
+ */
+ private static boolean isKnown(String packageName)
+ {
+ return packageName.startsWith("java") ||
+ packageName.startsWith("sun.reflect") ||
+ packageName.startsWith("proguard") ||
+ packageName.startsWith("org.apache.tools.ant") ||
+ packageName.startsWith("org.apache.tools.maven") ||
+ packageName.startsWith("org.gradle") ||
+ packageName.startsWith("org.codehaus.groovy") ||
+ packageName.startsWith("org.eclipse") ||
+ packageName.startsWith("org.netbeans") ||
+ packageName.startsWith("com.android") ||
+ packageName.startsWith("com.sun.kvem") ||
+ packageName.startsWith("net.certiv.proguarddt") ||
+ packageName.startsWith("groovy") ||
+ packageName.startsWith("scala") ||
+ packageName.startsWith("sbt") ||
+ packageName.startsWith("xsbt") ||
+ packageName.startsWith("eclipseme");
+ }
+
+
+ public static void main(String[] args)
+ {
+ LineNumberReader reader = new LineNumberReader(
+ new InputStreamReader(System.in));
+
+ Set unknownPackageNames = unknownPackageNames(reader);
+
+ if (unknownPackageNames.size() > 0)
+ {
+ String uniquePackageNames = uniquePackageNames(unknownPackageNames);
+
+ System.out.println(uniquePackageNames);
+ }
+ }
+}