⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servercorbatransport.java

📁 数字图书馆的互操作接口
💻 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 + -