Advertisement
Guest User

XML Canonicalizer and Sorter

a guest
Sep 9th, 2013
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 2.86 KB | None | 0 0
  1. /*
  2.  * Download Canonicalizer at http://apache.cs.utah.edu/santuario/java-library/1_5_5/xml-security-bin-1_5_5.zip
  3.  */
  4.  
  5. import javax.xml.transform.stream.StreamResult
  6. import javax.xml.transform.stream.StreamSource
  7. import javax.xml.transform.TransformerFactory
  8. import org.apache.xml.security.c14n.Canonicalizer
  9.  
  10. // Initialize the security library
  11. org.apache.xml.security.Init.init()
  12.  
  13. // Create some variables
  14. def error = false
  15. def fileInName = null
  16. def fileOutName = null
  17. def xsltName = null
  18. def indent = "    "
  19.  
  20. // Get arguments
  21. args.eachWithIndex() { arg, i ->
  22.     def nextArg = i < args.length - 1 ? args[i+1] : null
  23.     if(!error && nextArg) {
  24.         try {
  25.             switch(arg) {
  26.                 case "-in":
  27.                     fileInName = nextArg
  28.                     break
  29.  
  30.                 case "-indent":
  31.                     if(nextArg == "true") {
  32.                         // This is the default, do nothing
  33.                     } else if( nextArg == "false") {
  34.                         indent = ""
  35.                     } else {
  36.                         error = true
  37.                         println "Indent argument must be true or false if it specified"
  38.                     }
  39.                     break
  40.  
  41.                 case "-out":
  42.                     fileOutName = nextArg
  43.                     break
  44.  
  45.                 case "-xslt":
  46.                     xsltName = nextArg
  47.                     break
  48.             }
  49.         } catch(Exception e) {
  50.             error = true
  51.             println "Syntax error in arguments"
  52.         }
  53.     }
  54. }
  55.  
  56. // Make sure required arguments have been provided
  57. if(!error) {
  58.     if(!fileInName) {
  59.         error = true
  60.         println 'An input file must be specified with the "-in" argument'
  61.     }
  62.     if(!xsltName) {
  63.         error = true
  64.         println 'An XSLT file must be specified with the "-xslt" argument'
  65.     }
  66. }
  67.  
  68. if(!error) {
  69.     // Create some variables
  70.     def ext = fileInName.tokenize('.').last()
  71.     fileOutName = fileOutName ?: "${fileInName.lastIndexOf('.').with {it != -1 ? fileInName[0..<it] : fileInName}}_FORMATTED.${ext}"
  72.     def fileIn = new File(fileInName)
  73.     def fileOut = new File(fileOutName)
  74.     def xsltFile = new File(xsltName)
  75.     def temp1 = new File("./temp1")
  76.     def temp2 = new File("./temp2")
  77.     def os
  78.     def is
  79.  
  80.     // Sort the XML attributes, remove comments, and remove extra whitespace
  81.     println "Canonicalizing..."
  82.     Canonicalizer c = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS)
  83.     os = temp1.newOutputStream()
  84.     c.setWriter(os)
  85.     c.canonicalize(fileIn.getBytes())
  86.     os.close()
  87.  
  88.     // Sort the XML elements
  89.     println "Sorting..."
  90.     def factory = TransformerFactory.newInstance()
  91.     is = xsltFile.newInputStream()
  92.     def transformer = factory.newTransformer(new StreamSource(is))
  93.     is.close()
  94.     is = temp1.newInputStream()
  95.     os = temp2.newOutputStream()
  96.     transformer.transform(new StreamSource(is), new StreamResult(os))
  97.     is.close()
  98.     os.close()
  99.  
  100.     // Write the XML output in "pretty print"
  101.     println "Beautifying..."
  102.     def parser = new XmlParser()
  103.     def printer = new XmlNodePrinter(new IndentPrinter(fileOut.newPrintWriter(), indent, true))
  104.     printer.print parser.parseText(temp2.getText())
  105.  
  106.     // Cleanup
  107.     temp1.delete()
  108.     temp2.delete()
  109.  
  110.     println "Done!"
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement