001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.purap.util.cxml; 017 018 import java.io.ByteArrayInputStream; 019 import java.io.ByteArrayOutputStream; 020 import java.io.IOException; 021 022 import javax.xml.parsers.DocumentBuilder; 023 import javax.xml.parsers.DocumentBuilderFactory; 024 import javax.xml.parsers.ParserConfigurationException; 025 026 import org.apache.log4j.Logger; 027 import org.apache.xml.serialize.OutputFormat; 028 import org.apache.xml.serialize.XMLSerializer; 029 import org.kuali.kfs.sys.batch.service.BatchInputFileService; 030 import org.kuali.kfs.sys.context.SpringContext; 031 import org.w3c.dom.Document; 032 import org.w3c.dom.Element; 033 import org.w3c.dom.Node; 034 035 public class B2BParserHelper { 036 037 private static Logger log = Logger.getLogger(B2BParserHelper.class); 038 039 private DocumentBuilder builder; 040 private static B2BParserHelper _this; 041 042 private B2BParserHelper(){ 043 044 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 045 builderFactory.setValidating(false); // It's not needed to validate here 046 builderFactory.setIgnoringElementContentWhitespace(true); 047 048 try { 049 builder = builderFactory.newDocumentBuilder(); // Create the parser 050 } catch(ParserConfigurationException e) { 051 throw new RuntimeException(e); 052 } 053 054 } 055 056 public static B2BParserHelper getInstance(){ 057 if (_this == null){ 058 _this = new B2BParserHelper(); 059 } 060 return _this; 061 } 062 063 public synchronized B2BShoppingCart parseShoppingCartXML(String xmlChunk){ 064 065 Document xmlDoc = null; 066 try { 067 xmlDoc = builder.parse(new ByteArrayInputStream(xmlChunk.getBytes())); 068 } catch(Exception e) { 069 e.printStackTrace(); 070 throw new RuntimeException(e); 071 } 072 073 byte[] xmlDocAsBytes = addXMLNameSpace(xmlDoc,"http://www.kuali.org/kfs/purap/b2bPunchOutOrder"); 074 075 B2BPunchOutOrderFileType fileType = SpringContext.getBean(B2BPunchOutOrderFileType.class); 076 077 B2BShoppingCart cart = (B2BShoppingCart) SpringContext.getBean(BatchInputFileService.class).parse(fileType,xmlDocAsBytes); 078 079 return cart; 080 081 } 082 083 public synchronized PunchOutSetupResponse parsePunchOutSetupResponse(String xmlChunk){ 084 085 Document xmlDoc = null; 086 try { 087 xmlDoc = builder.parse(new ByteArrayInputStream(xmlChunk.getBytes())); 088 } catch(Exception e) { 089 e.printStackTrace(); 090 throw new RuntimeException(e); 091 } 092 093 byte[] xmlDocAsBytes = addXMLNameSpace(xmlDoc,"http://www.kuali.org/kfs/purap/b2bPunchOutResponse"); 094 095 PunchOutSetupResponseFileType fileType = SpringContext.getBean(PunchOutSetupResponseFileType.class); 096 097 PunchOutSetupResponse response = (PunchOutSetupResponse) SpringContext.getBean(BatchInputFileService.class).parse(fileType,xmlDocAsBytes); 098 099 return response; 100 101 } 102 103 public synchronized PurchaseOrderResponse parsePurchaseOrderResponse(String xmlChunk){ 104 105 Document xmlDoc = null; 106 try { 107 xmlDoc = builder.parse(new ByteArrayInputStream(xmlChunk.getBytes())); 108 } catch(Exception e) { 109 e.printStackTrace(); 110 throw new RuntimeException(e); 111 } 112 113 byte[] xmlDocAsBytes = addXMLNameSpace(xmlDoc,"http://www.kuali.org/kfs/purap/b2bPOResponse"); 114 115 B2BPOResponseFileType fileType = SpringContext.getBean(B2BPOResponseFileType.class); 116 117 PurchaseOrderResponse response = (PurchaseOrderResponse) SpringContext.getBean(BatchInputFileService.class).parse(fileType,xmlDocAsBytes); 118 119 return response; 120 121 } 122 123 private byte[] addXMLNameSpace(Document xmlDoc, 124 String nameSpace){ 125 126 Node node = xmlDoc.getDocumentElement(); 127 Element element = (Element)node; 128 129 element.setAttribute("xmlns", nameSpace); 130 131 OutputFormat outputFormat = new OutputFormat(xmlDoc); 132 outputFormat.setOmitDocumentType(true); 133 134 ByteArrayOutputStream out = new ByteArrayOutputStream(); 135 XMLSerializer serializer = new XMLSerializer( out,outputFormat ); 136 try { 137 serializer.asDOMSerializer(); 138 serializer.serialize( xmlDoc.getDocumentElement()); 139 } 140 catch (IOException e) { 141 throw new RuntimeException(e); 142 } 143 144 return out.toByteArray(); 145 } 146 }