очевидной целью является "плавный" переход от классики или вызов java для ф-ций, которые по той или иной причине засунуть в агент будет проблематичным/рискованным/неудобным
Для версий нотусни, в которых нет класов обработки http запросов (ниже 10.0) или нет желания постигать дзен новых классов из LS, подход будет заключаться в вызове java агента, с единственной целью - вызвать и обработать результат от xpage
Основны "хитрости":
- авторизация (создание передача сессии)
- обработка ситуации с прокси сервером
- обработка результата и формирование ответа
первое и второе (в коде ниже) я здесь уже описывал, последнее предполагается задействовать через документ. Вполне возможно передавать и бинарные объекты, но обработка их в ЛС не очень удобна, да и часто конечным "потребителем" будет документ.
Коротко схема такова:
Код на ЛС -> вызов java агента с документом контекста (поля которого заполняются соответственно потребностям) -> кода java обрабатывающий вызов и возврат параметров xpage
Ниже код агента и библиотеки с обработкой:
пример вызова из ЛС
Для версий нотусни, в которых нет класов обработки http запросов (ниже 10.0) или нет желания постигать дзен новых классов из LS, подход будет заключаться в вызове java агента, с единственной целью - вызвать и обработать результат от xpage
Основны "хитрости":
- авторизация (создание передача сессии)
- обработка ситуации с прокси сервером
- обработка результата и формирование ответа
первое и второе (в коде ниже) я здесь уже описывал, последнее предполагается задействовать через документ. Вполне возможно передавать и бинарные объекты, но обработка их в ЛС не очень удобна, да и часто конечным "потребителем" будет документ.
Коротко схема такова:
Код на ЛС -> вызов java агента с документом контекста (поля которого заполняются соответственно потребностям) -> кода java обрабатывающий вызов и возврат параметров xpage
Ниже код агента и библиотеки с обработкой:
Java:
//***************************************************
//агент
import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session ses = getSession();
AgentContext agentContext = ses.getAgentContext();
// (Your code goes here)
Document doc=agentContext.getDocumentContext();
if (doc!=null){
//agentContext could contains document with parameters
doc.replaceItemValue("result", org.mypackage.XAgent.run(ses, agentContext));
doc.recycle();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
//***************************************************
//библиотека
package org.mypackage;
import lotus.domino.Session;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import lotus.domino.AgentContext;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.Name;
import lotus.domino.NotesException;
//import org.apache.commons.lang.*;
public class XAgent {
private static boolean isError=true;
public static String run(Session ses, AgentContext agentContext) throws NotesException {
String url = null;
StringBuffer buf=new StringBuffer();
int status=-1;
Document doc=agentContext.getDocumentContext();
if (doc!=null){
String xpageName=doc.getItemValueString("xpage");
String domain=doc.getItemValueString("domain");
String params=doc.getItemValueString("params");
Database db=agentContext.getCurrentDatabase();
String dbPath = agentContext.getCurrentDatabase().getFilePath();
String server=db.getServer();
if (!xpageName.isEmpty()){
try {
System.out.println("Trusting...");
TrustAllCertificates.install();
System.out.println("Generating token...");
LtpaToken ltpaToken=new LtpaToken();
ltpaToken.initByConfiguration(ses);
String token=ltpaToken.generateLtpaToken(ses.getEffectiveUserName());
System.out.println("Context processing...");
//dbPath=db.getHttpURL();
//System.out.println("path->"+dbPath);
if (domain.isEmpty())domain=ltpaToken.getDomain();
Name name=ses.createName(server);
server=name.getCommon();
//doc.recycle();
url = "https://"+server+domain+"/" + dbPath + "/" + xpageName + ".xsp" + ((params.length())>0?"?"+params:"");
url = "https://"+server+domain+"/" + dbPath.replace("\\", "/") + "/" + xpageName + ".xsp";
System.out.println("Starting " + xpageName + " in database " + dbPath);
System.out.println("URL to connect->"+url);
assignSystemProxy(url);
String cookies="LtpaToken=" + token;// + "; domain=" + domain.substring(1) + "; path=/";
System.out.println("Cookies->"+cookies);
doc.recycle();
db.recycle();
URL xPageURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) xPageURL.openConnection();
conn.setRequestProperty("Cookie", cookies);
//conn.connect();
status=conn.getResponseCode();
switch (status) {
case HttpURLConnection.HTTP_OK:
// read from the urlconnection via the bufferedreader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
buf.append(line);
//System.out.println("Response: " + line);
}
bufferedReader.close();
isError=false;
break;
case HttpURLConnection.HTTP_INTERNAL_ERROR:
buf.append("Interal server error while running");
System.out.println(buf.toString());
break;
default:
buf.append(conn.getResponseMessage());
System.out.println("An error occurred: " + status);
System.out.println("Error message: " + buf.toString());
break;
}
conn.disconnect();
System.out.println("Finished " + xpageName + " in database " + dbPath);
} catch (Exception e) {
System.out.println("!URL->"+url);
e.printStackTrace();
buf.append(e.getMessage());
}
String res="";
if (isError)res="{,\n\"error\":true}";
return "{\"status\":"+status+", \"msg\":\""
+org.apache.commons.lang.StringEscapeUtils.escapeHtml(buf.toString())+"\""+
res+"}";
}
}
return "{\"status\":"+status+", \"msg\":\""
+((status==HttpURLConnection.HTTP_OK)?
buf.toString():
org.apache.commons.lang.StringEscapeUtils.escapeHtml(buf.toString()))+"\"}";
}
static void assignSystemProxy(String url){
System.setProperty("java.net.useSystemProxies", "true");
System.out.println("detecting proxies");
List l = null;
try {
l = ProxySelector.getDefault().select(new URI(url));
}
catch (URISyntaxException e) {
e.printStackTrace();
}
if (l != null) {
for (Iterator iter = l.iterator(); iter.hasNext();) {
java.net.Proxy proxy = (java.net.Proxy) iter.next();
System.out.println("proxy type: " + proxy.type());
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if (addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname: " + addr.getHostName());
System.setProperty("http.proxyHost", addr.getHostName());
System.out.println("proxy port: " + addr.getPort());
System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
}
}
}
}
}
Код:
Option Public
Option Declare
Use "ErrorHandlingLS"
Sub Initialize
On Error Goto ErrH
Goto Continue
ErrH:
Error Err, RaiseError
Continue:
Dim doc As NotesDocument, ses As New NotesSession, db As NotesDatabase
Set db=ses.Currentdatabase
Set doc=db.Createdocument()
doc.Replaceitemvalue {xpage}, {groupingreport}
Call db.Getagent({JXAgent}).Runwithdocumentcontext(doc, doc.Noteid)
Messagebox doc.Getitemvalue({result})(0)
End Sub
Последнее редактирование: