package hu.sztaki.ilab.longneck.process.kernel; import hu.sztaki.ilab.longneck.Record; import hu.sztaki.ilab.longneck.process.CheckError; import hu.sztaki.ilab.longneck.process.FrameAddress; import hu.sztaki.ilab.longneck.process.block.BlockReference; import hu.sztaki.ilab.longneck.process.block.GenericBlock; import hu.sztaki.ilab.longneck.process.mapping.MappedRecord; /** * TODO: docs * * @author Lukacs Gabor <lukacsg@sztaki.mta.hu> */ class BlockReferenceControl implements StartHandler, ErrorHandler, EndHandler, BreakHandler, RecordChangeHandler { private final BlockReference blockRef; private boolean wasError; private boolean breaked; private String context; public BlockReferenceControl(BlockReference blockRef) { this.blockRef = blockRef; } @Override public void beforeChildren(KernelState kernelState, Record record) throws RedirectException, CheckError { GenericBlock referredBlock = blockRef.getReferredBlock(); if (referredBlock.getInputConstraints() != null) { referredBlock.getInputConstraints().apply(record, kernelState.getLastExecutionFrame().getVariables()); } } @Override public void onError(KernelState kernelState, Record record) throws CheckError, RedirectException { if (blockRef.isPropagateFailure()) { throw kernelState.getLastError(); } if (context != null) kernelState.getLastError().getCheckResult().setContext(context); kernelState.handleError(record); wasError = true; throw new RedirectException(FrameAddress.RETURN); } @Override public void afterChildren(KernelState kernelState, Record record) throws CheckError { GenericBlock referredBlock = blockRef.getReferredBlock(); if (referredBlock.getOutputConstraints() != null && !wasError && !breaked) { referredBlock.getOutputConstraints().apply(record, kernelState.getLastExecutionFrame().getVariables()); } } @Override public BlockReferenceControl clone() { try { return (BlockReferenceControl) super.clone(); } catch (CloneNotSupportedException ex) { throw new AssertionError(ex); } } @Override public void onBreak(KernelState kernelState, Record record) { breaked = true; } @Override public Record changeRecord(Record record) throws NoMappingException { if (!blockRef.getMapping().hasRules()) { throw new NoMappingException(); } return new MappedRecord(record, blockRef.getMapping()); } @Override public Record restoreRecord(Record record) throws NoMappingException { if (!blockRef.getMapping().hasRules()) { throw new NoMappingException(); } return ((MappedRecord) record).restoreRecord(); } public String getContext() { return context; } public void setContext(String context) { this.context = context; } }