package com.iambookmaster.server.logic;
import java.util.ArrayList;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Battle;
import com.iambookmaster.client.beans.Modificator;
import com.iambookmaster.client.beans.NPC;
import com.iambookmaster.client.beans.ObjectBean;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.exceptions.TimeoutException;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppMessages;
import com.iambookmaster.client.model.Model;
import com.iambookmaster.client.model.Model.FullParagraphDescriptonBuilder;
import com.iambookmaster.client.paragraph.PathFinder;
import com.iambookmaster.client.paragraph.PathFinderErrorListener;
/**
* Server-side validator for Game book
* @author ggadyatskiy
*/
public class ServerModelValidator extends AbstractModelProcessor {
private PathFinder validator;
private ServerModelValidatorListener validatorListener;
private PathFinderErrorListener pathFinderErrorListener;
private boolean mapValidation;
public ServerModelValidator(Model model,AppConstants appConstants,AppMessages appMessages) {
super(model,appConstants,appMessages);
validator = new PathFinder(model);
validator.setCheckSuccessOnly(true);
}
public boolean validate(ServerModelValidatorListener listener) throws TimeoutException{
clearErrors();
validatorListener = listener;
pathFinderErrorListener = new PathFinderErrorListener() {
public void alreadyHaveThatObject(Paragraph current, ObjectBean object) {
if (object.isUncountable()==false) {
appendObject(object);
appendErrorText(appConstants.serverValidatorObjectCanBeGotManyTimes());
appendParagraph(current);
appendErrorEndLine();
}
}
public void bothDirConnectionHasObject(
ParagraphConnection connection) {
appendParagraphConnection(connection);
appendErrorText(appConstants.serverValidatorConnectionHasCondition());
appendObject(connection.getObject());
appendErrorEndLine();
}
public void duplicateConnectionBetweenParagraphs(
ParagraphConnection connection) {
appendErrorText(appConstants.serverValidatorDuplicateConnection());
appendParagraph(connection.getFrom());
appendErrorText(appConstants.serverValidatorDuplicateConnectionAnd());
appendParagraph(connection.getTo());
appendErrorEndLine();
}
public void noWayFromNormalParagraph(Paragraph paragraph) {
appendErrorText(appConstants.serverValidatorNoWayFrom());
appendParagraph(paragraph);
appendErrorEndLine();
}
public void noWayToSuccess(Paragraph paragraph) {
appendParagraph(paragraph);
appendErrorText(appConstants.serverValidatorParagraphCannotBeReached());
appendErrorEndLine();
}
public void objectCannotBeFound(ObjectBean object) {
appendObject(object);
appendErrorText(appConstants.serverValidatorObjectCannotBeFound());
appendErrorEndLine();
}
public void objectCannotBeUsed(ObjectBean object) {
// appendObject(object);
// appendErrorText(appConstants.serverValidatorCannotBeUsed());
// appendErrorEndLine();
}
public void outwayFromFialOrSuccessParagraph(Paragraph paragraph) {
appendParagraph(paragraph);
appendErrorText(appConstants.serverValidatorParagraphHasOutcome());
appendErrorEndLine();
}
public void startFromFialOrSuccessParagraph(Paragraph paragraph) {
appendErrorText(appConstants.serverValidatorStartsFrom());
appendParagraph(paragraph);
appendErrorEndLine();
}
public void startHasIncomeConection(Paragraph paragraph) {
appendErrorText(appConstants.serverValidatorStartsHasIncome());
appendParagraph(paragraph);
appendErrorEndLine();
}
public void startLocationIsNotDefined() {
appendErrorText(appConstants.modelStartParagraphNotSet());
appendErrorEndLine();
}
public void unriachebleParagraph(Paragraph paragraph) {
appendParagraph(paragraph);
appendErrorText(appConstants.serverValidatorParagraphCannotBeReached());
appendErrorEndLine();
}
public void unusedParagraphConnection(ParagraphConnection connection) {
appendParagraphConnection(connection);
appendErrorText(appConstants.serverValidatorObjectCannotBeUsed());
appendErrorEndLine();
}
public void uselessObjectInFailOrSuccess(Paragraph paragraph) {
appendParagraph(paragraph);
appendErrorText(appConstants.serverValidatorParagraphHasObjects());
appendErrorEndLine();
}
public void conditionalChain(ParagraphConnection connection) {
appendErrorText(appConstants.serverValidatorChainDetected());
appendParagraphConnection(connection);
appendErrorEndLine();
}
public boolean checkTimeout() {
return validatorListener.checkTimeout();
}
public void gotAndLostObjectInTheSameParagraph(Paragraph paragraph,ObjectBean bean) {
appendObject(bean);
appendErrorText(appConstants.serverValidatorObjectLostAndFoundInTheSamePlace());
appendParagraph(paragraph);
appendErrorEndLine();
}
public void twoInputConnectionsWithTheSameObject(Paragraph paragraph, ObjectBean object) {
appendErrorText(appMessages.twoInputConnectionsWithTheSameObject(paragraph.getName(),object.getName()));
appendErrorEndLine();
}
public void twoOutputConnectionsWithTheSameObject(Paragraph paragraph, ObjectBean object) {
appendErrorText(appMessages.twoOutputConnectionsWithTheSameObject(paragraph.getName(),object.getName()));
appendErrorEndLine();
}
public void modificatorIsSetNowhere(Modificator modificator) {
appendErrorText(appMessages.modificatorIsSetNowhere(modificator.getName()));
appendErrorEndLine();
}
public void modificatorNotSetInConnection(ParagraphConnection connection) {
appendErrorText(appMessages.modificatorNotSetInConnection(connection.getFrom().getName(),connection.getTo().getName()));
appendParagraphConnection(connection);
appendErrorEndLine();
}
public void modificatorsInFialOrSuccessParagraph(Paragraph paragraph) {
appendErrorText(appMessages.modificatorsInFialOrSuccessParagraph(paragraph.getName()));
appendParagraph(paragraph);
appendErrorEndLine();
}
public void parameterNotSetInConnection(ParagraphConnection connection) {
appendErrorText(appMessages.parameterNotSetInConnection(connection.getFrom().getName(),connection.getTo().getName()));
appendParagraphConnection(connection);
appendErrorEndLine();
}
public void parametersInFromFialOrSuccessParagraph(Paragraph paragraph) {
appendErrorText(appMessages.modificatorsInFialOrSuccessParagraph(paragraph.getName()));
appendParagraph(paragraph);
appendErrorEndLine();
}
public void unusedModificator(Modificator modificator) {
appendErrorText(appMessages.unusedModificator(modificator.getName()));
appendErrorEndLine();
}
public void unusedParameter(Parameter parameter) {
appendErrorText(appMessages.unusedParameter(parameter.getName()));
appendErrorEndLine();
}
public void NPCIsUsedNowhere(NPC npc) {
appendErrorText(appMessages.NPCIsUsedNowhere(npc.getName()));
appendErrorEndLine();
}
public void alchemyIsUsedNowhere(Alchemy alchemy) {
appendErrorText(appMessages.alchemyIsUsedNowhere(alchemy.getName()));
appendErrorEndLine();
}
public void battleIsUsedNowhere(Battle battle) {
appendErrorText(appMessages.battleIsUsedNowhere(battle.getName()));
appendErrorEndLine();
}
public void noSuccessParagraphs() {
appendErrorText(appConstants.noSuccessParagraphsDefined());
appendErrorEndLine();
}
public void updateStatus(int paragraphs, int connections) {
}
public boolean canContinue() {
return true;
}
public void mustGoAndNormaConnectionsInParagraph(Paragraph paragraph) {
appendErrorText(appMessages.mustGoAndNormaConnectionsInParagraph(paragraph.getName()));
appendParagraph(paragraph);
appendErrorEndLine();
}
public void done() {
}
public boolean canBePassed(ParagraphConnection connection, Paragraph paragraph) {
return true;
}
};
//engine is ready, start
mapValidation = true;
validator.validate(pathFinderErrorListener);
valiateTextCounter=0;
mapValidation = false;
validateText();
return getErrors()==null;
}
private int valiateTextCounter=0;
private void validateText() throws TimeoutException {
//validate text
ArrayList<Paragraph> paragrapghs = getModel().getParagraphs();
FullParagraphDescriptonBuilder builder = getModel().getFullParagraphDescriptonBuilder();
builder.setCheckSecretKeys(true);
builder.setHiddenUsingObjects(false);
for (; valiateTextCounter < paragrapghs.size(); valiateTextCounter++) {
Paragraph paragraph = paragrapghs.get(valiateTextCounter);
ArrayList<String> errors = new ArrayList<String>();
builder.getFullParagraphDescripton(paragraph, null, errors,null);
for (int j = 0; j < errors.size(); j++) {
appendParagraph(paragraph);
appendErrorText(errors.get(j));
appendErrorEndLine();
}
if (validatorListener.checkTimeout()) {
throw new TimeoutException();
}
}
}
public boolean continueValidation(ServerModelValidatorListener validatorListener) throws TimeoutException {
if (mapValidation) {
validator.continueProgess();
valiateTextCounter=0;
mapValidation = false;
validateText();
} else {
validateText();
}
return getErrors()==null;
}
}