package org.jactr.tools.tracer.transformer.chunk; /* * default logging */ import org.antlr.runtime.tree.CommonTree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.chunk.event.ChunkEvent; import org.jactr.core.event.IACTREvent; import org.jactr.io.antlr3.builder.JACTRBuilder; import org.jactr.io.antlr3.misc.ASTSupport; import org.jactr.io.resolver.ASTResolver; import org.jactr.tools.tracer.transformer.IEventTransformer; import org.jactr.tools.tracer.transformer.ITransformedEvent; public class ChunkEventTransformer implements IEventTransformer { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ChunkEventTransformer.class); private ASTSupport _support = new ASTSupport(); public ITransformedEvent transform(IACTREvent actrEvent) { ChunkEvent event = (ChunkEvent) actrEvent; ChunkEvent.Type type = event.getType(); CommonTree ast = null; boolean handled = false; try { switch (type) { case ENCODED: ast = encoded(event); handled = ast != null; break; case SLOT_VALUE_CHANGED: ast = slotsChanged(event); handled = ast != null; break; case MERGING_WITH: // unnecessary to send, implied by into.. break; case MERGING_INTO: // eek, how's this for readability.. handled = (ast = merge(event, event.getSource().getSymbolicChunk() .getName(), event.getChunk().getSymbolicChunk().getName())) != null; break; default: handled = false; } if (handled) return new TransformedChunkEvent( event.getSource().getModel().getName(), event.getSource() .getSymbolicChunk().getName(), event.getSystemTime(), event .getSimulationTime(), type, ast); } catch (Exception e) { LOGGER.debug("Could not transform event ", e); } return null; } protected CommonTree encoded(ChunkEvent event) { return ASTResolver.toAST(event.getSource(), true); } protected CommonTree slotsChanged(ChunkEvent event) { Object value = event.getNewSlotValue(); String valueStr = "null"; if (value != null) valueStr = value.toString(); CommonTree ast = _support.create(JACTRBuilder.SLOTS); ast.addChild(_support.createSlot(event.getSlotName(), _support.create( JACTRBuilder.STRING, valueStr))); return ast; } protected CommonTree merge(ChunkEvent event, String chunkA, String chunkB) { CommonTree ast = _support.create(JACTRBuilder.CHUNKS); ast.addChild(_support.create(JACTRBuilder.CHUNK_IDENTIFIER, chunkA)); ast.addChild(_support.create(JACTRBuilder.CHUNK_IDENTIFIER, chunkB)); return ast; } }