private ParseException createException(String rule, VariableResolver resolver, Throwable t) { String message = "Unable to parse: " + rule + " due to: " + t.getMessage(); Set<String> variablesUsed = variablesUsed(rule); if(variablesUsed.isEmpty()) { return new ParseException(message, t); } List<Map.Entry<String, Object>> messagesUsed = new ArrayList<>(variablesUsed.size()); for(String v : variablesUsed) { Optional<Object> resolved = Optional.ofNullable(resolver.resolve(v)); messagesUsed.add(new AbstractMap.SimpleEntry<>(v, resolved.orElse("missing"))); } return new ParseException(message + " with relevant variables " + Joiner.on(",").join(messagesUsed), t); }
@Override public void exitVariable(StellarParser.VariableContext ctx) { final FrameContext.Context context = getArgContext(); expression.tokenDeque.push(new Token<>( (tokenDeque, state) -> { String varName = ctx.getText(); if(state.context.getActivityType().equals(ActivityType.PARSE_ACTIVITY) && !state.variableResolver.exists(varName)) { // when parsing, missing variables are an error! throw new ParseException(String.format("variable: %s is not defined",varName)); } Object resolved = state.variableResolver.resolve(varName); tokenDeque.push(new Token<>(resolved, Object.class, context)); }, DeferredFunction.class, context)); expression.variablesUsed.add(ctx.getText()); }
public Object apply(List<Object> variableArgs) { Map<String, Object> lambdaVariables = new HashMap<>(); int i = 0; for(;i < Math.min(variables.size(),variableArgs.size()) ;++i) { lambdaVariables.put(variables.get(i), variableArgs.get(i)); } for(;i < variables.size();++i) { lambdaVariables.put(variables.get(i), null); } VariableResolver variableResolver = new DefaultVariableResolver(variable -> lambdaVariables.getOrDefault(variable , state.variableResolver.resolve(variable) ), variable -> true); StellarCompiler.ExpressionState localState = new StellarCompiler.ExpressionState( state.context , state.functionResolver , variableResolver); return apply(localState); } }
Map<String, Object> fields = packetToFields(pi); VariableResolver resolver = new MapVariableResolver(fields); String srcAddrIn = (String) resolver.resolve(Constants.Fields.SRC_ADDR.getName()); Integer srcPortIn = (Integer) resolver.resolve(Constants.Fields.SRC_PORT.getName()); String dstAddrIn = (String) resolver.resolve(Constants.Fields.DST_ADDR.getName()); Integer dstPortIn = (Integer) resolver.resolve(Constants.Fields.DST_PORT.getName()); String protocolIn = "" + resolver.resolve(Constants.Fields.PROTOCOL.getName()); if(!doHeaderFiltering || testHeader(srcAddrIn, srcPortIn, dstAddrIn, dstPortIn, protocolIn)) { byte[] data = (byte[])resolver.resolve(PcapHelper.PacketFields.PACKET_DATA.getName()); try { return ByteArrayMatchingUtil.INSTANCE.match(packetFilter, data);
@Override public void exitExistsFunc(StellarParser.ExistsFuncContext ctx) { final FrameContext.Context context = getArgContext(); expression.tokenDeque.push(new Token<>( (tokenDeque, state) -> { String variable = ctx.getChild(2).getText(); boolean exists = state.variableResolver.resolve(variable) != null; tokenDeque.push(new Token<>(exists, Boolean.class, context)); }, DeferredFunction.class, context)); String variable = ctx.getChild(2).getText(); expression.variablesUsed.add(variable); }