You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by ro...@apache.org on 2012/11/19 13:01:15 UTC
svn commit: r1411144 - in /pig/branches/branch-0.11: CHANGES.txt build.xml
ivy/libraries.properties src/org/apache/pig/impl/util/JarManager.java
test/org/apache/pig/test/TestRegisteredJarVisibility.java
Author: rohini
Date: Mon Nov 19 12:01:14 2012
New Revision: 1411144
URL: http://svn.apache.org/viewvc?rev=1411144&view=rev
Log:
PIG-3039: Not possible to use custom version of jackson jars (rohini)
Modified:
pig/branches/branch-0.11/CHANGES.txt
pig/branches/branch-0.11/build.xml
pig/branches/branch-0.11/ivy/libraries.properties
pig/branches/branch-0.11/src/org/apache/pig/impl/util/JarManager.java
pig/branches/branch-0.11/test/org/apache/pig/test/TestRegisteredJarVisibility.java
Modified: pig/branches/branch-0.11/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.11/CHANGES.txt?rev=1411144&r1=1411143&r2=1411144&view=diff
==============================================================================
--- pig/branches/branch-0.11/CHANGES.txt (original)
+++ pig/branches/branch-0.11/CHANGES.txt Mon Nov 19 12:01:14 2012
@@ -318,6 +318,8 @@ OPTIMIZATIONS
BUG FIXES
+PIG-3039: Not possible to use custom version of jackson jars (rohini)
+
PIG-2979: Pig.jar doesn't work with hadoop-2.0.x (cheolsoo)
PIG-2405: some unit test case failed with open JDK (fang fang chen via cheolsoo)
Modified: pig/branches/branch-0.11/build.xml
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.11/build.xml?rev=1411144&r1=1411143&r2=1411144&view=diff
==============================================================================
--- pig/branches/branch-0.11/build.xml (original)
+++ pig/branches/branch-0.11/build.xml Mon Nov 19 12:01:14 2012
@@ -197,6 +197,12 @@
<property name="build.ivy.maven.pom" location="${build.ivy.maven.dir}/pig-${version}.pom" />
<property name="build.ivy.maven.jar" location="${build.ivy.maven.dir}/pig-${version}-core.jar" />
<property name="javacc.home" location="${ivy.lib.dir}" />
+ <property name="jackson_core.jar" location="${test.src.dir}/resources/jackson-core-asl-${jackson-pig-3039-test.version}.jar"/>
+ <property name="jackson_mapper.jar" location="${test.src.dir}/resources/jackson-mapper-asl-${jackson-pig-3039-test.version}.jar"/>
+ <property name="jackson_core_repo_url"
+ value="${mvnrepo}/org/codehaus/jackson/jackson-core-asl/${jackson-pig-3039-test.version}/jackson-core-asl-${jackson-pig-3039-test.version}.jar"/>
+ <property name="jackson_mapper_repo_url"
+ value="${mvnrepo}/org/codehaus/jackson/jackson-mapper-asl/${jackson-pig-3039-test.version}/jackson-mapper-asl-${jackson-pig-3039-test.version}.jar"/>
<!--this is the naming policy for artifacts we want pulled down-->
<property name="ivy.artifact.retrieve.pattern" value="${ant.project.name}/[artifact]-[revision](-[classifier]).[ext]"/>
@@ -356,7 +362,7 @@
<ant dir="${test.e2e.dir}" target="clean"/>
</target>
- <target name="very-clean" unless="offline" depends="ivy-clean-cache,clean"
+ <target name="very-clean" unless="offline" depends="ivy-clean-cache,jackson-pig-3039-test-clean,clean"
description="Clean build artifacts and flush Ivy cache" />
<target name="clean-piggybank" description="Cleanup piggybank">
@@ -831,7 +837,7 @@
<!-- ================================================================== -->
<!-- Run unit tests -->
<!-- ================================================================== -->
- <target name="test-core" depends="compile-test,jar-withouthadoop,debugger.check" description="Run full set of unit tests">
+ <target name="test-core" depends="compile-test,jar-withouthadoop,debugger.check,jackson-pig-3039-test-download" description="Run full set of unit tests">
<macro-test-runner test.file="${test.all.file}" />
</target>
@@ -891,6 +897,7 @@
<excludesfile name="${test.exclude.file.23}" if="isHadoop23" />
</patternset>
<exclude name="**/${exclude.testcase}.java" if="exclude.testcase" />
+ <exclude name="**/TestRegisteredJarVisibility.java" if="offline"/>
<exclude name="**/TestInvokerSpeed.java" if="clover.enabled"/>
</fileset>
</batchtest>
@@ -1702,6 +1709,16 @@
<ivy:cleancache />
</target>
+ <target name="jackson-pig-3039-test-download" description="To download jackson" unless="offline">
+ <get src="${jackson_core_repo_url}" dest="${jackson_core.jar}" usetimestamp="true"/>
+ <get src="${jackson_mapper_repo_url}" dest="${jackson_mapper.jar}" usetimestamp="true"/>
+ </target>
+
+ <target name="jackson-pig-3039-test-clean" description="Clean the jackson jar files">
+ <delete file="${jackson_core.jar}"/>
+ <delete file="${jackson_mapper.jar}"/>
+ </target>
+
<target name="assert-pig-jar-exists" depends="ivy-init">
<fail>
<condition >
Modified: pig/branches/branch-0.11/ivy/libraries.properties
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.11/ivy/libraries.properties?rev=1411144&r1=1411143&r2=1411144&view=diff
==============================================================================
--- pig/branches/branch-0.11/ivy/libraries.properties (original)
+++ pig/branches/branch-0.11/ivy/libraries.properties Mon Nov 19 12:01:14 2012
@@ -45,6 +45,7 @@ hsqldb.version=1.8.0.10
hive.version=0.8.0
httpcomponents.version=4.1
jackson.version=1.8.8
+jackson-pig-3039-test.version=1.9.9
javacc.version=4.2
javax-inject.version=1
jaxb-api.version=2.2.2
Modified: pig/branches/branch-0.11/src/org/apache/pig/impl/util/JarManager.java
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.11/src/org/apache/pig/impl/util/JarManager.java?rev=1411144&r1=1411143&r2=1411144&view=diff
==============================================================================
--- pig/branches/branch-0.11/src/org/apache/pig/impl/util/JarManager.java (original)
+++ pig/branches/branch-0.11/src/org/apache/pig/impl/util/JarManager.java Mon Nov 19 12:01:14 2012
@@ -39,11 +39,19 @@ import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;
+import org.antlr.runtime.CommonTokenStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigMapReduce;
import org.apache.pig.impl.PigContext;
+import org.apache.tools.bzip2r.BZip2Constants;
+import org.codehaus.jackson.annotate.JsonPropertyOrder;
+import org.codehaus.jackson.map.annotate.JacksonStdImpl;
+import org.joda.time.DateTime;
+import com.google.common.collect.Multimaps;
+
+import dk.brics.automaton.Automaton;
public class JarManager {
@@ -84,10 +92,34 @@ public class JarManager {
}
}
- final static String pigPackagesToSend[] = { "org/apache/pig","org/apache/tools/bzip2r",
- "dk/brics/automaton", "org/antlr/runtime", "com/google/common", "org/codehaus/jackson",
- "org/joda/time"};
-
+ private static enum DefaultPigPackages {
+
+ PIG("org/apache/pig", PigMapReduce.class),
+ BZIP2R("org/apache/tools/bzip2r", BZip2Constants.class),
+ AUTOMATON("dk/brics/automaton", Automaton.class),
+ ANTLR("org/antlr/runtime", CommonTokenStream.class),
+ GUAVA("com/google/common", Multimaps.class),
+ JACKSON_CORE("org/codehaus/jackson", JsonPropertyOrder.class),
+ JACKSON_MAPPER("org/codehaus/jackson", JacksonStdImpl.class),
+ JODATIME("org/joda/time", DateTime.class);
+
+ private final String pkgPrefix;
+ private final Class pkgClass;
+
+ DefaultPigPackages(String pkgPrefix, Class pkgClass) {
+ this.pkgPrefix = pkgPrefix;
+ this.pkgClass = pkgClass;
+ }
+
+ public String getPkgPrefix() {
+ return pkgPrefix;
+ }
+
+ public Class getPkgClass() {
+ return pkgClass;
+ }
+ }
+
/**
* Create a jarfile in a temporary path, that is a merge of all the jarfiles containing the
* functions and the core pig classes.
@@ -101,10 +133,10 @@ public class JarManager {
@SuppressWarnings("deprecation")
public static void createJar(OutputStream os, Set<String> funcs, PigContext pigContext) throws ClassNotFoundException, IOException {
Vector<JarListEntry> jarList = new Vector<JarListEntry>();
- for(String toSend: pigPackagesToSend) {
- addContainingJar(jarList, PigMapReduce.class, toSend, pigContext);
+ for (DefaultPigPackages pkgToSend : DefaultPigPackages.values()) {
+ addContainingJar(jarList, pkgToSend.getPkgClass(), pkgToSend.getPkgPrefix(), pigContext);
}
-
+
for (String func: funcs) {
Class clazz = pigContext.getClassForAlias(func);
if (clazz != null) {
@@ -283,10 +315,19 @@ public class JarManager {
* @throws IOException
*/
public static String findContainingJar(Class my_class) {
- ClassLoader loader = my_class.getClassLoader();
+ ClassLoader loader = PigContext.getClassLoader();
String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";
try {
- for (Enumeration itr = loader.getResources(class_file); itr.hasMoreElements();) {
+ Enumeration<URL> itr = null;
+ //Try to find the class in registered jars
+ if (loader instanceof URLClassLoader) {
+ itr = ((URLClassLoader) loader).findResources(class_file);
+ }
+ //Try system classloader if not URLClassLoader or no resources found in URLClassLoader
+ if (itr == null || !itr.hasMoreElements()) {
+ itr = loader.getResources(class_file);
+ }
+ for (; itr.hasMoreElements();) {
URL url = (URL) itr.nextElement();
if ("jar".equals(url.getProtocol())) {
String toReturn = url.getPath();
Modified: pig/branches/branch-0.11/test/org/apache/pig/test/TestRegisteredJarVisibility.java
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.11/test/org/apache/pig/test/TestRegisteredJarVisibility.java?rev=1411144&r1=1411143&r2=1411144&view=diff
==============================================================================
--- pig/branches/branch-0.11/test/org/apache/pig/test/TestRegisteredJarVisibility.java (original)
+++ pig/branches/branch-0.11/test/org/apache/pig/test/TestRegisteredJarVisibility.java Mon Nov 19 12:01:14 2012
@@ -24,8 +24,11 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
+import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;
@@ -43,6 +46,7 @@ import org.apache.commons.logging.LogFac
import org.apache.hadoop.fs.Path;
import org.apache.pig.ExecType;
import org.apache.pig.PigServer;
+import org.apache.pig.impl.util.JarManager;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
@@ -134,6 +138,33 @@ public class TestRegisteredJarVisibility
pigServer.shutdown();
}
+ // See PIG-3039
+ @Test
+ public void testRegisterJarOverridePigJarPackages() throws IOException, ClassNotFoundException {
+ // When jackson jar is not registered, jackson-core from the first jar in
+ // classpath (pig.jar) should be picked up (version 1.8.8 in this case).
+ PigServer pigServer = new PigServer(ExecType.LOCAL, new Properties());
+ File jobJarFile = Util.createTempFileDelOnExit("Job", ".jar");
+ FileOutputStream fos = new FileOutputStream(jobJarFile);
+ JarManager.createJar(fos, new HashSet<String>(), pigServer.getPigContext());
+ JarFile jobJar = new JarFile(jobJarFile);
+ // JsonClass present in 1.8.8 but not in 1.9.9
+ Assert.assertNotNull(jobJar.getJarEntry("org/codehaus/jackson/annotate/JsonClass.class"));
+ // JsonUnwrapped present in 1.9.9 but not in 1.8.8
+ Assert.assertNull(jobJar.getJarEntry("org/codehaus/jackson/annotate/JsonUnwrapped.class"));
+
+ // When jackson jar is registered, the registered version should be picked up.
+ pigServer = new PigServer(ExecType.LOCAL, new Properties());
+ pigServer.registerJar("test/resources/jackson-core-asl-1.9.9.jar");
+ pigServer.registerJar("test/resources/jackson-mapper-asl-1.9.9.jar");
+ jobJarFile = Util.createTempFileDelOnExit("Job", ".jar");
+ fos = new FileOutputStream(jobJarFile);
+ JarManager.createJar(fos, new HashSet<String>(), pigServer.getPigContext());
+ jobJar = new JarFile(jobJarFile);
+ Assert.assertNull(jobJar.getJarEntry("org/codehaus/jackson/annotate/JsonClass.class"));
+ Assert.assertNotNull(jobJar.getJarEntry("org/codehaus/jackson/annotate/JsonUnwrapped.class"));
+ }
+
private static List<File> compile(File[] javaFiles) {
LOG.info("Compiling: " + Arrays.asList(javaFiles));