| /* |
| * 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.uima.ducc.ws.server; |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| |
| import org.apache.uima.ducc.common.utils.AlienAbstract; |
| import org.apache.uima.ducc.common.utils.DuccLogger; |
| import org.apache.uima.ducc.common.utils.DuccPropertiesResolver; |
| import org.apache.uima.ducc.common.utils.Utils; |
| import org.apache.uima.ducc.ws.utils.alien.EffectiveUser; |
| |
| public class AlienTextFile extends AlienAbstract { |
| |
| private static DuccLogger duccLogger = DuccLogger.getLogger(AlienTextFile.class.getName(), null); |
| |
| private static String command_du = "/usr/bin/du"; |
| private static String flag_dash_b = "-b"; |
| |
| private static String double_dash = "--"; |
| |
| private static String command_dd = "/bin/dd"; |
| private static String arg_if = "if="; |
| private static String arg_skip = "skip="; |
| private static String arg_count = "count="; |
| |
| private static int sizeBlockDd = 512; |
| private static int sizeDefault = 0; |
| |
| private static int page_bytes = 64*4096; |
| |
| private String file_name; |
| |
| private File devNull = new File("/dev/null"); |
| |
| public AlienTextFile(EffectiveUser eu, String file_name) { |
| init(eu.get(), file_name); |
| } |
| |
| private AlienTextFile(String user, String file_name) { |
| init(user, file_name); |
| } |
| |
| private void init(String user, String file_name) { |
| String location = "init"; |
| set_user(user); |
| set_file_name(file_name); |
| set_ducc_ling(Utils.resolvePlaceholderIfExists(System.getProperty("ducc.agent.launcher.ducc_spawn_path"),System.getProperties())); |
| init_page_bytes(); |
| duccLogger.debug(location, duccId, "bytes:"+get_page_bytes()); |
| } |
| |
| private void init_page_bytes() { |
| String location = "init_page_bytes"; |
| try { |
| String bytes_per_page = DuccPropertiesResolver.getInstance().getProperty(DuccPropertiesResolver.ducc_ws_bytes_per_page); |
| if(bytes_per_page != null) { |
| bytes_per_page = bytes_per_page.trim(); |
| int value = Integer.parseInt(bytes_per_page); |
| if(value > 0) { |
| set_page_bytes(value); |
| duccLogger.debug(location, duccId, value); |
| } |
| } |
| } |
| catch(Exception e) { |
| duccLogger.error(location, duccId, e); |
| } |
| } |
| |
| protected void set_file_name(String value) { |
| file_name = value; |
| } |
| |
| protected String get_file_name() { |
| return file_name; |
| } |
| |
| protected void set_page_bytes(int value) { |
| page_bytes = value; |
| } |
| |
| public static int get_page_bytes() { |
| return page_bytes; |
| } |
| |
| private void trace(String text) { |
| String location = "trace"; |
| duccLogger.debug(location, duccId, text); |
| } |
| |
| private void trace(String[] textArray) { |
| String location = "trace"; |
| StringBuffer sb = new StringBuffer(); |
| if(textArray != null) { |
| for(String s : textArray) { |
| if(s != null) { |
| sb.append(s+" "); |
| } |
| } |
| } |
| duccLogger.debug(location, duccId, sb); |
| } |
| |
| private String getResult(String[] command) { |
| String location = "getResult"; |
| StringBuffer sb = new StringBuffer(); |
| try { |
| trace(command); |
| ProcessBuilder pb = new ProcessBuilder( command ); |
| pb = pb.redirectError(devNull); |
| Process process = pb.start(); |
| InputStream is = process.getInputStream(); |
| InputStreamReader isr = new InputStreamReader(is); |
| BufferedReader br = new BufferedReader(isr); |
| String line; |
| while ((line = br.readLine()) != null) { |
| sb.append(line); |
| sb.append("\n"); |
| } |
| int exitValue = process.waitFor(); |
| duccLogger.debug(location,duccId, exitValue); |
| } |
| catch(Exception e) { |
| duccLogger.error(location, duccId, e); |
| } |
| String retVal = sb.toString(); |
| return retVal; |
| } |
| |
| private String[] buildCommandDu() { |
| String[] command_ducc_ling_yes = { ducc_ling, q_parameter, u_parameter, user, double_dash, command_du, flag_dash_b, file_name }; |
| String[] command_ducc_ling_no = { command_du, flag_dash_b, file_name }; |
| String[] command = command_ducc_ling_yes; |
| if(ducc_ling == null) { |
| command = command_ducc_ling_no; |
| } |
| else if(user == null) { |
| command = command_ducc_ling_no; |
| } |
| return command; |
| } |
| |
| private String getDu() throws Throwable { |
| String location = "getDu"; |
| String data = ""; |
| try { |
| String[] command = buildCommandDu(); |
| data = getResult(command); |
| trace("data size:"+data.length()); |
| } |
| catch(Throwable t) { |
| duccLogger.warn(location, duccId, t); |
| } |
| return data; |
| } |
| |
| private int convertToInt(String value, int otherwise) { |
| String location = "convertToInt"; |
| int retVal = otherwise; |
| try { |
| retVal = Integer.parseInt(value); |
| } |
| catch(Throwable t) { |
| duccLogger.trace(location, duccId, t); |
| } |
| return retVal; |
| } |
| |
| public int getByteSize() { |
| String location = "getByteSize"; |
| int retVal = sizeDefault; |
| try { |
| String text = getDu(); |
| if(text != null) { |
| text = text.trim(); |
| String[] tokens = text.split("\\s+"); |
| if(tokens.length > 0) { |
| duccLogger.debug(location, duccId, tokens[0]); |
| retVal = convertToInt(tokens[0], sizeDefault); |
| } |
| else { |
| duccLogger.debug(location, duccId, "empty"); |
| } |
| } |
| } |
| catch(Throwable t) { |
| duccLogger.warn(location, duccId, t); |
| } |
| return retVal; |
| } |
| |
| /******/ |
| |
| private String[] buildCommandDd(int skip, int count) { |
| String[] command_ducc_ling_yes = { ducc_ling, q_parameter, u_parameter, user, double_dash, command_dd, arg_if+file_name, arg_skip+skip, arg_count+count }; |
| String[] command_ducc_ling_no = { command_dd, arg_if+file_name, arg_skip+skip, arg_count+count }; |
| String[] command = command_ducc_ling_yes; |
| if(ducc_ling == null) { |
| command = command_ducc_ling_no; |
| } |
| else if(user == null) { |
| command = command_ducc_ling_no; |
| } |
| return command; |
| } |
| |
| private String getDd(int skip, int count) throws Throwable { |
| String location = "getDd"; |
| String data = ""; |
| try { |
| String[] command = buildCommandDd(skip, count); |
| data = getResult(command); |
| trace("data size:"+data.length()); |
| } |
| catch(Throwable t) { |
| duccLogger.warn(location, duccId, t); |
| } |
| return data; |
| } |
| |
| public String getChunk(int byteStart, int byteCount) { |
| String location = "getChunk"; |
| String retVal = ""; |
| try { |
| int skip = (int) Math.ceil(byteStart / (1.0*sizeBlockDd)); |
| int count = (int) Math.ceil(byteCount / (1.0*sizeBlockDd)); |
| //System.err.println("skip:"+skip+" "+"count:"+count); |
| retVal = getDd(skip, count); |
| } |
| catch(Throwable t) { |
| duccLogger.warn(location, duccId, t); |
| } |
| return retVal; |
| } |
| |
| public int getPageCount() { |
| int retVal = 0; |
| int pageSize = get_page_bytes(); |
| int fileBytes = getByteSize(); |
| retVal = (int) Math.ceil(fileBytes / (1.0 * pageSize)); |
| return retVal; |
| } |
| |
| public String getPage(int pageNo) { |
| String retVal = ""; |
| int pageSize = get_page_bytes(); |
| retVal = getChunk(pageNo*pageSize, pageSize); |
| return retVal; |
| } |
| |
| public String getPageFirst() { |
| String retVal = ""; |
| int pageSize = get_page_bytes(); |
| retVal = getChunk(0, pageSize); |
| return retVal; |
| } |
| |
| public String getPageLast() { |
| String retVal = ""; |
| int pageSize = get_page_bytes(); |
| int fileBytes = getByteSize(); |
| if(fileBytes > pageSize) { |
| int byteStart = (fileBytes-pageSize)+1; |
| int byteCount = pageSize; |
| //System.err.println("byteStart:"+byteStart+" "+"byteCount:"+byteCount); |
| retVal = getChunk(byteStart, byteCount); |
| } |
| else { |
| retVal = getPageFirst(); |
| } |
| return retVal; |
| } |
| |
| /******/ |
| |
| public static void main(String[] args) throws Throwable { |
| AlienTextFile alienTextFile; |
| String arg_user = args[0]; |
| String arg_file = args[1]; |
| alienTextFile = new AlienTextFile(arg_user, arg_file); |
| if(args.length > 2) { |
| alienTextFile.set_ducc_ling(args[2]); |
| } |
| int bytes = alienTextFile.getByteSize(); |
| System.out.println("--- file bytes ---"); |
| System.out.println(bytes); |
| String data; |
| data = alienTextFile.getPageFirst(); |
| System.out.println("--- first ---"); |
| System.out.println(data); |
| data = alienTextFile.getPageLast(); |
| System.out.println("--- last ---"); |
| System.out.println(data); |
| int count = alienTextFile.getPageCount(); |
| System.out.println("--- page count ---"); |
| System.out.println(count); |
| for(int i=0; i<count; i++) { |
| data = alienTextFile.getPage(i); |
| System.out.println("--- page "+i+" ---"); |
| System.out.println(data); |
| } |
| } |
| } |