Использование Библиотеки "base64 Ls2j" И "base64java&qu

seoman2

Well-Known Member
Lotus team
17.02.2010
455
1
#1
Вопрос 1.
Как с библитеки "Base64 LS2J" вызвать функцию EncodeBase64?

В библиотеке используюся ява библиотеки
Uselsx "*javacon"
Use "Base64Java"
Функция в библдиотеке объявлена так:
Function EncodeBase64 (stream As NotesStream) As String
функция получает stream?


На кнопочку вешаю код:
Dim bc As Base64Converter
Set bc=New Base64Converter
xxx$ = bc.EncodeBase64(inStream.ReadText())

но дизайнер не видит такой функции и даже Base64Converter...

Проблема что ява в библиотеке подкл?
Вот еще по теме:
http://codeby.net/ipb.html?s=&sh...st&p=246336
Но как реализовать я не понял.

Вопрос 2.
Можно ли библиотеку на яве"Base64Java" использовать в лотусскрипте?

Use "Base64Java" в опциях
...
Dim en As Base64Java
Set en= New Base64Java
en.encodeFile ("string какой-то")

- не работает
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#3
мне в свое время не помогло, просто вызывать, делал так:
Код:
		Set jMethod = jClass.Getmethod("setStyle", {()V})

Call jMethod.Invoke(jMenu)
Сигнатуры можно получить так:
Код:
Function getMethodSignatures(jClass As Javaclass, l As NotesLog)
Dim msg$
Dim methods As JavaMethodCollection
Set methods = jclass.Getclassmethods()
ForAll meth In methods
msg$ = meth.Methodname & " - SIG: " & meth.Signature
If Not(l Is Nothing) Then Call l.logaction(msg$)
Print msg$
End ForAll

End Function
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#4
seoman2 я понимаю, что разобраться в XSLT вам просто лень...
хотя именно такой путь и даст результат наименее затратным методом (джаву учить не надо, а ХСЛ - процедурный язык)
но вы еще и не желаете задуматься о применении надлежащих ф-ций
Код:
	Dim FileOS As JAVACLASS, FileOSObj As JavaObject
Set FileOS = jSession.GetClass("java/io/FileOutputStream")
Set FileOSObj= FileOS.CreateObject("(Ljava/lang/String;)V", sPath)
OpenXLSObj.writeBytes(FileOSObj)
Call FileOSObj.close()
этот кусок создает java объект типа файл и инициализирует его именем файла, т.к. др. java обект (OpenXLSObj)
принимает на вход java тип FileOutputStream
какбэ encodeFile , как мне кажется ;) ждет не строки, а именно аутпутстрим
и для вопроса, как минимум, необходимо указывать - откуда либа Base64Java , какие-то обрывочные сведения без кода

Добавлено: ЗЫЖ у вас есть схема того что из чего получить? ато тема опять растягивается ниочём

Добавлено: на Вопрос 1. ничего и не выйдет - попрание всех типов и преобразование не даст желаемого
так писать нельзя
 

seoman2

Well-Known Member
Lotus team
17.02.2010
455
1
#5
Call jMethod.Invoke(jMenu)
jMenu - может быть любой переменной (например стринг), или объектом с лотус скрипта?

>> seoman2 я понимаю, что разобраться в XSLT вам просто лень...
просто уже все сделал на лотусскрипте + libBase64 (генерит новый док и через миме конвертит в басе64).
а сейчас уже просто интересно разобраться в подкл яваскрипта и библиотек к лотус скрипту.

А про XSLT, вот можно рабочий пример xsl и xml файла, чтобы на выходе был чистый код XML :

Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase

Dim xslin As NotesStream
Set xslin=session.CreateStream
If Not xslin.Open("C:\text\boris1.xsl") Then
Messagebox "Cannot open - Error"
Exit Sub
End If

Dim xmlin As NotesStream
Set xmlin=session.CreateStream
If Not xmlin.Open("C:\text\0.xml") Then ' Эта XML получена CreateDXLImporter из лотуса
Messagebox "Cannot open - Error"
Exit Sub
End If

Dim xmlout As NotesStream
Set xmlout=session.CreateStream
Call xmlout.Open("C:\text\000000.xml")
Call xmlout.Truncate

Dim transformer As NotesXSLTransformer
Set transformer=session.CreateXSLTransformer(xmlin, xslin, xmlout)
Call transformer.Process
 

seoman2

Well-Known Member
Lotus team
17.02.2010
455
1
#7
Получает JavaObject. Читал. Но не подходит.
А как мне в явафункцию передать лотусскрипт объект?
Set mySession = New JavaSession()
Set myClass = mySession.GetClass("Base64Java")
Set myMethod = myClass.GetMethod("encodeFile","(Ljava/lang/String;)V")
Call myMethod.Invoke(лотус объект)

Call myMethod.Invoke(,лотус объект) ?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#8
А про XSLT, вот можно рабочий пример xsl и xml файла, чтобы на выходе был чистый код XML :
классика жанра :)
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
взять dxl2fo.xsl
чистый хмл - это как? ;)

Добавлено: файла либы мы не видим и дальнейшее обсуждение бессмысленно...
код давайте, я написал - может необходим др. тип объекта
А как мне в явафункцию передать лотусскрипт объект?
никак - так делать нельзя, внутренние объекты нотусни не могут передаваться в бридж

Добавлено: в бридж можно передавать то что написано в хэлпе...
и Variant - если он содержит промежуточный объект java
это полная аналогия бриджа с COM - во внешний КОМ также не получится передать нотусневый объект (он о нем ничего не знает)
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#9
хз, не силен как lmike , но если смотреть на аналогии с моим, как то так:
Код:
Private jBase64 As JAVAOBJECT
Set mySession = New JavaSession()
Set myClass = mySession.GetClass("Base64Java")
Set jBase64 = myClass.CreateObject()
Set myMethod = myClass.GetMethod("encodeFile","(Ljava/lang/String;)V")
Call myMethod.Invoke(jBase64, <строка>) ' если метод не Static
 

seoman2

Well-Known Member
Lotus team
17.02.2010
455
1
#10
Set Variant = javamethod.Invoke([JavaObject [,Argument1...[, Argument12]])
Argumentn - Variant. Optional.
пример myMethod.invoke(,5)
то есть я даже в качестве Argument не могу передать в явовскую encodeFile - путь к файлу.

Какой тогда смысл подключать яву, если она только с ява-объектами работает?

Вот код:
Dim mySession As JavaSession
Dim myClass As JavaClass
Dim myMethod As JavaMethod
Dim jBase64 As JavaObject

Set mySession = New JavaSession()
Set myClass = mySession.GetClass("Base64Java")
Set myMethod = myClass.GetMethod("encodeFile","(Ljava/lang/String;)V")
Set jBase64 = myClass.CreateObject()

Forall obj In rtitem.EmbeddedObjects
If ( obj.Type = EMBED_ATTACHMENT ) Then
Call obj.ExtractFile( datapatch$ & obj.Source )
oname$ = obj.Source
Argument = datapatch$ & oname$
xxx = myMethod.Invoke(jBase64,Argument)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#11
то есть я даже в качестве Argument не могу передать в явовскую encodeFile - путь к файлу.
путь - это не объект LS, а стринг, его передавать можно
вопрос в либе - кот. нам не известна - что она хочет на вход
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#12
еще вопрос, что она хочет отдать...
Потому что судя по сигнатуре: "(Ljava/lang/String;)V"
Функция encodeFile получает на вход строку, а возвращает void в чистом виде, то есть: ничего!
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#13
seoman2 вот элементарное подключение java декодера/энкодера в LS:
Код:
		Set encoderClass=jSession.Getclass({java/net/URLEncoder})
Set decoderClass=jSession.Getclass({java/net/URLDecoder})
вот их использование:
Код:
	Function Decode(msg As String) As String
Decode=decoderClass.decode(msg)
End Function

Function DecodeUTF8(msg As String) As String
DecodeUTF8=decoderClass.decode(msg,{UTF-8})
End Function

Function DecodeCP1251(msg As String) As String
DecodeCP1251=decoderClass.decode(msg, {Cp1251})
End Function

Function DecodeAll(msg As String, enc As String) As String
DecodeAll=decoderClass.decode(msg, enc)
End Function

Function EncodeAll(msg As String, enc As String) As String
EncodeAll=encoderClass.encode(msg, enc)
End Function

Function Encode(msg As String) As String
Encode=encoderClass.encode(msg)
End Function
понять вашу глубокую мысль - я не в состоянии
т.е. мне непонятно чего куда и зачем пихается, как и конечная цель сего действа
 

seoman2

Well-Known Member
Lotus team
17.02.2010
455
1
#14
Для чего вообще нужны эти сигнатуры? "(Ljava/lang/String;)V"
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#15
seoman2 они не нужны..., если...: не использовать конструкторы с параметрами и не вызывать методы как описал savl
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#16
оговорка, код выше - это URLEncoder
Base64 - это другой класс
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#17
в догонку - есть апач либа, кот. предоставляет Base64, надо только понимать, что на вход оно хочет получать массив байт
а отсюда - надо инициализировать класс String от java (тогда-то и знания сигнатур пригодятся)
и только после этого<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код на java"</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'> import org.apache.commons.codec.binary.Base64;

/**
* Java program to encode and decode String in Java using Base64 encoding algorithm
* @author http://javarevisited.blogspot.com
*/
public class Base64EncodingExample{

public static void main(String args[]) throws IOException {
String orig = "original String before base64 encoding in Java";

//encoding byte array into base 64
byte[] encoded = Base64.encodeBase64(orig.getBytes());

System.out.println("Original String: " + orig );
System.out.println("Base64 Encoded String : " + new String(encoded));

//decoding byte array into base64
byte[] decoded = Base64.decodeBase64(encoded);
System.out.println("Base 64 Decoded String : " + new String(decoded));

}
}[/CODE]можно переделать на LS

Добавлено: кодеки, соответ. версии java, брать отсюда, покладевать в jvm/lib/ext
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#18
ну как-то так вот (остальные либы здесь были и в гугле)<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">
Код:
Option Public
Option Declare
Use "ErrorHandling"
Use "StringBuffer"

Class Base64 As ErrorHandlerWJ
stringClass As JAVACLASS
BASE64 As JAVACLASS

Sub New
Set BASE64=jSession.GetClass({org/apache/commons/codec/binary/Base64})
Set stringClass=jSession.GetClass({java/lang/String})
End Sub

Function JString(xString As String)
On Error Goto ErrH
Set JString=stringClass.CreateObject("(Ljava/lang/String;)V", xString)
Quit:
Exit Function
ErrH:
Error 1024, RaiseError
Resume Quit
End Function

Function Encode(xString As String) As String
On Error Goto ErrH
Dim encoded, bytes As Variant
bytes=JString(xString).getBytes()
encoded=BASE64.encodeBase64(bytes)
Dim buf As New StringBuffer(16)
Forall b In encoded
buf.append(Chr(b))
End Forall
Encode=buf.toString()
Quit:
Exit Function
ErrH:
Error 1024, RaiseError
Resume Quit
End Function
End Class
Sub Initialize
On Error Goto ErrH
Dim encoder As New Base64
Msgbox encoder.Encode({test})
Quit:
Exit Sub
ErrH:
Error 1024, RaiseError
Resume Quit
End Sub
StringBuffer в виде %INCLUDE "StringBuffer.lss"
сам lss есть в гугле
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#19
в апачевской либе есть еще и такое Base64OutputStream(OutputStream out)
возможно что CreateObject примет на вход объект уже явл. java , как пример
Код:
Set FileOS = jSession.GetClass("java/io/FileOutputStream")
Set FileOSObj= FileOS.CreateObject("(Ljava/lang/String;)V", sPath)
типа
Код:
Set EncoderClass=jSession.GetClass({org/apache/commons/codec/binary/Base64OutputStream})
Set EncoderObj=EncoderClass.CreateObject({(Ljava/io/FileOutputStream;)V}, FileOSObj)
.................. тут типа в FileOSObj чета пишем
Call EncoderObj.close()
НО все эти сложности не нужны, для цели получения хмл
как можно заметить все это сильно усложняет код, а нужен всего-лишь XSL
 

duchan

Well-Known Member
20.09.2006
108
3
#20
Небольшой offtop:
lmike
это полная аналогия бриджа с COM - во внешний КОМ также не получится передать нотусневый объект (он о нем ничего не знает)
(Извени lmike просто резануло)
Не правильно, можно передать во внешний COM Notes-объект, лотус его в COM преобразует. см. мои древние изыскания на сей счет:
itforum.nsf: Тема: Передача Notes-объектов между модулями...