Project

General

Profile

« Previous | Next » 

Revision 5977

Added by Chris Jones over 13 years ago

These are fairly significant changes to MetacatHandler.handleInsertOrUpdateAction() that add in support for creation or update of GUIDs and SystemMetadata. Upon insertion or update of DataPackages from non-DataONE aware clients (such as Morpho), the identifier table is updated by creating a GUID, and the systemmetadata table is updated with fields after the EML document is parsed for distribution information and entity typing. System Metadata documents are also generated and inserted into Metacat. The list of data entities is iterated over and System Metadata is generated for each data file as well.

View differences:

src/edu/ucsb/nceas/metacat/MetacatHandler.java
1562 1562
    public String handleInsertOrUpdateAction(String ipAddress,
1563 1563
            HttpServletResponse response, PrintWriter out, Hashtable<String, String[]> params,
1564 1564
            String user, String[] groups) {
1565
        Logger logMetacat = Logger.getLogger(MetaCatServlet.class);
1565
        Logger logMetacat = Logger.getLogger(MetacatHandler.class);
1566 1566
        DBConnection dbConn = null;
1567 1567
        int serialNumber = -1;
1568 1568
        String output = "";
......
1573 1573
        }
1574 1574
        
1575 1575
        if(params.get("docid") == null){
1576
            String msg = "<?xml version=\"1.0\"?>" +
1577
                "<error>" +
1578
                "Docid not specified" +
1579
                "</error>";
1576
            String msg = this.PROLOG +
1577
                         this.ERROR  +
1578
                         "Docid not specified" +
1579
                         this.ERRORCLOSE;
1580 1580
            if(out != null)
1581 1581
            {
1582 1582
                out.println(msg);
1583
                logMetacat.error("MetaCatServlet.handleInsertOrUpdateAction - Docid not specified");
1583
                logMetacat.error("MetacatHandler.handleInsertOrUpdateAction - Docid not specified");
1584 1584
            }
1585 1585
            return msg; 
1586 1586
        }
1587 1587
        
1588 1588
        try {
1589 1589
            if (!AuthUtil.canInsertOrUpdate(user, groups)) {
1590
                String msg = "<?xml version=\"1.0\"?>" +
1591
                "<error>" +
1592
                "User '" + user + "' not allowed to insert and update" +
1593
                "</error>";
1590
                String msg = this.PROLOG +
1591
                             this.ERROR +
1592
                             "User '" + 
1593
                             user + 
1594
                             "' not allowed to insert and update" +
1595
                             this.ERRORCLOSE;
1594 1596
                if(out != null)
1595 1597
                {
1596 1598
                  out.println(msg);
......
1607 1609
        }
1608 1610
        
1609 1611
        try {
1610
            // Get the document indicated
1611
            logMetacat.debug("MetaCatServlet.handleInsertOrUpdateAction - params: " + params.toString());
1612
            
1613
            String[] doctext = params.get("doctext");
1614
            String pub = null;
1615
            if (params.containsKey("public")) {
1616
                pub = params.get("public")[0];
1617
            }
1618
            
1619
            StringReader dtd = null;
1620
            if (params.containsKey("dtdtext")) {
1621
                String[] dtdtext = params.get("dtdtext");
1622
                try {
1623
                    if (!dtdtext[0].equals("")) {
1624
                        dtd = new StringReader(dtdtext[0]);
1612
          // Get the document indicated
1613
          logMetacat.debug("MetacatHandler.handleInsertOrUpdateAction - params: " + params.toString());
1614
          
1615
          String[] doctext = params.get("doctext");
1616
          String pub = null;
1617
          if (params.containsKey("public")) {
1618
              pub = params.get("public")[0];
1619
          }
1620
          
1621
          StringReader dtd = null;
1622
          if (params.containsKey("dtdtext")) {
1623
              String[] dtdtext = params.get("dtdtext");
1624
              try {
1625
                  if (!dtdtext[0].equals("")) {
1626
                      dtd = new StringReader(dtdtext[0]);
1627
                  }
1628
              } catch (NullPointerException npe) {
1629
              }
1630
          }
1631
          
1632
          if(doctext == null){
1633
              String msg = this.PROLOG +
1634
                           this.ERROR +
1635
                           "Document text not submitted." +
1636
                           this.ERRORCLOSE;
1637
              if(out != null)
1638
              {
1639
                out.println(msg);
1640
              }
1641
              
1642
              // TODO: this should really throw an exception
1643
              return msg;
1644
          }
1645
          
1646
          logMetacat.debug("MetacatHandler.handleInsertOrUpdateAction - the xml document in metacat servlet (before parsing):\n" + doctext[0]);
1647
          StringReader xmlReader = new StringReader(doctext[0]);
1648
          boolean validate = false;
1649
          DocumentImplWrapper documentWrapper = null;
1650
          try {
1651
            // look inside XML Document for <!DOCTYPE ... PUBLIC/SYSTEM ...
1652
            // >
1653
            // in order to decide whether to use validation parser
1654
            validate = needDTDValidation(xmlReader);
1655
            if (validate) {
1656
                // set a dtd base validation parser
1657
                String rule = DocumentImpl.DTD;
1658
                documentWrapper = new DocumentImplWrapper(rule, validate);
1659
            } else {
1660
                
1661
                String namespace = XMLSchemaService.findDocumentNamespace(xmlReader);
1662
                
1663
                if (namespace != null) {
1664
                    if (namespace.compareTo(DocumentImpl.EML2_0_0NAMESPACE) == 0
1665
                            || namespace.compareTo(
1666
                            DocumentImpl.EML2_0_1NAMESPACE) == 0) {
1667
                        // set eml2 base     validation parser
1668
                        String rule = DocumentImpl.EML200;
1669
                        // using emlparser to check id validation
1670
                        @SuppressWarnings("unused")
1671
                        EMLParser parser = new EMLParser(doctext[0]);
1672
                        documentWrapper = new DocumentImplWrapper(rule, true);
1673
                    } else if (
1674
                    		namespace.compareTo(DocumentImpl.EML2_1_0NAMESPACE) == 0
1675
                    		|| namespace.compareTo(DocumentImpl.EML2_1_1NAMESPACE) == 0) {
1676
                        // set eml2 base validation parser
1677
                        String rule = DocumentImpl.EML210;
1678
                        // using emlparser to check id validation
1679
                        @SuppressWarnings("unused")
1680
                        EMLParser parser = new EMLParser(doctext[0]);
1681
                        documentWrapper = new DocumentImplWrapper(rule, true);
1682
                    } else {
1683
                        // set schema base validation parser
1684
                        String rule = DocumentImpl.SCHEMA;
1685
                        documentWrapper = new DocumentImplWrapper(rule, true);
1625 1686
                    }
1626
                } catch (NullPointerException npe) {
1687
                } else {
1688
                    documentWrapper = new DocumentImplWrapper("", false);
1627 1689
                }
1628 1690
            }
1629 1691
            
1630
            if(doctext == null){
1631
                String msg = "<?xml version=\"1.0\"?>" +
1632
                "<error>" +
1633
                "Document text not submitted." +
1634
                "</error>";
1635
                if(out != null)
1636
                {
1637
                  out.println(msg);
1638
                }
1692
            String[] action = params.get("action");
1693
            String[] docid = params.get("docid");
1694
            String newdocid = null;
1695
            
1696
            String doAction = null;
1697
            if (action[0].equals("insert") || action[0].equals("insertmultipart")) {
1698
                doAction = "INSERT";
1639 1699
                
1640
                // TODO: this should really throw an exception
1641
                return msg;
1700
            } else if (action[0].equals("update")) {
1701
                doAction = "UPDATE";
1702
                
1642 1703
            }
1643 1704
            
1644
            logMetacat.debug("MetaCatServlet.handleInsertOrUpdateAction - the xml document in metacat servlet (before parsing):\n" + doctext[0]);
1645
            StringReader xmlReader = new StringReader(doctext[0]);
1646
            boolean validate = false;
1647
            DocumentImplWrapper documentWrapper = null;
1648 1705
            try {
1649
                // look inside XML Document for <!DOCTYPE ... PUBLIC/SYSTEM ...
1650
                // >
1651
                // in order to decide whether to use validation parser
1652
                validate = needDTDValidation(xmlReader);
1653
                if (validate) {
1654
                    // set a dtd base validation parser
1655
                    String rule = DocumentImpl.DTD;
1656
                    documentWrapper = new DocumentImplWrapper(rule, validate);
1657
                } else {
1658
                    
1659
                    String namespace = XMLSchemaService.findDocumentNamespace(xmlReader);
1660
                    
1661
                    if (namespace != null) {
1662
                        if (namespace.compareTo(DocumentImpl.EML2_0_0NAMESPACE) == 0
1663
                                || namespace.compareTo(
1664
                                DocumentImpl.EML2_0_1NAMESPACE) == 0) {
1665
                            // set eml2 base     validation parser
1666
                            String rule = DocumentImpl.EML200;
1667
                            // using emlparser to check id validation
1668
                            @SuppressWarnings("unused")
1669
                            EMLParser parser = new EMLParser(doctext[0]);
1670
                            documentWrapper = new DocumentImplWrapper(rule, true);
1671
                        } else if (
1672
                        		namespace.compareTo(DocumentImpl.EML2_1_0NAMESPACE) == 0
1673
                        		|| namespace.compareTo(DocumentImpl.EML2_1_1NAMESPACE) == 0) {
1674
                            // set eml2 base validation parser
1675
                            String rule = DocumentImpl.EML210;
1676
                            // using emlparser to check id validation
1677
                            @SuppressWarnings("unused")
1678
                            EMLParser parser = new EMLParser(doctext[0]);
1679
                            documentWrapper = new DocumentImplWrapper(rule, true);
1680
                        } else {
1681
                            // set schema base validation parser
1682
                            String rule = DocumentImpl.SCHEMA;
1683
                            documentWrapper = new DocumentImplWrapper(rule, true);
1684
                        }
1685
                    } else {
1686
                        documentWrapper = new DocumentImplWrapper("", false);
1687
                    }
1688
                }
1706
              // get a connection from the pool
1707
              dbConn = DBConnectionPool
1708
                      .getDBConnection("Metacathandler.handleInsertOrUpdateAction");
1709
              serialNumber = dbConn.getCheckOutSerialNumber();
1710
              
1711
              // write the document to the database and disk
1712
              String accNumber = docid[0];
1713
              logMetacat.debug("MetaCatServlet.handleInsertOrUpdateAction - " + 
1714
                doAction + " " + accNumber + "...");
1715
              
1716
              if (accNumber == null || accNumber.equals("")) {
1717
                  logMetacat.warn("MetacatHandler.handleInsertOrUpdateAction - writing with null acnumber");
1718
                  newdocid = documentWrapper.write(dbConn, doctext[0], pub, dtd,
1719
                          doAction, null, user, groups);
1720
                  EventLog.getInstance().log(ipAddress, user, "", action[0]);
1721
              
1722
              } else {
1723
                  newdocid = documentWrapper.write(dbConn, doctext[0], pub, dtd,
1724
                          doAction, accNumber, user, groups);
1725
            
1726
                  EventLog.getInstance().log(ipAddress, user, accNumber, action[0]);
1727
              
1728
              }
1729
              
1730
              // Check for existing system metadata for the docid. Update
1731
              // or create it as necessary, but only for non-DataONE
1732
              // calls to handleInsertOrUpdateAction()
1733
              if ( !(ipAddress.contains("/d1")) ) {
1689 1734
                
1690
                String[] action = params.get("action");
1691
                String[] docid = params.get("docid");
1692
                String newdocid = null;
1735
                SystemMetadata sysMeta = new SystemMetadata();  
1736
                IdentifierManager im = IdentifierManager.getInstance();
1737
                Hashtable<String, Object> docInfo = 
1738
                  im.getDocumentInfo(newdocid);
1739
                int rev = im.getLatestRevForLocalId(newdocid);
1740
                Identifier identifier = new Identifier();
1741
                String sysMetaLocalId = "";
1693 1742
                
1694
                String doAction = null;
1695
                if (action[0].equals("insert") || action[0].equals("insertmultipart")) {
1696
                    doAction = "INSERT";
1697
                } else if (action[0].equals("update")) {
1698
                    doAction = "UPDATE";
1699
                }
1700
                
1743
                // it's possible that system metadata exists although
1744
                // older clients don't support it. Try updates first.
1701 1745
                try {
1702
                    // get a connection from the pool
1703
                    dbConn = DBConnectionPool
1704
                            .getDBConnection("MetaCatServlet.handleInsertOrUpdateAction");
1705
                    serialNumber = dbConn.getCheckOutSerialNumber();
1746
                  // handle updates
1747
                  identifier.setValue(im.getGUID(newdocid, rev));
1748
                  sysMeta = getSystemMetadata(identifier, user, groups);
1749
                  sysMetaLocalId = insertOrUpdateSystemMetadata(
1750
                    sysMeta, "update", user, groups);
1751
                  
1752
                } catch ( PropertyNotFoundException pnfe) {
1753
                  logMetacat.error("There was a problem getting the server " +
1754
                    "url properties: " + pnfe.getMessage());
1755
                  
1756
                } catch ( McdbDocNotFoundException mnfe) {
1757
                  
1758
                  // handle inserts
1759
                  try {
1760
                    sysMeta = createSystemMetadata(newdocid, user, groups);
1761
                    sysMetaLocalId = insertOrUpdateSystemMetadata(
1762
                      sysMeta, "insert", user, groups);
1706 1763
                    
1707
                    // write the document to the database and disk
1708
                    String accNumber = docid[0];
1709
                    logMetacat.debug("MetaCatServlet.handleInsertOrUpdateAction - " + doAction + " "
1710
                            + accNumber + "...");
1711
                    if (accNumber == null || accNumber.equals("")) {
1712
                        logMetacat.warn("MetaCatServlet.handleInsertOrUpdateAction - writing with null acnumber");
1713
                        newdocid = documentWrapper.write(dbConn, doctext[0], pub, dtd,
1714
                                doAction, null, user, groups);
1715
                        EventLog.getInstance().log(ipAddress, user, "", action[0]);
1716
                    } else {
1717
                        newdocid = documentWrapper.write(dbConn, doctext[0], pub, dtd,
1718
                                doAction, accNumber, user, groups);
1719

  
1720
                        EventLog.getInstance().log(ipAddress, user, accNumber, action[0]);
1721
                    }
1722
                } finally {
1723
                    // Return db connection
1724
                    DBConnectionPool.returnDBConnection(dbConn, serialNumber);
1764
                  } catch ( McdbDocNotFoundException dnfe ) {
1765
                    logMetacat.debug(
1766
                      "There was a problem finding the localId " +
1767
                      newdocid + "The error was: " + dnfe.getMessage());
1768
                    throw dnfe;
1769
            
1770
                  } catch ( AccessionNumberException ane ) {
1771
            
1772
                    logMetacat.debug(
1773
                      "There was a problem creating the accession number " +
1774
                      "for " + newdocid + ". The error was: " + ane.getMessage());
1775
                    throw ane;
1776
                    
1777
                  } // end try()
1778
                                        
1725 1779
                }
1726 1780
                
1727
                // set content type and other response header fields first
1728
                //response.setContentType("text/xml");
1729
                output += "<?xml version=\"1.0\"?>";
1730
                output += "<success>";
1731
                output += "<docid>" + newdocid + "</docid>";
1732
                output += "</success>";
1733
                
1734
            } catch (NullPointerException npe) {
1735
                //response.setContentType("text/xml");
1736
                output += "<?xml version=\"1.0\"?>";
1737
                output += "<error>";
1738
                output += npe.getMessage();
1739
                output += "</error>";
1740
                logMetacat.warn("MetaCatServlet.handleInsertOrUpdateAction - Null pointer error when writing eml document to the database: " + npe.getMessage());
1741
                npe.printStackTrace();
1781
              } // end if()
1782
              
1783
              
1784
            } finally {
1785
                // Return db connection
1786
                DBConnectionPool.returnDBConnection(dbConn, serialNumber);
1742 1787
            }
1788
            
1789
            // set content type and other response header fields first
1790
            //response.setContentType("text/xml");
1791
            output += this.PROLOG;
1792
            output += this.SUCCESS;
1793
            output += "<docid>" + newdocid + "</docid>";
1794
            output += this.SUCCESSCLOSE;
1795
            
1796
          } catch (NullPointerException npe) {
1797
              //response.setContentType("text/xml");
1798
              output += this.PROLOG;
1799
              output += this.ERROR;
1800
              output += npe.getMessage();
1801
              output += this.ERRORCLOSE;
1802
              logMetacat.warn("MetaCatServlet.handleInsertOrUpdateAction - Null pointer error when writing eml document to the database: " + npe.getMessage());
1803
              npe.printStackTrace();
1804
          }
1743 1805
        } catch (Exception e) {
1744 1806
            //response.setContentType("text/xml");
1745
            output += "<?xml version=\"1.0\"?>";
1746
            output += "<error>";
1807
            output += this.PROLOG;
1808
            output += this.ERROR;
1747 1809
            output += e.getMessage();
1748
            output += "</error>";
1810
            output += this.ERRORCLOSE;
1749 1811
            logMetacat.warn("MetaCatServlet.handleInsertOrUpdateAction - General error when writing eml document to the database: " + e.getMessage());
1750 1812
            e.printStackTrace();
1751 1813
        }

Also available in: Unified diff