Merge pull request #3 from Flowdalic/androidagnostic

Rene Treffer created

Make minidns Android agnostic

Change summary

AndroidManifest.xml                                 |  13 -
README.md                                           |   2 
build.gradle                                        | 154 +++++++++++---
build.xml                                           |  92 --------
proguard-project.txt                                |   0 
project.properties                                  |   2 
src/main/java/de/measite/minidns/Client.java        |  42 ++-
src/main/java/de/measite/minidns/DNSMessage.java    |   0 
src/main/java/de/measite/minidns/Question.java      |   0 
src/main/java/de/measite/minidns/Record.java        |   0 
src/main/java/de/measite/minidns/record/A.java      |   0 
src/main/java/de/measite/minidns/record/AAAA.java   |   0 
src/main/java/de/measite/minidns/record/CNAME.java  |   0 
src/main/java/de/measite/minidns/record/Data.java   |   0 
src/main/java/de/measite/minidns/record/NS.java     |   0 
src/main/java/de/measite/minidns/record/SRV.java    |   0 
src/main/java/de/measite/minidns/util/NameUtil.java |   0 
17 files changed, 146 insertions(+), 159 deletions(-)

Detailed changes

AndroidManifest.xml 🔗

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="de.measite.minidns"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="9"
-        android:targetSdkVersion="19" />
-
-    <application/>
-
-</manifest>

README.md 🔗

@@ -1,7 +1,7 @@
 MiniDNS
 -------
 
-MiniDNS is a minial dns client library for android. It can parse a basic set
+MiniDNS is a minimal dns client library for android. It can parse a basic set
 of resource records (A, AAAA, NS, SRV) and is easy to use and extend.
 
 This library is not intended to be used as a DNS server. You might want to

build.gradle 🔗

@@ -1,34 +1,126 @@
-buildscript {
-    repositories {
-        mavenCentral()
-    }
-
-    dependencies {
-        classpath 'com.android.tools.build:gradle:0.9.0'
-    }
+apply plugin: 'java'
+apply plugin: 'eclipse'
+apply plugin: 'maven'
+apply plugin: 'osgi'
+apply plugin: 'signing'
+
+ext {
+	shortVersion = '0.1'
+	isSnapshot = true
+	gitCommit = getGitCommit()
+	isReleaseVersion = !shortVersion
+	sonatypeCredentialsAvailable = project.hasProperty('sonatypeUsername') && project.hasProperty('sonatypePassword')
+	signingRequired = isReleaseVersion
+	sonatypeSnapshotUrl = 'https://oss.sonatype.org/content/repositories/snapshots'
+	sonatypeStagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2'
+	buildDate = (new java.text.SimpleDateFormat("yyyy-MM-dd")).format(new Date())
+}
+
+group = 'de.measite.minidns'
+description = "A minimal DNS client library with support for A, AAAA, NS and SRV records"
+sourceCompatibility = 1.7
+version = shortVersion
+if (isSnapshot) {
+	version += '-SNAPSHOT'
+}
+
+jar {
+	manifest {
+		instruction 'Implementation-GitRevision:', project.ext.gitCommit
+	}
+}
+
+gradle.taskGraph.whenReady { taskGraph ->
+	if (signingRequired
+		&& taskGraph.allTasks.any { it instanceof Sign }) {
+		// Use Java 6's console to read from the console (no good for a CI environment)
+		Console console = System.console()
+		console.printf '\n\nWe have to sign some things in this build.\n\nPlease enter your signing details.\n\n'
+		def password = console.readPassword('GnuPG Private Key Password: ')
+
+		allprojects { ext.'signing.password' = password }
+
+		console.printf '\nThanks.\n\n'
+	}
 }
 
-apply plugin: 'android-library'
-
-android {
-    compileSdkVersion 19
-    buildToolsVersion '19.0.3'
-    
-    // NOTE: We are using the old folder structure to also support Eclipse
-    sourceSets {
-        main {
-            manifest.srcFile 'AndroidManifest.xml'
-            java.srcDirs = ['src']
-            resources.srcDirs = ['src']
-            aidl.srcDirs = ['src']
-            renderscript.srcDirs = ['src']
-            res.srcDirs = ['res']
-            assets.srcDirs = ['assets']
-        }
-    }
-    
-    // Do not abort build if lint finds errors
-    lintOptions {
-        abortOnError false
-    }
+uploadArchives {
+	repositories {
+		mavenDeployer {
+			if (signingRequired) {
+				beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
+			}
+			repository(url: project.sonatypeStagingUrl) {
+				if (sonatypeCredentialsAvailable) {
+					authentication(userName: sonatypeUsername, password: sonatypePassword)
+				}
+			}
+			snapshotRepository(url: project.sonatypeSnapshotUrl) {
+				if (sonatypeCredentialsAvailable) {
+					authentication(userName: sonatypeUsername, password: sonatypePassword)
+				}
+			}
+
+			pom.project {
+				name 'minidns'
+				packaging 'jar'
+				inceptionYear '2014'
+				url 'https://github.com/rtreffer/minidns'
+				description project.description
+
+				issueManagement {
+					system 'GitHub'
+					url 'https://github.com/rtreffer/minidns/issues'
+				}
+
+				distributionManagement {
+					snapshotRepository {
+						id 'minidns.snapshot'
+						url project.sonatypeSnapshotUrl
+					}
+				}
+
+				scm {
+					url 'https://github.com/rtreffer/minidns'
+					connection 'scm:git:https://github.com/rtreffer/minidns.git'
+					developerConnection 'scm:git:https://github.com/rtreffer/minidns.git'
+				}
+
+				licenses {
+					license {
+						name 'The Apache Software License, Version 2.0'
+						url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+						distribution 'repo'
+					}
+				}
+
+				developers {
+					developer {
+						id 'rtreffer'
+						name 'Rene Treffer'
+					}
+					developer {
+						id 'flow'
+						name 'Florian Schmaus'
+						email 'flow@geekplace.eu'
+					}
+				}
+			}
+		}
+	}
+	signing {
+		required { signingRequired }
+		sign configurations.archives
+	}
+}
+
+def getGitCommit() {
+	def dotGit = new File("$projectDir/.git")
+	if (!dotGit.isDirectory()) return 'non-git build'
+
+	def cmd = 'git describe --all --dirty=+'
+	def proc = cmd.execute()
+	def gitCommit = proc.text.trim()
+	assert !gitCommit.isEmpty()
+	gitCommit
 }

build.xml 🔗

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="minidns-library" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-It contains the path to the SDK. It should *NOT* be checked into
-Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-'android' tool to add properties to it.
-This is the place to change some Ant specific build properties.
-Here are some properties you may want to change/update:
-
-source.dir
-The name of the source directory. Default is 'src'.
-out.dir
-The name of the output directory. Default is 'bin'.
-
-For other overridable properties, look at the beginning of the rules
-files in the SDK, at tools/ant/build.xml
-
-Properties related to the SDK location or the project target should
-be updated using the 'android' tool with the 'update' action.
-
-This file is an integral part of the build system for your
-application and should be checked into Version Control Systems.
-
--->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-get it from the ANDROID_HOME env var.
-This must be done before we load project.properties since
-the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-tool, as well as ADT.
-
-This contains project specific properties such as project target, and library
-dependencies. Lower level build properties are stored in ant.properties
-(or in .classpath for Eclipse projects).
-
-This file is an integral part of the build system for your
-application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-Import per project custom build rules if present at the root of the project.
-This is the place to put custom intermediary targets such as:
--pre-build
--pre-compile
--post-compile (This is typically used for code obfuscation.
-Compiled code location: ${out.classes.absolute.dir}
-If this is not done in place, override ${out.dex.input.absolute.dir})
--post-package
--post-build
--pre-clean
--->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-To customize existing targets, there are two options:
-- Customize only one target:
-- copy/paste the target into this file, *before* the
-<import> task.
-- customize it to your needs.
-- Customize the whole content of build.xml
-- copy/paste the content of the rules files (minus the top node)
-into this file, replacing the <import> task.
-- customize to your needs.
-
-***********************
-****** IMPORTANT ******
-***********************
-In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-in order to avoid having your file be overridden by tools such as "android update project"
--->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>

src/de/measite/minidns/Client.java → src/main/java/de/measite/minidns/Client.java 🔗

@@ -14,8 +14,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
-import android.util.Log;
 import de.measite.minidns.Record.CLASS;
 import de.measite.minidns.Record.TYPE;
 
@@ -25,6 +26,8 @@ import de.measite.minidns.Record.TYPE;
  */
 public class Client {
 
+    private static final Logger LOGGER = Logger.getLogger(Client.class.getName());
+
     /**
      * The internal random class for sequence generation.
      */
@@ -129,18 +132,19 @@ public class Client {
         message.setRecursionDesired(true);
         message.setId(random.nextInt());
         byte[] buf = message.toArray();
-        DatagramSocket socket = new DatagramSocket();
-        DatagramPacket packet = new DatagramPacket(
-                buf, buf.length, InetAddress.getByName(host), port);
-        socket.setSoTimeout(timeout);
-        socket.send(packet);
-        packet = new DatagramPacket(new byte[bufferSize], bufferSize);
-        socket.receive(packet);
-        DNSMessage dnsMessage = DNSMessage.parse(packet.getData());
-        if (dnsMessage.getId() != message.getId()) {
-            return null;
+        try (DatagramSocket socket = new DatagramSocket()) {
+            DatagramPacket packet = new DatagramPacket(buf, buf.length,
+                    InetAddress.getByName(host), port);
+            socket.setSoTimeout(timeout);
+            socket.send(packet);
+            packet = new DatagramPacket(new byte[bufferSize], bufferSize);
+            socket.receive(packet);
+            DNSMessage dnsMessage = DNSMessage.parse(packet.getData());
+            if (dnsMessage.getId() != message.getId()) {
+                return null;
+            }
+            return dnsMessage;
         }
-        return dnsMessage;
     }
 
     /**
@@ -165,6 +169,7 @@ public class Client {
                     }
                 }
             } catch (IOException ioe) {
+                LOGGER.log(Level.FINE, "IOException in query", ioe);
             }
         }
         return null;
@@ -177,22 +182,19 @@ public class Client {
     public String[] findDNS() {
         String[] result = findDNSByReflection();
         if (result != null) {
-            Log.d("minidns/client",
-                "Got DNS servers via reflection: " + Arrays.toString(result));
+            LOGGER.fine("Got DNS servers via reflection: " + Arrays.toString(result));
             return result;
         }
 
         result = findDNSByExec();
         if (result != null) {
-            Log.d("minidns/client",
-                "Got DNS servers via exec: " + Arrays.toString(result));
+            LOGGER.fine("Got DNS servers via exec: " + Arrays.toString(result));
             return result;
         }
 
         // fallback for ipv4 and ipv6 connectivity
         // see https://developers.google.com/speed/public-dns/docs/using
-        Log.d("minidns/client",
-            "No DNS found? Using fallback [8.8.8.8, [2001:4860:4860::8888]]");
+        LOGGER.fine("No DNS found? Using fallback [8.8.8.8, [2001:4860:4860::8888]]");
 
         return new String[]{"8.8.8.8", "[2001:4860:4860::8888]"};
     }
@@ -238,7 +240,7 @@ public class Client {
                 return server.toArray(new String[server.size()]);
             }
         } catch (IOException e) {
-            e.printStackTrace();
+            LOGGER.log(Level.WARNING, "Exception in findDNSByExec", e);
         }
         return null;
     }
@@ -283,7 +285,7 @@ public class Client {
             }
         } catch (Exception e) {
             // we might trigger some problems this way
-            e.printStackTrace();
+            LOGGER.log(Level.WARNING, "Exception in findDNSByReflection", e);
         }
         return null;
     }