From: Guanming Wu <gua...@us...> - 2004-09-30 02:37:23
|
Update of /cvsroot/gmod/apollo/src/java/apollo/dataadapter/gamexml In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32214/apollo/src/java/apollo/dataadapter/gamexml Modified Files: TransactionXMLAdapter.java Added Files: TransactionXMLTemplate.java Log Message: Use a template for transaction xml generating --- NEW FILE: TransactionXMLTemplate.java --- /* * Created on Sep 28, 2004 * */ package apollo.dataadapter.gamexml; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import apollo.datamodel.SeqFeatureI; import apollo.editor.DeleteTransaction; /** * This class is used to process xml template for transactions. * @author wgm */ public class TransactionXMLTemplate { // The definition for paramter mark private static final String PARAMTER_MARK = "$"; private Document doc; // Default parameter values private Map defaultValues = new HashMap(); // To control export format private String startIndent = ""; private String indent = " "; public TransactionXMLTemplate(String fileName) { loadTemplates(fileName); } public TransactionXMLTemplate(String fileName, String startIndent, String indent) { this(fileName); this.startIndent = startIndent; this.indent = indent; } public void setStartIndent(String indent) { this.startIndent = indent; } public void setIndent(String indent) { this.indent = indent; } private void loadTemplates(String fileName) { try { DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = df.newDocumentBuilder(); doc = builder.parse(fileName); loadDefaultValues(); } catch(Exception e) { System.err.println("XMLTemplate.loadTemplates(): " + e); e.printStackTrace(); } } private void loadDefaultValues() { Element defaultElm = null; Element root = doc.getDocumentElement(); NodeList children = root.getChildNodes(); int size = children.getLength(); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeName().equals("default")) { defaultElm = (Element) node; } } if (defaultElm != null) { children = defaultElm.getChildNodes(); size = children.getLength(); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeName().equals("parameter")) { Element paraElm = (Element) node; String name = paraElm.getAttribute("name"); String value = paraElm.getAttribute("value"); defaultValues.put(name, value); } } } } public String createDeleteExonElement(DeleteTransaction tran) { Element delExonElm = getElement("delete", "exon"); ParameterElement elm = new ParameterElement((Element)delExonElm.cloneNode(true)); SeqFeatureI exon = tran.getSeqFeature(); elm.setValue("$id", exon.getId()); elm.setValue("$parentID", tran.getParentFeature().getId()); elm.setValue("$seqlen", "" + Math.abs(exon.getEnd() - exon.getStart())); elm.setValue("$start", "" + exon.getStart()); elm.setValue("$end", "" + exon.getEnd()); elm.setValue("$phase", "" + exon.getPhase()); elm.compile(); return elm.toString(); } public String createDeleteGeneElement(DeleteTransaction tran) { Element delGeneElm = getElement("delete", "gene"); ParameterElement elm = new ParameterElement((Element)delGeneElm.cloneNode(true)); SeqFeatureI gene = tran.getSeqFeature(); elm.setValue("$id", gene.getId()); elm.compile(); return elm.toString(); } public String createDeleteTranscriptElement(DeleteTransaction tran) { Element delTranscriptElm = getElement("delete", "transcript"); ParameterElement elm = new ParameterElement((Element)delTranscriptElm.cloneNode(true)); SeqFeatureI transcript = tran.getSeqFeature(); elm.setValue("$id", transcript.getId()); elm.setValue("$type", transcript.getType()); elm.compile(); return elm.toString(); } private Element getElement(String operation, String type) { Element root = doc.getDocumentElement(); NodeList children = root.getChildNodes(); int size = children.getLength(); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeName().equals(operation)) { Element elm = (Element) node; if (elm.getAttribute("type").equals(type)) { // Should be the first element NodeList list = elm.getChildNodes(); for (int j = 0; j < list.getLength(); j++) { Node node1 = list.item(j); if (node1.getNodeType() == Node.ELEMENT_NODE) return (Element)node1; } } } } return null; } private Element getElement(String elmName) { // Find the root element Element root = doc.getDocumentElement(); NodeList children = root.getChildNodes(); int size = children.getLength(); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeName().equals(elmName)) return (Element)node; } return null; } public String getRootStartTag() { Element rootElm = getTxRootElement(); StringBuffer buffer = new StringBuffer(); buffer.append("<"); buffer.append(rootElm.getNodeName()); NamedNodeMap atts = rootElm.getAttributes(); if (atts != null) { int size = atts.getLength(); for (int i = 0; i < size; i++) { Node node = atts.item(i); if (node.getNodeType() == Node.ATTRIBUTE_NODE) { Attr att = (Attr) node; buffer.append(" "); buffer.append(att.getName()); buffer.append("=\""); buffer.append(att.getName()); buffer.append("\""); } } } buffer.append(">\n"); return buffer.toString(); } public String getRootEndTag() { Element txRootElm = getTxRootElement(); return "</" + txRootElm.getNodeName() + ">\n"; } private Element getTxRootElement() { Element rootElm = getElement("root"); NodeList children = rootElm.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { return (Element)node; } } return null; } public String getPreambleString() { Element preamleElm = getElement("preamble"); if (preamleElm != null) { StringBuffer buffer = new StringBuffer(); // No need for <preamble> element NodeList children = preamleElm.getChildNodes(); int size = children.getLength(); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) convertElementToString((Element)node, buffer, startIndent); } return buffer.toString(); } return null; } private void convertElementToString(Element element, StringBuffer buffer, String indent1) { buffer.append(indent1); buffer.append("<"); buffer.append(element.getNodeName()); // Convert attributes NamedNodeMap attributes = element.getAttributes(); if (attributes != null) { int size = attributes.getLength(); Node node = null; for (int i = 0; i < size; i++) { node = attributes.item(i); if (node.getNodeType() == Node.ATTRIBUTE_NODE) { Attr att = (Attr) node; buffer.append(" "); buffer.append(att.getName()); buffer.append("=\""); buffer.append(att.getValue()); buffer.append("\""); } } } buffer.append(">"); // Convert elements NodeList children = element.getChildNodes(); int size = children.getLength(); // A special case for text node if (size == 1 && children.item(0).getNodeType() == Node.TEXT_NODE) { Node textNode = children.item(0); buffer.append(textNode.getNodeValue()); } else { // Close the start tag buffer.append("\n"); for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { convertElementToString((Element) node, buffer, indent1 + indent); } } buffer.append(indent1); } buffer.append("</"); buffer.append(element.getNodeName()); buffer.append(">\n"); } class ParameterElement { private Map parameters = new HashMap(); private Element element; ParameterElement(Element elm) { this.element = elm; } public void setValue(String paraName, String value) { parameters.put(paraName, value); } /** * Convert all parameters to the specified values. * */ public void compile() { compile(element); } private void compile(Element elm) { // Check attributes NamedNodeMap attMap = elm.getAttributes(); if (attMap != null) { int size = attMap.getLength(); Node node = null; for (int i = 0; i < size; i++) { node = attMap.item(i); if (node.getNodeType() == Node.ATTRIBUTE_NODE) { Attr attr = (Attr) node; String attrValue = attr.getValue(); if (attrValue.startsWith(PARAMTER_MARK)) { // A mark for parameter String value = (String) parameters.get(attrValue); if (value == null) { // Check default value value = (String) defaultValues.get(attrValue); } if (value != null) attr.setValue(value); } } } } // Check child elements NodeList children = elm.getChildNodes(); int size = children.getLength(); // A special case for text node for (int i = 0; i < size; i++) { Node node = children.item(i); if (node.getNodeType() == Node.TEXT_NODE) { // Should break here. There should be only one text node // Check if this TextNode is for paramter String textValue = node.getNodeValue(); if (textValue.startsWith(PARAMTER_MARK)) { String value = (String) parameters.get(textValue); if (value == null) { value = (String) defaultValues.get(textValue); } if (value != null) node.setNodeValue(value); } } else if (node.getNodeType() == Node.ELEMENT_NODE) { compile((Element)node); } } } public String toString() { StringBuffer buffer = new StringBuffer(); convertElementToString(element, buffer, startIndent); return buffer.toString(); } } } Index: TransactionXMLAdapter.java =================================================================== RCS file: /cvsroot/gmod/apollo/src/java/apollo/dataadapter/gamexml/TransactionXMLAdapter.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** TransactionXMLAdapter.java 28 Sep 2004 18:39:43 -0000 1.2 --- TransactionXMLAdapter.java 30 Sep 2004 02:37:04 -0000 1.3 *************** *** 13,16 **** --- 13,19 ---- import java.util.List; + import apollo.datamodel.Exon; + import apollo.datamodel.SeqFeatureI; + import apollo.datamodel.Transcript; import apollo.editor.AddTransaction; import apollo.editor.DeleteTransaction; *************** *** 59,94 **** System.out.println("Save transaction objects: " + transactions.size()); StringBuffer buffer = new StringBuffer(); buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); ! buffer.append("<transactions>\n"); ! String indent = " "; Transaction ts = null; for (Iterator it = transactions.iterator(); it.hasNext();) { ts = (Transaction) it.next(); if (ts instanceof DeleteTransaction) { DeleteTransaction delTs = (DeleteTransaction) ts; ! buffer.append(indent); ! // Time stamp ! buffer.append("<delete timestamp=\"" + ts.getDate() + "\" "); ! // parent_id ! buffer.append("parentID=\""); ! buffer.append(delTs.getParentFeature().getId()); ! buffer.append("\">\n"); ! buffer.append(indent + indent); ! // Deleted feature ! buffer.append("<"); ! buffer.append(delTs.getDeletedFeature().getType()); ! buffer.append(" id=\""); ! buffer.append(delTs.getDeletedFeature().getId()); ! if (delTs.getSubpart() == null) ! buffer.append("\" />\n"); // Close it. No more info is needed ! else { ! buffer.append(indent + indent + indent); ! String subpart = delTs.getSubpart().toString(); ! buffer.append("<"); ! buffer.append(subpart); ! buffer.append(" />\n"); ! } ! buffer.append(indent); ! buffer.append("</delete>\n"); } else if (ts instanceof AddTransaction) { --- 62,78 ---- System.out.println("Save transaction objects: " + transactions.size()); StringBuffer buffer = new StringBuffer(); + TransactionXMLTemplate template = new TransactionXMLTemplate("conf" + File.separator + "transactionXMLTemplate.xml"); + template.setStartIndent(" "); + template.setIndent(" "); buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); ! buffer.append(template.getRootStartTag()); ! buffer.append(template.getPreambleString()); Transaction ts = null; + String indent = " "; for (Iterator it = transactions.iterator(); it.hasNext();) { ts = (Transaction) it.next(); if (ts instanceof DeleteTransaction) { DeleteTransaction delTs = (DeleteTransaction) ts; ! saveDeleteTransaction(delTs, buffer, template); } else if (ts instanceof AddTransaction) { *************** *** 111,118 **** } } ! buffer.append("</transactions>\n"); saveToFile(buffer, fileName); } private void saveToFile(StringBuffer buffer, String fileName) throws IOException { FileWriter fileWriter = new FileWriter(fileName); --- 95,115 ---- } } ! buffer.append(template.getRootEndTag()); saveToFile(buffer, fileName); } + private void saveDeleteTransaction(DeleteTransaction transaction, StringBuffer buffer, TransactionXMLTemplate template) { + SeqFeatureI feature = transaction.getDeletedFeature(); + if (feature instanceof Exon) { + buffer.append(template.createDeleteExonElement(transaction)); + } + else if (feature instanceof Transcript) { + buffer.append(template.createDeleteTranscriptElement(transaction)); + } + else { // Assume a Gene is deleted + buffer.append(template.createDeleteGeneElement(transaction)); + } + } + private void saveToFile(StringBuffer buffer, String fileName) throws IOException { FileWriter fileWriter = new FileWriter(fileName); |