Improving error handling in client.

This commit is contained in:
marcins78@gmail.com
2012-04-04 22:19:19 +00:00
parent f704eb3225
commit 3d1b3a4560
8 changed files with 162 additions and 104 deletions

View File

@@ -102,7 +102,6 @@ public class CollectionResource extends AbstractResource {
collectionElem.setAttribute("count", String.valueOf(filteredResult.size()));
doc.appendChild(collectionElem);
int index = 0;
for (int i = start; i < start + count; i++) {
if (i >= 0 && i < filteredResult.size()) {
CardCollection.Item item = filteredResult.get(i);

View File

@@ -1,4 +1,4 @@
package com.gempukku.lotro.server;
package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.sun.jersey.core.spi.component.ComponentContext;

View File

@@ -1,4 +1,4 @@
package com.gempukku.lotro.server;
package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.collection.CollectionSerializer;
import com.gempukku.lotro.db.*;

View File

@@ -1,4 +1,4 @@
package com.gempukku.lotro.server;
package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.packs.*;
import com.sun.jersey.core.spi.component.ComponentContext;

View File

@@ -1,4 +1,4 @@
package com.gempukku.lotro.server;
package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.chat.ChatServer;
import com.gempukku.lotro.collection.CollectionsManager;

View File

@@ -24,27 +24,16 @@ var ChatBoxUI = Class.extend({
this.communication = new GempLotrCommunication(url, function(xhr, ajaxOptions, thrownError) {
if (thrownError != "abort") {
if (xhr != null) {
if (xhr.status == 401) {
that.appendMessage("You're not logged in, go to the <a href='index.html'>main page</a> to log in", "warningMessage");
return;
} else if (xhr.status == 404) {
that.appendMessage("Chat room was closed, or you were inactive for too long, please go to the Game Hall.", "warningMessage");
return;
} else if (xhr.status == 503) {
that.appendMessage("Server is being restarted, please wait for the restart to finish and try again later.", "warningMessage");
return;
that.retryCount++;
if (that.retryCount <= that.maxRetryCount) {
that.appendMessage("Chat had a problem communicating with the server (error " + xhr.status + "). Retrying (" + that.retryCount + " of " + that.maxRetryCount + ")...", "systemMessage");
setTimeout(function() {
that.updateChatMessages();
}, that.chatUpdateInterval);
} else {
that.retryCount++;
if (that.retryCount <= that.maxRetryCount) {
that.appendMessage("Chat had a problem communicating with the server (error " + xhr.status + "). Retrying (" + that.retryCount + " of " + that.maxRetryCount + ")...", "systemMessage");
setTimeout(function() {
that.updateChatMessages();
}, that.chatUpdateInterval);
} else {
that.appendMessage("Chat has given up on connection retry (tried " + that.maxRetryCount + "), make sure your connection with the Internet is working.", "warningMessage");
}
return;
that.appendMessage("Chat has given up on connection retry (tried " + that.maxRetryCount + "), make sure your connection with the Internet is working.", "warningMessage");
}
return;
}
that.retryCount++;
if (that.retryCount <= that.maxRetryCount) {
@@ -61,8 +50,6 @@ var ChatBoxUI = Class.extend({
this.chatMessagesDiv = $("<div class='chatMessages'></div>");
this.div.append(this.chatMessagesDiv);
var that = this;
if (this.name != null) {
this.chatTalkDiv = $("<input class='chatTalk'>");
if (showList) {
@@ -71,8 +58,19 @@ var ChatBoxUI = Class.extend({
}
this.div.append(this.chatTalkDiv);
this.communication.startChat(this.name, function(xml) {
that.processMessages(xml, true);
this.communication.startChat(this.name,
function(xml) {
that.processMessages(xml, true);
}, {
"401": function() {
that.appendMessage("You are not logged in, go to the main page to log in.", "warningMessage");
},
"403": function() {
that.appendMessage("You have no permission to join this chat.", "warningMessage");
},
"404": function() {
that.appendMessage("Chat room was closed, please go to the Game Hall.");
}
});
this.chatTalkDiv.bind("keypress", function(e) {
@@ -188,16 +186,46 @@ var ChatBoxUI = Class.extend({
if (this.processingMessages != null) {
this.communication.sendChatMessage(this.name, this.processingMessages, function(xml) {
that.processMessages(xml, true);
}, {
"401": function() {
that.appendMessage("You are not logged in, go to the main page to log in.", "warningMessage");
},
"403": function() {
that.appendMessage("You have no permission to send messages to this chat.", "warningMessage");
},
"404": function() {
that.appendMessage("Chat room was closed, or you were inactive for too long, please go to the Game Hall.");
}
});
} else if (this.unsentMessages.length > 0) {
this.communication.sendChatMessage(this.name, this.unsentMessages, function(xml) {
that.processMessages(xml, true);
}, {
"401": function() {
that.appendMessage("You are not logged in, go to the main page to log in.", "warningMessage");
},
"403": function() {
that.appendMessage("You have no permission to send messages to this chat.", "warningMessage");
},
"404": function() {
that.appendMessage("Chat room was closed, or you were inactive for too long, please go to the Game Hall.");
}
});
this.processingMessages = this.unsentMessages;
this.unsentMessages = new Array();
} else {
this.communication.updateChat(this.name, function(xml) {
that.processMessages(xml, true);
}, {
"401": function() {
that.appendMessage("You are not logged in, go to the main page to log in.", "warningMessage");
},
"403": function() {
that.appendMessage("You have no permission to get message from this chat.", "warningMessage");
},
"404": function() {
that.appendMessage("Chat room was closed, or you were inactive for too long, please go to the Game Hall.");
}
});
}
},

View File

@@ -7,6 +7,17 @@ var GempLotrCommunication = Class.extend({
this.failure = failure;
},
errorCheck: function(errorMap) {
var that = this;
return function(xhr, status, request) {
var errorStatus = "" + xhr.status;
if (errorMap != null && errorMap[errorStatus] != null)
errorMap[errorStatus](xhr, status, request);
else
that.failure(xhr, status, request);
};
},
getDelivery: function(callback) {
$.ajax({
type: "GET",
@@ -30,7 +41,7 @@ var GempLotrCommunication = Class.extend({
};
},
getGameHistory: function(start, count, callback) {
getGameHistory: function(start, count, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/gameHistory",
@@ -40,12 +51,12 @@ var GempLotrCommunication = Class.extend({
count: count,
participantId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getLeagues: function(callback) {
getLeagues: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/league",
@@ -53,12 +64,12 @@ var GempLotrCommunication = Class.extend({
data: {
participanId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
joinLeague: function(code, callback) {
joinLeague: function(code, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/league/" + code,
@@ -66,44 +77,44 @@ var GempLotrCommunication = Class.extend({
data: {
participanId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getReplay: function(replayId, callback) {
getReplay: function(replayId, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/replay/" + replayId,
cache: false,
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
startGameSession: function(callback) {
startGameSession: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/game/" + getUrlParam("gameId"),
cache: false,
data: { participantId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
updateGameState: function(callback) {
updateGameState: function(callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/game/" + getUrlParam("gameId"),
cache: false,
data: { participantId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getGameCardModifiers: function(cardId, callback) {
getGameCardModifiers: function(cardId, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/game/" + getUrlParam("gameId") + "/cardInfo",
@@ -111,11 +122,11 @@ var GempLotrCommunication = Class.extend({
data: { cardId: cardId,
participantId: getUrlParam("participantId") },
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
},
gameDecisionMade: function(decisionId, response, callback) {
gameDecisionMade: function(decisionId, response, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/game/" + getUrlParam("gameId"),
@@ -125,22 +136,22 @@ var GempLotrCommunication = Class.extend({
decisionId: decisionId,
decisionValue: response},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
concede: function() {
concede: function(errorMap) {
$.ajax({
type: "POST",
url: this.url + "/game/" + getUrlParam("gameId") + "/concede",
cache: false,
data: {
participantId: getUrlParam("participantId")},
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getDeck: function(deckName, callback) {
getDeck: function(deckName, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/deck",
@@ -149,11 +160,11 @@ var GempLotrCommunication = Class.extend({
participantId: getUrlParam("participantId"),
deckName: deckName},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getDecks: function(callback) {
getDecks: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/deck/list",
@@ -161,11 +172,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getCollectionTypes: function(callback) {
getCollectionTypes: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/collection",
@@ -173,11 +184,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getMerchant: function(filter, ownedMin, start, count, callback) {
getMerchant: function(filter, ownedMin, start, count, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/merchant",
@@ -189,11 +200,11 @@ var GempLotrCommunication = Class.extend({
start: start,
count: count},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
buyItem: function(blueprintId, price, callback) {
buyItem: function(blueprintId, price, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/merchant/buy",
@@ -203,11 +214,11 @@ var GempLotrCommunication = Class.extend({
blueprintId: blueprintId,
price: price},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
sellItem: function(blueprintId, price, callback) {
sellItem: function(blueprintId, price, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/merchant/sell",
@@ -217,11 +228,11 @@ var GempLotrCommunication = Class.extend({
blueprintId: blueprintId,
price: price},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
tradeInFoil: function(blueprintId, callback) {
tradeInFoil: function(blueprintId, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/merchant/tradeFoil",
@@ -230,11 +241,11 @@ var GempLotrCommunication = Class.extend({
participantId: getUrlParam("participantId"),
blueprintId: blueprintId},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getCollection: function(collectionType, filter, start, count, callback) {
getCollection: function(collectionType, filter, start, count, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/collection/" + collectionType,
@@ -245,11 +256,11 @@ var GempLotrCommunication = Class.extend({
start: start,
count: count},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
openPack: function(collectionType, pack, callback) {
openPack: function(collectionType, pack, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/collection/" + collectionType,
@@ -257,14 +268,12 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId"),
pack: pack},
success: function(xml, status, request) {
callback(xml);
},
error: this.failure,
success: this.deliveryCheck(callback),
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
openSelectionPack: function(collectionType, pack, selection, callback) {
openSelectionPack: function(collectionType, pack, selection, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/collection/" + collectionType,
@@ -273,14 +282,12 @@ var GempLotrCommunication = Class.extend({
participantId: getUrlParam("participantId"),
pack: pack,
selection: selection},
success: function(xml, status, request) {
callback(xml);
},
error: this.failure,
success: this.deliveryCheck(callback),
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
saveDeck: function(deckName, contents, callback) {
saveDeck: function(deckName, contents, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/deck",
@@ -291,11 +298,11 @@ var GempLotrCommunication = Class.extend({
deckName: deckName,
deckContents: contents},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
renameDeck: function(oldDeckName, deckName, callback) {
renameDeck: function(oldDeckName, deckName, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/deck/rename",
@@ -305,11 +312,11 @@ var GempLotrCommunication = Class.extend({
oldDeckName: oldDeckName,
deckName: deckName},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
deleteDeck: function(deckName, callback) {
deleteDeck: function(deckName, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/deck/delete",
@@ -318,11 +325,11 @@ var GempLotrCommunication = Class.extend({
participantId: getUrlParam("participantId"),
deckName: deckName},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getDeckStats: function(contents, callback) {
getDeckStats: function(contents, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/deck/stats",
@@ -331,11 +338,11 @@ var GempLotrCommunication = Class.extend({
participantId: getUrlParam("participantId"),
deckContents: contents},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
},
startChat: function(room, callback) {
startChat: function(room, callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/chat/" + room,
@@ -343,11 +350,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
updateChat: function(room, callback) {
updateChat: function(room, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/chat/" + room,
@@ -355,11 +362,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
sendChatMessage: function(room, messages, callback) {
sendChatMessage: function(room, messages, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/chat/" + room,
@@ -369,11 +376,11 @@ var GempLotrCommunication = Class.extend({
message: messages},
success: this.deliveryCheck(callback),
traditional: true,
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getHall: function(callback) {
getHall: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/hall",
@@ -381,11 +388,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
joinTable: function(tableId, deckName, callback) {
joinTable: function(tableId, deckName, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/hall/" + tableId,
@@ -394,11 +401,11 @@ var GempLotrCommunication = Class.extend({
deckName: deckName,
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
createTable: function(format, deckName, callback) {
createTable: function(format, deckName, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/hall",
@@ -408,22 +415,22 @@ var GempLotrCommunication = Class.extend({
deckName: deckName,
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
leaveTable: function() {
leaveTable: function(errorMap) {
$.ajax({
type: "POST",
url: this.url + "/hall/leave",
cache: false,
data: {
participantId: getUrlParam("participantId")},
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "xml"
});
},
getStatus: function(callback) {
getStatus: function(callback, errorMap) {
$.ajax({
type: "GET",
url: this.url + "/",
@@ -431,11 +438,11 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
},
login: function(login, password, callback) {
login: function(login, password, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/login",
@@ -445,11 +452,11 @@ var GempLotrCommunication = Class.extend({
password: password,
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
},
register: function(login, password, callback) {
register: function(login, password, callback, errorMap) {
$.ajax({
type: "POST",
url: this.url + "/register",
@@ -459,11 +466,11 @@ var GempLotrCommunication = Class.extend({
password: password,
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
},
getRegistrationForm: function(callback) {
getRegistrationForm: function(callback, errorMap) {
$.ajax({
type: "POST",
url: "/gemp-lotr/includes/registrationForm.html",
@@ -471,7 +478,7 @@ var GempLotrCommunication = Class.extend({
data: {
participantId: getUrlParam("participantId")},
success: this.deliveryCheck(callback),
error: this.failure,
error: this.errorCheck(errorMap),
dataType: "html"
});
}

View File

@@ -54,6 +54,10 @@ var GempLotrDeckBuildingUI = Class.extend({
function(filter, start, count, callback) {
that.comm.getCollection(that.collectionType, filter, start, count, function(xml) {
callback(xml);
}, {
"404": function() {
alert("You don't have collection of that type.");
}
});
},
function() {
@@ -140,7 +144,11 @@ var GempLotrDeckBuildingUI = Class.extend({
function() {
if (confirm("Do you wish to save this deck?"))
that.saveDeck(false);
});
}, {
"404": function() {
alert("Couldn't find the deck to rename on the server.");
}
});
}
});
@@ -385,11 +393,19 @@ var GempLotrDeckBuildingUI = Class.extend({
if (confirm("Would you like to open this pack?")) {
this.comm.openPack(this.getCollectionType(), selectedCardElem.data("card").blueprintId, function() {
that.cardFilter.getCollection();
}, {
"404": function() {
alert("You have no pack of this type in your collection.");
}
});
}
} else if (selectedCardElem.hasClass("cardToSelect")) {
this.comm.openSelectionPack(this.getCollectionType(), this.packSelectionId, selectedCardElem.data("card").blueprintId, function() {
that.cardFilter.getCollection();
}, {
"404": function() {
alert("You have no pack of this type in your collection or that selection is not available for this pack.");
}
});
this.selectionDialog.dialog("close");
} else if (selectedCardElem.hasClass("selectionInCollection")) {
@@ -540,6 +556,10 @@ var GempLotrDeckBuildingUI = Class.extend({
this.comm.saveDeck(this.deckName, deckContents, function(xml) {
that.deckModified(false);
alert("Deck was saved");
}, {
"400": function() {
alert("Invalid deck format.");
}
});
},
@@ -641,7 +661,11 @@ var GempLotrDeckBuildingUI = Class.extend({
function() {
that.checkDeckStatsDirty();
}, that.checkDirtyInterval);
});
}, {
"400": function() {
alert("Invalid deck for getting stats.");
}
});
} else {
$("#deckStats").html("Deck has no Ring, Ring-bearer or all 9 sites");
setTimeout(