This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 1451a2753857c68fe4bd25cec58e795e463edf86
Author: DongLiang-0 <46414265+donglian...@users.noreply.github.com>
AuthorDate: Sun Sep 17 21:17:05 2023 +0800

    [fix](java-udaf)Fix need to restart BE after replacing the jar package in 
java-udaf (#24469)
---
 .../apache/doris/analysis/CreateFunctionStmt.java  | 154 +++++++++++----------
 1 file changed, 81 insertions(+), 73 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
index d00318d0a2..c50acda716 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
@@ -387,93 +387,101 @@ public class CreateFunctionStmt extends DdlStmt {
 
         try {
             URL[] urls = {new URL("jar:" + userFile + "!/")};
-            URLClassLoader cl = URLClassLoader.newInstance(urls);
-            Class udfClass = cl.loadClass(clazz);
-            String udfClassName = udfClass.getCanonicalName();
-            String stateClassName = udfClassName + "$" + STATE_CLASS_NAME;
-            Class stateClass = cl.loadClass(stateClassName);
-
-            for (Method m : udfClass.getMethods()) {
-                if (!m.getDeclaringClass().equals(udfClass)) {
-                    continue;
+            try (URLClassLoader cl = URLClassLoader.newInstance(urls)) {
+                Class udfClass = cl.loadClass(clazz);
+                String udfClassName = udfClass.getCanonicalName();
+                String stateClassName = udfClassName + "$" + STATE_CLASS_NAME;
+                Class stateClass = cl.loadClass(stateClassName);
+
+                for (Method m : udfClass.getMethods()) {
+                    if (!m.getDeclaringClass().equals(udfClass)) {
+                        continue;
+                    }
+                    String name = m.getName();
+                    if (allMethods.containsKey(name)) {
+                        throw new AnalysisException(
+                                String.format("UDF class '%s' has multiple 
methods with name '%s' ", udfClassName,
+                                        name));
+                    }
+                    allMethods.put(name, m);
                 }
-                String name = m.getName();
-                if (allMethods.containsKey(name)) {
+
+                if (allMethods.get(CREATE_METHOD_NAME) == null) {
                     throw new AnalysisException(
-                            String.format("UDF class '%s' has multiple methods 
with name '%s' ", udfClassName, name));
+                            String.format("No method '%s' in class '%s'!", 
CREATE_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(CREATE_METHOD_NAME, 
allMethods.get(CREATE_METHOD_NAME), udfClassName);
+                    checkArgumentCount(allMethods.get(CREATE_METHOD_NAME), 0, 
udfClassName);
+                    checkReturnJavaType(udfClassName, 
allMethods.get(CREATE_METHOD_NAME), stateClass);
                 }
-                allMethods.put(name, m);
-            }
-
-            if (allMethods.get(CREATE_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
CREATE_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(CREATE_METHOD_NAME, 
allMethods.get(CREATE_METHOD_NAME), udfClassName);
-                checkArgumentCount(allMethods.get(CREATE_METHOD_NAME), 0, 
udfClassName);
-                checkReturnJavaType(udfClassName, 
allMethods.get(CREATE_METHOD_NAME), stateClass);
-            }
 
-            if (allMethods.get(DESTROY_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
DESTROY_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(DESTROY_METHOD_NAME, 
allMethods.get(DESTROY_METHOD_NAME), udfClassName);
-                checkArgumentCount(allMethods.get(DESTROY_METHOD_NAME), 1, 
udfClassName);
-                checkReturnJavaType(udfClassName, 
allMethods.get(DESTROY_METHOD_NAME), void.class);
-            }
+                if (allMethods.get(DESTROY_METHOD_NAME) == null) {
+                    throw new AnalysisException(
+                            String.format("No method '%s' in class '%s'!", 
DESTROY_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(DESTROY_METHOD_NAME, 
allMethods.get(DESTROY_METHOD_NAME),
+                            udfClassName);
+                    checkArgumentCount(allMethods.get(DESTROY_METHOD_NAME), 1, 
udfClassName);
+                    checkReturnJavaType(udfClassName, 
allMethods.get(DESTROY_METHOD_NAME), void.class);
+                }
 
-            if (allMethods.get(ADD_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
ADD_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(ADD_METHOD_NAME, 
allMethods.get(ADD_METHOD_NAME), udfClassName);
-                checkArgumentCount(allMethods.get(ADD_METHOD_NAME), 
argsDef.getArgTypes().length + 1, udfClassName);
-                checkReturnJavaType(udfClassName, 
allMethods.get(ADD_METHOD_NAME), void.class);
-                for (int i = 0; i < argsDef.getArgTypes().length; i++) {
-                    Parameter p = 
allMethods.get(ADD_METHOD_NAME).getParameters()[i + 1];
-                    checkUdfType(udfClass, allMethods.get(ADD_METHOD_NAME), 
argsDef.getArgTypes()[i], p.getType(),
-                            p.getName());
+                if (allMethods.get(ADD_METHOD_NAME) == null) {
+                    throw new AnalysisException(
+                            String.format("No method '%s' in class '%s'!", 
ADD_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(ADD_METHOD_NAME, 
allMethods.get(ADD_METHOD_NAME), udfClassName);
+                    checkArgumentCount(allMethods.get(ADD_METHOD_NAME), 
argsDef.getArgTypes().length + 1, udfClassName);
+                    checkReturnJavaType(udfClassName, 
allMethods.get(ADD_METHOD_NAME), void.class);
+                    for (int i = 0; i < argsDef.getArgTypes().length; i++) {
+                        Parameter p = 
allMethods.get(ADD_METHOD_NAME).getParameters()[i + 1];
+                        checkUdfType(udfClass, 
allMethods.get(ADD_METHOD_NAME), argsDef.getArgTypes()[i], p.getType(),
+                                p.getName());
+                    }
                 }
-            }
 
-            if (allMethods.get(SERIALIZE_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
SERIALIZE_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(SERIALIZE_METHOD_NAME, 
allMethods.get(SERIALIZE_METHOD_NAME),
-                        udfClassName);
-                checkArgumentCount(allMethods.get(SERIALIZE_METHOD_NAME), 2, 
udfClassName);
-                checkReturnJavaType(udfClassName, 
allMethods.get(SERIALIZE_METHOD_NAME), void.class);
-            }
+                if (allMethods.get(SERIALIZE_METHOD_NAME) == null) {
+                    throw new AnalysisException(
+                            String.format("No method '%s' in class '%s'!", 
SERIALIZE_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(SERIALIZE_METHOD_NAME, 
allMethods.get(SERIALIZE_METHOD_NAME),
+                            udfClassName);
+                    checkArgumentCount(allMethods.get(SERIALIZE_METHOD_NAME), 
2, udfClassName);
+                    checkReturnJavaType(udfClassName, 
allMethods.get(SERIALIZE_METHOD_NAME), void.class);
+                }
 
-            if (allMethods.get(MERGE_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
MERGE_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(MERGE_METHOD_NAME, 
allMethods.get(MERGE_METHOD_NAME), udfClassName);
-                checkArgumentCount(allMethods.get(MERGE_METHOD_NAME), 2, 
udfClassName);
-                checkReturnJavaType(udfClassName, 
allMethods.get(MERGE_METHOD_NAME), void.class);
-            }
+                if (allMethods.get(MERGE_METHOD_NAME) == null) {
+                    throw new AnalysisException(
+                            String.format("No method '%s' in class '%s'!", 
MERGE_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(MERGE_METHOD_NAME, 
allMethods.get(MERGE_METHOD_NAME), udfClassName);
+                    checkArgumentCount(allMethods.get(MERGE_METHOD_NAME), 2, 
udfClassName);
+                    checkReturnJavaType(udfClassName, 
allMethods.get(MERGE_METHOD_NAME), void.class);
+                }
 
-            if (allMethods.get(GETVALUE_METHOD_NAME) == null) {
-                throw new AnalysisException(
-                        String.format("No method '%s' in class '%s'!", 
GETVALUE_METHOD_NAME, udfClassName));
-            } else {
-                checkMethodNonStaticAndPublic(GETVALUE_METHOD_NAME, 
allMethods.get(GETVALUE_METHOD_NAME), udfClassName);
-                checkArgumentCount(allMethods.get(GETVALUE_METHOD_NAME), 1, 
udfClassName);
-                checkReturnUdfType(udfClass, 
allMethods.get(GETVALUE_METHOD_NAME), returnType.getType());
-            }
+                if (allMethods.get(GETVALUE_METHOD_NAME) == null) {
+                    throw new AnalysisException(
+                            String.format("No method '%s' in class '%s'!", 
GETVALUE_METHOD_NAME, udfClassName));
+                } else {
+                    checkMethodNonStaticAndPublic(GETVALUE_METHOD_NAME, 
allMethods.get(GETVALUE_METHOD_NAME),
+                            udfClassName);
+                    checkArgumentCount(allMethods.get(GETVALUE_METHOD_NAME), 
1, udfClassName);
+                    checkReturnUdfType(udfClass, 
allMethods.get(GETVALUE_METHOD_NAME), returnType.getType());
+                }
 
-            if (!Modifier.isPublic(stateClass.getModifiers()) || 
!Modifier.isStatic(stateClass.getModifiers())) {
+                if (!Modifier.isPublic(stateClass.getModifiers()) || 
!Modifier.isStatic(stateClass.getModifiers())) {
+                    throw new AnalysisException(
+                            String.format(
+                                    "UDAF '%s' should have one public & static 
'State' class to Construction data ",
+                                    udfClassName));
+                }
+            } catch (ClassNotFoundException e) {
                 throw new AnalysisException(
-                        String.format("UDAF '%s' should have one public & 
static 'State' class to Construction data ",
-                                udfClassName));
+                        "Class [" + clazz + "] or inner class [State] not 
found in file :" + userFile);
+            } catch (IOException e) {
+                throw new AnalysisException("Failed to load file: " + 
userFile);
             }
         } catch (MalformedURLException e) {
             throw new AnalysisException("Failed to load file: " + userFile);
-        } catch (ClassNotFoundException e) {
-            throw new AnalysisException("Class [" + clazz + "] or inner class 
[State] not found in file :" + userFile);
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to