Ignore:
Timestamp:
2010-12-14T17:15:30+13:00 (13 years ago)
Author:
sjb48
Message:

Working on saving a format statement to the config file. This looks like it should work but changes in FormatAction have caused major issues with Document/Node violations. This is because saving required the format statement as a Document rather than a string (which did work). Added a check to GSXML for xmlNodeToString to check that attrs is not null (attrs will be null unless the node is an element).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/collection/Collection.java

    r21771 r23489  
    3030import org.w3c.dom.NodeList;
    3131
     32import java.io.*;
    3233import java.io.File;
    3334import java.util.HashMap;
     
    299300    }
    300301
     302 /** handles requests made to the ServiceCluster itself
     303     *
     304     * @param req - the request Element- <request>
     305     * @return the result Element - should be <response>
     306     */
     307    protected Element processMessage(Element request) {
     308
     309    Element response = this.doc.createElement(GSXML.RESPONSE_ELEM);
     310    response.setAttribute(GSXML.FROM_ATT, this.cluster_name);
     311    String type = request.getAttribute(GSXML.TYPE_ATT);
     312    String lang = request.getAttribute(GSXML.LANG_ATT);
     313    response.setAttribute(GSXML.TYPE_ATT, type);
     314
     315    if (type.equals(GSXML.REQUEST_TYPE_FORMAT_STRING)) {
     316        logger.error("Received format string request");
     317
     318        String subaction = request.getAttribute("subaction");
     319        logger.error("Subaction is " + subaction);
     320
     321        String service = request.getAttribute("service");
     322        logger.error("Service is " + service);
     323
     324        String classifier = null;
     325        if(service.equals("ClassifierBrowse"))
     326        {
     327            classifier = request.getAttribute("classifier");
     328            logger.error("Classifier is " + classifier);
     329        }
     330
     331        Element format_element = (Element) GSXML.getChildByTagName(request, GSXML.FORMAT_STRING_ELEM);
     332        //String format_string = GSXML.getNodeText(format_element);
     333        Element format_statement = (Element) format_element.getFirstChild();
     334
     335        //logger.error("Format string: " + format_string);
     336        logger.error("Config file location = " + GSFile.collectionConfigFile(this.site_home, this.cluster_name));
     337
     338        // check for version file
     339
     340        String directory = new File(GSFile.collectionConfigFile(this.site_home, this.cluster_name)).getParent() + File.separator;
     341        logger.error("Directory is " + directory);
     342
     343        String version_filename = "";
     344        if(service.equals("ClassifierBrowse"))
     345            version_filename = directory + "browse_"+classifier+"_format_statement_version.txt";
     346        else
     347            version_filename = directory + "query_format_statement_version.txt";
     348
     349        File version_file = new File(version_filename);
     350        logger.error("Version filename is " + version_filename);
     351
     352
     353        if(subaction.equals("update"))
     354        {
     355            String version_number = "1";
     356            BufferedWriter writer;
     357
     358            try{
     359
     360                if(version_file.exists())
     361                {
     362                    // Read version
     363                    BufferedReader reader = new BufferedReader(new FileReader(version_filename));
     364                    version_number = reader.readLine();
     365                    int aInt = Integer.parseInt(version_number) + 1;
     366                    version_number = Integer.toString(aInt);
     367                    reader.close();
     368                }
     369                else{
     370                    // Create
     371                    version_file.createNewFile();
     372                    writer = new BufferedWriter(new FileWriter(version_filename));
     373                    writer.write(version_number);
     374                    writer.close();
     375                }
     376
     377                // Write version file
     378                String format_statement_filename = "";
     379
     380                if(service.equals("ClassifierBrowse"))
     381                    format_statement_filename = directory + "browse_"+classifier+"_format_statement_v" + version_number + ".txt";
     382                else
     383                    format_statement_filename = directory + "query_format_statement_v" + version_number + ".txt";
     384
     385                logger.error("Format statement filename is " + format_statement_filename);
     386
     387                // Write format statement
     388                String format_string = GSXML.xmlNodeToString(format_statement);
     389                writer = new BufferedWriter(new FileWriter(format_statement_filename));
     390                writer.write(format_string);
     391                writer.close();
     392
     393                // Update version number
     394                writer = new BufferedWriter(new FileWriter(version_filename));
     395                writer.write(version_number);
     396                writer.close();
     397
     398            } catch (IOException e) {
     399                logger.error("IO Exception "+e);
     400            }
     401        }
     402
     403        if(subaction.equals("save"))
     404        {
     405            logger.error("SAVE format statement");
     406
     407            // open collectionConfig.xml and read in to w3 Document
     408            String collection_config = directory + "collectionConfig.xml";
     409            Document config = this.converter.getDOM(new File(collection_config), "UTF-8");
     410           
     411            //String tag_name = "";
     412            int k;
     413            int index;
     414            Element elem;
     415            Node current_node = GSXML.getChildByTagName(config, "CollectionConfig");
     416            NodeList current_node_list;
     417
     418            if(service.equals("ClassifierBrowse"))
     419            {
     420                //tag_name = "browse";
     421                // if CLX then need to look in <classifier> X then <format>
     422                // default is <browse><format>
     423
     424                current_node = GSXML.getChildByTagName(current_node, "browse");
     425
     426                // find CLX
     427                if(classifier != null)
     428                {
     429                    current_node_list = GSXML.getChildrenByTagName(current_node, "classifier");
     430                    index = Integer.parseInt(classifier.substring(2)) - 1;
     431                    // index should be given by X-1
     432                    current_node = current_node_list.item(index);
     433                    current_node = GSXML.getChildByTagName(current_node, "format");
     434                }
     435                else{
     436                    current_node = GSXML.getChildByTagName(current_node, "format");
     437                }
     438            }
     439            else
     440            {
     441                // look in <format> with no attributes
     442           
     443                current_node_list = GSXML.getChildrenByTagName(current_node, "search");
     444                for(k=0; k<current_node_list.getLength(); k++)
     445                {
     446                    current_node = current_node_list.item(k);
     447                    // if current_node has no attributes then break
     448                    elem = (Element) current_node;
     449                    if(elem.hasAttribute("name")==false)
     450                        break;
     451                }
     452            }
     453
     454            // Current_node should be a format tag
     455            elem = (Element) current_node;
     456
     457            logger.error("Current_node = " + elem.getNodeName());
     458
     459            // seems we want to remove current child/ren and replace with format_statement's child/ren?
     460
     461            // remove existing
     462            current_node_list = elem.getChildNodes();
     463            for(k=0; k<current_node_list.getLength(); k++)
     464            {
     465                current_node = elem.removeChild(current_node_list.item(k));
     466            }
     467
     468            // append new
     469            current_node_list = format_statement.getChildNodes();
     470            for(k=0; k<current_node_list.getLength(); k++)
     471            {
     472                current_node = elem.appendChild(current_node_list.item(k));
     473            }
     474
     475            //String text = GSXML.getNodeText(elem);
     476            //logger.error(text);
     477            //text = text.replaceAll("_httpsite_", http_site);
     478            //text = text.replaceAll("_httpcollection_", http_collection);
     479            //GSXML.setNodeText(d, text);
     480
     481            // Now convert config document to string for writing to file
     482            String new_config = GSXML.xmlNodeToString(config);
     483
     484            // Write to file (not original! for now)
     485            try{
     486                BufferedWriter writer = new BufferedWriter(new FileWriter(collection_config+".new"));
     487                writer.write(new_config);
     488                writer.close();
     489            } catch (IOException e) {
     490                logger.error("IO Exception "+e);
     491            }
     492        }
     493    }
     494    else { // unknown type
     495        super.processMessage(request);
     496
     497    }
     498    return response;
     499    }
     500
    301501}
    302502
Note: See TracChangeset for help on using the changeset viewer.