From f35e504cde65bff4131949cdf132ab59b3bb494d Mon Sep 17 00:00:00 2001 From: Julian Hyde Date: Wed, 12 Nov 2008 07:39:40 +0000 Subject: [PATCH] Mainly code formatting. Fix how ConnectionTest.testXmlaCatalogParameter unwraps statements. Clean up DoubleSubmissionTestProxy by factoring out base class DelegatingTestProxy. git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@135 c6a108a4-781c-0410-a6c6-c2d559e19af0 --- .../driver/xmla/XmlaOlap4jConnection.java | 2 - .../olap4j/driver/xmla/XmlaOlap4jCube.java | 4 - .../olap4j/driver/xmla/XmlaOlap4jDriver.java | 4 - .../xmla/XmlaOlap4jPreparedStatement.java | 1 - .../olap4j/driver/xmla/XmlaOlap4jUtil.java | 73 +++--- .../XmlaOlap4jConcurrentMemoryCache.java | 1 - .../cache/XmlaOlap4jNamedMemoryCache.java | 1 - .../proxy/XmlaOlap4jAbstractHttpProxy.java | 8 +- .../xmla/proxy/XmlaOlap4jCookieManager.java | 4 - src/org/olap4j/mdx/MdxUtil.java | 6 +- src/org/olap4j/transform/AxisTransform.java | 1 - .../DrillDownOnPositionTransform.java | 24 +- .../transform/DrillReplaceTransform.java | 10 +- src/org/olap4j/transform/Quax.java | 3 - .../transform/RollUpLevelTransform.java | 10 +- src/org/olap4j/type/HierarchyType.java | 1 - testsrc/org/olap4j/ConnectionTest.java | 28 +-- testsrc/org/olap4j/MetadataTest.java | 1 - testsrc/org/olap4j/OlapTest.java | 45 ++-- testsrc/org/olap4j/XmlaConnectionTest.java | 230 ++++++++++++++---- .../xmla/proxy/XmlaCookieManagerTest.java | 3 - testsrc/org/olap4j/test/ParserTest.java | 1 - testsrc/org/olap4j/test/TestContext.java | 1 - .../org/olap4j/transform/TransformTest.java | 1 - 24 files changed, 276 insertions(+), 187 deletions(-) diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java index a5632b8..4a8e8d2 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java @@ -188,7 +188,6 @@ abstract class XmlaOlap4jConnection implements OlapConnection { * while creating the cache. */ private void initSoapCache(Map map) throws OlapException { - // Test if a SOAP cache class was defined if (map.containsKey(XmlaOlap4jDriver.Property.Cache.name() .toUpperCase())) @@ -1368,7 +1367,6 @@ static abstract class HandlerImpl implements Handler { public void sortList(List list) { // do nothing - assume XMLA returned list in correct order } - } static class Context { diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jCube.java b/src/org/olap4j/driver/xmla/XmlaOlap4jCube.java index 18c4859..020ce0d 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jCube.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jCube.java @@ -434,10 +434,6 @@ public XmlaOlap4jMember lookupMemberByUniqueName( } } - /* (non-Javadoc) - * @see org.olap4j.driver.xmla.MetadataReader - * #lookupMembersByUniqueName(java.util.List, java.util.Map) - */ public void lookupMembersByUniqueName( List memberUniqueNames, Map memberMap) throws OlapException diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java b/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java index c8668e6..f98b565 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java @@ -149,11 +149,7 @@ private static void register() throws SQLException { DriverManager.registerDriver(new XmlaOlap4jDriver()); } - /* (non-Javadoc) - * @see java.sql.Driver#connect(java.lang.String, java.util.Properties) - */ public Connection connect(String url, Properties info) throws SQLException { - // Checks if this driver handles this connection, exit otherwise. if (!XmlaOlap4jConnection.acceptsURL(url)) { return null; diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jPreparedStatement.java b/src/org/olap4j/driver/xmla/XmlaOlap4jPreparedStatement.java index 847aa4b..9cbb0ae 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jPreparedStatement.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jPreparedStatement.java @@ -54,7 +54,6 @@ abstract class XmlaOlap4jPreparedStatement this.cellSetMetaData = cellSetMetaData1.cloneFor(this); cellSet.close(); statement.close(); - } catch (SQLException e) { throw OlapExceptionHelper.createException( "Error while preparing statement '" + mdx + "'", diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jUtil.java b/src/org/olap4j/driver/xmla/XmlaOlap4jUtil.java index 501d2d2..d881030 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jUtil.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jUtil.java @@ -64,7 +64,6 @@ abstract class XmlaOlap4jUtil { static Document parse(byte[] in) throws SAXException, IOException { - InputSource source = new InputSource(new ByteArrayInputStream(in)); DOMParser parser = getParser(null, null, false); @@ -110,16 +109,15 @@ static DOMParser getParser( } /** - * See if the DOMParser after parsing a Document has any errors and, - * if so, throw a RuntimeException exception containing the errors. - * + * Checks whether the DOMParser after parsing a Document has any errors and, + * if so, throws a RuntimeException exception containing the errors. */ static void checkForParseError(DOMParser parser, Throwable t) { final ErrorHandler errorHandler = parser.getErrorHandler(); if (errorHandler instanceof SAXErrorHandler) { final SAXErrorHandler saxEH = (SAXErrorHandler) errorHandler; - final List errors = saxEH.getErrors(); + final List errors = saxEH.getErrors(); if (errors != null && errors.size() > 0) { String errorStr = SAXErrorHandler.formatErrorInfos(saxEH); @@ -162,14 +160,14 @@ static String prettyPrint(Element element) { } private static void prettyPrintLoop( - NodeList nodes, - StringBuilder string, - String indentation) - { - for (int index = 0; index < nodes.getLength(); index++) { - prettyPrintLoop(nodes.item(index), string, indentation); - } + NodeList nodes, + StringBuilder string, + String indentation) + { + for (int index = 0; index < nodes.getLength(); index++) { + prettyPrintLoop(nodes.item(index), string, indentation); } + } private static void prettyPrintLoop( Node node, @@ -181,9 +179,7 @@ private static void prettyPrintLoop( } int type = node.getNodeType(); - switch (type) { - case Node.DOCUMENT_NODE: string.append("\n"); prettyPrintLoop(node.getChildNodes(), string, indentation + "\t"); @@ -194,18 +190,19 @@ private static void prettyPrintLoop( string.append("<"); string.append(node.getNodeName()); - int length = (node.getAttributes() != null) ? - node.getAttributes().getLength() : 0; - Attr attributes[] = new Attr[length]; - for (int loopIndex = 0; loopIndex < length; loopIndex++) { - attributes[loopIndex] = - (Attr)node.getAttributes().item(loopIndex); + Attr[] attributes; + if (node.getAttributes() != null) { + int length = node.getAttributes().getLength(); + attributes = new Attr[length]; + for (int loopIndex = 0; loopIndex < length; loopIndex++) { + attributes[loopIndex] = + (Attr)node.getAttributes().item(loopIndex); + } + } else { + attributes = new Attr[0]; } - for (int loopIndex = 0; loopIndex < attributes.length; - loopIndex++) - { - Attr attribute = attributes[loopIndex]; + for (Attr attribute : attributes) { string.append(" "); string.append(attribute.getNodeName()); string.append("=\""); @@ -226,7 +223,8 @@ private static void prettyPrintLoop( case Node.TEXT_NODE: string.append(indentation); - string.append(node.getNodeValue().trim() + "\n"); + string.append(node.getNodeValue().trim()); + string.append("\n"); break; case Node.PROCESSING_INSTRUCTION_NODE: @@ -249,7 +247,6 @@ private static void prettyPrintLoop( } } - static Element findChild(Element element, String ns, String tag) { final NodeList childNodes = element.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { @@ -329,7 +326,7 @@ static List findChildren(Element element, String ns, String tag) { } /** - * Convert a Node to a String. + * Converts a Node to a String. * * @param node XML node * @param prettyPrint Whether to print with nice indentation @@ -461,14 +458,7 @@ public static String formatErrorInfo(ErrorInfo ei) { buf.append(ei.exception.getMessage()); return buf.toString(); } - public static class ErrorInfo { - public SAXParseException exception; - public short severity; - ErrorInfo(short severity, SAXParseException exception) { - this.severity = severity; - this.exception = exception; - } - } + private List errors; public SAXErrorHandler() { } @@ -485,7 +475,8 @@ public void error(SAXParseException exception) throws SAXException { addError(new ErrorInfo(SEVERITY_ERROR, exception)); } public void fatalError(SAXParseException exception) - throws SAXException { + throws SAXException + { addError(new ErrorInfo(SEVERITY_FATAL_ERROR, exception)); } protected void addError(ErrorInfo ei) { @@ -501,6 +492,16 @@ public String getFirstError() { : ""; } } + + static class ErrorInfo { + final SAXParseException exception; + final short severity; + + ErrorInfo(short severity, SAXParseException exception) { + this.severity = severity; + this.exception = exception; + } + } } // End XmlaOlap4jUtil.java diff --git a/src/org/olap4j/driver/xmla/cache/XmlaOlap4jConcurrentMemoryCache.java b/src/org/olap4j/driver/xmla/cache/XmlaOlap4jConcurrentMemoryCache.java index 1479b9a..29d7368 100644 --- a/src/org/olap4j/driver/xmla/cache/XmlaOlap4jConcurrentMemoryCache.java +++ b/src/org/olap4j/driver/xmla/cache/XmlaOlap4jConcurrentMemoryCache.java @@ -200,7 +200,6 @@ public void put(final URL url, final byte[] request, * evicting an entry based on the selected eviction mode. */ private void cleanExpired(boolean makeRoom) { - String toBeEvicted = null; if (evictionMode == MODE.FIFO || evictionMode == MODE.LIFO) { diff --git a/src/org/olap4j/driver/xmla/cache/XmlaOlap4jNamedMemoryCache.java b/src/org/olap4j/driver/xmla/cache/XmlaOlap4jNamedMemoryCache.java index 646a544..4d5191a 100644 --- a/src/org/olap4j/driver/xmla/cache/XmlaOlap4jNamedMemoryCache.java +++ b/src/org/olap4j/driver/xmla/cache/XmlaOlap4jNamedMemoryCache.java @@ -127,7 +127,6 @@ private static synchronized void initCaches() { if (caches == null) { caches = new ConcurrentHashMap(); } - } // implement XmlaOlap4jCache diff --git a/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jAbstractHttpProxy.java b/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jAbstractHttpProxy.java index 70e4cf8..0b36397 100644 --- a/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jAbstractHttpProxy.java +++ b/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jAbstractHttpProxy.java @@ -101,12 +101,10 @@ protected void saveCookies(URLConnection urlConn) { this.cookieManager.storeCookies(urlConn); } - /* (non-Javadoc) - * @see org.olap4j.driver.xmla.XmlaOlap4jDriver.Proxy#setCache( - * java.lang.String, java.util.Properties) - */ @SuppressWarnings("unchecked") - public void setCache(Map config, Map properties) + public void setCache( + Map config, + Map properties) throws OlapException { try { diff --git a/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jCookieManager.java b/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jCookieManager.java index ae007f5..00eb59a 100644 --- a/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jCookieManager.java +++ b/src/org/olap4j/driver/xmla/proxy/XmlaOlap4jCookieManager.java @@ -83,7 +83,6 @@ public XmlaOlap4jCookieManager() { * @throws java.io.IOException Thrown if conn is not open. */ public void storeCookies(URLConnection conn) { - // Determines the domain from where these cookies are being sent String domain = getDomainFromHost(conn.getURL().getHost()); @@ -125,7 +124,6 @@ public void storeCookies(URLConnection conn) { if (this.debug == true) { System.out.println("Saving cookie : " + name + "=" + value); } - } while (st.hasMoreTokens()) { @@ -159,7 +157,6 @@ public void storeCookies(URLConnection conn) { * @throws java.io.IOException Thrown if conn has already been opened. */ public void setCookies(URLConnection conn) { - // Determines the domain and path to retrieve the appropriate cookies URL url = conn.getURL(); String domain = getDomainFromHost(url.getHost()); @@ -233,7 +230,6 @@ private boolean comparePaths(String cookiePath, String targetPath) { } else { return false; } - } /** diff --git a/src/org/olap4j/mdx/MdxUtil.java b/src/org/olap4j/mdx/MdxUtil.java index eff4cdc..5e61b10 100644 --- a/src/org/olap4j/mdx/MdxUtil.java +++ b/src/org/olap4j/mdx/MdxUtil.java @@ -62,9 +62,9 @@ static String mdxEncodeString(String st) { char c = st.charAt(i); if ((c == ']') && ((i + 1) < st.length()) && - (st.charAt(i + 1) != '.')) { - - retString.append(']'); //escaping character + (st.charAt(i + 1) != '.')) + { + retString.append(']'); // escaping character } retString.append(c); } diff --git a/src/org/olap4j/transform/AxisTransform.java b/src/org/olap4j/transform/AxisTransform.java index c8dee1d..1c15ecc 100644 --- a/src/org/olap4j/transform/AxisTransform.java +++ b/src/org/olap4j/transform/AxisTransform.java @@ -32,7 +32,6 @@ protected AxisTransform(Axis axis) { } public SelectNode apply(SelectNode sn) { - // do a deep copy of the existing query SelectNode before // modifying it: SelectNode newSelectNode = sn.deepCopy(); diff --git a/src/org/olap4j/transform/DrillDownOnPositionTransform.java b/src/org/olap4j/transform/DrillDownOnPositionTransform.java index f28f19c..35f61c4 100644 --- a/src/org/olap4j/transform/DrillDownOnPositionTransform.java +++ b/src/org/olap4j/transform/DrillDownOnPositionTransform.java @@ -75,24 +75,24 @@ public class DrillDownOnPositionTransform extends AxisTransform { * @param cellSet */ public DrillDownOnPositionTransform( - // ParseTreeNode query, - Axis axis, - int positionOrdinalInAxis, - int memberOrdinalInPosition, - CellSet cellSet) { - + Axis axis, + int positionOrdinalInAxis, + int memberOrdinalInPosition, + CellSet cellSet) + { super(axis); // this.positionOrdinalInAxis = positionOrdinalInAxis; // this.memberOrdinalInPosition = memberOrdinalInPosition; // this.cellSet = cellSet; positionToDrill = - TransformUtil.getPositionFromCellSet(axis, positionOrdinalInAxis, - cellSet); - memberToDrill = TransformUtil.getMemberFromCellSet(axis, - positionOrdinalInAxis, memberOrdinalInPosition, cellSet); - pathToMember = TransformUtil.getPathToMember(positionToDrill, - memberOrdinalInPosition); + TransformUtil.getPositionFromCellSet( + axis, positionOrdinalInAxis, cellSet); + memberToDrill = TransformUtil.getMemberFromCellSet( + axis, positionOrdinalInAxis, memberOrdinalInPosition, cellSet); + pathToMember = TransformUtil.getPathToMember( + positionToDrill, + memberOrdinalInPosition); } public String getName() { diff --git a/src/org/olap4j/transform/DrillReplaceTransform.java b/src/org/olap4j/transform/DrillReplaceTransform.java index df63e9a..5a4f4fc 100644 --- a/src/org/olap4j/transform/DrillReplaceTransform.java +++ b/src/org/olap4j/transform/DrillReplaceTransform.java @@ -54,11 +54,11 @@ public class DrillReplaceTransform extends AxisTransform { * transformed */ public DrillReplaceTransform( - Axis axis, - int positionOrdinalInAxis, - int memberOrdinalInPosition, - CellSet cellSet) { - + Axis axis, + int positionOrdinalInAxis, + int memberOrdinalInPosition, + CellSet cellSet) + { super(axis); // this.positionOrdinalInAxis = positionOrdinalInAxis; diff --git a/src/org/olap4j/transform/Quax.java b/src/org/olap4j/transform/Quax.java index 9917545..6c73857 100644 --- a/src/org/olap4j/transform/Quax.java +++ b/src/org/olap4j/transform/Quax.java @@ -31,7 +31,6 @@ * @since Aug 7, 2008 */ public class Quax { - private final CellSetAxis cellSetAxis; private TreeNode memberTree; @@ -42,9 +41,7 @@ public Quax(CellSetAxis cellSetAxis) { for (Position p : cellSetAxis.getPositions()) { p.getMembers(); } - } - } // End Quax.java diff --git a/src/org/olap4j/transform/RollUpLevelTransform.java b/src/org/olap4j/transform/RollUpLevelTransform.java index 9c966aa..e9b7b9d 100644 --- a/src/org/olap4j/transform/RollUpLevelTransform.java +++ b/src/org/olap4j/transform/RollUpLevelTransform.java @@ -52,11 +52,11 @@ public class RollUpLevelTransform extends AxisTransform { * @param cellSet */ public RollUpLevelTransform( - Axis axis, - int positionOrdinalInAxis, - int memberOrdinalInPosition, - CellSet cellSet) { - + Axis axis, + int positionOrdinalInAxis, + int memberOrdinalInPosition, + CellSet cellSet) + { super(axis); // this.positionOrdinalInAxis = positionOrdinalInAxis; diff --git a/src/org/olap4j/type/HierarchyType.java b/src/org/olap4j/type/HierarchyType.java index 7776d1c..eeaef36 100755 --- a/src/org/olap4j/type/HierarchyType.java +++ b/src/org/olap4j/type/HierarchyType.java @@ -48,7 +48,6 @@ public HierarchyType( } buf.append(">"); this.digest = buf.toString(); - } // not part of public olap4j API diff --git a/testsrc/org/olap4j/ConnectionTest.java b/testsrc/org/olap4j/ConnectionTest.java index 027671b..658cb48 100644 --- a/testsrc/org/olap4j/ConnectionTest.java +++ b/testsrc/org/olap4j/ConnectionTest.java @@ -315,10 +315,12 @@ public void testXmlaCatalogParameter() throws Exception { tester.getURL().replaceFirst("\\;Catalog=FoodMart", ""), info); assertEquals("FoodMart", connection.getCatalog()); - ((OlapConnection)connection).getCatalogs(); + final NamedList catalogs = + ((OlapConnection) connection).getCatalogs(); + assertNotNull(catalogs); Statement statement = connection.createStatement(); OlapStatement olapStatement = - tester.getWrapper().unwrap(statement, OlapStatement.class); + TestContext.Wrapper.NONE.unwrap(statement, OlapStatement.class); CellSet cellSet = olapStatement.executeOlapQuery( "SELECT FROM [Sales]"); @@ -995,18 +997,18 @@ public void testCell() throws Exception { // todo: test CellSetAxis methods /* - public int getAxisOrdinal() { - public CellSet getCellSet() { - public CellSetAxisMetaData getAxisMetaData() { - public List getPositions() { - public int getPositionCount() { - public ListIterator iterate() { + public int getAxisOrdinal() + public CellSet getCellSet() + public CellSetAxisMetaData getAxisMetaData() + public List getPositions() + public int getPositionCount() + public ListIterator iterate() todo: test OlapResultAxisMetaData methods - public org.olap4j.Axis getAxisOrdinal() { - public List getHierarchies() { - public List getProperties() { + public org.olap4j.Axis getAxisOrdinal() + public List getHierarchies() + public List getProperties() */ } @@ -1048,7 +1050,6 @@ public void testScrolling() { int y = ResultSet.TYPE_FORWARD_ONLY; // are how to ask for these characteristics. also need to document this // behavior in the API and the spec. in one mode, - } /** @@ -1063,7 +1064,6 @@ public void testScrolling() { * exist. */ public void testParsing() throws SQLException { - // parse connection = tester.createConnection(); @@ -1120,7 +1120,6 @@ private void checkUnparsedMdx(SelectNode select) { "FROM [sales]\n" + "WHERE [Time].[1997].[Q4]"), mdx); - } /** @@ -1614,7 +1613,6 @@ public void testRagged() throws SQLException { "Row #11: 2\n" + "Row #11: 10\n"), s); - } /** * Tests members from a parent-child hierarchy. diff --git a/testsrc/org/olap4j/MetadataTest.java b/testsrc/org/olap4j/MetadataTest.java index b3764b1..5cb4ac3 100644 --- a/testsrc/org/olap4j/MetadataTest.java +++ b/testsrc/org/olap4j/MetadataTest.java @@ -442,7 +442,6 @@ public void testDatabaseMetaDataGetSets() throws SQLException { catalogName, null, null, "non existent set"), SETS_COLUMN_NAMES); assertEquals("", s); - } // todo: More tests required for other methods on DatabaseMetaData diff --git a/testsrc/org/olap4j/OlapTest.java b/testsrc/org/olap4j/OlapTest.java index 387e1e5..4fc0d64 100644 --- a/testsrc/org/olap4j/OlapTest.java +++ b/testsrc/org/olap4j/OlapTest.java @@ -91,12 +91,10 @@ public Cube getFoodmartCube(String cubeName) { // take the first cube return cubes.get(cubeName); - } catch (Exception e) { e.printStackTrace(); } return null; - } public void testModel() { @@ -258,12 +256,10 @@ public void testModel() { result = query.execute(); System.out.println(result.toString()); System.out.println(Olap4jXml.xmlToString(Olap4jXml.resultToDoc(result))); - } catch (Throwable t) { t.printStackTrace(); fail(); } - } public void testSelectionModes() { @@ -441,7 +437,6 @@ public void testMultipleDimensionSelections() { "[Store].[All Stores].[USA].Children}}, " + "{[Time].[1997].Children})) ON ROWS\n" + "FROM [Sales]")); - } catch (Exception e) { e.printStackTrace(); fail(); @@ -504,8 +499,6 @@ public void testSwapAxes() { "FROM [Sales]")); query.swapAxes(); - - } catch (Exception e) { e.printStackTrace(); fail(); @@ -537,11 +530,9 @@ public static void listMembers(Level level) throws OlapException { } public static void main(String args[]) { - OlapTest olapTest = new OlapTest(); olapTest.testModel(); - } static class Olap4jXml { @@ -595,8 +586,12 @@ public static Document resultToDoc(CellSet result) { return doc; } - public static void selectionToXml(Selection selection, List members, Document doc, Element parent) { - + public static void selectionToXml( + Selection selection, + List members, + Document doc, + Element parent) + { try { Element root = doc.createElement("olap4j-members"); parent.appendChild(root); @@ -611,16 +606,17 @@ public static void selectionToXml(Selection selection, List members, Doc memberToXml(member, doc, membersNode); } } - } catch (Throwable t) { t.printStackTrace(); } } - public static void queryToXml(Query query, Document doc, Element parent) { - + public static void queryToXml( + Query query, + Document doc, + Element parent) + { try { - Element root = doc.createElement("query"); parent.appendChild(root); @@ -632,16 +628,17 @@ public static void queryToXml(Query query, Document doc, Element parent) { axisToXml(query.getAxes().get(Axis.COLUMNS), doc, axes); axisToXml(query.getAxes().get(Axis.ROWS), doc, axes); axisToXml(query.getAxes().get(Axis.FILTER), doc, axes); - } catch (Throwable t) { t.printStackTrace(); } } - public static void resultsToXml(CellSet result, Document doc, Element parent) { - + public static void resultsToXml( + CellSet result, + Document doc, + Element parent) + { try { - Element root = doc.createElement("result"); parent.appendChild(root); @@ -659,7 +656,6 @@ public static void resultsToXml(CellSet result, Document doc, Element parent) { } // TODO - } catch (Throwable t) { t.printStackTrace(); } @@ -695,7 +691,6 @@ public static void axisToXml( for (QueryDimension dimension : dimensions) { dimensionSelectionsToXml(dimension, doc, dimensionsNode); } - } catch (Throwable t) { t.printStackTrace(); } @@ -707,14 +702,12 @@ public static void memberToXml( Element parent) { try { - Element root = doc.createElement("member"); parent.appendChild(root); addCDataNode("name", member.getName(), root); addCDataNode("unique-name", member.getUniqueName(), root); // addCDataNode("description", member.getDescription(null), root); - } catch (Throwable t) { t.printStackTrace(); } @@ -726,7 +719,6 @@ public static void selectionToXml( Element parent) { try { - Element root = doc.createElement("selection"); parent.appendChild(root); @@ -743,7 +735,6 @@ public static void selectionToXml( addCDataNode("operation", "member", root); break; } - } catch (Throwable t) { t.printStackTrace(); } @@ -761,7 +752,6 @@ public static void cubeToXml( } try { - Element root = doc.createElement("cube"); parent.appendChild(root); @@ -775,7 +765,6 @@ public static void cubeToXml( dimensionToXml(dimension, doc, dimensionsNode); } } - } catch (Throwable t) { t.printStackTrace(); } @@ -867,7 +856,6 @@ public static Element hierarchyToXml(Hierarchy hierarchy, Document doc) } public static Element memberToXml(Member member, Element parent) { - Document doc = parent.getOwnerDocument(); Element memberNode = doc.createElement("member"); @@ -905,7 +893,6 @@ public static void addAttribute(String name, String value, Element parent) { } public static Element levelToXml(Level level, Document doc) { - Element levelNode = doc.createElement("level"); addCDataNode("name", level.getName(), levelNode); diff --git a/testsrc/org/olap4j/XmlaConnectionTest.java b/testsrc/org/olap4j/XmlaConnectionTest.java index 60c4347..03a0091 100644 --- a/testsrc/org/olap4j/XmlaConnectionTest.java +++ b/testsrc/org/olap4j/XmlaConnectionTest.java @@ -6,11 +6,12 @@ import java.sql.*; import java.util.*; import java.util.concurrent.Future; - -import mondrian.olap4j.MondrianInprocProxy; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import org.olap4j.driver.xmla.XmlaOlap4jDriver; import org.olap4j.driver.xmla.proxy.XmlaOlap4jProxy; +import org.olap4j.driver.xmla.proxy.XmlaOlap4jProxyException; import org.olap4j.test.TestContext; import junit.framework.TestCase; @@ -19,7 +20,6 @@ public class XmlaConnectionTest extends TestCase { public static final String DRIVER_CLASS_NAME = "org.olap4j.driver.xmla.XmlaOlap4jDriver"; - private TestContext.Tester tester = null; static class XmlaOlap4jProxyMock implements XmlaOlap4jProxy { public byte[] get(URL url, String request) throws IOException { @@ -34,32 +34,149 @@ public Future submit(URL url, String request) { throw new RuntimeException("Non-Trivial Call!"); } } - public static class DoubleSubmissionTestProxy extends MondrianInprocProxy { - Map requests = new HashMap(); + + /** + * Implementation of {@link org.olap4j.driver.xmla.proxy.XmlaOlap4jProxy} + * that delegates all requests to an underlying proxy. + */ + public static class DelegatingTestProxy implements XmlaOlap4jProxy { + protected final XmlaOlap4jProxy proxy; + + /** + * Creates a DelegatingTestProxy. + * + * @param proxy Underlying proxy + */ + public DelegatingTestProxy(XmlaOlap4jProxy proxy) { + this.proxy = proxy; + } + + public byte[] get(URL url, String request) + throws XmlaOlap4jProxyException, IOException + { + return proxy.get(url, request); + } + + public Future submit( + URL url, + String request) + { + return proxy.submit(url, request); + } + + public String getEncodingCharsetName() { + return proxy.getEncodingCharsetName(); + } + } + + /** + * Proxy that checks that the same request does not occur twice. + */ + public static class DoubleSubmissionTestProxy extends DelegatingTestProxy { + final Map requests = new HashMap(); + private static String PROXY_CLASS_NAME; + + /** + * Creates a DoubleSubmissionTestProxy. + * + *

Public constructor is required because this is instantiated via + * reflection. + * + *

Instantiates an underlying proxy whose name is given by + * {@link #getProxyClassName()}. + * + * @param catalogNameUrls Collection of catalog names and the URL where + * their catalog is to be found. For testing purposes, this should + * contain a catalog called "FoodMart". + * + * @param urlString JDBC connect string; must begin with + * "jdbc:mondrian:" + */ public DoubleSubmissionTestProxy( - Map catalogNameUrls, - String urlString) + Map catalogNameUrls, + String urlString) { - super(catalogNameUrls,urlString); + super(createProxy(catalogNameUrls, urlString)); } - public byte[] get(URL url, String request) throws IOException { + + /** + * Sets the name of the class which is the underlying proxy. + * + * @param clazz Proxy class name + */ + public static void setProxyClassName(String clazz) { + PROXY_CLASS_NAME = clazz; + } + + /** + * Returns the name of the class which is the underlying proxy. + * + * @return Proxy class name + */ + public static String getProxyClassName() { + return PROXY_CLASS_NAME; + } + + /** + * Creates the underlying proxy. + * + * @param catalogNameUrls Catalog name URLs + * @param urlString URL + * @return Proxy + */ + private static XmlaOlap4jProxy createProxy( + Map catalogNameUrls, + String urlString) + { + try { + final Class clazz = Class.forName(getProxyClassName()); + final Constructor constructor = + clazz.getConstructor(Map.class, String.class); + return + (XmlaOlap4jProxy) constructor.newInstance( + catalogNameUrls, urlString); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + public byte[] get(URL url, String request) + throws IOException, XmlaOlap4jProxyException + { this.checkup(request); return super.get(url, request); } + + /** + * Checks that a request has not been seen before. + * + * @param request Request + * + * @throws RuntimeException if proxy has been seen before + */ private void checkup(String request) { String hash = Encoder.convertToHex(request.getBytes()); if (request.indexOf("MDSCHEMA_CUBES") == -1 && - this.requests.containsKey(hash)) { + this.requests.containsKey(hash)) + { throw new RuntimeException("DOUBLE-REQUEST"); } else { - this.requests.put(hash,request); + this.requests.put(hash, request); } } } /** - * this test verifies that the construction of the necessary - * xmla objects during DriverManager.getConnection() do not make + * Verifies that the construction of the necessary + * XMLA objects during DriverManager.getConnection() do not make * calls that could cause deadlocks. */ public void testNoNonTrivalCallsOnConnect() throws Exception { @@ -84,8 +201,8 @@ public void testNoNonTrivalCallsOnConnect() throws Exception { } /** - * If the same request - * is sent twice, an exception gets triggered. The only + * Tests that no request is sent to XMLA more than once. + * If the same request is sent twice, throws an exception. The only * exception to this is the MDSCHEMA_CUBES query that is used to * populate both the catalogs and the schemas associated to a * given catalog. This was due to a flaw in SSAS; it doesn't @@ -94,44 +211,55 @@ public void testNoNonTrivalCallsOnConnect() throws Exception { * @throws Exception If the test fails. */ public void testNoDoubleQuerySubmission() throws Exception { + if (!TestContext.getTestProperties() + .get(TestContext.Property.HELPER_CLASS_NAME.path) + .equals("org.olap4j.XmlaTester")) + { + return; + } String oldValue = XmlaTester.getProxyClassName(); XmlaTester.setProxyClassName( - DoubleSubmissionTestProxy.class.getName()); - if (TestContext.getTestProperties() - .get(TestContext.Property.HELPER_CLASS_NAME.path) - .equals("org.olap4j.XmlaTester")) - { - try { - tester = TestContext.instance().getTester(); - Connection connection = tester.createConnection(); - Statement statement = connection.createStatement(); - final OlapStatement olapStatement = - tester.getWrapper().unwrap(statement, OlapStatement.class); - @SuppressWarnings("unused") - CellSet cellSet = - olapStatement.executeOlapQuery( - "SELECT\n" + - " {[Measures].[Unit Sales],\n" + - " [Measures].[Store Sales]} ON COLUMNS\n," + - " Crossjoin({[Gender].[M]}, [Product].Children) ON ROWS\n" + - "FROM [Sales]\n" + - "WHERE [Time].[1997].[Q2]"); - cellSet = - olapStatement.executeOlapQuery( - "SELECT\n" + - " {[Measures].[Unit Sales],\n" + - " [Measures].[Store Sales]} ON COLUMNS\n," + - " Crossjoin({[Gender].[M]}, [Product].Children) ON ROWS\n" + - "FROM [Sales]\n" + - "WHERE [Time].[1997].[Q3]"); - } catch (RuntimeException e) { - fail(e.getMessage()); - } - } - XmlaTester.setProxyClassName(oldValue); + DoubleSubmissionTestProxy.class.getName()); + DoubleSubmissionTestProxy.setProxyClassName(oldValue); + try { + final TestContext.Tester tester = + TestContext.instance().getTester(); + Connection connection = tester.createConnection(); + Statement statement = connection.createStatement(); + final OlapStatement olapStatement = + tester.getWrapper().unwrap(statement, OlapStatement.class); + CellSet cellSet = + olapStatement.executeOlapQuery( + "SELECT\n" + + " {[Measures].[Unit Sales],\n" + + " [Measures].[Store Sales]} ON COLUMNS\n," + + " Crossjoin({[Gender].[M]}, [Product].Children) ON ROWS\n" + + "FROM [Sales]\n" + + "WHERE [Time].[1997].[Q2]"); + assertNotNull(cellSet); + cellSet = + olapStatement.executeOlapQuery( + "SELECT\n" + + " {[Measures].[Unit Sales],\n" + + " [Measures].[Store Sales]} ON COLUMNS\n," + + " Crossjoin({[Gender].[M]}, [Product].Children) ON ROWS\n" + + "FROM [Sales]\n" + + "WHERE [Time].[1997].[Q3]"); + } finally { + XmlaTester.setProxyClassName(oldValue); + } } private static class Encoder { + /** + * Converts an array of bytes to a hex string. + * + *

For example, convertToHex(new byte[] {(byte) 0xDE, + * (byte) 0xAD}) returns "DEAD". + * + * @param data Array of bytes + * @return Bytes encoded as hex + */ private static String convertToHex(byte[] data) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < data.length; i++) { @@ -148,6 +276,12 @@ private static String convertToHex(byte[] data) { } return buf.toString(); } + + /** + * Computes the SHA-1 digest of a string, encoded as a hex string. + * @param text String + * @return Digest + */ public static String SHA1(String text) { MessageDigest md; try { diff --git a/testsrc/org/olap4j/driver/xmla/proxy/XmlaCookieManagerTest.java b/testsrc/org/olap4j/driver/xmla/proxy/XmlaCookieManagerTest.java index 42b5965..a80e921 100644 --- a/testsrc/org/olap4j/driver/xmla/proxy/XmlaCookieManagerTest.java +++ b/testsrc/org/olap4j/driver/xmla/proxy/XmlaCookieManagerTest.java @@ -98,10 +98,7 @@ public String getInternalCookieKey() { public String getInternalCookieValue() { return internalCookieValue; } - - } - } // End XmlaCookieManagerTest.java diff --git a/testsrc/org/olap4j/test/ParserTest.java b/testsrc/org/olap4j/test/ParserTest.java index 1c48df2..a75e78c 100644 --- a/testsrc/org/olap4j/test/ParserTest.java +++ b/testsrc/org/olap4j/test/ParserTest.java @@ -603,7 +603,6 @@ public void testNumbers() { * used to gather the mantissa. */ public void testLargePrecision() { - // Now, a query with several numeric literals. This is the original // testcase for the bug. assertParseQuery( diff --git a/testsrc/org/olap4j/test/TestContext.java b/testsrc/org/olap4j/test/TestContext.java index 03cb7ec..e0a6b9a 100644 --- a/testsrc/org/olap4j/test/TestContext.java +++ b/testsrc/org/olap4j/test/TestContext.java @@ -260,7 +260,6 @@ public static void assertEqualsVerbose( * */ static String toJavaString(String s) { - // Convert [string with "quotes" split // across lines] // into ["string with \"quotes\" split\n" + diff --git a/testsrc/org/olap4j/transform/TransformTest.java b/testsrc/org/olap4j/transform/TransformTest.java index 585c676..6c9b3b8 100644 --- a/testsrc/org/olap4j/transform/TransformTest.java +++ b/testsrc/org/olap4j/transform/TransformTest.java @@ -175,7 +175,6 @@ public void testRollUpLevelTransform() throws SQLException { * @throws java.sql.SQLException on error */ public void _testDrillDownOnPositionTransform() throws SQLException { - // TODO: rewrite the initial and expected MDX once this transform // is written. // Will fail for now.