quinta-feira, 29 de maio de 2014

Zipar arquivos em Lotus Script com ls2j


Como Lotus Script não possui uma classe nativa para compactar arquivos no formato '.zip', Criei essa funcionalidade utilizando 'ls2j' para conectar na classe java.

Necessidade: O sistema deverá permitir a seleção de um arquivo no formato 'player.html' e o sistema deverá compactar toda a estrutura de diretórios do arquivo selecionado.


1º Criação de um agent Lotus Script com o código abaixo:



Option Public
Option Declare
UseLSX "*javacon"
Use "bib_zip"
Use "OpenLogFunctions" '// OpenLog para captura de erros 
Sub Initialize
On Error GoTo trataerro

Dim mySession As JavaSession
Dim zipClass As JavaClass 
Dim zipFileObject As JavaObject

Set mySession = New JavaSession()
Set zipClass = mySession.GetClass("br.com.zipFile.controller.ZiparArquivos")
Set zipFileObject = zipClass.CreateObject()

Dim ses_corrente As New NotesSession
Dim strDesktop As String

strDesktop  = getDiretorio(ses_corrente)

Dim ws_corrente As New NotesUIWorkspace
Dim varArqHtml As Variant

varArqHtml = ws_corrente.OpenFileDialog(False, "Selecione o arquivo 'Player.html' para anexar", "Htm|*.html", strDesktop)

If IsEmpty(varArqHtml) Then
MsgBox "Operação Cancelada"
Exit Sub
End If

Dim strArqHtmlDiretorio As String
Dim strArqHtmlNomeDir As String
strArqHtmlDiretorio = varArqHtml(0)

strArqHtmlDiretorio = StrLeftBack(strArqHtmlDiretorio,"\")
strArqHtmlNomeDir = StrRightBack(strArqHtmlDiretorio,"\")

Call zipFileObject.ziparArquivo(strArqHtmlDiretorio,strArqHtmlNomeDir)

Dim returnZipPath As String

returnZipPath =   zipFileObject.getZippedFilePath()  

Dim iuD_corrente As NotesUIDocument
Set iuD_corrente = ws_corrente.currentDocument
Dim doc_atual As NotesDocument
Set doc_atual = iuD_corrente.Document

' //define o campo como notesrichtextitem p/poder anexar
Dim rti_anexo As NotesRichTextItem

set  rti_anexo = doc_atual.Getfirstitem("ca_AnexoConvertido")

If Not rti_anexo Is Nothing Then
Call rti_anexo.Remove()
End If

Set rti_anexo = New NotesRichTextItem(doc_atual, "ca_AnexoConvertido")

Call  rti_anexo.EmbedObject( EMBED_ATTACHMENT, "", returnZipPath)
Call doc_atual.Save(True,False)
doc_atual.SaveOptions = "0"
Call iuD_corrente.Close()
Call ws_corrente.editDocument(True,doc_atual,False)

Exit Sub
trataerro:
MsgBox | Erro na linha | & CStr(Erl) & | tipo | & CStr(Err) & |   |  & CStr(Error) , 16, |Operação Cancelada|
Call LogError()
Exit Sub
End Sub

Function getDiretorio(ses_session As NotesSession) As String


On Error GoTo trataerro

getDiretorio = ""

Dim strAux As String

strAux = Environ("HomePath")
If (Trim(strAux)<>"") Then
getDiretorio = strAux + |\Desktop|
Exit  Function
End If

strAux = Environ("HOMEDRIVE")
If (Trim(strAux)<>"") Then
getDiretorio = strAux
Exit  Function
End If

strAux = ses_session.GetEnvironmentString("Directory",True)
If (Trim(strAux)<>"") Then
getDiretorio = strAux
Exit  Function
End If

strAux = ses_session.GetEnvironmentString("Location",True)
If (Trim(strAux)<>"") Then
getDiretorio = strAux
Exit  Function
End If

trataerro:
Call AddtoStackTrace()
End Function

2º Criação da biblioteca de script 'bib_zip'  em Java com os métodos p/compactar.

Classe Progresso.  => Progressive dialog


package br.com.zipFile.view;

import java.awt.Window;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

import javax.swing.ProgressMonitor;

public class Progresso {


ProgressMonitor progress;

public Progresso(String strMensagem, String strAlerta, int intMaximo){
JFrame frame = new JFrame();
WindowListener exitListener;

exitListener = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Window window = e.getWindow();
window.setVisible(false);
window.dispose();
System.exit(0);
}
};
frame.addWindowListener(exitListener);

progress = new ProgressMonitor(frame, strMensagem, strAlerta, 0, intMaximo);
}
public void setProgresso(int intProgresso){
progress.setProgress(intProgresso);
}
public boolean cancelado(){
return progress.isCanceled();
}
}



Classe  model => compactar os arquivos


package br.com.zipFile.model;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import br.com.zipFile.view.Progresso;


public class ZipFolder {


List fileList;
private String sourceFolder = "";

public ZipFolder(String sourceFolder){
this.sourceFolder = sourceFolder;
fileList = new ArrayList(); 
}

public void zipIt(String zipFile){

byte[] buffer = new byte[1024];
Progresso progresso = new Progresso("Compactando arquivos...", "Aguarde...", fileList.size()-1);
   int counter = 0;
try{
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);

for(String file : this.fileList){
ZipEntry ze= new ZipEntry(file);
zos.putNextEntry(ze);
FileInputStream in = new FileInputStream(sourceFolder + File.separator + file);

int len;
while ((len = in.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}

if(progresso.cancelado()){
break;
}

progresso.setProgresso(counter);
counter++;
in.close();
}

zos.closeEntry();
zos.close();

}catch(IOException ex){
ex.printStackTrace();   
}
}

public void generateFileList(File node){
//add file only
if(node.isFile()){
fileList.add(generateZipEntry(node.getAbsoluteFile().toString()));
}

if(node.isDirectory()){
String[] subNote = node.list();
for(String filename : subNote){
generateFileList(new File(node, filename));
}
}
}

private String generateZipEntry(String file){
return file.substring(sourceFolder.length()+1, file.length());
}
}



Classe  ZiparArquivos => principal


package br.com.zipFile.controller;

import java.io.File;

import java.text.SimpleDateFormat;
import java.util.Date;

import br.com.zipFile.model.ZipFolder;


public class ZiparArquivos {


private String destinationFileName = null;

public ZiparArquivos(){
}

public void ziparArquivo(String caminhoArquivoHtml,String arquivoHtml) {

String sourceFolder = "";
String destinationFolder = "";
sourceFolder = caminhoArquivoHtml;

if(sourceFolder != null){
destinationFolder = System.getProperty("java.io.tmpdir");
Date data = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy-HHmmss"); 
destinationFileName = destinationFolder + arquivoHtml + "_" + dateFormat.format(data) + ".zip"; 
ZipFolder zipFolder = new ZipFolder(sourceFolder);
zipFolder.generateFileList(new File(sourceFolder));
zipFolder.zipIt(destinationFileName);
}
}
public String getZippedFilePath(){
return destinationFileName;
}
}