[ 
https://issues.apache.org/jira/browse/TRAFODION-1668?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15039658#comment-15039658
 ] 

ASF GitHub Bot commented on TRAFODION-1668:
-------------------------------------------

Github user zellerh commented on a diff in the pull request:

    https://github.com/apache/incubator-trafodion/pull/203#discussion_r46644336
  
    --- Diff: core/conn/spj_init/src/main/java/com/traf/mgmt/JarFileMgmt.java 
---
    @@ -0,0 +1,435 @@
    +/**
    +* @@@ START COPYRIGHT @@@
    +*
    +* 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.
    +*
    +* @@@ END COPYRIGHT @@@
    + */
    +package com.traf.mgmt;
    +
    +import java.io.File;
    +import java.io.FileFilter;
    +import java.io.FileOutputStream;
    +import java.io.IOException;
    +import java.io.InputStream;
    +import java.io.RandomAccessFile;
    +import java.sql.Connection;
    +import java.sql.DriverManager;
    +import java.sql.ResultSet;
    +import java.sql.SQLException;
    +import java.sql.Statement;
    +import java.text.SimpleDateFormat;
    +import java.util.ArrayList;
    +import java.util.Arrays;
    +import java.util.Date;
    +import java.util.List;
    +
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +import org.xerial.snappy.Snappy;
    +
    +public class JarFileMgmt {
    +   private static final Logger LOG = 
LoggerFactory.getLogger(JarFileMgmt.class);
    +   private static final String url = "jdbc:default:connection";
    +   // 100Mb
    +   private static final long MAX_JAR_FILE_SIZE = 104857600;
    +   private static final SimpleDateFormat format = new 
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    +   private static final int MaxDataSize = 102400;
    +   private static final String CHARTSET = "ISO-8859-1";
    +
    +   /**
    +    * Print help info
    +    * 
    +    * @param helps:
    +    *            INOUT parameter like PUT/LS/...
    +    */
    +   public static void help(String[] helps) {
    +           String[] help = new String[] {
    +                           "PUT - Upload a JAR. SHOWDDL PROCEDURE 
DEFAULT_SPJ.PUT for more info.",
    +                           "LS - List JARs. SHOWDDL PROCEDURE 
DEFAULT_SPJ.LS for more info.",
    +                           "LSALL - List all JARs. SHOWDDL PROCEDURE 
DEFAULT_SPJ.LSALL for more info.",
    +                           "RM - Remove a JAR. SHOWDDL PROCEDURE 
DEFAULT_SPJ.RM for more info.",
    +                           "RMREX - Remove JARs by a perticular pattern. 
SHOWDDL PROCEDURE DEFAULT_SPJ.RMREX for more info.",
    +                           "GETFILE - Download a JAR. SHOWDDL PROCEDURE 
DEFAULT_SPJ.GETFILE for more info."
    +           };
    +           List<String> index = new ArrayList<String>(help.length);
    +           index.add("PUT");
    +           index.add("LS");
    +           index.add("LSALL");
    +           index.add("RM");
    +           index.add("RMREX");
    +           index.add("GETFILE");
    +           String tmp = helps[0].trim().toUpperCase();
    +           helps[0] = "HELP:\r\n";
    +           switch (index.indexOf(tmp)) {
    +           case 0:
    +                   helps[0] = help[0];
    +                   break;
    +           case 1:
    +                   helps[0] = help[1];
    +                   break;
    +           case 2:
    +                   helps[0] = help[2];
    +                   break;
    +           case 3:
    +                   helps[0] = help[3];
    +                   break;
    +           case 4:
    +                   helps[0] = help[4];
    +                   break;
    +           case 5:
    +                   helps[0] = help[5];
    +                   break;
    +           default:
    +                   for (String h : help) {
    +                           helps[0] += h + "\r\n";
    +                   }
    +
    +           }
    +
    +   }
    +
    +   public static void syncJar(String userPath, String fileName) throws 
SQLException, IOException {
    +           checkFileName(fileName);
    +           LOG.info("syncJars " + fileName);
    +           String nodes = System.getenv("MY_NODES");
    +           if (nodes != null && !"".equals(nodes.trim())) {
    +                   execShell("pdcp " + nodes + " " + userPath + 
fileName.trim() + " " + userPath + " ");
    +           }
    +   }
    +
    +   private static String execShell(String cmd) throws IOException {
    +           Process p = Runtime.getRuntime().exec(cmd);
    +           if (p != null) {
    +                   StringBuilder sb = new StringBuilder();
    +                   InputStream in = null;
    +                   try {
    +                           in = p.getInputStream();
    +                           int c = -1;
    +                           while ((c = in.read()) != -1) {
    +                                   sb.append((char) c);
    +                           }
    +                   } finally {
    +                           if (in != null)
    +                                   in.close();
    +                   }
    +                   try {
    +                           in = p.getErrorStream();
    +                           int c = -1;
    +                           boolean flag = true;
    +                           while ((c = in.read()) != -1) {
    +                                   if (flag) {
    +                                           sb.append("\r\n");
    +                                   } else {
    +                                           flag = false;
    +                                   }
    +                                   sb.append((char) c);
    +                           }
    +                   } finally {
    +                           if (in != null)
    +                                   in.close();
    +                   }
    +                   return sb.toString();
    +           }
    +           return null;
    +   }
    +
    +   /**
    +    * Download a JAR file
    +    * 
    +    * @param fileName
    +    * @param offset
    +    * @param fileData
    +    * @throws SQLException
    +    * @throws IOException
    +    */
    +   public static void get(String fileName, int offset, String[] fileData, 
long[] fileLength)
    +                   throws SQLException, IOException {
    +           checkFileName(fileName);
    +           Connection conn = getConn();
    +           LOG.info("Get " + fileName);
    +           String userPath = getCodeFilePath(conn);
    +           close(conn);
    +           File file = new File(userPath + fileName);
    +           if (!file.exists()) {
    +                   throw new SQLException("No such file[" + fileName + 
"]");
    +           }
    +           RandomAccessFile rAFile = null;
    +           try {
    +                   rAFile = new RandomAccessFile(file, "r");
    +                   rAFile.seek(offset);
    +                   byte bArray[] = new byte[MaxDataSize];
    +                   int bytesRead = rAFile.read(bArray, 0, MaxDataSize);
    +                   if (bytesRead != -1) {
    +                           fileData[0] = new 
String(Snappy.compress(Arrays.copyOf(bArray, bytesRead)), CHARTSET);
    +                           fileLength[0] = file.length();
    +                           LOG.info("Download: " + fileName + ", offset:" 
+ offset + ",compressed length:" + fileData[0].length()
    +                                           + ",file length:" + 
fileLength[0]);
    +                   }
    +           } finally {
    +                   if (rAFile != null) {
    +                           try {
    +                                   rAFile.close();
    +                           } catch (Exception e) {
    +                                   LOG.warn("Something wrong while close 
file[" + fileName + "] stream: " + e.getMessage());
    +                           }
    +                   }
    +           }
    +
    +   }
    +
    +   /**
    +    * Remove exact file
    +    * 
    +    * @param fileName
    +    * @throws SQLException
    +    */
    +   public static void rm(String fileName) throws SQLException {
    +           checkFileName(fileName);
    +           Connection conn = getConn();
    +           LOG.info("Remove " + fileName);
    +           String userPath = getCodeFilePath(conn);
    +           close(conn);
    +           File file = new File(userPath + fileName);
    +           if (file.exists()) {
    +                   file.delete();
    +                   LOG.info("Remove " + fileName + " successfully!");
    +                   return;
    +           } else {
    +                   throw new SQLException("No such file[" + fileName + 
"]");
    +           }
    +   }
    +
    +   /**
    +    * Remove files via regular formulation
    +    * 
    +    * @param pattern:
    +    *            to be deleted
    +    * @param names
    +    *            : file names to be deleted
    +    * @throws SQLException
    +    */
    +   public static void rmRex(String pattern, String[] names) throws 
SQLException {
    +           checkFileName(pattern);
    +           Connection conn = getConn();
    +           LOG.info("Try to remove files[" + pattern + "]");
    +           String userPath = getCodeFilePath(conn);
    +           close(conn);
    +           File[] files = getFiles(pattern, new File(userPath));
    +           StringBuilder sb = new StringBuilder();
    +           sb.append("<rmRex>");
    +           sb.append(toXML(files, "rmList"));
    +           sb.append("<message>");
    +           boolean hasError = false;
    +           for (File f : files) {
    +                   try {
    +                           f.delete();
    +                   } catch (Exception e) {
    +                           hasError = true;
    +                           LOG.error(e.getMessage(), e);
    +                           sb.append("<error fileName='" + f.getName() + 
"'>" + e.getMessage() + "</error>");
    +                   }
    +           }
    +           if (!hasError) {
    +                   sb.append("Remove the files successfully!");
    +           }
    +           sb.append("</message>");
    +           sb.append("</rmRex>");
    +           names[0] = sb.toString();
    +           LOG.info("Done for removing files[" + pattern + "].");
    +   }
    +
    +   public static void lsAll(String[] names) throws SQLException {
    +           ls("*", names);
    +   }
    +
    +   /**
    +    * list the Jars matching PATTERN
    +    * 
    +    * @param pattern:
    +    * @param names
    +    * @throws SQLException
    +    */
    +   public static void ls(String pattern, String[] names) throws 
SQLException {
    +           checkFileName(pattern);
    +           Connection conn = getConn();
    +           LOG.info("List files[" + pattern + "]");
    +           String userPath = getCodeFilePath(conn);
    +           close(conn);
    +           File dir = new File(userPath);
    +           if (!dir.exists() || !dir.isDirectory()) {
    +                   LOG.error("Directory [" + userPath + "] is not found!");
    +                   throw new SQLException("Directory [" + userPath + "] is 
not found!");
    +           }
    +           if (pattern == null) {
    +                   LOG.error("File pattern should not be empty!");
    +                   throw new SQLException("Pattern is empty!");
    +           }
    +           File[] files = getFiles(pattern, dir);
    +           names[0] = toXML(files, "ls");
    +   }
    +
    +   /**
    +    * upload a JAR file
    +    * 
    +    * @param fileData
    +    * @param fileName
    +    * @param appendFlag
    +    *            0: append; otherwise overwrite
    +    * @throws SQLException
    +    */
    +   public static void put(String fileData, String fileName, int 
appendFlag) throws SQLException {
    +           checkFileName(fileName);
    +           try {
    +                   byte[] data = fileData.getBytes(CHARTSET);
    +
    +                   Connection conn = getConn();
    +                   LOG.info("Put " + fileName + ", length: " + data.length 
+ ", file string length:" + fileData.length());
    +                   String userPath = getCodeFilePath(conn);
    +                   close(conn);
    +                   String fname = userPath + fileName;
    +                   checkFile(fname, data.length);
    +                   FileOutputStream fos = null;
    +                   try {
    +                           fos = new FileOutputStream(fname, (appendFlag 
== 0));
    +
    +                           fos.write(Snappy.uncompress(Arrays.copyOf(data, 
data.length)));
    +                           fos.flush();
    +                   } finally {
    +                           if (fos != null)
    +                                   fos.close();
    +                   }
    +
    +                   syncJar(userPath, fileName);
    --- End diff --
    
    What I am trying to say is that your new SPJs will also be used to deploy 
DLLs for UDFs written in C or C++. Those DLLs need to have execute privilege or 
they will not work. You could try to find out whether a file is a jar file or a 
DLL and set the permissions accordingly, or just always set execute permissions.


> Cannot upload customer SPJ JARs
> -------------------------------
>
>                 Key: TRAFODION-1668
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-1668
>             Project: Apache Trafodion
>          Issue Type: Improvement
>            Reporter: Kevin Xu
>            Assignee: Kevin Xu
>




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to