?? servercorbatransport.java
字號:
package dli2fe.helpers;
/**
* Title: Digial Library Interoperable Interface Fudan Edition
* Description: This project contains all the classes required for DLI2FE interface. Developers use these classes to implement the wrapper and client side codes. The basic functions of DLI2FE is as follows:
* Search: Search a digital library source site.
* Metadata: Fetch metadata for a site.
* ResultAccess: Get results for a given query.
* DLI2FE uses Dublin Core as the basic attribute model, DAV/DASL as the general XML-based query language and CORBA as distributed object transportation mechanism.
* Copyright: Copyright (c) 2001
* Company: Fudan University
* @author Carl Tao
* @version 1.0
*/
import dli2fe.CORBA.*;
import dli2fe.http.*;
import java.io.*;
import java.util.*;
import java.net.*;
import org.omg.PortableServer.*;
public class ServerCORBATransport extends DLI2FEIntfPOA implements HTTPCallback, Runnable {
static org.omg.CORBA.ORB orb;
static POA poa;
static POA rootPOA;
static Hashtable lsps = new Hashtable();
Object lsp;
String ior;
public ServerCORBATransport(String lspPath, Object lsp) throws Exception {
this.lsp = lsp;
lsps.put(lspPath, this);
register(this);
}
public ServerCORBATransport() {
}
public ServerCORBATransport(Object lsp) throws Exception {
this("/", lsp);
}
public void addLSP(String lspPath, Object lsp) throws Exception {
if (! (lsp instanceof dli2fe.Metadata) || ! (lsp instanceof dli2fe.Searcher))
throw new RuntimeException("LSP must implement Metadata and Searcher interface.");
ServerCORBATransport tm = new ServerCORBATransport(lspPath, lsp);
}
public void addLSP(Object lsp) throws Exception {
addLSP("/", lsp);
}
public ServerCORBATransport getLSP(String lspPath) {
return (ServerCORBATransport)lsps.get(lspPath);
}
protected Object getServerImpl() {
return lsp;
}
void register(org.omg.PortableServer.Servant servant) throws Exception {
boolean initORB = (orb == null);
if (initORB) {
String args[] = new String[1];
orb = org.omg.CORBA.ORB.init(args, null);
//String services[] = orb.list_initial_services();
//System.out.println(services);
rootPOA = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
// Create policies for our persistent POA
org.omg.CORBA.Policy[] policies = {
rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT)
};
poa = rootPOA.create_POA("dli2fe",
rootPOA.the_POAManager(),
policies);
}
// Create my POA with the right policies
byte[] servantID = getServerImpl().toString().getBytes();
poa.activate_object_with_id(servantID, servant);
if (initORB)
rootPOA.the_POAManager().activate();
org.omg.CORBA.Object o = poa.servant_to_reference(servant);
ior = orb.object_to_string(o);
System.out.println("DLI2FE/CORBA ORB Running");
Thread t1 = new Thread(this);
t1.start();
// Start web server
if (initORB) {
int port = dli2fe.DLI2FE.NameServerDefaultPort;
try {
port = Integer.parseInt( System.getProperty(dli2fe.DLI2FE.NameServerJVMParName) );
} catch (Exception any) {}
new HTTPServer(this, port);
}
}
// Web server processor
public void process(Socket socket, InputStream in, OutputStream out) throws Exception {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
try {
BufferedReader din = new BufferedReader(new InputStreamReader( in ));
String line = din.readLine();
if(line.startsWith("GET ")) {
StringTokenizer st = new StringTokenizer(line);
st.nextToken();
String lspPath = st.nextToken();
ServerCORBATransport lsp = getLSP(lspPath);
if (lsp != null)
System.out.println(lsp);
else
System.out.println("lsp null");
if(lsp == null) {
pw.println("HTTP/1.0 400 Not Found\nContent-Type: text/html");
pw.println();
pw.println("<p>No CORBA object found for \"" + lspPath + "\".");
if(lsps.size() > 0) {
pw.println("<p>Available LSPs:<p><table cellpadding=5 border=1><tr><td><b>LSP</td><td><b>Description</td></tr>");
for(Enumeration en = lsps.keys(); en.hasMoreElements();) {
String lp = (String)en.nextElement();
pw.println("<tr><td><tt><a href='" + lp + "'>" + lp + "</a></tt></td><td>" + getLSP(lp).getServerImpl() + "</td></tr>");
}
pw.println("</table>");
} else
pw.println("<p>No LSPs are registered.");
pw.close();
return;
}
pw.println("HTTP/1.0 200 OK\nContent-Type: text/plain");
pw.println();
pw.println(lsp.ior);
pw.println();
pw.close();
}
} catch (Exception any) {
}
}
public String toString() {
return "[DLI2FE/CORBA Server Transport]";
}
String notNull(String s) {
return s == null ? "" : s;
}
void throwCORBAException(Exception se) throws DLI2FEException {
if (se instanceof dli2fe.DLI2FEException) {
String details = null;
dli2fe.DLI2FEException ex = (dli2fe.DLI2FEException)se;
try {
details = ex.getDetails().getString();
} catch (Exception any) {}
throw new DLI2FEException(ex.getCode(), notNull(ex.getReason()), notNull(details));
} else {
throw new DLI2FEException(dli2fe.DLI2FEException.SERVICE_UNAVAILABLE_EXC, String.valueOf(se), "");
}
}
void checkMetadataInterface(Object obj) throws dli2fe.DLI2FEException {
if (! (obj instanceof dli2fe.Metadata) ) {
throw new dli2fe.DLI2FEException(dli2fe.DLI2FEException.NOT_IMPLEMENTED_EXC, "Metadata interface not implemented");
}
}
void checkSearcherInterface(Object obj) throws dli2fe.DLI2FEException {
if (! (obj instanceof dli2fe.Searcher) ) {
throw new dli2fe.DLI2FEException(dli2fe.DLI2FEException.NOT_IMPLEMENTED_EXC, "Searcher interface not implemented");
}
}
void checkResultAccessInterface(Object obj) throws dli2fe.DLI2FEException {
if (! (obj instanceof dli2fe.ResultAccess) ) {
throw new dli2fe.DLI2FEException(dli2fe.DLI2FEException.NOT_IMPLEMENTED_EXC, "ResultAccess interface not implemented");
}
}
public void getSiteMetadata (org.omg.CORBA.StringHolder theSiteMetadata) throws dli2fe.CORBA.DLI2FEException {
SimpleXMLObject siteMetadata = new SimpleXMLObject();
try {
checkMetadataInterface(lsp);
((dli2fe.Metadata)lsp).getSiteMetadata(siteMetadata);
} catch (Exception se) {
throwCORBAException(se);
}
theSiteMetadata.value = notNull(siteMetadata.getString());
}
public void getAttributeInfo (java.lang.String ctgrName,
org.omg.CORBA.StringHolder attributeInfo) throws dli2fe.CORBA.DLI2FEException {
SimpleXMLObject attrInfo = new SimpleXMLObject();
try {
checkMetadataInterface(lsp);
((dli2fe.Metadata)lsp).getAttributeInfo(ctgrName, attrInfo);
} catch (Exception se) {
throwCORBAException(se);
}
attributeInfo.value = notNull(attrInfo.getString());
}
public void search (int clientSID,
java.lang.String subcols,
java.lang.String query,
int numDocs,
java.lang.String docPropList,
java.lang.String queryOptions,
org.omg.CORBA.IntHolder expectedTotal,
org.omg.CORBA.IntHolder serverSID,
org.omg.CORBA.StringHolder result) throws dli2fe.CORBA.DLI2FEException {
SimpleXMLObject xResult = new SimpleXMLObject();
expectedTotal.value = dli2fe.Searcher.UNKNOWABLE;
try {
checkSearcherInterface(lsp);
((dli2fe.Searcher)lsp).search(clientSID,
new SimpleXMLObject(subcols),
new SimpleXMLObject(query),
numDocs,
new SimpleXMLObject(docPropList),
new SimpleXMLObject(queryOptions),
expectedTotal,
serverSID,
xResult);
} catch (Exception se) {
throwCORBAException(se);
}
result.value = notNull(xResult.getString());
}
public void getSessionInfo (int serverSID,
org.omg.CORBA.IntHolder expectedTotal,
org.omg.CORBA.IntHolder stateTimeout) throws dli2fe.CORBA.DLI2FEException {
try {
checkResultAccessInterface(lsp);
((dli2fe.ResultAccess)lsp).getSessionInfo(serverSID, expectedTotal, stateTimeout);
} catch (Exception se) {
throwCORBAException(se);
}
}
public void getDocs (int serverSID,
int reqID,
java.lang.String docPropList,
java.lang.String docsToGet,
org.omg.CORBA.StringHolder res) throws dli2fe.CORBA.DLI2FEException {
SimpleXMLObject result = new SimpleXMLObject();
try {
checkResultAccessInterface(lsp);
((dli2fe.ResultAccess)lsp).getDocs(serverSID,
reqID,
new SimpleXMLObject(docPropList),
docsToGet,
result);
} catch (Exception se) {
throwCORBAException(se);
}
res.value = notNull(result.getString());
}
public void extendStateTimeout (int serverSID,
int secondsToExtend) throws dli2fe.CORBA.DLI2FEException {
try {
checkResultAccessInterface(lsp);
((dli2fe.ResultAccess)lsp).extendStateTimeout(serverSID, secondsToExtend);
} catch (Exception se) {
throwCORBAException(se);
}
}
public void cancelRequest (int serverSID,
int reqID) throws dli2fe.CORBA.DLI2FEException {
try {
checkResultAccessInterface(lsp);
((dli2fe.ResultAccess)lsp).cancelRequest(serverSID, reqID);
} catch (Exception se) {
throwCORBAException(se);
}
}
public void run() {
if (orb == null) {
System.out.println("Error initializing ORB.");
}
orb.run();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -