summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/isode/stroke/elements/ErrorPayload.java11
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/ErrorParser.java152
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/ErrorParserFactory.java45
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java2
4 files changed, 208 insertions, 2 deletions
diff --git a/src/com/isode/stroke/elements/ErrorPayload.java b/src/com/isode/stroke/elements/ErrorPayload.java
index b0ffd58..42e9c61 100644
--- a/src/com/isode/stroke/elements/ErrorPayload.java
+++ b/src/com/isode/stroke/elements/ErrorPayload.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Isode Limited, London, England.
+ * Copyright (c) 2010-2012, Isode Limited, London, England.
* All rights reserved.
*/
/*
@@ -16,6 +16,7 @@ public class ErrorPayload extends Payload {
private Condition condition_;
private Type type_;
private String text_;
+ private Payload payload_;
public enum Type { Cancel, Continue, Modify, Auth, Wait };
@@ -85,4 +86,12 @@ public class ErrorPayload extends Payload {
public String getText() {
return text_;
}
+
+ public void setPayload(Payload payload) {
+ this.payload_ = payload;
+ }
+
+ public Payload getPayload() {
+ return payload_;
+ }
}
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;
+ }
+ }
+}
diff --git a/src/com/isode/stroke/parser/payloadparsers/ErrorParserFactory.java b/src/com/isode/stroke/parser/payloadparsers/ErrorParserFactory.java
new file mode 100644
index 0000000..1f36b19
--- /dev/null
+++ b/src/com/isode/stroke/parser/payloadparsers/ErrorParserFactory.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012 Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2011 Kevin Smith
+ * All rights reserved.
+ */
+package com.isode.stroke.parser.payloadparsers;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.parser.AttributeMap;
+import com.isode.stroke.parser.PayloadParser;
+import com.isode.stroke.parser.PayloadParserFactory;
+
+/**
+ * Parser factory for {@link ErrorPayload}
+ *
+ */
+public class ErrorParserFactory implements PayloadParserFactory {
+ private FullPayloadParserFactoryCollection factories_;
+
+ /**
+ * Create the factory
+ * @param factories reference to Payload parser factory collection, not null
+ */
+ public ErrorParserFactory(FullPayloadParserFactoryCollection factories) {
+ this.factories_ = factories;
+ }
+
+ @Override
+ public boolean canParse(final String element, final String ns, final AttributeMap map) {
+ return element.equals("error");
+ }
+
+ @Override
+ public PayloadParser createPayloadParser() {
+ return new ErrorParser(factories_);
+ }
+
+ @Override
+ public String toString() {
+ return ErrorParserFactory.class.getSimpleName();
+ }
+}
diff --git a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java
index 7273cf2..6b67116 100644
--- a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java
+++ b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java
@@ -23,7 +23,7 @@ public class FullPayloadParserFactoryCollection extends PayloadParserFactoryColl
addFactory(new GenericPayloadParserFactory<BodyParser>("body", BodyParser.class));
//addFactory(new GenericPayloadParserFactory<SubjectParser>("subject", SubjectParser.class));
//addFactory(new GenericPayloadParserFactory<PriorityParser>("priority", PriorityParser.class));
- //addFactory(new ErrorParserFactory(this)));
+ addFactory(new ErrorParserFactory(this));
addFactory(new SoftwareVersionParserFactory());
//addFactory(new StorageParserFactory());
addFactory(new RosterParserFactory());