Changeset 15373 for gli


Ignore:
Timestamp:
2008-05-09T14:41:48+12:00 (16 years ago)
Author:
ak19
Message:
  1. FedoraLogin loops on exception; 2. When using FLI and GS server is not remote, gsdl.xml file is written into Fedora server end telling it the location of the Greenstone collect directory containing the FedoraMETS to be ingested
File:
1 edited

Legend:

Unmodified
Added
Removed
  • gli/trunk/src/org/greenstone/gatherer/Gatherer.java

    r15083 r15373  
    8181        * change the regex in the gs3-release-maker code and in this message
    8282        */
     83
    8384    static final public String PROGRAM_VERSION = "svn-trunk";
    8485
     
    853854        }
    854855    }
     856   
     857    boolean showLogin = true;
     858 
     859    do {
     860        if(!dialog.loginRequested()) { // user pressed cancel to exit the FedoraLogin dialog
     861        System.exit(0);
     862        } else {
     863        showLogin = dialog.loginRequested();
     864        String hostname = dialog.getHostname();
     865        String port     = dialog.getPort();
     866        String username = dialog.getUsername();
     867        String password = dialog.getPassword();
     868        String protocol = dialog.getProtocol();
    855869       
    856     if (dialog.loginRequested()) {
    857 
    858         String hostname = dialog.getHostname();
    859         String port     = dialog.getPort();
    860         String username = dialog.getUsername();
    861         String password = dialog.getPassword();
    862         String protocol = dialog.getProtocol();
    863 
    864         Configuration.fedora_info.setHostname(hostname);
    865         Configuration.fedora_info.setPort(port);
    866         Configuration.fedora_info.setUsername(username);
    867         Configuration.fedora_info.setPassword(password);
    868         Configuration.fedora_info.setProtocol(protocol);
    869 
    870         String ping_url_str = protocol + "://" + hostname + ":" + port + "/fedora";
    871         String login_str = username + ":" + password;
     870        Configuration.fedora_info.setHostname(hostname);
     871        Configuration.fedora_info.setPort(port);
     872        Configuration.fedora_info.setUsername(username);
     873        Configuration.fedora_info.setPassword(password);
     874        Configuration.fedora_info.setProtocol(protocol);
    872875       
    873         String login_encoding = new sun.misc.BASE64Encoder().encode(login_str.getBytes());
    874 
    875 
    876         try {
    877         URL ping_url = new URL(ping_url_str);
    878         URLConnection uc = ping_url.openConnection();
    879         uc.setRequestProperty  ("Authorization", "Basic " + login_encoding);
    880         // Attempt to access some content ...
    881         InputStream content = (InputStream)uc.getInputStream();
    882 
    883         }
    884         catch (Exception exception) {
    885         System.err.println("****");
    886         System.err.println("* Failed to connect to Fedora server.");
    887         System.err.println("* Server might not be running, or incorrect username and/or password.");
    888         System.err.println("***");
    889         DebugStream.printStackTrace(exception);
    890         System.exit(1);
    891         }
    892     }
    893     else {
    894         System.exit(0);
    895     }
    896 
    897 
    898     dialog.dispose();
    899     dialog = null;
    900 
    901 
     876        String ping_url_str = protocol + "://" + hostname + ":" + port + "/fedora";
     877        String login_str = username + ":" + password;
     878       
     879        String login_encoding = new sun.misc.BASE64Encoder().encode(login_str.getBytes());
     880               
     881        try {
     882            URL ping_url = new URL(ping_url_str);
     883            URLConnection uc = ping_url.openConnection();
     884            uc.setRequestProperty  ("Authorization", "Basic " + login_encoding);
     885            // Attempt to access some content ...
     886            InputStream content = (InputStream)uc.getInputStream();
     887           
     888            // if no exception occurred in the above, we would have come here:
     889            showLogin = false;
     890            dialog.dispose();
     891        }
     892        catch (Exception exception) {
     893            String[] errorMessage = {"Failed to connect to the Fedora server.", "It might not be running, or",
     894                         "incorrect username and/or password."};
     895            dialog.setErrorMessage(errorMessage);
     896            DebugStream.printStackTrace(exception);
     897            // exception occurred, show the dialog again (do this after printing to
     898            // debugStream, else the above does not get done for some reason).
     899            dialog.setVisible(true);
     900        }
     901        }
     902    } while(showLogin);
     903
     904    dialog = null; // no more need of the dialog
     905   
     906    // Now we are connected. Need to tell fedora where to find the FedoraMETS
     907    // files for ingestion
     908
     909    //Fedora needs an xml file:
     910    // FEDORA_HOME/tomcat/conf/Catalina/<fedora-hostname OR localhost>/gsdl.xml
     911    // (which is to be wherever fedora.xml is situated) in order to know where
     912    // to get the collection contents from.
     913    writeGsdlXmlFile();
     914
     915    }
     916
     917    /** Fedora needs an xml file:
     918     *  FEDORA_HOME/tomcat/conf/Catalina/[fedora-hostname OR localhost]/gsdl.xml
     919     * (host folder is the one wherever fedora.xml is found) in order to know where
     920     * to get the collection contents from.
     921     * This method generates the necessary gsdl.xml file which points Fedora to the
     922     * parent of the collect folder.
     923    */
     924    private static void writeGsdlXmlFile() {
     925    // System.getenv(FEDORA_HOME) is deprecated in Java v4 (but is back in v5).
     926    // But fedora_info.getHome() will return FEDORA_HOME.
     927
     928    // To do the following, we actually need to stop and restart the Fedora server.
     929    // Why should FLI have to do all this, or even know that it needs doing?
     930    String execExtension = Utility.isWindows() ? "bat" : "sh";
     931    String fedoraProcess = Configuration.fedora_info.getHome()+"tomcat"
     932        +File.separator+"bin"+File.separator;
     933    String fedoraStop = fedoraProcess+"shutdown."+execExtension;
     934    String fedoraStart = fedoraProcess+"startup."+execExtension;
     935    String errorMessage = "";
     936   
     937    try{
     938        // (1) stop the fedora server
     939        errorMessage = "Failed to stop the fedora server.";
     940
     941        Process process = Runtime.getRuntime().exec(fedoraStop);
     942        System.err.println("*****Stopping the fedora server: " + fedoraStop);
     943        int exitValue = -1;
     944        if((exitValue = process.waitFor()) != 0) {
     945        throw new Exception(errorMessage);
     946        }
     947        System.out.println("Exit value is: " + exitValue);
     948       
     949        // (2) See if the folder for the host contains fedora.xml, if it doesn't,
     950        // then don't write gsdl.xml in there, try folder "localhost" instead
     951        String pathPrefix = Configuration.fedora_info.getHome()+"tomcat"+File.separator+"conf"
     952        +File.separator+"Catalina";
     953        String gsdlHostFolderPath = pathPrefix+File.separator+Configuration.fedora_info.getHostname();
     954        File fedoraXML = new File(gsdlHostFolderPath,"fedora.xml");
     955        if(!fedoraXML.exists()) {
     956        // prepare the errorMessage just in case we need it
     957        errorMessage = "Directory " + gsdlHostFolderPath + " is the wrong place to put"
     958            + " the crucial gsdl.xml file as it doesn't contain the example file fedora.xml\n";
     959           
     960        // no default fedora.xml file in the folder we want to write gsdl.xml to
     961        // so we may be in the wrong place
     962        if(Configuration.fedora_info.getHostname().equals("localhost")) {
     963            // if we just tried localhost and then failed
     964            // we can't continue
     965            fedoraXML = null;
     966            throw new Exception(errorMessage);         
     967        } else {
     968            System.err.println("*** Folder " + gsdlHostFolderPath
     969            +"\nis the wrong location for gsdl.xml. Trying folder localhost.");
     970            // we just tried a folder of a different hostname,
     971            // let's try "localhost" as a last ditch effort
     972            gsdlHostFolderPath = pathPrefix+File.separator+"localhost";
     973            fedoraXML = new File(gsdlHostFolderPath,"fedora.xml");
     974            if(!fedoraXML.exists()){
     975            fedoraXML = null;
     976            throw new Exception(errorMessage);
     977            } // else we found the location for gsdl.xml
     978        }
     979        }
     980
     981        // If we made it here, we found the correct folder to write gsdl.xml to
     982        errorMessage = "";
     983        fedoraXML = null;
     984        File gsdlXMLPath = new File(gsdlHostFolderPath);
     985        if(!gsdlXMLPath.exists()) {
     986        // make sure all the intermediate directories exist
     987        // (should be the case when fedoraXML exists in it)
     988        gsdlXMLPath.mkdirs();
     989        }
     990        String gsdlXMLFile = gsdlXMLPath+File.separator+"gsdl.xml";
     991       
     992        // (3) We write xml out containing the location of the parent folder of the collect dir
     993        String collectParent = Configuration.gsdl_path;
     994        if(Gatherer.GS3){ // Collect dir's parent folder is web/sites/localsite, which is GSDL3HOME/sites/localsite
     995        collectParent = Configuration.gsdl3_path+"sites"+File.separator+"localsite";
     996        }
     997        System.err.println("****CollectParent folder: " + collectParent + "\n****gsdlXMLFile: " + gsdlXMLFile);
     998       
     999        // The contents we are going to write out to the file: <Context docBase="collectParent" path="/gsdl"></Context>
     1000        // Does Fedora expect a / in the path to gsdl, does Fedora deal with "/gsdl" or do I need to use a File.separator?
     1001        String contents = "<?xml version='1.0' encoding='utf-8'?>\n<Context docBase=\""
     1002        +collectParent+"\" path=\""+File.separator+"gsdl\"></Context>";
     1003       
     1004        // even if the file exists, we overwrite it, because we may have changed GS versions
     1005        // and collect dir would have changed though there'd still be a gsdl.xml file
     1006        errorMessage =  "Failed to create the essential file: " + gsdlXMLFile;
     1007        java.io.OutputStream gsdlXMLFileOut = new java.io.FileOutputStream(gsdlXMLFile);
     1008        gsdlXMLFileOut.write(contents.getBytes());
     1009        gsdlXMLFileOut.close();
     1010        gsdlXMLFileOut = null;
     1011       
     1012        // Otherwise, restart the fedora server again
     1013        errorMessage = "Failed to stop the fedora server.";
     1014        process = Runtime.getRuntime().exec(fedoraStart);
     1015        System.err.println("*****Restarting the fedora server: " + fedoraStart);
     1016        if((exitValue = process.waitFor()) != 0) {
     1017        throw new Exception(errorMessage);
     1018        }
     1019        System.out.println("Exit value is: " + exitValue);
     1020    }catch(Exception e){
     1021        System.err.println("****");
     1022        System.err.println("* " + errorMessage + "\n" + e.getMessage());
     1023        System.err.println("***");
     1024        e.printStackTrace();
     1025        DebugStream.printStackTrace(e);
     1026        // We can't continue, so we exit
     1027        System.exit(1);     
     1028    }       
    9021029    }
    9031030
Note: See TracChangeset for help on using the changeset viewer.