FileDownloader

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#1
Вот такой <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">
Код:
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">
Код:
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">
LS2J Error: Threw java.lang.NullPointerException
at FileDownloader.start(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectLoader.invoke(Unknown Source)
Почитал, это что-то типа Object variable not set, но как его понять, в какой строке, какой объект?

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

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#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'хе.
И пока непонятно, как сделать так, чтобы не передёргивать клиента при каждом изменении..
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#3
Ещё какая-то фигня..
Есть агент, который генерирует ошибку (запускается с действия в виде).
После запуска этого агента запускаю LS-агент, запускаемый из меню, имеющий вызов этого даунлоадера.. и тут на Win7 начинаются странности:
1. В большинстве случаев намертво вешает клиента, варианты:
- закачиваемый файл загружается полностью;
- создаётся файл размером = 0.
В обоих случаях код дальше не выполняется.
2. Изредка появляется сообщение, что "вызван недопустимый метод" или что-то типа того.. в этом случае клиент не вешается.
Если не вызывать первого агента, генерящего ошибку, то всё отрабатывает нормально.
Все исключения, которые могут быть в этих случаях, отловлены, куда копать непонятно.
Есть идея сделать вызов агента, который вызывается из меню, другого агента, в котором и будет находиться код, чтобы разделить "потоки".. но хотелось бы понять, как это можно отловить культурно.
Предложения/помощь только приветствуются! ;)
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#4
Проблема из предыдущего поста в трабле 8.5.1-2 версий и только в Win7. В 8.5.3 этот баг пофиксен.
При закрытии дока, в котором вызывался агент, генерирующий ошибку, всё работает и в пред. версиях, т.к. контекст текущего дока разрушается. Пытался программно из агента сначала закрыть док, а потом вызвать агент с закачкой, - не получилось. Можно из действия на собаках закрыть док, а после него вызвать агента, но добавлять это действие потом на все формы/виды/страницы не вариант.

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

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#5
В ходе экспериментов опробовал больше десятка вариантов..
Решил проблему перемещением агента в другую БД. Всё работает, т.к. агент, находящийся в другой БД, не может подхватить контекст документа с ошибкой из текущей БД.