Improving logging for detecting bad performance.

This commit is contained in:
marcins78@gmail.com
2011-11-16 12:01:46 +00:00
parent f0aa3a5518
commit 766820f328
3 changed files with 167 additions and 297 deletions

View File

@@ -8,26 +8,22 @@ public class LoggingThreadLocal {
private static ThreadLocal<StringBuilder> _logLocal = new ThreadLocal<StringBuilder>();
private static ThreadLocal<Long> _start = new ThreadLocal<Long>();
public static boolean isStarting() {
if (_logLocal.get() == null) {
_logLocal.set(new StringBuilder());
_start.set(System.currentTimeMillis());
return true;
}
return false;
public static void start() {
_logLocal.set(new StringBuilder());
_start.set(System.currentTimeMillis());
}
public static void log(PhysicalCard card, String desc) {
StringBuilder builder = _logLocal.get();
if (builder != null)
if (builder != null && card != null)
builder.append(card.getBlueprintId()).append(" ").append(desc).append(" - ");
}
public static void stop() {
public static void stop(boolean writeOperation) {
long start = _start.get();
long time = System.currentTimeMillis() - start;
if (time > 100)
LOG.error("Processing took " + time + "ms: \n" + _logLocal.get().toString());
LOG.error("Processing took (" + writeOperation + ")" + time + "ms: \n" + _logLocal.get().toString());
_start.set(null);
_logLocal.set(null);
}

View File

@@ -188,53 +188,41 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
@Override
public boolean hasKeyword(GameState gameState, PhysicalCard physicalCard, Keyword keyword) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "hasKeyword");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
return false;
}
LoggingThreadLocal.log(physicalCard, "hasKeyword");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
return false;
}
if (physicalCard.getBlueprint().hasKeyword(keyword))
return true;
if (physicalCard.getBlueprint().hasKeyword(keyword))
return true;
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
if (modifier.hasKeyword(gameState, this, physicalCard, keyword))
return true;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
if (modifier.hasKeyword(gameState, this, physicalCard, keyword))
return true;
}
return false;
}
@Override
public int getKeywordCount(GameState gameState, PhysicalCard physicalCard, Keyword keyword) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getKeywordCount");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
return 0;
}
int result = physicalCard.getBlueprint().getKeywordCount(keyword);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
result += modifier.getKeywordCountModifier(gameState, this, physicalCard, keyword);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getKeywordCount");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
return 0;
}
int result = physicalCard.getBlueprint().getKeywordCount(keyword);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.KEYWORD_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
result += modifier.getKeywordCountModifier(gameState, this, physicalCard, keyword);
}
return Math.max(0, result);
}
private boolean appliesKeywordModifier(GameState gameState, PhysicalCard modifierSource, Keyword keyword) {
@@ -266,20 +254,14 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
@Override
public int getStrength(GameState gameState, PhysicalCard physicalCard) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getStrength");
int result = physicalCard.getBlueprint().getStrength();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.STRENGTH_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesStrengthModifier(gameState, modifier.getSource()))
result += modifier.getStrengthModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getStrength");
int result = physicalCard.getBlueprint().getStrength();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.STRENGTH_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
&& appliesStrengthModifier(gameState, modifier.getSource()))
result += modifier.getStrengthModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
}
private boolean appliesStrengthModifier(GameState gameState, PhysicalCard modifierSource) {
@@ -295,262 +277,172 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
@Override
public int getVitality(GameState gameState, PhysicalCard physicalCard) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getVitality");
int result = physicalCard.getBlueprint().getVitality() - gameState.getWounds(physicalCard);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.VITALITY_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getVitalityModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getVitality");
int result = physicalCard.getBlueprint().getVitality() - gameState.getWounds(physicalCard);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.VITALITY_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getVitalityModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
}
@Override
public int getResistance(GameState gameState, PhysicalCard physicalCard) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getResistance");
int result = physicalCard.getBlueprint().getResistance() - gameState.getBurdens();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.RESISTANCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getResistanceModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getResistance");
int result = physicalCard.getBlueprint().getResistance() - gameState.getBurdens();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.RESISTANCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getResistanceModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
}
@Override
public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getMinionSiteNumber");
int result = physicalCard.getBlueprint().getSiteNumber();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.SITE_NUMBER_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getMinionSiteNumberModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getMinionSiteNumber");
int result = physicalCard.getBlueprint().getSiteNumber();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.SITE_NUMBER_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getMinionSiteNumberModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
}
@Override
public int getTwilightCost(GameState gameState, PhysicalCard physicalCard, boolean ignoreRoamingPenalty) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getTwilightCost");
int result = physicalCard.getBlueprint().getTwilightCost();
result += physicalCard.getBlueprint().getTwilightCostModifier(gameState, this, physicalCard);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getTwilightCostModifier(gameState, this, physicalCard, ignoreRoamingPenalty);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getTwilightCost");
int result = physicalCard.getBlueprint().getTwilightCost();
result += physicalCard.getBlueprint().getTwilightCostModifier(gameState, this, physicalCard);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getTwilightCostModifier(gameState, this, physicalCard, ignoreRoamingPenalty);
}
return Math.max(0, result);
}
@Override
public int getPlayOnTwilightCost(GameState gameState, PhysicalCard physicalCard, PhysicalCard target) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getPlayOnTwilightCost");
int result = getTwilightCost(gameState, physicalCard, false);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getPlayOnTwilightCostModifier(gameState, this, physicalCard, target);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getPlayOnTwilightCost");
int result = getTwilightCost(gameState, physicalCard, false);
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getPlayOnTwilightCostModifier(gameState, this, physicalCard, target);
}
return Math.max(0, result);
}
@Override
public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(physicalCard, "getRoamingPenalty");
int result = 2;
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getRoamingPenaltyModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(physicalCard, "getRoamingPenalty");
int result = 2;
for (Modifier modifier : getModifiers(gameState, ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result += modifier.getRoamingPenaltyModifier(gameState, this, physicalCard);
}
return Math.max(0, result);
}
@Override
public int getOverwhelmMultiplier(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "getOverwhelmMultiplier");
int overwhelmMultiplier = 2;
for (Modifier modifier : getModifiers(gameState, ModifierEffect.OVERWHELM_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
overwhelmMultiplier = Math.max(overwhelmMultiplier, modifier.getOverwhelmMultiplier(gameState, this, card));
}
return overwhelmMultiplier;
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "getOverwhelmMultiplier");
int overwhelmMultiplier = 2;
for (Modifier modifier : getModifiers(gameState, ModifierEffect.OVERWHELM_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
overwhelmMultiplier = Math.max(overwhelmMultiplier, modifier.getOverwhelmMultiplier(gameState, this, card));
}
return overwhelmMultiplier;
}
@Override
public boolean canTakeWound(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canTakeWound");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier)) {
Integer woundsTaken = _woundsPerPhaseMap.get(card.getCardId());
if (woundsTaken == null)
woundsTaken = 0;
if (!modifier.canTakeWound(gameState, this, card, woundsTaken))
return false;
}
LoggingThreadLocal.log(card, "canTakeWound");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier)) {
Integer woundsTaken = _woundsPerPhaseMap.get(card.getCardId());
if (woundsTaken == null)
woundsTaken = 0;
if (!modifier.canTakeWound(gameState, this, card, woundsTaken))
return false;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
}
return true;
}
@Override
public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canTakeArcheryWound");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier)) {
if (!modifier.canTakeArcheryWound(gameState, this, card))
return false;
}
LoggingThreadLocal.log(card, "canTakeArcheryWound");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier)) {
if (!modifier.canTakeArcheryWound(gameState, this, card))
return false;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
}
return true;
}
@Override
public boolean canBeExerted(GameState gameState, PhysicalCard source, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canBeExerted");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeExerted(gameState, this, source, card))
return false;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "canBeExerted");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeExerted(gameState, this, source, card))
return false;
}
return true;
}
@Override
public boolean isAllyAllowedToParticipateInArcheryFire(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "isAllyAllowedToParticipateInArcheryFire");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyParticipateInArcheryFire(gameState, this, card))
return true;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "isAllyAllowedToParticipateInArcheryFire");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyParticipateInArcheryFire(gameState, this, card))
return true;
}
return false;
}
@Override
public boolean isAllowedToParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "isAllowedToParticipateInSkirmished");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isParticipateInSkirmishes(gameState, sidePlayer, this, card))
return true;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "isAllowedToParticipateInSkirmished");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isParticipateInSkirmishes(gameState, sidePlayer, this, card))
return true;
}
return false;
}
@Override
public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInArcheryFire");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyPreventedFromParticipatingInArcheryFire(gameState, this, card))
return true;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInArcheryFire");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyPreventedFromParticipatingInArcheryFire(gameState, this, card))
return true;
}
return false;
}
@Override
public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInSkirmishes");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyPreventedFromParticipatingInSkirmishes(gameState, sidePlayer, this, card))
return true;
}
} finally {
if (starting)
LoggingThreadLocal.stop();
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInSkirmishes");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyPreventedFromParticipatingInSkirmishes(gameState, sidePlayer, this, card))
return true;
}
return false;
}
@Override
public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "addsToArcheryTotal");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.ARCHERY_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.addsToArcheryTotal(gameState, this, card))
return false;
LoggingThreadLocal.log(card, "addsToArcheryTotal");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.ARCHERY_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.addsToArcheryTotal(gameState, this, card))
return false;
} finally {
if (starting)
LoggingThreadLocal.stop();
}
return true;
}
@@ -620,49 +512,31 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
@Override
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canBeAssignedToSkirmish");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.ASSIGNMENT_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeAssignedToSkirmish(gameState, sidePlayer, this, card))
return false;
} finally {
if (starting)
LoggingThreadLocal.stop();
}
LoggingThreadLocal.log(card, "canBeAssignedToSkirmish");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.ASSIGNMENT_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeAssignedToSkirmish(gameState, sidePlayer, this, card))
return false;
return true;
}
@Override
public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canBeDiscardedFromPlay");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeDiscardedFromPlay(gameState, this, card, source))
return false;
} finally {
if (starting)
LoggingThreadLocal.stop();
}
LoggingThreadLocal.log(card, "canBeDiscardedFromPlay");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeDiscardedFromPlay(gameState, this, card, source))
return false;
return true;
}
@Override
public boolean canBeHealed(GameState gameState, PhysicalCard card) {
boolean starting = LoggingThreadLocal.isStarting();
try {
LoggingThreadLocal.log(card, "canBeHealed");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeHealed(gameState, this, card))
return false;
} finally {
if (starting)
LoggingThreadLocal.stop();
}
LoggingThreadLocal.log(card, "canBeHealed");
for (Modifier modifier : getModifiers(gameState, ModifierEffect.WOUND_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
if (!modifier.canBeHealed(gameState, this, card))
return false;
return true;
}

View File

@@ -18,6 +18,7 @@ import com.gempukku.lotro.hall.HallException;
import com.gempukku.lotro.hall.HallInfoVisitor;
import com.gempukku.lotro.hall.HallServer;
import com.gempukku.lotro.league.LeagueService;
import com.gempukku.lotro.logic.modifiers.LoggingThreadLocal;
import com.gempukku.lotro.logic.vo.LotroDeck;
import com.sun.jersey.spi.resource.Singleton;
import org.apache.commons.lang.StringEscapeUtils;
@@ -279,36 +280,35 @@ public class ServerResource {
if (!_test)
participantId = getLoggedUser(request);
long start = System.currentTimeMillis();
LoggingThreadLocal.start();
try {
LotroGameMediator gameMediator = _lotroServer.getGameById(gameId);
if (gameMediator == null)
sendError(Response.Status.NOT_FOUND);
LotroGameMediator gameMediator = _lotroServer.getGameById(gameId);
if (gameMediator == null)
sendError(Response.Status.NOT_FOUND);
if (decisionId != null) {
try {
gameMediator.playerAnswered(participantId, decisionId, decisionValue);
} catch (RuntimeException exp) {
_logger.error("Error while sending decision", exp);
throw exp;
if (decisionId != null) {
try {
gameMediator.playerAnswered(participantId, decisionId, decisionValue);
} catch (RuntimeException exp) {
_logger.error("Error while sending decision", exp);
throw exp;
}
}
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
Element update = doc.createElement("update");
gameMediator.processCommunicationChannel(participantId, new SerializationVisitor(doc, update));
doc.appendChild(update);
return doc;
} finally {
LoggingThreadLocal.stop(decisionId != null);
}
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
Element update = doc.createElement("update");
gameMediator.processCommunicationChannel(participantId, new SerializationVisitor(doc, update));
doc.appendChild(update);
long time = System.currentTimeMillis() - start;
if (time > 100)
_logger.debug("Processing time: " + time);
return doc;
}
@Path("/deck/list")