Skip to content

Commit

Permalink
Fix issues found during Android consumer testing.
Browse files Browse the repository at this point in the history
Update issue 199
Test association with commit
  • Loading branch information
johnspurlock committed Aug 5, 2012
1 parent 43ecb73 commit af0755e
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 52 deletions.
1 change: 1 addition & 0 deletions .hgignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target
.settings
.DS_Store
.idea
.externalToolBuilders
*.iml
*.ipr
*.iws
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ public OError parse(Reader reader) {
String innerError = null;
XMLEventReader2 xmlReader = InternalUtil.newXMLEventReader(reader);
XMLEvent2 event = xmlReader.nextEvent();
if (!isStartElement(event = xmlReader.nextEvent(), ERROR))
throw new RuntimeException("Unable to parse the error message");
while (!event.isStartElement())
event = xmlReader.nextEvent();
if (!isStartElement(event, ERROR))
throw new RuntimeException("Bad error response: <" + ERROR.getLocalPart() + "> not found");
while (!isEndElement(event = xmlReader.nextEvent(), ERROR)) {
if (isStartElement(event, CODE))
code = xmlReader.getElementText();
Expand All @@ -36,12 +38,12 @@ else if (isStartElement(event, INNER_ERROR))
else if (!event.isStartElement() || !event.isEndElement())
continue;
else
throw new RuntimeException("Unable to parse the error message");
throw new RuntimeException("Bad error response: Unexpected structure");
}
if (!isEndElement(event, ERROR))
throw new RuntimeException("Unable to parse the error message");
throw new RuntimeException("Bad error response: Expected </" + ERROR.getLocalPart() + ">");
if (code == null && message == null && innerError == null)
throw new RuntimeException("Wrong format of the error message");
throw new RuntimeException("Bad error response: Unknown elements");
return OErrors.error(code, message, innerError);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,7 @@ public static Iterable<OProperty<?>> parseProperties(XMLEventReader2 reader, Sta
op = OProperties.parseSimple(name, (EdmSimpleType<?>) et, isNull ? null : reader.getElementText());
}
rt.add(op);

}

}

throw new RuntimeException();
Expand Down
2 changes: 0 additions & 2 deletions odata4j-core/src/main/java/org/odata4j/stax2/Namespace2.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.odata4j.stax2;

/**
*/
public interface Namespace2 extends Attribute2 {

String getNamespaceURI();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
Expand Down Expand Up @@ -166,6 +167,27 @@ public StaxXMLEvent2(XMLEvent real) {
this.real = real;
}

@Override
public String toString() {
return String.format("%s[%s]", StaxXMLEvent2.class.getSimpleName(), getEventTypeName());
}

private String getEventTypeName() {
switch (real.getEventType()) {
case XMLStreamConstants.START_ELEMENT: return "START_ELEMENT";
case XMLStreamConstants.END_ELEMENT: return "END_ELEMENT";
case XMLStreamConstants.CHARACTERS: return "CHARACTERS";
case XMLStreamConstants.ATTRIBUTE: return "ATTRIBUTE";
case XMLStreamConstants.NAMESPACE: return "NAMESPACE";
case XMLStreamConstants.PROCESSING_INSTRUCTION: return "PROCESSING_INSTRUCTION";
case XMLStreamConstants.COMMENT: return "COMMENT";
case XMLStreamConstants.START_DOCUMENT: return "START_DOCUMENT";
case XMLStreamConstants.END_DOCUMENT: return "END_DOCUMENT";
case XMLStreamConstants.DTD: return "DTD";
default: return "UNKNOWN TYPE " + real.getEventType();
}
}

public XMLEvent getXMLEvent() {
return real;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.odata4j.stax2.xppimpl;

import org.core4j.Predicate1;
import org.odata4j.stax2.Attribute2;
import org.odata4j.stax2.QName2;

public class CachedAttribute implements Attribute2 {

private final QName2 name;
private final String value;

public CachedAttribute(QName2 name, String value) {
this.name = name;
this.value = value;
}

@Override
public QName2 getName() {
return name;
}

@Override
public String getValue() {
return value;
}

private static boolean equal(Object lhs, Object rhs) {
return lhs == rhs || (lhs != null && lhs.equals(rhs));
}

public static Predicate1<Attribute2> pred1_byQName(final QName2 name) {
return new Predicate1<Attribute2>() {
@Override
public boolean apply(Attribute2 attribute) {
return equal(attribute.getName().getNamespaceUri(),name.getNamespaceUri()) && equal(attribute.getName().getLocalPart(),name.getLocalPart());
}};
}

public static Predicate1<Attribute2> pred1_byName(final String name) {
return new Predicate1<Attribute2>() {
@Override
public boolean apply(Attribute2 attribute) {
return attribute.getName().getLocalPart().equals(name);
}};
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.odata4j.stax2.xppimpl;

import java.util.ArrayList;
import java.util.List;

import org.core4j.Enumerable;
import org.odata4j.stax2.Attribute2;
import org.odata4j.stax2.QName2;

public class CachedAttributes {

private final List<Attribute2> attributes = new ArrayList<Attribute2>();

public Enumerable<Attribute2> getAttributes() {
return Enumerable.create(attributes);
}

public Attribute2 getAttributeByName(String name) {
return getAttributes().firstOrNull(CachedAttribute.pred1_byName(name));
}

public Attribute2 getAttributeByName(QName2 name) {
return getAttributes().firstOrNull(CachedAttribute.pred1_byQName(name));
}

public void put(String namespaceUri, String name, String prefix, String value) {
QName2 qname = new QName2(namespaceUri, name, prefix);
Attribute2 attribute = new CachedAttribute(qname, value);
attributes.add(attribute);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ public XMLEventReader2 createXMLEventReader(Reader reader) {
private static class XmlPullXMLEventReader2 implements XMLEventReader2 {

private final XmlPullParser xpp;
private boolean peeked;
private boolean hasNext;

public XmlPullXMLEventReader2(XmlPullParser xpp) {
this.xpp = xpp;
Expand All @@ -106,6 +108,9 @@ public XmlPullXMLEventReader2(XmlPullParser xpp) {
@Override
public String getElementText() {
try {
if (xpp.getEventType() == XmlPullParser.TEXT)
return xpp.getText();
peeked = false;
return xpp.nextText();
} catch (Exception e) {
throw Throwables.propagate(e);
Expand All @@ -114,20 +119,31 @@ public String getElementText() {

@Override
public boolean hasNext() {
try {
int eventType = xpp.next();
return eventType != XmlPullParser.END_DOCUMENT;
} catch (Exception e) {
throw Throwables.propagate(e);
}

if (peeked)
return hasNext;
int eventType = advance();
peeked = true;
hasNext = eventType != XmlPullParser.END_DOCUMENT;
return hasNext;
}

@Override
public XMLEvent2 nextEvent() {
if (peeked)
peeked = false;
else
advance();
return new XmlPullXMLEvent2(xpp);
}

private int advance() {
try {
return xpp.next();
} catch (Exception e) {
throw Throwables.propagate(e);
}
}

}

private static class XmlPullXMLEvent2 implements XMLEvent2 {
Expand All @@ -137,6 +153,32 @@ public XmlPullXMLEvent2(XmlPullParser xpp) {
this.xpp = xpp;
}

@Override
public String toString() {
return String.format("%s[%s]", XmlPullXMLEvent2.class.getSimpleName(), getEventTypeName());
}

private String getEventTypeName() {
try {
switch(xpp.getEventType()) {
case XmlPullParser.START_DOCUMENT: return "START_DOCUMENT";
case XmlPullParser.END_DOCUMENT: return "END_DOCUMENT";
case XmlPullParser.START_TAG: return "START_TAG";
case XmlPullParser.END_TAG: return "END_TAG";
case XmlPullParser.TEXT: return "TEXT";
case XmlPullParser.CDSECT: return "CDSECT";
case XmlPullParser.ENTITY_REF: return "ENTITY_REF";
case XmlPullParser.IGNORABLE_WHITESPACE: return "IGNORABLE_WHITESPACE";
case XmlPullParser.PROCESSING_INSTRUCTION: return "PROCESSING_INSTRUCTION";
case XmlPullParser.COMMENT: return "COMMENT";
case XmlPullParser.DOCDECL: return "DOCDECL";
default: return "UNKNOWN TYPE " + xpp.getEventType();
}
} catch (XmlPullParserException e) {
throw Throwables.propagate(e);
}
}

@Override
public EndElement2 asEndElement() {
if (!isEndElement())
Expand Down Expand Up @@ -174,60 +216,48 @@ public boolean isStartElement() {
private static class XmlPullStartElement2 implements StartElement2 {
private final XmlPullParser xpp;
private final QName2 name;
private CachedAttributes attributes;

public XmlPullStartElement2(XmlPullParser xpp) {
this.xpp = xpp;
name = new QName2(xpp.getNamespace(), xpp.getName());
}

@Override
public Attribute2 getAttributeByName(final QName2 arg0) {
final String value = xpp.getAttributeValue(arg0.getNamespaceUri(), arg0.getLocalPart());
if (value == null)
return null;

return new Attribute2() {
public String getValue() {
return value;
}

@Override
public QName2 getName() {
throw new UnsupportedOperationException("Not supported yet.");
}
};

public Attribute2 getAttributeByName(QName2 name) {
ensureAttributesCached();
return attributes.getAttributeByName(name);
}

@Override
public Attribute2 getAttributeByName(final String arg0) {

final String value = xpp.getAttributeValue(null, arg0);
if (value == null)
return null;

return new Attribute2() {

@Override
public String getValue() {
return value;
}

@Override
public QName2 getName() {
throw new UnsupportedOperationException("Not supported yet.");
}
};
public Attribute2 getAttributeByName(String name) {
ensureAttributesCached();
return attributes.getAttributeByName(name);
}

@Override
public QName2 getName() {
return name;
}

private void ensureAttributesCached() {
if (attributes != null)
return;
attributes = new CachedAttributes();
for (int i = 0; i < xpp.getAttributeCount(); i++) {
String ns = xpp.getAttributeNamespace(i);
attributes.put(
ns == null || ns.length() == 0 ? null : ns,
xpp.getAttributeName(i),
xpp.getAttributePrefix(i),
xpp.getAttributeValue(i));
}
}

@Override
public Enumerable<Attribute2> getAttributes() {
throw new UnsupportedOperationException("Not supported yet.");
ensureAttributesCached();
return attributes.getAttributes();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ else if (request.getPayload() instanceof SingleLink)
} catch (RuntimeException e) {
// ... otherwise throw a RuntimeError
exception = new RuntimeException(String.format("Expected status %s, found %s. Server response:",
Enumerable.create(expectedResponseStatus).join(" or "), status) + "\n" + textEntity);
Enumerable.create(expectedResponseStatus).join(" or "), status) + "\n" + textEntity, e);
}
throw exception;
}
Expand Down

0 comments on commit af0755e

Please sign in to comment.