Author: pisong Date: Tue Jul 8 04:38:18 2008 New Revision: 674773 URL: http://svn.apache.org/viewvc?rev=674773&view=rev Log: PIG-269: Merge PIG-256 to the type branch
Added: incubator/pig/branches/types/test/org/apache/pig/test/TestInstantiateFunc.java Modified: incubator/pig/branches/types/src/org/apache/pig/impl/PigContext.java Modified: incubator/pig/branches/types/src/org/apache/pig/impl/PigContext.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/PigContext.java?rev=674773&r1=674772&r2=674773&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/PigContext.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/PigContext.java Tue Jul 8 04:38:18 2008 @@ -407,8 +407,17 @@ private static Object instantiateFunc(String className, String argString) { Object ret; List<String> args = parseArguments(argString); - try{ - Class objClass = resolveClassName(className); + Class objClass = null ; + + try { + objClass = resolveClassName(className); + } + catch(IOException ioe) { + throw new RuntimeException("Cannot instantiate:" + className, ioe) ; + } + + try { + // Do normal instantiation if (args != null && args.size() > 0) { Class paramTypes[] = new Class[args.size()]; for (int i = 0; i < paramTypes.length; i++) { @@ -419,9 +428,36 @@ } else { ret = objClass.newInstance(); } - }catch(Throwable e){ - throw new RuntimeException("could not instantiate '" + className - + "' with arguments '" + args + "'", e); + } + catch(NoSuchMethodException nme) { + // Second channce. Try with var arg constructor + try { + Constructor c = objClass.getConstructor(String[].class); + String[] argArr = args.toArray(new String[0]) ; + Object[] wrappedArgs = new Object[1] ; + wrappedArgs[0] = argArr ; + ret = c.newInstance(wrappedArgs); + } + catch(Throwable e){ + // bad luck + StringBuilder sb = new StringBuilder(); + sb.append("could not instantiate '"); + sb.append(className); + sb.append("' with arguments '"); + sb.append(args); + sb.append("'"); + throw new RuntimeException(sb.toString(), e); + } + } + catch(Throwable e){ + // bad luck + StringBuilder sb = new StringBuilder(); + sb.append("could not instantiate '"); + sb.append(className); + sb.append("' with arguments '"); + sb.append(args); + sb.append("'"); + throw new RuntimeException(sb.toString(), e); } return ret; } Added: incubator/pig/branches/types/test/org/apache/pig/test/TestInstantiateFunc.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/test/org/apache/pig/test/TestInstantiateFunc.java?rev=674773&view=auto ============================================================================== --- incubator/pig/branches/types/test/org/apache/pig/test/TestInstantiateFunc.java (added) +++ incubator/pig/branches/types/test/org/apache/pig/test/TestInstantiateFunc.java Tue Jul 8 04:38:18 2008 @@ -0,0 +1,90 @@ +/* + * 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.pig.test; + +import junit.framework.TestCase; +import org.junit.Test; +import org.apache.pig.impl.PigContext; + +public class TestInstantiateFunc extends TestCase { + + static final String TEST_CLASS + = "org.apache.pig.test.TestInstantiateFunc$TestClass" ; + + static final String TEST_CLASS2 + = "org.apache.pig.test.TestInstantiateFunc$TestClass2" ; + + // Positive case + @Test + public void testInstantiate1() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS) ; + } + + // Positive case + @Test + public void testInstantiate2() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS + "('a','b')") ; + } + + // Positive case + @Test + public void testInstantiate3() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS + "('a','b','c')") ; + } + + // Negative case + @Test + public void testInstantiate4() throws Throwable { + try { + PigContext.instantiateFuncFromSpec(TEST_CLASS2) ; + fail("expect error here") ; + } catch(Exception e) { + // good + } + } + + // Negative case + @Test + public void testInstantiate5() throws Throwable { + try { + PigContext.instantiateFuncFromSpec(TEST_CLASS2 + "('a','b','c')") ; + fail("expect error here") ; + } catch(Exception e) { + // good + } + } + + public static class TestClass{ + public TestClass() { + + } + public TestClass(String a, String b) { + + } + public TestClass(String... strList) { + + } + } + + public static class TestClass2{ + public TestClass2(String a, String b) { + + } + } +}