Changeset 34266 for main


Ignore:
Timestamp:
2020-07-13T20:37:55+12:00 (4 years ago)
Author:
ak19
Message:
  1. Added rudimentary support for inserting the basic skeletons of security-related elements into collectionConfiguration.xml when using GLI's ConfigFileEditor. Hopefully this is useful. 2. Removed the self-evident tooltip from the ConfigFileEditor as it was always annoying floating over the editor, obscuring stuff. Had to addd a no-arg constructor in NumberedJTextArea for this to be possible.
Location:
main/trunk/gli
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/gli/classes/dictionary.properties

    r34264 r34266  
    979979
    980980#***** ConfigFileEditor *****
    981 ConfigFileEditor.Tooltip:Greenstone 3 collection configuration XML editor.
    982981ConfigFileEditor.Save_Tooltip:Save changes and close.
    983982ConfigFileEditor.Cancel_Tooltip:Close without saving.
     983ConfigFileEditor.Add_Element_Label:Add element to:
     984ConfigFileEditor.Add_Label:Add
     985ConfigFileEditor.Add_Element_Tooltip:Select the (security related) element to add to the collection configuration file then edit the newly added element accordingly.
     986ConfigFileEditor.Hide_Collection:Hide the collection
     987ConfigFileEditor.Secure_Collection:Secure the collection
     988ConfigFileEditor.Secure_All_Documents:Secure all documents in this collection
     989ConfigFileEditor.Secure_Certain_Documents:Secure certain documents in this collection
     990ConfigFileEditor.Add_Another_DocumentSet:Add another documentSet element
     991ConfigFileEditor.Add_Another_Exception:Add another exception element
     992ConfigFileEditor.Press_Undo_Once_More_First:Cannot add to the collection configuration as it is currently empty. Try pressing Undo (once more) first to get any earlier configuration contents back before trying to add further elements to it.
     993ConfigFileEditor.Need_Security_Element_To_Add:Since there is no <security> element in collectionConfig.xml yet, cannot add further elements to it. Try one of the Secure... options first before trying this option again.
     994ConfigFileEditor.Config_Already_Has_Security_Element:The collectionConfiguration.xml file already contains a <security> element, cannot add more to it. Remove the existing element in entirety first before attempting to add a new one.
    984995
    985996#**********************
  • main/trunk/gli/src/org/greenstone/gatherer/gui/ConfigFileEditor.java

    r34246 r34266  
    5555    public final File config_file;
    5656
     57    /** User can add some complex elements by clcking a button */
     58    private Document elements_available_for_insertion;
     59   
    5760    private GLIButton cancel_button = null;
    5861    private GLIButton save_button = null;
     
    6063    private JTextArea editor_msgarea;
    6164
     65    private JComboBox chooseElementComboBox;
     66    private GLIButton addElementButton;
    6267   
    6368    // https://github.com/bobbylight/RSyntaxTextArea/wiki/Example:-Using-Find-and-Replace
     
    6772    private JButton nextButton;
    6873    private JButton prevButton;
    69    
     74   
    7075    //private final String DEFAULT_PROCESSING_INSTRUCTION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";   
    7176
    7277    private static final Dimension SIZE = new Dimension(850,550);
    7378
     79   
     80    // Enum to define elements the user can add
     81    // enum available from Java 1.5
     82    // https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
     83    // https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html
     84    private enum ElementOption {   
     85    HIDE_COLLECTION (Dictionary.get("ConfigFileEditor.Hide_Collection")),
     86    SECURE_COLLECTION (Dictionary.get("ConfigFileEditor.Secure_Collection")),
     87    SECURE_ALL_DOCUMENTS(Dictionary.get("ConfigFileEditor.Secure_All_Documents")),
     88    SECURE_CERTAIN_DOCUMENTS(Dictionary.get("ConfigFileEditor.Secure_Certain_Documents")),
     89    ADD_ANOTHER_DOCUMENTSET(Dictionary.get("ConfigFileEditor.Add_Another_DocumentSet")),
     90    ADD_ANOTHER_EXCEPTION(Dictionary.get("ConfigFileEditor.Add_Another_Exception"));   
     91   
     92    private final String displayString;
     93    // Constructor may not be declared as public
     94    ElementOption(String displayStr) {
     95        // interesting that Enum implementation classes don't
     96        // have to call protected superclass constructor
     97        displayString = displayStr;
     98    }
     99
     100    // override default behaviour of returning the ENUM string itself
     101    // to display the displayString instead
     102    public String toString() {
     103        return displayString;
     104    }
     105    }
     106
     107   
    74108    public ConfigFileEditor() {
    75109   
     
    127161   
    128162    // the all important XML editor
    129     editor = new NumberedJTextArea(Dictionary.get("ConfigFileEditor.Tooltip"));
     163    editor = new NumberedJTextArea(); // Don't pass in tooltip string for editor:
     164                                      // The editor's purpose should be obvious, and
     165                                      // the tooltip annoyingly constantly floats over the editor all the time
    130166    editor.getDocument().addDocumentListener(this);
    131167    // if Ctrl (or Mac equiv) + F is pressed in the config file editing area,
     
    138174    save_button.addActionListener(this);
    139175
     176    // widgets in section for adding security-related XML elements into the collectionConfigXML file
     177    JLabel addElementLabel = new JLabel(Dictionary.get("ConfigFileEditor.Add_Element_Label"));
     178
     179    chooseElementComboBox = new JComboBox(ElementOption.values()); // calls the implicit static values() method on Enum class to get an array of all Enum values
     180    addElementButton = new GLIButton(Dictionary.get("ConfigFileEditor.Add_Label"),
     181                     Dictionary.get("ConfigFileEditor.Add_Element_Tooltip"));
     182    elements_available_for_insertion = XMLTools.parseXMLFile("xml/elementsForInsertion.xml", true);
     183    addElementButton.addActionListener(this);
     184
     185    // Elements can't be added if gli/classes/xml/elementsForInsertion.xml file
     186    // does not exist or can't be parsed
     187    if(elements_available_for_insertion == null) {
     188        addElementButton.setEnabled(false);
     189    }
     190   
    140191    // LAYOUT
     192    JPanel add_elements_panel = new JPanel(new FlowLayout());
     193    add_elements_panel.setComponentOrientation(Dictionary.getOrientation());
     194    add_elements_panel.add(addElementLabel);
     195    add_elements_panel.add(chooseElementComboBox);
     196    add_elements_panel.add(addElementButton);
     197   
    141198    JPanel button_panel = new JPanel(new FlowLayout());
    142199    button_panel.setComponentOrientation(Dictionary.getOrientation());
     
    145202    button_panel.add(cancel_button);
    146203    button_panel.add(save_button);
    147 
     204   
    148205    // toolbars_panel to contain find-and-replace toolbar and undo/redo/cancel/save button panel
    149206    JPanel toolbars_panel = new JPanel(new BorderLayout());
    150207    toolbars_panel.add(toolBar, BorderLayout.NORTH);
    151     toolbars_panel.add(button_panel, BorderLayout.CENTER);
     208    toolbars_panel.add(add_elements_panel, BorderLayout.CENTER);
     209    toolbars_panel.add(button_panel, BorderLayout.SOUTH);
    152210   
    153211    JPanel content_pane = (JPanel) getContentPane();
     
    196254        editor_msgarea.setText(msg); // display the parsing error
    197255        save_button.setEnabled(false);
     256        addElementButton.setEnabled(false);
    198257
    199258        editor.setText(xml_str); // display the xml contents with error and all     
     
    204263        }       
    205264    }
    206    
     265
    207266
    208267    // Final dialog setup & positioning.
     
    320379       
    321380    }
    322     }
    323    
     381    else if(e.getSource() == addElementButton) {
     382       
     383        ElementOption elementToAdd = (ElementOption)chooseElementComboBox.getSelectedItem();
     384        addElementToConfigFile(elementToAdd);
     385       
     386    }
     387    }
     388
     389    /** Method to add the selected security-related element to the config file
     390     * so that the user can then edit it to behave as they wish.
     391     */
     392    private void addElementToConfigFile(ElementOption elementOption) {
     393
     394    // if the user just undid a previous add operation, then the editor would be empty
     395    // and can't be parsed. In such a case, don't try to add any elements into the editor
     396    String config_xml_str = editor.getText();
     397    if(config_xml_str.equals("")) {
     398        editor_msgarea.setText(Dictionary.get("ConfigFileEditor.Press_Undo_Once_More_First"));
     399        editor_msgarea.setBackground(Color.orange);
     400        return;
     401    }
     402    Document config_xml_doc = XMLTools.getDOM(config_xml_str);
     403    // The addElementButton would not have been enabled/available for pressing
     404    // and we wouldn't be here unless the collConfig xml parses fine.   
     405
     406    Element targetParent = config_xml_doc.getDocumentElement(); // tentative target element
     407   
     408
     409    final String SECURITY = "security"; // just looking for security elements to insert
     410    final String EXCEPTION = "exception"; // just looking for security elements to insert
     411    final String DOCUMENTSET = "documentSet"; // just looking for security elements to insert
     412   
     413    NodeList children = elements_available_for_insertion.getElementsByTagName(SECURITY);       
     414
     415    Element elementToAdd = null;
     416   
     417    // To find out if the collectionConfig.xml has any security nodes in it already
     418    NodeList configXMLSecurityNodes = config_xml_doc.getElementsByTagName(SECURITY);
     419
     420   
     421    // Switch on an Enum type is interesting:
     422    // don't have to do "case ElementOption.HIDE_COLLECTION:"
     423    // and just "case HIDE_COLLECTION:" is fine
     424    // see https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
     425
     426    switch(elementOption) {
     427    case HIDE_COLLECTION:
     428        Element publicElement = XMLTools.getNamedElement(
     429                          config_xml_doc.getDocumentElement(), // parent
     430                          "metadata", // element name
     431                          "name", // attribute name
     432                          "public" // attribute value
     433                      );
     434       
     435        if(publicElement != null) {
     436        XMLTools.setNodeText(publicElement, "false");
     437        // done, with elementToAdd = null, no more processing
     438        } else { // collConfig.xml missing <metadata name="public">true</metadata>
     439        // need to add in the necessary element from elements_available_for_insertion XML,
     440        // which is set to hide
     441        elementToAdd = XMLTools.getNamedElement(
     442                    elements_available_for_insertion.getDocumentElement(), // parent
     443                    "metadata", // element name
     444                    "name", // attribute name
     445                    "public" // attribute value
     446                );
     447        }
     448        break;
     449       
     450    case SECURE_COLLECTION:
     451    case SECURE_ALL_DOCUMENTS:
     452    case SECURE_CERTAIN_DOCUMENTS:
     453        if(configXMLSecurityNodes.getLength() == 0) {
     454        elementToAdd = (Element)children.item(elementOption.ordinal()-1);
     455        } else {
     456        editor_msgarea.setText(Dictionary.get("ConfigFileEditor.Config_Already_Has_Security_Element"));
     457        editor_msgarea.setBackground(Color.orange);
     458        }
     459        break;
     460       
     461       
     462    case ADD_ANOTHER_DOCUMENTSET:
     463    case ADD_ANOTHER_EXCEPTION:
     464       
     465        if(configXMLSecurityNodes.getLength() > 0) {
     466
     467        // get first security element child of collectionConfigXML file.
     468        // There should at most be one
     469        targetParent = (Element)configXMLSecurityNodes.item(0);
     470        Element lastSecurityElement = (Element)children.item(children.getLength()-1);
     471       
     472        if(elementOption == ElementOption.ADD_ANOTHER_DOCUMENTSET) {
     473            // Get the immediate child called documentSet, not any other descendants by that name
     474            // i.e. not the child <exception> element's child called <documentSet>, but the last
     475            // <security> element's <documentSet> element
     476            elementToAdd = (Element)XMLTools.getChildByTagName(lastSecurityElement, DOCUMENTSET);
     477        }
     478        else { // ElementOption.ADD_ANOTHER_EXCEPTION:
     479
     480            // Get the last <security> element's sole <exception> child
     481            elementToAdd = (Element)XMLTools.getChildByTagName(lastSecurityElement, EXCEPTION);
     482        }
     483        }
     484        else {
     485        // Can't Add Another DocSet/Exception element if the collectionConfigXML has no
     486        // Security element in place to add them into.
     487        // Display an error/warning if no security element and don't do anything.       
     488       
     489        targetParent = null;
     490        editor_msgarea.setText(Dictionary.get("ConfigFileEditor.Need_Security_Element_To_Add"));
     491        editor_msgarea.setBackground(Color.orange);
     492        }
     493        break;
     494    }
     495
     496    if(elementToAdd != null) {
     497        Node copiedNode = config_xml_doc.importNode(elementToAdd, true);
     498        targetParent.appendChild(copiedNode);
     499        StringBuffer xml_str_buf = new StringBuffer();
     500        // now set the text in the XML editor to reflect the changes to the doc     
     501        XMLTools.xmlNodeToString(xml_str_buf, config_xml_doc.getDocumentElement(), true, "  ", 0);
     502        editor.setText(xml_str_buf.toString()); // display the xml contents with error and all     
     503    } // TODO: sadly, the act of doing a editor.setText() adds 2 actions to undo history instead of 1
     504    }
    324505   
    325506    // This method returns a proper processing instruction (starts with <?xml and ends with ?>)
     
    395576        editor_msgarea.setBackground(Color.red);
    396577        save_button.setEnabled(false);
     578        addElementButton.setEnabled(false);
    397579        }
    398580    }
  • main/trunk/gli/src/org/greenstone/gatherer/gui/NumberedJTextArea.java

    r29034 r34266  
    5353    public final GLIButton redoButton;
    5454
     55    public NumberedJTextArea() {
     56    this("");
     57    }
     58   
    5559    public NumberedJTextArea(String tooltip) {
    5660    this("", tooltip);
Note: See TracChangeset for help on using the changeset viewer.