Java агент

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#1
я написал агент, который берет параметры из профайла - селективную формулу и имя поля,
затем по этим параметрам получает сортированный массив(тип Vector) и сохраняет в поле этого же профайла этот массив..
НО на самом деле нечего не сохраняется.
агент вызывается скриптом agent.Run или agent.Runonserver
класс агента является наследником от AgentBase..
в дебагере я проверял все правильно - данные получаются, созраняются, затем для контроля вызываю метод, который проверяет, есть ли данные в поле документа - они там есть.
но после завершения работы агента в лотус-скрипте получаю (дебагер) профайл - поле пустое..

какие есть соображения ? в чем тут может быть дело ?

кроме того лотус подвисает на минуту пока агент выпоняется - это слишком долго по сравнению с десятком функций реализующих тоже самое на лотус скрипте :)

так с производительностью все ясно - ошибка была... тем не менее скрипт быстрее в 4 раза
 

LuMee

Well-Known Member
02.05.2006
477
0
#2
Я думаю, неплохо было бы привести код агента, а также скрипта, который результаты его работы принимает. Просто у меня похожие проблемы были, мож смогу вспомнить, в чем затык.
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#3
в тот же профайл, из которого берутся параметры не сохраняется.. поэтому решил в новый документ сохранять данные..

кнопка
Код:
Sub Click(Source As Button)
Dim ses As New NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Dim profile As NotesDocument
Dim formula As String
Dim varData As Variant
Dim choice As Variant	
Dim key As String
Dim coll As NotesDocumentCollection	
try:
On Error Goto catch	
key = Lcase(Trim(Inputbox("","")))
If key = "" Then Exit Sub	

Set db = ses.CurrentDatabase	

Dim startTime As New NotesDateTime(Now)	

formula = {SELECT Form = "fa_Person" & fl_JobTitle != "Супервайзер" & fl_Deleted !="1"} +_
{& @contains(@LowerCase(} + FIELD_FULLNAME + {);"} + key + {")}	

Set profile = db.GetProfileDocument("Formula","")  

Call profile.ReplaceItemValue("Formula", Formula)		
Call profile.ReplaceItemValue("FieldName",FIELD_FULLNAME)		

Call profile.Save(True, False)
Set profile = Nothing

Set agent = db.GetAgent("aa_Make")
If agent Is Nothing Then Exit Sub
Call agent.Run

Dim endTime As New NotesDateTime(Now)

Set profile = db.GetProfileDocument("Formula")

varData = profile.GetItemValue("Responce")
If Trim(Cstr(varData(0)))<>"" Then choice = workspace.Prompt(4, Cstr(endTime.TimeDifference(startTime)), "Profile", varData(0), varData)	

Call profile.Remove(True)

Exit Sub
catch:
Print Getthreadinfo(1),Err,Error,Erl
Exit Sub
End Sub
агент
Код:
import lotus.domino.*;
import java.util.*;

public class JavaAgent extends AgentBase {
Database DB;
DocumentCollection coll;
String query, objectName;
String[]params = new String[1];
Vector responce = new Vector();

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
DB = agentContext.getCurrentDatabase();

// параметры: 
params = getParams(DB, params.length);
if (params != null){				
query = params[0];			// формула отбора			
objectName = params[1];		// поле, по которому строится отбор					

if (query != ""){
try {
coll = DB.search(query);//коллекция по формуле отбора				
if (coll.getCount() > 0){							
// получить сортированный массив соответствий запросу							
responce = getSortedData(coll,objectName);
if (responce != null){
setData(DB,responce);	
//testing


}							
}	
}catch(Exception e) {
e.printStackTrace();
}
}
}

} catch(Exception e) {
e.printStackTrace();
}
};

// занести массив в поле документа
void setData(Database db, Vector v){
try {			
//Document doc = db.createDocument();
Document doc = db.getProfileDocument("Formula",null);
//doc.replaceItemValue("Form", "Formula");			 
doc.replaceItemValue("Responce", v);

if (doc.save(true,false))
prt("Document saved");
else
prt ("Something went wrong");
doc = null;

}catch(Exception e) {
e.printStackTrace();			
}	
}

// вывод текста
void prt(String s) {System.out.println(s);}

// получить сортированный Vector-массив соответствий запросу
Vector getSortedData(DocumentCollection coll, String objectName){		
Document doc;
Vector resp = new Vector();		
List list = new ArrayList();
String objectValue;			

try { 
doc = coll.getFirstDocument();
while (doc != null){
objectValue = doc.getItemValueString(objectName);
if (list.contains(objectValue)== false )
list.add(objectValue);							
doc = coll.getNextDocument(doc);					
}	 
Collections.sort(list);	
// трансформировать список в вектор			
resp = listToVector(list);

}catch(Exception e) {
e.printStackTrace();			
}	
return resp;
}

// трансформировать список в вектор
Vector listToVector(List l){
Vector v = new Vector();		
try {
for (int i = 0; i < l.size(); i++){				
v.addElement(l.get(i));
}			
}catch(Exception e) {
e.printStackTrace();
}		
return v;
}

// получение параметров
String[] getParams(Database db, int dim){
String[] p = new String[dim+1];		 
try {
Document profile = db.getProfileDocument("Formula", null);
if (profile.hasItem("Formula")){
p[0] = profile.getItemValueString("Formula");
p[1] = profile.getItemValueString("FieldName");	
profile = null;
return p;					
}
else
return null;									
}catch(Exception e) {
e.printStackTrace();
return null;
}		
}
};
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#4
кто писал апплеты, работающие с документам приведите, пожалуйста, каркас апплета с инициализацией сессии, и собственно как апплет прикручивается к лотусу ??

собственно, меня интересует механизм: передача параметров в java - работа с документами - возврат параметра в лотус-скрипт
 
V

v2v

Гость
#5
Вопрос.
Я написал ява агент и ещё один класс в этом же ява агенте, теперь я хочу использовать этот класс в другом агенте.
попробывал вынести его в ява скрипт лайбрари, но вот возникла незадача, как мне теперь подключить в агенте эту библиотеку.