summaryrefslogtreecommitdiffstats
blob: 5540d2bb08f94c4af6efbc3f02e78578132d9be3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 * Copyright (c) 2010, Isode Limited, London, England.
 * All rights reserved.
 */
/*
 * Copyright (c) 2010, Remko Tronçon.
 * All rights reserved.
 */

package com.isode.stroke.serializer.payloadserializers;

import com.isode.stroke.elements.ErrorPayload;
import com.isode.stroke.serializer.GenericPayloadSerializer;
import com.isode.stroke.serializer.xml.XMLTextNode;
import com.isode.stroke.serializer.PayloadSerializerCollection;
import com.isode.stroke.serializer.PayloadSerializer;

public class ErrorSerializer extends GenericPayloadSerializer<ErrorPayload> {

	private PayloadSerializerCollection serializers;

    public ErrorSerializer(PayloadSerializerCollection serializers) {
        super(ErrorPayload.class);
        this.serializers = serializers;
    }

    @Override
    public String serializePayload(ErrorPayload error) {
        String result = "<error type=\"";
	switch (error.getType()) {
		case Continue: result += "continue"; break;
		case Modify: result += "modify"; break;
		case Auth: result += "auth"; break;
		case Wait: result += "wait"; break;
		default: result += "cancel"; break;
	}
	result += "\">";

	String conditionElement;
	switch (error.getCondition()) {
		case BadRequest: conditionElement = "bad-request"; break;
		case Conflict: conditionElement = "conflict"; break;
		case FeatureNotImplemented: conditionElement = "feature-not-implemented"; break;
		case Forbidden: conditionElement = "forbidden"; break;
		case Gone: conditionElement = "gone"; break;
		case InternalServerError: conditionElement = "internal-server-error"; break;
		case ItemNotFound: conditionElement = "item-not-found"; break;
		case JIDMalformed: conditionElement = "jid-malformed"; break;
		case NotAcceptable: conditionElement = "not-acceptable"; break;
		case NotAllowed: conditionElement = "not-allowed"; break;
		case NotAuthorized: conditionElement = "not-authorized"; break;
		case PaymentRequired: conditionElement = "payment-required"; break;
		case RecipientUnavailable: conditionElement = "recipient-unavailable"; break;
		case Redirect: conditionElement = "redirect"; break;
		case RegistrationRequired: conditionElement = "registration-required"; break;
		case RemoteServerNotFound: conditionElement = "remote-server-not-found"; break;
		case RemoteServerTimeout: conditionElement = "remote-server-timeout"; break;
		case ResourceConstraint: conditionElement = "resource-constraint"; break;
		case ServiceUnavailable: conditionElement = "service-unavailable"; break;
		case SubscriptionRequired: conditionElement = "subscription-required"; break;
		case UnexpectedRequest: conditionElement = "unexpected-request"; break;
		default: conditionElement = "undefined-condition"; break;
	}
	result += "<" + conditionElement + " xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>";

	if (error.getText().length() != 0) {
		XMLTextNode textNode = new XMLTextNode(error.getText());
		result += "<text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\">" + textNode.serialize() + "</text>";
	}

	if (error.getPayload() != null) {
		PayloadSerializer serializer = serializers.getPayloadSerializer(error.getPayload());
		if (serializer != null) {
			result += serializer.serialize(error.getPayload());
		}
	}

	result += "</error>";
	return result;
    }

}