private void appendParametersFromArgumentHolder( final Class<?>[] parameterTypes, final StringBuilder methodSrc, final ArgumentHolderGenerator argumentHolderGenerator) { argumentHolderGenerator.resetFieldNames(); for (int i = 0; i < parameterTypes.length; i++) { final Class<?> parameterType = parameterTypes[i]; methodSrc .append("holder.") .append(argumentHolderGenerator.getNextFieldNameForType(parameterType)); if (i < parameterTypes.length - 1) { methodSrc.append(", "); } } }
private void createRingBufferPublisherMethod( final CtClass ctClass, final Method method, final Invoker invoker, final OverflowStrategy overflowStrategy, final ArgumentHolderGenerator argumentHolderGenerator) { final StringBuilder methodSrc = new StringBuilder("public void ").append(method.getName()).append("("); final Class<?>[] parameterTypes = method.getParameterTypes(); char paramId = 'a'; for (int i = 0, parameterTypesLength = parameterTypes.length; i < parameterTypesLength; i++) { final Class<?> parameterType = parameterTypes[i]; if (parameterType.isArray()) { methodSrc .append(parameterType.getComponentType().getName()) .append("[] ") .append(paramId++); } else { methodSrc.append(parameterType.getName()).append(' ').append(paramId++); } if (i < parameterTypesLength - 1) { methodSrc.append(", "); } } methodSrc.append(")\n{\n"); methodSrc.append("messagePublicationListener.onPrePublish();\n"); handleOverflowStrategy(overflowStrategy, methodSrc); methodSrc .append("final long sequence = ringBuffer.next();\n") .append("try\n") .append("{\n") .append( "final ProxyMethodInvocation proxyMethodInvocation = (ProxyMethodInvocation) ringBuffer.get(sequence);\n"); final String argumentHolderClass = argumentHolderGenerator.getGeneratedClassName(); methodSrc .append("final ") .append(argumentHolderClass) .append(" holder = (") .append(argumentHolderClass) .append(") proxyMethodInvocation.getArgumentHolder();\n"); argumentHolderGenerator.resetFieldNames(); for (int i = 0; i < parameterTypes.length; i++) { final Class<?> parameterType = parameterTypes[i]; final String holderField = argumentHolderGenerator.getNextFieldNameForType(parameterType); methodSrc .append("holder.") .append(holderField) .append(" = ") .append((char) ('a' + i)) .append(";"); } methodSrc .append("proxyMethodInvocation.setInvoker(_") .append(invoker.getClass().getName()) .append(");\n") .append("}\n") .append("catch(Throwable t){t.printStackTrace();}\n") .append("finally\n") .append("{\n") .append("ringBuffer.publish(sequence);\n") .append("messagePublicationListener.onPostPublish();\n") .append("}\n"); methodSrc.append("}\n"); createMethod(ctClass, methodSrc.toString()); }