FileDownloader

Тема в разделе "Lotus + Java + LS2J", создана пользователем VladSh, 19 янв 2012.

  1. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Вот такой <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">кодец</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    import java.io.*;
    import java.net.*;

    class FileDownloader
    {
    public static boolean start(String sURL, String sFilePath)
    {
    InputStream is = null;
    try
    {
    URL u = new URL(sURL);
    is = u.openStream();
    BufferedInputStream bis = new BufferedInputStream(is);

    int bufSize = 1024;
    byte[] buffer = new byte[bufSize];

    FileOutputStream fos = new FileOutputStream(sFilePath);
    BufferedOutputStream bos = new BufferedOutputStream(fos);

    int bytes;
    while((bytes = bis.read(buffer)) != -1)
    {
    bos.write(buffer, 0, bytes);
    }
    fos.flush();
    fos.close();

    return true;
    }
    catch (MalformedURLException mue)
    {
    System.err.println("Ouch - a MalformedURLException happened.");
    mue.printStackTrace();
    return false;
    }
    catch (IOException ioe)
    {
    System.err.println("Oops - an IOException happened.");
    ioe.printStackTrace();
    return false;
    }
    finally
    {
    try
    {
    is.close();
    }
    catch (IOException ioe)
    {}
    }
    }
    }
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"вызов"</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Function DownloadFile(sURL As String, sFilePath As String) As Boolean
    On Error GoTo errH
    Dim jClassFD As JavaClass
    Dim jMethod As JavaMethod

    Set jClassFD = GetJavaClass("FileDownloader")
    If jClassFD Is Nothing Then Exit Function

    Set jMethod = jClassFD.GetMethod("start", "(Ljava/lang/String;Ljava/lang/String;)Z")
    DownloadFile = jMethod.Invoke(, sURL, sFilePath)
    Exit Function

    ErrH:
    Call WriteJavaError(Error$)
    Exit Function
    End Function


    %REM
    Library LS2J
    Created Jun 10, 2010 by я
    Description: основной функционал для работы с бриджами LS2J
    %END REM
    Option Public
    UseLSX "*javacon"
    Public jSession As JavaSession


    Sub Initialize()
    Set jSession = New JavaSession()
    End Sub


    %REM
    Function GetJavaClass
    Description: возвращает объект класса
    %END REM
    Function GetJavaClass(sClassName As String) As JavaClass
    On Error GoTo ErrH

    Set GetJavaClass = jSession.GetClass(sClassName)
    If Not GetJavaClass Is Nothing Then Exit Function

    ErrH:
    Call WriteJavaError(Error$)
    Exit Function
    End Function


    %REM
    Sub WriteJavaError
    Description: пока только вывод сообщения об ошибке
    %END REM
    Sub WriteJavaError(sError As String)
    Dim jError As JavaError
    Set jError = jSession.getLastJavaError()
    Messagebox sError + Chr(13) + jError.StackTrace, 48, "Lotus Notes..."
    End Sub
    выплёвывает <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">такую ошибку</div></div><div class="sp-body"><div class="sp-content">
    Почитал, это что-то типа Object variable not set, но как его понять, в какой строке, какой объект?

    Как вообще в Лотусе лучше отлаживать Java-код?
    Все ответы на этот вопрос перенесены туда, где им и положено быть.
     
  2. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Что получилось в результате:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java auto'>import java.io.*;
    import java.net.*;

    class FileDownloader
    {
    public static void start(String sURL, String sFilePath) throws Exception
    {
    String sErrMsg = null;

    InputStream is = null;
    BufferedInputStream bis = null;

    try
    {
    //обрабатываем взятие файла по адресу
    URL u = new URL(sURL);
    is = u.openStream();
    bis = new BufferedInputStream(is);

    BufferedOutputStream bos = null;
    try
    {
    //обрабатываем сохранение файла по указанному пути
    int bufSize = 1024;
    byte[] buffer = new byte[bufSize];

    FileOutputStream fos = new FileOutputStream(sFilePath);
    bos = new BufferedOutputStream(fos);

    int bytes;
    while((bytes = bis.read(buffer)) != -1)
    {
    bos.write(buffer, 0, bytes);
    }
    }
    catch (FileNotFoundException e)
    {
    sErrMsg = "Ошибка сохранения файла: " + e.getLocalizedMessage();
    }
    finally
    {
    if (bos != null)
    {
    bos.flush();
    bos.close();
    }
    }
    }
    catch (MalformedURLException e)
    {
    sErrMsg = "Ошибка подключения по сети: " + e.getLocalizedMessage();
    }
    catch (IOException e)
    {
    sErrMsg = "Ошибка чтения файла: " + e.getLocalizedMessage();
    }
    finally
    {
    if (bis != null)
    bis.close();
    else
    if (is != null) is.close();

    if (sErrMsg != null)
    throw new Exception(sErrMsg);
    }
    }
    }[/CODE]Да, и отлаживать Java-код в Лотусе - это извращение.. Лучше уж пошагово прогнать в какой-нить IDE'хе.
    И пока непонятно, как сделать так, чтобы не передёргивать клиента при каждом изменении..
     
  3. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ещё какая-то фигня..
    Есть агент, который генерирует ошибку (запускается с действия в виде).
    После запуска этого агента запускаю LS-агент, запускаемый из меню, имеющий вызов этого даунлоадера.. и тут на Win7 начинаются странности:
    1. В большинстве случаев намертво вешает клиента, варианты:
    - закачиваемый файл загружается полностью;
    - создаётся файл размером = 0.
    В обоих случаях код дальше не выполняется.
    2. Изредка появляется сообщение, что "вызван недопустимый метод" или что-то типа того.. в этом случае клиент не вешается.
    Если не вызывать первого агента, генерящего ошибку, то всё отрабатывает нормально.
    Все исключения, которые могут быть в этих случаях, отловлены, куда копать непонятно.
    Есть идея сделать вызов агента, который вызывается из меню, другого агента, в котором и будет находиться код, чтобы разделить "потоки".. но хотелось бы понять, как это можно отловить культурно.
    Предложения/помощь только приветствуются! ;)
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Проблема из предыдущего поста в трабле 8.5.1-2 версий и только в Win7. В 8.5.3 этот баг пофиксен.
    При закрытии дока, в котором вызывался агент, генерирующий ошибку, всё работает и в пред. версиях, т.к. контекст текущего дока разрушается. Пытался программно из агента сначала закрыть док, а потом вызвать агент с закачкой, - не получилось. Можно из действия на собаках закрыть док, а после него вызвать агента, но добавлять это действие потом на все формы/виды/страницы не вариант.

    P.S. Кстати 18-го числа вышла русская версия 8.5.3, так что можно требовать в представительствах IBM. И было бы здорово, если бы кто-то положил на наш ftp lotus.net.ua.
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    В ходе экспериментов опробовал больше десятка вариантов..
    Решил проблему перемещением агента в другую БД. Всё работает, т.к. агент, находящийся в другой БД, не может подхватить контекст документа с ошибкой из текущей БД.
     

Поделиться этой страницей