001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.sqlc; 005 006 import java.util.Collection; 007 008 import javax.xml.parsers.FactoryConfigurationError; 009 import javax.xml.transform.TransformerException; 010 011 import org.apache.tools.ant.BuildException; 012 import org.apache.tools.ant.Project; 013 import org.apache.xpath.CachedXPathAPI; 014 import org.w3c.dom.Element; 015 import org.w3c.dom.traversal.NodeIterator; 016 017 import biz.hammurapi.ant.XmlSourceEntry; 018 import biz.hammurapi.xml.dom.AbstractDomObject; 019 020 021 /** 022 * @ant.element name="statements" 023 * @author Pavel Vlasov 024 * @version $Revision: 1.6 $ 025 */ 026 public class StatementsEntry extends XmlSourceEntry { 027 028 public void getStatements(Collection statementsReceiver, Collection tableEntriesReceiver) { 029 try { 030 CachedXPathAPI cxpa = new CachedXPathAPI(); 031 Element documentElement = getDocumentElement(); 032 if (documentElement!=null) { 033 NodeIterator nit = cxpa.selectNodeIterator(documentElement, "/statements/query|/statements/update|/statements/table"); 034 Element se; 035 while ((se=(Element) nit.nextNode())!=null) { 036 if ("query".equals(se.getNodeName())) { 037 log("Loading query "+se.getAttribute("name"), Project.MSG_VERBOSE); 038 QueryEntry entry=new QueryEntry(); 039 if (se.hasAttribute("generateMutators")) { 040 entry.setGenerateMutators("yes".equalsIgnoreCase(se.getAttribute("generateMutators"))); 041 } 042 if (se.hasAttribute("singleRow")) { 043 entry.setSingleRow("yes".equalsIgnoreCase(se.getAttribute("singleRow"))); 044 } 045 setStatementAttributes(se, entry); 046 loadColumns(cxpa, se, entry); 047 loadParameters(cxpa, se, entry); 048 statementsReceiver.add(entry); 049 entry.setSmart("yes".equalsIgnoreCase(se.getAttribute("smart"))); 050 entry.setTask(task); 051 } else if ("update".equals(se.getNodeName())) { 052 log("Loading update "+se.getAttribute("name"), Project.MSG_VERBOSE); 053 UpdateEntry entry=new UpdateEntry(); 054 setStatementAttributes(se, entry); 055 loadParameters(cxpa, se, entry); 056 statementsReceiver.add(entry); 057 entry.setTask(task); 058 } else if ("table".equals(se.getNodeName())) { 059 log("Loading table "+se.getAttribute("catalog")+":"+se.getAttribute("schema")+":"+se.getAttribute("table"), Project.MSG_VERBOSE); 060 TableEntry entry=new TableEntry(); 061 if (se.hasAttribute("catalog")) { 062 entry.setCatalog(se.getAttribute("catalog")); 063 } 064 if (se.hasAttribute("schema")) { 065 entry.setSchema(se.getAttribute("schema")); 066 } 067 if (se.hasAttribute("table")) { 068 entry.setTable(se.getAttribute("table")); 069 } 070 if (se.hasAttribute("generateMutators")) { 071 entry.setGenerateMutators("yes".equalsIgnoreCase(se.getAttribute("generateMutators"))); 072 } 073 if (se.hasAttribute("paramsPerColumnInsert")) { 074 entry.setParamPerColumnInsert("yes".equalsIgnoreCase(se.getAttribute("paramsPerColumnInsert"))); 075 } 076 if (se.hasAttribute("qualifiedName")) { 077 entry.setQualifiedName(se.getAttribute("qualifiedName")); 078 } 079 loadColumns(cxpa, se, entry); 080 tableEntriesReceiver.add(entry); 081 entry.setTask(task); 082 } else { 083 throw new BuildException("Unsupported entry type: "+se.getNodeName()); 084 } 085 } 086 } 087 } catch (TransformerException e) { 088 throw new BuildException("Cannot load queries", e); 089 } catch (FactoryConfigurationError e) { 090 throw new BuildException("Cannot load queries", e); 091 } 092 } 093 094 /** 095 * @param cxpa 096 * @param qe 097 * @param entry 098 * @throws TransformerException 099 */ 100 private void loadColumns(CachedXPathAPI cxpa, Element qe, ColumnHolder entry) throws TransformerException { 101 NodeIterator cit=cxpa.selectNodeIterator(qe,"column"); 102 Element ce; 103 while ((ce=(Element) cit.nextNode())!=null) { 104 ColumnType ct=new ColumnType(); 105 if (ce.hasAttribute("type")) { 106 ct.setType(ce.getAttribute("type")); 107 } 108 if ("yes".equals(ce.getAttribute("skip"))) { 109 ct.setSkip(true); 110 } 111 ct.setName(ce.getAttribute("name")); 112 entry.addConfiguredColumn(ct); 113 } 114 } 115 116 /** 117 * @param cxpa 118 * @param qe 119 * @param entry 120 * @throws TransformerException 121 */ 122 private void loadParameters(CachedXPathAPI cxpa, Element qe, StatementEntry entry) throws TransformerException { 123 NodeIterator pit=cxpa.selectNodeIterator(qe,"parameter"); 124 Element pe; 125 while ((pe=(Element) pit.nextNode())!=null) { 126 ParamType pt=new ParamType(); 127 if (pe.hasAttribute("type")) { 128 pt.setType(pe.getAttribute("type")); 129 } 130 pt.setPosition(Integer.parseInt(pe.getAttribute("name"))); 131 entry.addConfiguredParameter(pt); 132 } 133 } 134 135 /** 136 * @param cxpa 137 * @param qe 138 * @param entry 139 */ 140 private void setStatementAttributes(Element qe, StatementEntry entry) { 141 entry.setStatementText(AbstractDomObject.getElementText(qe)); 142 if (qe.hasAttribute("name")) { 143 entry.setName(qe.getAttribute("name")); 144 } 145 146 if (qe.hasAttribute("hasNullableParameters")) { 147 entry.setHasNullableParameters("yes".equalsIgnoreCase(qe.getAttribute("hasNullableParameters"))); 148 } 149 150 if (qe.hasAttribute("description")) { 151 entry.setDescription(qe.getAttribute("description")); 152 } 153 154 if (qe.hasAttribute("parameters")) { 155 entry.setParameters(qe.getAttribute("parameters")); 156 } 157 } 158 159 protected StatementCompilerTask task; 160 161 void setTask(StatementCompilerTask task) { 162 this.task=task; 163 } 164 }