1 16 17 package org.pentaho.data.connection.xquery; 18 19 import java.util.ArrayList ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import net.sf.saxon.om.Axis; 23 import net.sf.saxon.om.AxisIterator; 24 import net.sf.saxon.tinytree.TinyNodeImpl; 25 import net.sf.saxon.type.Type; 26 27 import org.pentaho.core.connection.AbstractPentahoMetaData; 28 29 35 public class XQMetaData extends AbstractPentahoMetaData { 36 public static final String DEFAULT_COLUMN_NAME = "Default Column"; private Object [][] columnHeaders; 38 private Object [][] rowHeaders; 39 40 int rowCount = 0; 41 42 public XQMetaData(Iterator iter) { 43 List headers = new ArrayList (); 44 while (iter.hasNext()) { 45 rowCount++; 46 Object obj = iter.next(); 47 if (obj instanceof TinyNodeImpl) { 48 boolean processedChildren = false; 49 AxisIterator aIter = ((TinyNodeImpl) obj).iterateAxis(Axis.DESCENDANT); 50 Object descendent = aIter.next(); 51 while (descendent != null) { 52 if (descendent instanceof TinyNodeImpl && ((TinyNodeImpl) descendent).getNodeKind() == Type.ELEMENT) { 53 TinyNodeImpl descNode = (TinyNodeImpl) descendent; 54 processedChildren = true; 55 if (!headers.contains(descNode.getDisplayName())) { 56 headers.add(descNode.getDisplayName()); 57 } 58 } 59 descendent = aIter.next(); 60 } 61 if (!processedChildren) { 62 Object value = ((TinyNodeImpl) obj).getDisplayName(); 63 if (!headers.contains(value)) { 64 headers.add(value); 65 } 66 } 67 } 68 } 69 if (headers.size() > 0) { 70 columnHeaders = new Object [1][headers.size()]; 71 Iterator headerIter = headers.iterator(); 72 int i = 0; 73 while (headerIter.hasNext()) { 74 columnHeaders[0][i] = headerIter.next(); 75 i++; 76 } 77 } else { 78 columnHeaders = new Object [1][1]; 79 columnHeaders[0][0] = DEFAULT_COLUMN_NAME; 80 } 81 82 } 83 84 public int getRowCount() { 85 return rowCount; 86 } 87 88 93 public Object [][] getColumnHeaders() { 94 return columnHeaders; 95 } 96 97 102 public Object [][] getRowHeaders() { 103 return rowHeaders; 104 } 105 } 106 | Popular Tags |