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

Тема в разделе "Lotus - Программирование", создана пользователем seoman2, 16 апр 2014.

  1. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Вопрос 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 какой-то")

    - не работает
     
  2. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    мне в свое время не помогло, просто вызывать, делал так:
    Код (LotusScript):
            Set jMethod = jClass.Getmethod("setStyle", {()V})

    Call jMethod.Invoke(jMenu)
    Сигнатуры можно получить так:
    Код (LotusScript):
    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
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    seoman2 я понимаю, что разобраться в XSLT вам просто лень...
    хотя именно такой путь и даст результат наименее затратным методом (джаву учить не надо, а ХСЛ - процедурный язык)
    но вы еще и не желаете задуматься о применении надлежащих ф-ций
    Код (LotusScript):
        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. ничего и не выйдет - попрание всех типов и преобразование не даст желаемого
    так писать нельзя
     
  5. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    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
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    seoman2
    Объект
    Вы help по LS2J читали или сразу в бой?
    LS2J On-line help
     
  7. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Получает 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(,лотус объект) ?
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    классика жанра :) здесь взять dxl2fo.xsl
    чистый хмл - это как? ;)

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    хз, не силен как lmike , но если смотреть на аналогии с моим, как то так:
    Код (LotusScript):
    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
     
  10. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    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)
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    путь - это не объект LS, а стринг, его передавать можно
    вопрос в либе - кот. нам не известна - что она хочет на вход
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    еще вопрос, что она хочет отдать...
    Потому что судя по сигнатуре: "(Ljava/lang/String;)V"
    Функция encodeFile получает на вход строку, а возвращает void в чистом виде, то есть: ничего!
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    seoman2 вот элементарное подключение java декодера/энкодера в LS:
    Код (LotusScript):
            Set encoderClass=jSession.Getclass({java/net/URLEncoder})
    Set decoderClass=jSession.Getclass({java/net/URLDecoder})
    вот их использование:
    Код (LotusScript):
        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
    понять вашу глубокую мысль - я не в состоянии
    т.е. мне непонятно чего куда и зачем пихается, как и конечная цель сего действа
     
  14. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Для чего вообще нужны эти сигнатуры? "(Ljava/lang/String;)V"
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    seoman2 они не нужны..., если...: не использовать конструкторы с параметрами и не вызывать методы как описал savl
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    оговорка, код выше - это URLEncoder
    Base64 - это другой класс
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    в догонку - есть апач либа, кот. предоставляет 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
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    ну как-то так вот (остальные либы здесь были и в гугле)<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">
    Код (LotusScript):
    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 есть в гугле
     
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    Небольшой offtop:
    lmike
    (Извени lmike просто резануло)
    Не правильно, можно передать во внешний COM Notes-объект, лотус его в COM преобразует. см. мои древние изыскания на сей счет:
    itforum.nsf: Тема: Передача Notes-объектов между модулями...
     
Загрузка...

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