summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGurmeen Bindra <gurmeen.bindra@isode.com>2012-03-29 14:34:35 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-03-29 15:04:06 (GMT)
commitc194f7d215935cded5b2eab4daeed725a5a4069c (patch)
tree18f68f2247e4a7dd0f3fcb403dfcb2c6f9b3ff02 /src/com/isode/stroke/parser/payloadparsers/ErrorParser.java
parentcb4600a1612a5dd8342656241e11ec45542cd1e0 (diff)
downloadstroke-c194f7d215935cded5b2eab4daeed725a5a4069c.zip
stroke-c194f7d215935cded5b2eab4daeed725a5a4069c.tar.bz2
Port Error Parser to stroke
After this change, the error payload object should be populated in case of error. The condtion, type and text field will be from the payload rather than Undefined, Cancel and empty. Test-information: tested by executing adhoc-commands on an XMPP clinet in a way to result in an error. I do see the error text and condition set as per the XMPP streams. Reviewer: Kevin Smith <kevin.smith@isode.com>
Diffstat (limited to 'src/com/isode/stroke/parser/payloadparsers/ErrorParser.java')
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/ErrorParser.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/com/isode/stroke/parser/payloadparsers/ErrorParser.java b/src/com/isode/stroke/parser/payloadparsers/ErrorParser.java
new file mode 100644
index 0000000..7ff0b49
--- /dev/null
+++ b/src/com/isode/stroke/parser/payloadparsers/ErrorParser.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2012 Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * All rights reserved.
+ */
+
+package com.isode.stroke.parser.payloadparsers;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.Payload;
+import com.isode.stroke.parser.AttributeMap;
+import com.isode.stroke.parser.GenericPayloadParser;
+import com.isode.stroke.parser.PayloadParser;
+import com.isode.stroke.parser.PayloadParserFactory;
+import com.isode.stroke.parser.PayloadParserFactoryCollection;
+
+/**
+ * Class that represents a parser for the Error payload
+ *
+ */
+public class ErrorParser extends GenericPayloadParser<ErrorPayload> {
+ private enum Level {
+ TopLevel(0),
+ PayloadLevel(1);
+ private Level(int val) {
+ this.value = val;
+ }
+ int value;
+ }
+ private PayloadParserFactoryCollection factories_;
+ private int level_;
+ private String currentText_ = "";
+ private PayloadParser currentPayloadParser;
+
+ /**
+ * Create the parse
+ * @param factories reference to the Payload parser factory,
+ * should not be null
+ */
+ public ErrorParser(PayloadParserFactoryCollection factories) {
+ super(new ErrorPayload());
+ level_ = Level.TopLevel.value;
+ this.factories_ = factories;
+ }
+
+ @Override
+ public void handleStartElement(String element, String ns, final AttributeMap attributes) {
+ if (level_ == Level.TopLevel.value) {
+ String type = attributes.getAttribute("type");
+ if (type.equals("continue")) {
+ getPayloadInternal().setType(ErrorPayload.Type.Continue);
+ } else if (type.equals("modify")) {
+ getPayloadInternal().setType(ErrorPayload.Type.Modify);
+ }else if (type.equals("auth")) {
+ getPayloadInternal().setType(ErrorPayload.Type.Auth);
+ }else if (type.equals("wait")) {
+ getPayloadInternal().setType(ErrorPayload.Type.Wait);
+ }else {
+ getPayloadInternal().setType(ErrorPayload.Type.Cancel);
+ }
+ }else if (level_ == Level.PayloadLevel.value) {
+ if (element.equals("text")) {
+
+ }else if (element.equals("bad-request")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.BadRequest);
+ }else if (element.equals("conflict")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.Conflict);
+ }else if (element.equals("feature-not-implemented")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.FeatureNotImplemented);
+ }else if (element.equals("forbidden")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.Forbidden);
+ }else if (element.equals("gone")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.Gone);
+ }else if (element.equals("internal-server-error")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.InternalServerError);
+ }else if (element.equals("item-not-found")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.ItemNotFound);
+ }else if (element.equals("jid-malformed")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.JIDMalformed);
+ }else if (element.equals("not-acceptable")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.NotAcceptable);
+ }else if (element.equals("not-allowed")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.NotAllowed);
+ }else if (element.equals("not-authorized")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.NotAuthorized);
+ }else if (element.equals("payment-required")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.PaymentRequired);
+ }else if (element.equals("recipient-unavailable")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.RecipientUnavailable);
+ }else if (element.equals("redirect")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.Redirect);
+ }else if (element.equals("registration-required")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.RegistrationRequired);
+ }else if (element.equals("remote-server-not-found")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.RemoteServerNotFound);
+ }else if (element.equals("remote-server-timeout")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.RemoteServerTimeout);
+ }else if (element.equals("resource-constraint")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.ResourceConstraint);
+ }else if (element.equals("service-unavailable")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.ServiceUnavailable);
+ }else if (element.equals("subscription-required")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.SubscriptionRequired);
+ }else if (element.equals("unexpected-request")) {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.UnexpectedRequest);
+ }else {
+ PayloadParserFactory payloadParserFactory = factories_.getPayloadParserFactory(element, ns, attributes);
+ if (payloadParserFactory != null) {
+ currentPayloadParser = payloadParserFactory.createPayloadParser();
+ } else {
+ getPayloadInternal().setCondition(ErrorPayload.Condition.UndefinedCondition);
+ }
+ }
+ }
+ if (level_ >= Level.PayloadLevel.value && currentPayloadParser != null) {
+ currentPayloadParser.handleStartElement(element, ns, attributes);
+ }
+ ++level_;
+ }
+
+ @Override
+ public void handleEndElement(final String element, final String ns) {
+ --level_;
+ ErrorPayload payloadInternal = getPayloadInternal();
+ if (currentPayloadParser != null) {
+ if (level_ >= Level.PayloadLevel.value) {
+ currentPayloadParser.handleEndElement(element, ns);
+ }
+ if (level_ == Level.PayloadLevel.value) {
+ getPayloadInternal().setPayload(currentPayloadParser.getPayload());
+ currentPayloadParser= null;
+ }
+ }
+ else if (level_ == Level.PayloadLevel.value) {
+ if (element.equals("text")) {
+ payloadInternal.setText(currentText_);
+ }
+ }
+ }
+
+ @Override
+ public void handleCharacterData(final String data) {
+ if (level_ > Level.PayloadLevel.value && currentPayloadParser != null) {
+ currentPayloadParser.handleCharacterData(data);
+ }else{
+ currentText_ += data;
+ }
+ }
+}