diff --git a/src/org/gcube/vremanagement/vremodeler/impl/util/XMLUtil.java b/src/org/gcube/vremanagement/vremodeler/impl/util/XMLUtil.java index d9710e7..8cc39ae 100644 --- a/src/org/gcube/vremanagement/vremodeler/impl/util/XMLUtil.java +++ b/src/org/gcube/vremanagement/vremodeler/impl/util/XMLUtil.java @@ -1,20 +1,31 @@ package org.gcube.vremanagement.vremodeler.impl.util; +import java.io.StringWriter; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import org.gcube.common.core.utils.logging.GCUBELog; import org.gcube.vremanagement.vremodeler.db.DBInterface; import org.gcube.vremanagement.vremodeler.impl.ModelerService; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + + /** * - * @author lucio + * @author Lucio Lelii * */ public class XMLUtil { @@ -25,95 +36,97 @@ public class XMLUtil { /** * it creates the XML output for VDLGenerator * - * @param res - * @return String + * @param res the result set of the query on database + * @return String the XML */ public static String PrepareCollectionXML(ResultSet res, ArrayList relatedCollection){ - StringBuilder temp= new StringBuilder(); - String selectedString="false"; - temp.append(""); + + Document doc= null; + try { + doc= DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } catch (ParserConfigurationException e1) { + logger.error("Error creating XML Message"); + e1.printStackTrace(); + } + + Element root= doc.createElement("ResultSet"); + try{ while (res.next()){ - - selectedString= relatedCollection.contains(res.getString("ID")) ? "true" : "false"; - temp.append(""); - temp.append(res.getString(1)); - temp.append(""); - temp.append(res.getString(2)); - temp.append(""); - temp.append(res.getString(3)); - temp.append(""); - temp.append(res.getString(4)); - temp.append(""); - temp.append(res.getString(5)); - temp.append(""); - temp.append(res.getString(6)); - temp.append(""); - temp.append(selectedString); - temp.append(""); + Element collection = addElements(doc, "Collection", + new Element[]{createTextElement(doc, "ID", res.getString(1)), + createTextElement(doc, "Name", res.getString(2)), + addElements(doc, "Info", + new Element[]{ + createTextElement(doc, "Description",res.getString(3)), + createTextElement(doc, "NumberOfMembers",res.getString(4)), + createTextElement(doc, "CreationTime",res.getString(5)), + createTextElement(doc, "LastUpdateTime",res.getString(6))}), + createTextElement(doc, "Selected",relatedCollection.contains(res.getString(1)) ? "true" : "false") }); + root.appendChild(collection); } }catch(SQLException e){ logger.error("database error "+e.getMessage()); e.printStackTrace(); } - temp.append(""); + doc.appendChild(root); //logger.debug("VDLMODEL: request collection XML: "+temp); - return temp.toString(); + return docToString(doc); } + + @SuppressWarnings("unchecked") public static String PrepareGHNsXML(ResultSet res, ArrayList relatedGHNs){ - StringBuilder temp = new StringBuilder(), - runningInstancesString ; + Document doc= null; + try { + doc= DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } catch (ParserConfigurationException e1) { + logger.error("Error creating XML Message"); + e1.printStackTrace(); + } + Element root= doc.createElement("ResultSet"); + ResultSet riRes; - String selectedString="false"; - temp.append(""); + try{ while (res.next()){ - selectedString= relatedGHNs.contains(res.getString("ID")) ? "true" : "false"; riRes= DBInterface.queryDB("select RI.id, RI.name from RUNNINGINSTANCE as RI, GHNRELATEDRI as REL where REL.GHNID='"+res.getString("ID")+"' and REL.RIID=RI.ID"); - runningInstancesString= new StringBuilder(); + Element risElement=doc.createElement("RunningInstances"); while (riRes.next()){ - runningInstancesString.append(""); + Element riElement= createTextElement(doc, "RunningInstances", null, new Couple("id", riRes.getString(1)), new Couple("name", riRes.getString(2))); + risElement.appendChild(riElement); } - temp.append(""); - temp.append(res.getString(1)); - temp.append(""); - temp.append(res.getString(2)); - temp.append(""); - temp.append(res.getString(3)); - temp.append(""); - temp.append(res.getString(4)); - temp.append(""); - temp.append(res.getString(5)); - temp.append(""); - temp.append(res.getString(6)); - temp.append(""); - temp.append(res.getString(7)); - temp.append(""); - temp.append(res.getString(8)); - temp.append(""); - temp.append(res.getString(9)); - temp.append(""); - temp.append(res.getString(10)); - temp.append(""); - temp.append(runningInstancesString); - temp.append(""); - temp.append(selectedString); - temp.append(""); + Element ghnEl = addElements(doc, "GHN", new Element[]{ + createTextElement(doc, "ID",res.getString(1)), + createTextElement(doc, "Host",res.getString(2)), + addElements(doc, "Info", new Element[]{ + createTextElement(doc, "Security", res.getString(3)), + createTextElement(doc, "UpTime", res.getString(4)), + addElements(doc, "Memory", new Element[]{ + createTextElement(doc, "VirtualAvailable", res.getString(5)), + createTextElement(doc, "VirtualSize", res.getString(6)), + createTextElement(doc, "LocalAvailableSpace", res.getString(7))}), + addElements(doc, "Site", new Element[]{ + createTextElement(doc, "Location", res.getString(8)), + createTextElement(doc, "Country", res.getString(9)), + createTextElement(doc, "Domain", res.getString(10))}), + createTextElement(doc, "Libraries", null), + createTextElement(doc, "Selected", relatedGHNs.contains(res.getString("ID")) ? "true" : "false") + }) + }); + + root.appendChild(ghnEl); } }catch(SQLException e){ logger.error("database error "+e.getMessage()); } - temp.append(""); + doc.appendChild(root); //logger.debug("VDLMODEL: request collection XML: "+temp); - return temp.toString(); + + return docToString(doc); } /** @@ -123,89 +136,92 @@ public class XMLUtil { */ public static String PrepareMCFormatXML(ResultSet resNative, ResultSet resDerivable, ResultSet allMF, Hashtable> selectedMetadata){ - Hashtable> MDFHash= new Hashtable>(); - StringBuilder temp; - StringBuilder keyTemp=null; - StringBuilder totalMFList=new StringBuilder(); - totalMFList.append(""); - ArrayList tempArray; - try{ + Document doc= null; + try { + doc= DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } catch (ParserConfigurationException e1) { + logger.error("Error creating XML Message"); + e1.printStackTrace(); + } + Hashtable> MDFHash= new Hashtable>(); + Element mflEl= doc.createElement("MFL"); + ArrayList tempArray; + try{ while (allMF.next()) { - temp= new StringBuilder(); - temp.append(""); - temp.append(allMF.getString(1)); - temp.append(""); - temp.append(allMF.getString(2)); - temp.append(""); - temp.append(allMF.getString(3)); - temp.append(""); - temp.append(allMF.getString(4)); - temp.append(""); - totalMFList.append(temp); + + Element elementEl=addElements(doc, "Element", new Element[]{ + createTextElement(doc, "MFID", allMF.getString(1)), + createTextElement(doc, "MFName", allMF.getString(2)), + createTextElement(doc, "URI", allMF.getString(3)), + createTextElement(doc, "Language", allMF.getString(4)) + }); + mflEl.appendChild(elementEl); } - totalMFList.append(""); - + //setting the native MDF while(resNative.next()){ - keyTemp= new StringBuilder(); - keyTemp.append(""); - keyTemp.append(resNative.getString(1)); - keyTemp.append(""); - keyTemp.append(resNative.getString(2)); - keyTemp.append(""); - keyTemp.append(resNative.getString(3)); - keyTemp.append(""); - temp= new StringBuilder(); - temp.append(""); - temp.append(resNative.getString(4)); - if(selectedMetadata.isEmpty()) - temp.append("TrueTrue"); + Element tmpKeyEl= addElements(doc, "Collection", new Element[]{ + createTextElement(doc,"CollectionID" , resNative.getString(1)), + createTextElement(doc,"Name" , resNative.getString(2)), + createTextElement(doc,"Description" , resNative.getString(3)) + }); + + Element tmpEl; + + if(selectedMetadata.isEmpty() || (selectedMetadata.containsKey(resNative.getString(1))) && (selectedMetadata.get(resNative.getString(1)).contains(resNative.getString(4))) ) + tmpEl= addElements(doc, "MetadataFormat", new Element[]{ + createTextElement(doc, "Id", resNative.getString(4)), + createTextElement(doc, "Selectable", "True"), + createTextElement(doc, "Selected", "True"), + }); else{ - if((selectedMetadata.containsKey(resNative.getString(1))) && (selectedMetadata.get(resNative.getString(1)).contains(resNative.getString(4)))) - temp.append("TrueTrue"); - else - temp.append("TrueFalse"); + tmpEl= addElements(doc, "MetadataFormat", new Element[]{ + createTextElement(doc, "Id", resNative.getString(4)), + createTextElement(doc, "Selectable", "True"), + createTextElement(doc, "Selected", "False"), + }); } //logger.debug("MDFProva: "+keyTemp+" "+temp); - - - if(MDFHash.contains(keyTemp.toString())) MDFHash.get(keyTemp.toString()).add(temp.toString()); + if(MDFHash.contains(tmpKeyEl)) MDFHash.get(tmpKeyEl).add(tmpEl); else{ - tempArray=new ArrayList(); - tempArray.add(temp.toString()); - MDFHash.put(keyTemp.toString(), tempArray ); + tempArray=new ArrayList(); + tempArray.add(tmpEl); + MDFHash.put(tmpKeyEl, tempArray ); } //logger.debug("MDFProva: Native "+MDFHash.get(keyTemp).size()); } + + //setting the derivable MDF while(resDerivable.next()){ - keyTemp= new StringBuilder(); - keyTemp.append(""); - keyTemp.append(resDerivable.getString(1)); - keyTemp.append(""); - keyTemp.append(resDerivable.getString(2)); - keyTemp.append(""); - keyTemp.append(resDerivable.getString(3)); - keyTemp.append(""); - temp= new StringBuilder(); - temp.append(""); - temp.append(resDerivable.getString(4)); - if(selectedMetadata.isEmpty()) - temp.append("TrueFalse"); + Element tmpKeyEl= addElements(doc, "Collection", new Element[]{ + createTextElement(doc,"CollectionID" , resDerivable.getString(1)), + createTextElement(doc,"Name" , resDerivable.getString(2)), + createTextElement(doc,"Description" , resDerivable.getString(3)) + }); + + Element tmpEl; + if(selectedMetadata.isEmpty() || !(selectedMetadata.containsKey(resDerivable.getString(1))) && (selectedMetadata.get(resDerivable.getString(1)).contains(resDerivable.getString(4)))) + tmpEl= addElements(doc, "MetadataFormat", new Element[]{ + createTextElement(doc, "Id", resDerivable.getString(4)), + createTextElement(doc, "Selectable", "True"), + createTextElement(doc, "Selected", "False"), + }); else{ - if((selectedMetadata.containsKey(resDerivable.getString(1))) && (selectedMetadata.get(resDerivable.getString(1)).contains(resDerivable.getString(4)))) - temp.append("TrueTrue"); - else - temp.append("TrueFalse"); + tmpEl= addElements(doc, "MetadataFormat", new Element[]{ + createTextElement(doc, "Id", resDerivable.getString(4)), + createTextElement(doc, "Selectable", "False"), + createTextElement(doc, "Selected", "False"), + }); } //logger.debug("MDFProva: Derivable "+keyTemp+" "+temp); - if(MDFHash.contains(keyTemp.toString())) MDFHash.get(keyTemp.toString()).add(temp.toString()); + if(MDFHash.contains(tmpKeyEl)) MDFHash.get(tmpKeyEl).add(tmpEl); else{ - tempArray=new ArrayList(); - tempArray.add(temp.toString()); - MDFHash.put(keyTemp.toString(), tempArray ); + tempArray=new ArrayList(); + tempArray.add(tmpEl); + MDFHash.put(tmpKeyEl, tempArray ); } } @@ -215,44 +231,31 @@ public class XMLUtil { e.printStackTrace(); } - StringBuilder resultString= new StringBuilder(); - - resultString.append(""); - resultString.append(totalMFList); - resultString.append(""); - String key; - Enumeration k=MDFHash.keys(); + Element collectionListEl= doc.createElement("CollectionList"); + Element key; + Enumeration k=MDFHash.keys(); while (k.hasMoreElements()){ key= k.nextElement(); - ArrayList tempMD=MDFHash.get(key); + ArrayList tempMD=MDFHash.get(key); //logger.debug("ArrayProva"+tempMD.size()); - resultString.append(""); - resultString.append(key); - resultString.append("");; - for (String obj: tempMD){ - resultString.append(obj); - //logger.debug("ArrayProva "+obj); - } - resultString.append(""); - + collectionListEl.appendChild(addElements(doc, "Collection", new Element[]{ + key, addElements(doc, "MetadataFormatList", tempMD.toArray(new Element[0])) + })); } - resultString.append(""); + doc.appendChild(addElements(doc, "ResultSet", new Element[]{mflEl, collectionListEl})); //logger.debug("VDLMODEL: request MCFormat XML "+resultString); - return resultString.toString(); + return docToString(doc); } /** - * - * @param resNative - * @param resDerivable - * @return + * + * @return the XML representing the quality string */ public static String PrepareQualityXML(){ StringBuilder qualityString=new StringBuilder(); qualityString.append(""); qualityString.append("Response TimeThis quality parameter indicates the importance of response time (i.e., the delay from a function request to the reception of the response) "); - qualityString.append("in selecting the resource (both in number and type) needed to satisfy the Digital Library definition criteria. E.g., the specification of a 100% response time will result in a maximization of the resources "); qualityString.append("allocated as to minimise the response time. *"); qualityString.append("RobustnessThis quality parameter indicates the importance of robustness (i.e., the resilience to faults) in selecting the resource (both in number and type)"); @@ -275,43 +278,44 @@ public class XMLUtil { /** * + * @param res + * @param selectedFunct + * @param selectedCS + * @return */ + @SuppressWarnings("unchecked") public static String PrepareFunctionalityXML(ResultSet res, ArrayList selectedFunct, ArrayList selectedCS){ - StringBuilder toReturn=new StringBuilder(); - toReturn.append(""); + + Document doc= null; + try { + doc= DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } catch (ParserConfigurationException e1) { + logger.error("Error creating XML Message"); + e1.printStackTrace(); + } + Element root= doc.createElement("ResultSet"); + try { while(res.next()){ - StringBuilder temp= new StringBuilder(); - temp.append(""); - else { - temp.append("selected=\"false\">"); - temp.append(""); - temp.append(res.getString(3)); - temp.append(""); - } + + Element functionalityEl= createTextElement(doc, "Functionality", null, new Couple("id", res.getInt(1)+""), + new Couple("name", res.getString(2)), + new Couple("enableCS", res.getInt(1)==10 ? "true" : "false"), + new Couple("selected", selectedFunct.contains(res.getInt(1)) ? "true" : "false") + ); + functionalityEl.appendChild(createTextElement(doc, "FunctionalityDescription", res.getString(3))); + ResultSet subFunctRes=DBInterface.queryDB("select * from FUNCTIONALITY where father='"+res.getInt(1)+"';"); while(subFunctRes.next()){ - temp.append(""); - temp.append(""); - else temp.append("selected=\"false\">"); - temp.append(""); - temp.append(subFunctRes.getString(3)); - temp.append(""); - temp.append(""); + Element subFunctEl=createTextElement(doc,"Functionality" , null, new Couple("id", subFunctRes.getInt(1)+""), + new Couple("name", subFunctRes.getString(2)), + new Couple("enableCS", subFunctRes.getInt(1)==10 ? "true" : "false"), + new Couple("selected", selectedFunct.contains(subFunctRes.getInt(1)) ? "true" : "false")); + + subFunctEl.appendChild(createTextElement(doc, "FunctionalityDescription", subFunctRes.getString(3))); + functionalityEl.appendChild(addElements(doc, "child", new Element[]{subFunctEl})); } - temp.append(""); - toReturn.append(temp); + root.appendChild(functionalityEl); } } catch (SQLException e) { logger.error("VDLModelService: DB error preparing XML for Functionality"); @@ -321,31 +325,15 @@ public class XMLUtil { try { ResultSet csRes=DBInterface.queryDB("select * from cs;"); if (csRes.next()){ - - StringBuilder temp= new StringBuilder(); - temp.append(""; - //else - temp.append("selected=\"false\">"); - temp.append("This class of functions contains compound functions defined by aggregating existing functions in structured workflows as to deliver advanced features."); - + Element csEl= createTextElement(doc, "CS", null, new Couple("id", "-1"), new Couple("name", "Workflows"), new Couple("selected", "false")); + csEl.appendChild(createTextElement(doc,"CSDescription" , "This class of functions contains compound functions defined by aggregating existing functions in structured workflows as to deliver advanced features.")); do{ - temp.append(""); - else temp.append("selected=\"false\">"); - temp.append(""); - temp.append(csRes.getString(3)); - temp.append(""); - temp.append(""); - + Element subCsEl= createTextElement(doc, "CS", null, new Couple("id", csRes.getString(1)), new Couple("name", csRes.getString(2)), new Couple("selected", selectedCS.contains(csRes.getString(1)) ? "true" : "false")); + subCsEl.appendChild(createTextElement(doc,"CSDescription" , csRes.getString(3))); + csEl.appendChild(addElements(doc, "child", new Element[]{subCsEl})); }while (csRes.next()); - temp.append(""); - toReturn.append(temp); - + + root.appendChild(csEl); } @@ -353,9 +341,8 @@ public class XMLUtil { logger.error("VDLModelService: DB error retreiving CS"); e.printStackTrace(); } - - toReturn.append(""); - return toReturn.toString(); + doc.appendChild(root); + return docToString(doc); } @@ -408,5 +395,61 @@ public class XMLUtil { return toReturn.toString(); } + /** + * transform a Document into string + * + * @param doc Document + * @return a String + */ + public static String docToString(Document doc){ + + String temp= null; + try{ + DOMSource domSource = new DOMSource(doc); + + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer serializer = tf.newTransformer(); + StringWriter sw= new StringWriter(); + StreamResult sr= new StreamResult(sw); + serializer.transform(domSource, sr); + temp=sr.getWriter().toString(); + }catch(Exception e){ + logger.error("transformation to String Error"); + e.printStackTrace(); + } + return temp; + } + /** + * + * @param doc the root Document + * @param root the element tag name + * @param elements elements to add + * @return the result element + */ + public static Element addElements(Document doc, String root, Element[] elements){ + Element returnEl= doc.createElement(root); + for (Element el: elements){ + returnEl.appendChild(el); + } + return returnEl; + } + + /** + * + * @param doc the root Document + * @param Tag the element tag name + * @param text the text to add at the element + * @return the result element + */ + public static Element createTextElement(Document doc, String Tag, String text, Couple ... attributes ){ + Element returnEl= doc.createElement("UpTime"); + if (attributes!=null){ + for (Couple attribute : attributes){ + returnEl.setAttribute(attribute.first, attribute.second); + } + } + if (text!=null) returnEl.appendChild(doc.createTextNode(text)); + return returnEl; + } }