summaryrefslogtreecommitdiff
path: root/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java')
-rw-r--r--trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java1826
1 files changed, 0 insertions, 1826 deletions
diff --git a/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java b/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java
deleted file mode 100644
index 7730fca1bd..0000000000
--- a/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java
+++ /dev/null
@@ -1,1826 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.gentools;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.TreeMap;
-
-public class JavaGenerator extends Generator
-{
- // TODO: Move this to parent class
- protected static final int FIELD_NAME = 0;
- protected static final int FIELD_CODE_TYPE = 1;
-
- private class DomainInfo
- {
- final public String type;
- final public String size;
- final public String encodingType;
- final public String encodeExpression;
- final public String decodeExpression;
-
- public DomainInfo(String domain, String size, String encodingType, String encodeExpression, String decodeExpression)
- {
- this.type = domain;
- this.size = size;
- this.encodeExpression = encodeExpression;
- this.decodeExpression = decodeExpression;
- this.encodingType = encodingType;
- }
- }
-
- private static TreeMap<String, DomainInfo> typeMap = new TreeMap<String, DomainInfo>();
-
- // Methods used for generation of code snippets called from the field map parsers
-
- // Common methods
- private final CommandGenerateMethod declarationGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generateFieldDeclaration(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
-
- private MangledGenerateMethod mangledDeclarationGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generateMangledFieldDeclaration(field, indentSize, tabSize, notLast);
- }
- };
-
- // Methods for MessageBody classes
- private CommandGenerateMethod mbGetGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbGetMethod(codeType, field, versionSet, indentSize, tabSize, notLast); //To change body of implemented methods use File | Settings | File Templates.
- }
- };
-
- private MangledGenerateMethod mbMangledGetGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbMangledGetMethod(field, indentSize, tabSize, notLast);
- }
- };
- private CommandGenerateMethod mbParamListGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbParamList(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private CommandGenerateMethod mbPassedParamListGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbPassedParamList(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod mbMangledParamListGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbMangledParamList(field, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod mbMangledPassedParamListGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbMangledPassedParamList(field, indentSize, tabSize, notLast);
- }
- };
- private CommandGenerateMethod mbBodyInitGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbBodyInit(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod mbMangledBodyInitGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generateMbMangledBodyInit(field, indentSize, tabSize, notLast);
- }
- };
- private GenerateMethod mbSizeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generateMbFieldSize(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod mbBitSizeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generateMbBitArrayFieldSize(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod mbEncodeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generateMbFieldEncode(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod mbBitEncodeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generateMbBitFieldEncode(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod mbDecodeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generateMbFieldDecode(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod mbBitDecodeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generateMbBitFieldDecode(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod mbToStringGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generateMbFieldToString(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod mbBitToStringGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generateMbBitFieldToString(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
-
- // Methods for PropertyContentHeader classes
- private CommandGenerateMethod pchClearGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchClearMethod(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod pchMangledClearGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchMangledClearMethod(field, indentSize, tabSize, notLast);
- }
- };
- private CommandGenerateMethod pchGetGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchGetMethod(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod pchMangledGetGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchMangledGetMethod(field, indentSize, tabSize, notLast);
- }
- };
- private CommandGenerateMethod pchSetGenerateMethod = new CommandGenerateMethod()
- {
- public String generate(String codeType, AmqpField field, AmqpVersionSet versionSet, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchSetMethod(codeType, field, versionSet, indentSize, tabSize, notLast);
- }
- };
- private MangledGenerateMethod pchMangledSetGenerateMethod = new MangledGenerateMethod()
- {
- public String generate(AmqpField field, int indentSize, int tabSize, boolean notLast)
- {
- return generatePchMangledSetMethod(field, indentSize, tabSize, notLast);
- }
- };
- private GenerateMethod pchSizeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generatePchFieldSize(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod pchBitSizeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generatePchBitArrayFieldSize(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod pchEncodeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generatePchFieldEncode(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod pchBitEncodeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generatePchBitFieldEncode(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod pchDecodeGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generatePchFieldDecode(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod pchBitDecodeGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generatePchBitFieldDecode(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod pchGetPropertyFlagsGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generatePchGetPropertyFlags(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod pchBitGetPropertyFlagsGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generatePchBitGetPropertyFlags(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
- private GenerateMethod pchSetPropertyFlagsGenerateMethod = new GenerateMethod()
- {
- public String generate(String domainType, String fieldName, int ordinal, int indentSize, int tabSize)
- {
- return generatePchSetPropertyFlags(domainType, fieldName, ordinal, indentSize, tabSize);
- }
- };
- private BitFieldGenerateMethod pchBitSetPropertyFlagsGenerateMethod = new BitFieldGenerateMethod()
- {
- public String generate(List<String> bitFieldList, int ordinal, int indentSize, int tabSize)
- {
- return generatePchBitSetPropertyFlags(bitFieldList, ordinal, indentSize, tabSize);
- }
- };
-
-
- public String getNativeType(String type)
- {
- return typeMap.get(type).type;
- }
-
- public String getEncodingType(String type)
- {
- return typeMap.get(type).encodingType;
- }
-
-
- public JavaGenerator()
- {
- super();
- // Load Java type and size maps.
- // Adjust or add to these lists as new types are added/defined.
- // The char '#' will be replaced by the field variable name (any type).
- // The char '~' will be replaced by the compacted bit array size (type bit only).
- typeMap.put("bit", new DomainInfo(
- "boolean", // Java code type
- "~", // size
- "Boolean", // Java code type
- "EncodingUtils.writeBooleans(buffer, #)", // encode expression
- "# = EncodingUtils.readBooleans(buffer)")); // decode expression
- typeMap.put("bitfield", new DomainInfo(
- "byte", // Java code type
- "~", // size
- "Bitfield",
- "EncodingUtils.writeBooleans(buffer, #)", // encode expression
- "# = EncodingUtils.readBooleans(buffer)")); // decode expression
-
- typeMap.put("content", new DomainInfo(
- "Content", // Java code type
- "EncodingUtils.encodedContentLength(#)", // size
- "Content", // Java code type
- "EncodingUtils.writeContentBytes(buffer, #)", // encode expression
- "# = EncodingUtils.readContent(buffer)")); // decode expression
- typeMap.put("long", new DomainInfo(
- "long", // Java code type
- "4", // size
- "UnsignedInteger", // Java code type
- "EncodingUtils.writeUnsignedInteger(buffer, #)", // encode expression
- "# = buffer.getUnsignedInt()")); // decode expression
- typeMap.put("longlong", new DomainInfo(
- "long", // Java code type
- "8", // size
- "Long",
- "buffer.putLong(#)", // encode expression
- "# = buffer.getLong()")); // decode expression
- typeMap.put("longstr", new DomainInfo(
- "byte[]", // Java code type
- "EncodingUtils.encodedLongstrLength(#)", // size
- "Bytes",
- "EncodingUtils.writeLongStringBytes(buffer, #)", // encode expression
- "# = EncodingUtils.readLongstr(buffer)")); // decode expression
- typeMap.put("octet", new DomainInfo(
- "short", // Java code type
- "1", // size
- "UnsignedByte",
- "EncodingUtils.writeUnsignedByte(buffer, #)", // encode expression
- "# = buffer.getUnsigned()")); // decode expression
- typeMap.put("short", new DomainInfo(
- "int", // Java code type
- "2", // size
- "UnsignedShort",
- "EncodingUtils.writeUnsignedShort(buffer, #)", // encode expression
- "# = buffer.getUnsignedShort()")); // decode expression
- typeMap.put("shortstr", new DomainInfo(
- "AMQShortString", // Java code type
- "EncodingUtils.encodedShortStringLength(#)", // size
- "AMQShortString", // Java code type
- "EncodingUtils.writeShortStringBytes(buffer, #)", // encode expression
- "# = EncodingUtils.readAMQShortString(buffer)")); // decode expression
- typeMap.put("table", new DomainInfo(
- "FieldTable", // Java code type
- "EncodingUtils.encodedFieldTableLength(#)", // size
- "FieldTable", // Java code type
- "EncodingUtils.writeFieldTableBytes(buffer, #)", // encode expression
- "# = EncodingUtils.readFieldTable(buffer)")); // decode expression
- typeMap.put("timestamp", new DomainInfo(
- "long", // Java code type
- "8", // size
- "Timestamp",
- "EncodingUtils.writeTimestamp(buffer, #)", // encode expression
- "# = EncodingUtils.readTimestamp(buffer)")); // decode expression
- }
-
- // === Start of methods for Interface LanguageConverter ===
-
- public String prepareClassName(String className)
- {
- return camelCaseName(className, true);
- }
-
- public String prepareMethodName(String methodName)
- {
- return camelCaseName(methodName, false);
- }
-
- public String prepareDomainName(String domainName)
- {
- return camelCaseName(domainName, false);
- }
-
-
- public String getGeneratedType(String domainName, AmqpVersion version)
- {
- String domainType = getDomainType(domainName, version);
- if (domainType == null)
- {
- throw new AmqpTypeMappingException("Domain type \"" + domainName +
- "\" not found in Java typemap.");
- }
- DomainInfo info = typeMap.get(domainType);
- if (info == null)
- {
- throw new AmqpTypeMappingException("Unknown domain: \"" + domainType + "\"");
- }
- return info.type;
- }
-
- // === Abstract methods from class Generator - Java-specific implementations ===
-
- @Override
- protected String prepareFilename(String filenameTemplate, AmqpClass thisClass, AmqpMethod method,
- AmqpField field, AmqpVersion version)
- {
- StringBuffer sb = new StringBuffer(filenameTemplate);
- if (thisClass != null)
- {
- replaceToken(sb, "${CLASS}", thisClass.getName());
- }
- if (method != null)
- {
- replaceToken(sb, "${METHOD}", method.getName());
- }
- if (field != null)
- {
- replaceToken(sb, "${FIELD}", field.getName());
- }
- if (version != null)
- {
- replaceToken(sb, "${MAJOR}", String.valueOf(version.getMajor()));
- replaceToken(sb, "${MINOR}", String.valueOf(version.getMinor()));
- }
- return sb.toString();
- }
-
- @Override
- protected void processModelTemplate(NamedTemplate template)
- {
- processTemplate(template, null, null, null, null);
- }
-
- @Override
- protected void processClassTemplate(NamedTemplate template, AmqpClass thisClass)
- {
- processTemplate(template, thisClass, null, null,
- thisClass.getVersionSet().size() == 1 ? thisClass.getVersionSet().first() : null);
- }
-
- @Override
- protected void processMethodTemplate(NamedTemplate template, AmqpClass thisClass,
- AmqpMethod method)
- {
- processTemplate(template, thisClass, method, null,
- thisClass.getVersionSet().size() == 1 ? thisClass.getVersionSet().first() : null);
- }
-
- protected void processFieldTemplate(NamedTemplate template, AmqpClass thisClass,
- AmqpMethod method, AmqpField field)
- {
- processTemplate(template, thisClass, method, field,
- thisClass.getVersionSet().size() == 1 ? thisClass.getVersionSet().first() : null);
- }
-
- @Override
- protected void processTemplate(NamedTemplate template, AmqpClass thisClass,
- AmqpMethod method, AmqpField field, AmqpVersion version)
- {
- StringBuffer sb = new StringBuffer(template.getTemplate());
- String filename = prepareFilename(getTemplateFileName(sb), thisClass, method, field, version);
- processTemplate(sb, thisClass, method, field, template.getName(), version);
- writeTargetFile(sb, new File(getOutputDirectory() + Utils.FILE_SEPARATOR + filename));
- generatedFileCounter++;
- }
-
- protected void processTemplate(StringBuffer sb, AmqpClass thisClass, AmqpMethod method,
- AmqpField field, String templateFileName, AmqpVersion version)
- {
- try
- {
- processAllLists(sb, thisClass, method, version);
- }
- catch (AmqpTemplateException e)
- {
- System.out.println("WARNING: " + templateFileName + ": " + e.getMessage());
- }
- try
- {
- processAllTokens(sb, thisClass, method, field, version);
- }
- catch (AmqpTemplateException e)
- {
- System.out.println("WARNING: " + templateFileName + ": " + e.getMessage());
- }
- }
-
- @Override
- protected String processToken(String token, AmqpClass thisClass, AmqpMethod method, AmqpField field,
- AmqpVersion version)
- {
- if (token.compareTo("${GENERATOR}") == 0)
- {
- return GENERATOR_INFO;
- }
- if (token.compareTo("${CLASS}") == 0 && thisClass != null)
- {
- return thisClass.getName();
- }
- if (token.compareTo("${CLASS_ID_INIT}") == 0 && thisClass != null)
- {
- return generateIndexInitializer("registerClassId", thisClass.getIndexMap(), 8);
- }
- if (token.compareTo("${METHOD}") == 0 && method != null)
- {
- return method.getName();
- }
- if (token.compareTo("${METHOD_ID_INIT}") == 0 && method != null)
- {
- return generateIndexInitializer("registerMethodId", method.getIndexMap(), 8);
- }
- if (token.compareTo("${FIELD}") == 0 && field != null)
- {
- return field.getName();
- }
-
- // This token is used only with class or method-level templates
- if (token.compareTo("${pch_property_flags_declare}") == 0)
- {
- return generatePchPropertyFlagsDeclare();
- }
- else if (token.compareTo("${pch_property_flags_initializer}") == 0)
- {
- int mapSize = method == null ? thisClass.getFieldMap().size() : method.getFieldMap().size();
- return generatePchPropertyFlagsInitializer(mapSize);
- }
- else if (token.compareTo("${pch_compact_property_flags_initializer}") == 0)
- {
- return generatePchCompactPropertyFlagsInitializer(thisClass, 8, 4);
- }
- else if (token.compareTo("${pch_compact_property_flags_check}") == 0)
- {
- return generatePchCompactPropertyFlagsCheck(thisClass, 8, 4);
- }
-
- // Oops!
- throw new AmqpTemplateException("Template token " + token + " unknown.");
- }
-
- @Override
- protected void processClassList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
- AmqpModel model, AmqpVersion version)
- {
- String codeSnippet;
- int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
- String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
- int tokStart = tline.indexOf('$');
- String token = tline.substring(tokStart).trim();
- sb.delete(listMarkerStartIndex, lend);
-
- if (token.compareTo("${reg_map_put_method}") == 0)
- {
- codeSnippet = generateRegistry(model, 8, 4);
- }
-
- else // Oops!
- {
- throw new AmqpTemplateException("Template token " + token + " unknown.");
- }
-
- sb.insert(listMarkerStartIndex, codeSnippet);
- }
-
- @Override
- protected void processMethodList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
- AmqpClass thisClass)
- {
- String codeSnippet;
- int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
- String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
- int tokStart = tline.indexOf('$');
- String token = tline.substring(tokStart).trim();
- sb.delete(listMarkerStartIndex, lend);
-
- //TODO - we don't have any cases of this (yet).
- if (token.compareTo("${???}") == 0)
- {
- codeSnippet = token;
- }
- else // Oops!
- {
- throw new AmqpTemplateException("Template token " + token + " unknown.");
- }
-
- sb.insert(listMarkerStartIndex, codeSnippet);
- }
-
- @Override
- protected void processFieldList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
- AmqpFieldMap fieldMap, AmqpVersion version)
- {
- String codeSnippet;
- int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
- String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
- int tokStart = tline.indexOf('$');
- String token = tline.substring(tokStart).trim();
- sb.delete(listMarkerStartIndex, lend);
-
- // Field declarations - common to MethodBody and PropertyContentHeader classes
- if (token.compareTo("${field_declaration}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(declarationGenerateMethod,
- mangledDeclarationGenerateMethod, 4, 4, this);
- }
-
- // MethodBody classes
- else if (token.compareTo("${mb_field_get_method}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(mbGetGenerateMethod,
- mbMangledGetGenerateMethod, 4, 4, this);
- }
- else if (token.compareTo("${mb_field_parameter_list}") == 0)
- {
- // <cringe> The code generated by this is ugly... It puts a comma on a line by itself!
- // TODO: Find a more elegant solution here sometime...
- codeSnippet = fieldMap.size() > 0 ? Utils.createSpaces(42) + "," + CR : "";
- // </cringe>
- codeSnippet += fieldMap.parseFieldMap(mbParamListGenerateMethod,
- mbMangledParamListGenerateMethod, 42, 4, this);
- }
-
- else if (token.compareTo("${mb_field_passed_parameter_list}") == 0)
- {
- // <cringe> The code generated by this is ugly... It puts a comma on a line by itself!
- // TODO: Find a more elegant solution here sometime...
- codeSnippet = fieldMap.size() > 0 ? Utils.createSpaces(42) + "," + CR : "";
- // </cringe>
- codeSnippet += fieldMap.parseFieldMap(mbPassedParamListGenerateMethod,
- mbMangledPassedParamListGenerateMethod, 42, 4, this);
- }
- else if (token.compareTo("${mb_field_body_initialize}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(mbBodyInitGenerateMethod,
- mbMangledBodyInitGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${mb_field_size}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(mbSizeGenerateMethod,
- mbBitSizeGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${mb_field_encode}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(mbEncodeGenerateMethod,
- mbBitEncodeGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${mb_field_decode}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(mbDecodeGenerateMethod,
- mbBitDecodeGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${mb_field_to_string}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(mbToStringGenerateMethod,
- mbBitToStringGenerateMethod, 8, 4, this);
- }
-
- // PropertyContentHeader classes
- else if (token.compareTo("${pch_field_list_size}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(pchSizeGenerateMethod,
- pchBitSizeGenerateMethod, 12, 4, this);
- }
- else if (token.compareTo("${pch_field_list_payload}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(pchEncodeGenerateMethod,
- pchBitEncodeGenerateMethod, 12, 4, this);
- }
- else if (token.compareTo("${pch_field_list_decode}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(pchDecodeGenerateMethod,
- pchBitDecodeGenerateMethod, 12, 4, this);
- }
- else if (token.compareTo("${pch_get_compact_property_flags}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(pchGetPropertyFlagsGenerateMethod,
- pchBitGetPropertyFlagsGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${pch_set_compact_property_flags}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMapOrdinally(pchSetPropertyFlagsGenerateMethod,
- pchBitSetPropertyFlagsGenerateMethod, 8, 4, this);
- }
- else if (token.compareTo("${pch_field_clear_methods}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(pchClearGenerateMethod,
- pchMangledClearGenerateMethod, 4, 4, this);
- }
- else if (token.compareTo("${pch_field_get_methods}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(pchGetGenerateMethod,
- pchMangledGetGenerateMethod, 4, 4, this);
- }
- else if (token.compareTo("${pch_field_set_methods}") == 0)
- {
- codeSnippet = fieldMap.parseFieldMap(pchSetGenerateMethod,
- pchMangledSetGenerateMethod, 4, 4, this);
- }
-
- else // Oops!
- {
- throw new AmqpTemplateException("Template token " + token + " unknown.");
- }
- sb.insert(listMarkerStartIndex, codeSnippet);
- }
-
- @Override
- protected void processConstantList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
- AmqpConstantSet constantSet)
- {
- String codeSnippet;
- int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
- String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
- int tokStart = tline.indexOf('$');
- String token = tline.substring(tokStart).trim();
- sb.delete(listMarkerStartIndex, lend);
-
- if (token.compareTo("${const_get_method}") == 0)
- {
- codeSnippet = generateConstantGetMethods(constantSet, 4, 4);
- }
-
- else // Oops!
- {
- throw new AmqpTemplateException("Template token " + token + " unknown.");
- }
-
- sb.insert(listMarkerStartIndex, codeSnippet);
- }
-
- // === Protected and private helper functions unique to Java implementation ===
-
- // Methods used for generation of code snippets called from the field map parsers
-
- // Common methods
-
- protected String generateFieldDeclaration(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- return Utils.createSpaces(indentSize) + "public " + codeType + " " + field.getName() +
- "; // AMQP version(s): " + versionSet + CR;
- }
-
- protected String generateMangledFieldDeclaration(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- StringBuffer sb = new StringBuffer();
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- String codeType = getGeneratedType(domainName, versionSet.first());
- sb.append(Utils.createSpaces(indentSize) + "public " + codeType + " " +
- field.getName() + "_" + (domainCntr++) + "; // AMQP Version(s): " + versionSet +
- CR);
- }
- return sb.toString();
- }
-
- protected String generateIndexInitializer(String mapName, AmqpOrdinalVersionMap indexMap, int indentSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
-
- Iterator<Integer> iItr = indexMap.keySet().iterator();
- while (iItr.hasNext())
- {
- int index = iItr.next();
- AmqpVersionSet versionSet = indexMap.get(index);
- Iterator<AmqpVersion> vItr = versionSet.iterator();
- while (vItr.hasNext())
- {
- AmqpVersion version = vItr.next();
- sb.append(indent + mapName + "( (byte) " + version.getMajor() + ", (byte) " + version.getMinor() + ", " + index + ");" + CR);
- }
- }
- return sb.toString();
- }
-
- protected String generateRegistry(AmqpModel model, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
-
- for (String className : model.getClassMap().keySet())
- {
- AmqpClass thisClass = model.getClassMap().get(className);
- for (String methodName : thisClass.getMethodMap().keySet())
- {
- AmqpMethod method = thisClass.getMethodMap().get(methodName);
- for (AmqpVersion version : model.getVersionSet())
- {
- // Find class and method index for this version (if it exists)
- try
- {
- int classIndex = findIndex(thisClass.getIndexMap(), version);
- int methodIndex = findIndex(method.getIndexMap(), version);
- sb.append(indent + "registerMethod(" + CR);
- sb.append(indent + tab + "(short)" + classIndex +
- ", (short)" + methodIndex + ", (byte)" + version.getMajor() +
- ", (byte)" + version.getMinor() + ", " + CR);
- sb.append(indent + tab + Utils.firstUpper(thisClass.getName()) +
- Utils.firstUpper(method.getName()) + "Body.getFactory());" + CR);
- }
- catch (Exception e)
- {
- } // Ignore
- }
- }
- }
- return sb.toString();
- }
-
- protected int findIndex(TreeMap<Integer, AmqpVersionSet> map, AmqpVersion version)
- {
- Iterator<Integer> iItr = map.keySet().iterator();
- while (iItr.hasNext())
- {
- int index = iItr.next();
- AmqpVersionSet versionSet = map.get(index);
- if (versionSet.contains(version))
- {
- return index;
- }
- }
- throw new IllegalArgumentException("Index not found");
- }
-
- // Methods for AmqpConstants class
-
-
- public String prepareConstantName(String constantName)
- {
- return upperCaseName(constantName);
- }
-
-
- protected String generateConstantGetMethods(AmqpConstantSet constantSet,
- int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
-
- for (AmqpConstant constant : constantSet.getContstants())
- {
-
- if (constant.isVersionConsistent(constantSet.getVersionSet()))
- {
- // return a constant
- String value = constant.firstKey();
- if (Utils.containsOnlyDigits(value))
- {
- sb.append(indent + "public static final int " + constant.getName() + " = " +
- constant.firstKey() + ";" + CR);
- }
- else if (Utils.containsOnlyDigitsAndDecimal(value))
- {
- sb.append(indent + "public static double " + constant.getName() + " = " +
- constant.firstKey() + "; " + CR);
- }
- else
- {
- sb.append(indent + "public static String " + constant.getName() + " = " +
- constant.firstKey() + "\"; " + CR);
-
- }
- sb.append(CR);
- }
- else
- {
- // Return version-specific constant
- sb.append(generateVersionDependentGet(constant, "String", "", "\"", "\"", indentSize, tabSize));
- sb.append(generateVersionDependentGet(constant, "int", "AsInt", "", "", indentSize, tabSize));
- sb.append(generateVersionDependentGet(constant, "double", "AsDouble", "(double)", "", indentSize, tabSize));
- sb.append(CR);
- }
- }
- return sb.toString();
- }
-
- protected String generateVersionDependentGet(AmqpConstant constant,
- String methodReturnType, String methodNameSuffix, String returnPrefix, String returnPostfix,
- int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "public static " + methodReturnType + " " + constant.getName() +
- methodNameSuffix + "(byte major, byte minor) throws AMQProtocolVersionException" + CR);
- sb.append(indent + "{" + CR);
- boolean first = true;
- Iterator<String> sItr = constant.keySet().iterator();
- while (sItr.hasNext())
- {
- String value = sItr.next();
- AmqpVersionSet versionSet = constant.get(value);
- sb.append(indent + tab + (first ? "" : "else ") + "if (" + generateVersionCheck(versionSet) +
- ")" + CR);
- sb.append(indent + tab + "{" + CR);
- if (methodReturnType.compareTo("int") == 0 && !Utils.containsOnlyDigits(value))
- {
- sb.append(generateConstantDeclarationException(constant.getName(), methodReturnType,
- indentSize + (2 * tabSize), tabSize));
- }
- else if (methodReturnType.compareTo("double") == 0 && !Utils.containsOnlyDigitsAndDecimal(value))
- {
- sb.append(generateConstantDeclarationException(constant.getName(), methodReturnType,
- indentSize + (2 * tabSize), tabSize));
- }
- else
- {
- sb.append(indent + tab + tab + "return " + returnPrefix + value + returnPostfix + ";" + CR);
- }
- sb.append(indent + tab + "}" + CR);
- first = false;
- }
- sb.append(indent + tab + "else" + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "throw new AMQProtocolVersionException(\"Constant \\\"" +
- constant.getName() + "\\\" \" +" + CR);
- sb.append(indent + tab + tab + tab +
- "\"is undefined for AMQP version \" + major + \"-\" + minor + \".\");" + CR);
- sb.append(indent + tab + "}" + CR);
- sb.append(indent + "}" + CR);
- return sb.toString();
- }
-
- protected String generateConstantDeclarationException(String name, String methodReturnType,
- int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "throw new AMQProtocolVersionException(\"Constant \\\"" +
- name + "\\\" \" +" + CR);
- sb.append(indent + tab + "\"cannot be converted to type " + methodReturnType +
- " for AMQP version \" + major + \"-\" + minor + \".\");" + CR);
- return sb.toString();
- }
-
- // Methods for MessageBody classes
- protected String generateMbGetMethod(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- return Utils.createSpaces(indentSize) + "public " + codeType + " get" +
- Utils.firstUpper(field.getName()) + "() { return " + field.getName() + "; }" +
- CR;
- }
-
- protected String generateMbMangledGetMethod(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer(CR);
- sb.append(indent + "public <T> T get" + Utils.firstUpper(field.getName()) +
- "(Class<T> classObj) throws AMQProtocolVersionException" + CR);
- sb.append(indent + "{" + CR);
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- String codeType = getGeneratedType(domainName, versionSet.first());
- sb.append(indent + tab + "if (classObj.equals(" + codeType +
- ".class)) // AMQP Version(s): " + versionSet + CR);
- sb.append(indent + tab + tab + "return (T)(Object)" + field.getName() + "_" +
- (domainCntr++) + ";" + CR);
- }
- sb.append(indent + tab +
- "throw new AMQProtocolVersionException(\"None of the AMQP versions defines \" +" +
- CR + " \"field \\\"" + field.getName() +
- "\\\" as domain \\\"\" + classObj.getName() + \"\\\".\");" + CR);
- sb.append(indent + "}" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generateMbParamList(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- return Utils.createSpaces(indentSize) + codeType + " " + field.getName() +
- (nextFlag ? "," : "") + " // AMQP version(s): " + versionSet + CR;
- }
-
-
- protected String generateMbPassedParamList(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- return Utils.createSpaces(indentSize) + field.getName() +
- (nextFlag ? "," : "") + " // AMQP version(s): " + versionSet + CR;
- }
-
-
- protected String generateMbMangledParamList(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- StringBuffer sb = new StringBuffer();
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- String codeType = getGeneratedType(domainName, versionSet.first());
- sb.append(Utils.createSpaces(indentSize) + codeType + " " + field.getName() + "_" +
- (domainCntr++) + (nextFlag ? "," : "") + " // AMQP version(s): " +
- versionSet + CR);
- }
- return sb.toString();
- }
-
- protected String generateMbMangledPassedParamList(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- StringBuffer sb = new StringBuffer();
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- sb.append(Utils.createSpaces(indentSize) + field.getName() + "_" +
- (domainCntr++) + (nextFlag ? "," : "") + " // AMQP version(s): " +
- versionSet + CR);
- }
- return sb.toString();
- }
-
-
- protected String generateMbBodyInit(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- return Utils.createSpaces(indentSize) + "this." + field.getName() + " = " + field.getName() +
- ";" + CR;
- }
-
- protected String generateMbMangledBodyInit(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- StringBuffer sb = new StringBuffer();
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- dItr.next();
- sb.append(Utils.createSpaces(indentSize) + "this." + field.getName() + "_" + domainCntr +
- " = " + field.getName() + "_" + (domainCntr++) + ";" + CR);
- }
- return sb.toString();
- }
-
- protected String generateMbFieldSize(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- StringBuffer sb = new StringBuffer();
- sb.append(Utils.createSpaces(indentSize) + "size += " +
- typeMap.get(domainType).size.replaceAll("#", fieldName) +
- "; // " + fieldName + ": " + domainType + CR);
- return sb.toString();
- }
-
- protected String generateMbBitArrayFieldSize(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- StringBuffer sb = new StringBuffer();
- int numBytes = ((bitFieldList.size() - 1) / 8) + 1;
- String comment = bitFieldList.size() == 1 ?
- bitFieldList.get(0) + ": bit" :
- "Combinded bits: " + bitFieldList;
- sb.append(Utils.createSpaces(indentSize) + "size += " +
- typeMap.get("bit").size.replaceAll("~", String.valueOf(numBytes)) +
- "; // " + comment + CR);
- return sb.toString();
- }
-
- protected String generateMbFieldEncode(String domain, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- StringBuffer sb = new StringBuffer();
- sb.append(Utils.createSpaces(indentSize) +
- typeMap.get(domain).encodeExpression.replaceAll("#", fieldName) +
- "; // " + fieldName + ": " + domain + CR);
- return sb.toString();
- }
-
- protected String generateMbBitFieldEncode(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
-
- StringBuilder sb = new StringBuilder();
- int i = 0;
- while (i < bitFieldList.size())
- {
-
- StringBuilder line = new StringBuilder();
-
- for (int j = 0; i < bitFieldList.size() && j < 8; i++, j++)
- {
- if (j != 0)
- {
- line.append(", ");
- }
- line.append(bitFieldList.get(i));
- }
-
- sb.append(indent +
- typeMap.get("bit").encodeExpression.replaceAll("#", line.toString()) + ";" + CR);
- }
- return sb.toString();
- }
-
- protected String generateMbFieldDecode(String domain, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- StringBuffer sb = new StringBuffer();
- sb.append(Utils.createSpaces(indentSize) +
- typeMap.get(domain).decodeExpression.replaceAll("#", fieldName) +
- "; // " + fieldName + ": " + domain + CR);
- return sb.toString();
- }
-
- protected String generateMbBitFieldDecode(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
-
- StringBuilder sb = new StringBuilder(indent);
- sb.append("byte packedValue;");
- sb.append(CR);
-
- // RG HERE!
-
- int i = 0;
- while (i < bitFieldList.size())
- {
- sb.append(indent + "packedValue = EncodingUtils.readByte(buffer);" + CR);
-
- for (int j = 0; i < bitFieldList.size() && j < 8; i++, j++)
- {
- sb.append(indent + bitFieldList.get(i) + " = ( packedValue & (byte) (1 << " + j + ") ) != 0;" + CR);
- }
- }
- return sb.toString();
- }
-
- protected String generateMbFieldToString(String domain, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- StringBuffer sb = new StringBuffer();
- sb.append(Utils.createSpaces(indentSize) +
- "buf.append(\" " + fieldName + ": \" + " + fieldName + ");" + CR);
- return sb.toString();
- }
-
- protected String generateMbBitFieldToString(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < bitFieldList.size(); i++)
- {
- String bitFieldName = bitFieldList.get(i);
- sb.append(indent + "buf.append(\" " + bitFieldName + ": \" + " + bitFieldName +
- ");" + CR);
- }
- return sb.toString();
- }
-
- // Methods for PropertyContentHeader classes
-
- protected String generatePchClearMethod(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- // This is one case where the ordinal info is the only significant factor,
- // the domain info plays no part. Defer to the mangled version; the code would be
- // identical anyway...
- return generatePchMangledClearMethod(field, indentSize, tabSize, nextFlag);
- }
-
- protected String generatePchMangledClearMethod(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "public void clear" + Utils.firstUpper(field.getName()) +
- "()" + CR);
- sb.append(indent + "{" + CR);
-
- // If there is more than one ordinal for this field or the ordinal does not
- // apply to all known versions, then we need to generate version checks so
- // we know which fieldProperty to clear.
- if (field.getOrdinalMap().size() == 1 &&
- field.getOrdinalMap().get(field.getOrdinalMap().firstKey()).size() == field.getVersionSet().size())
- {
- int ordinal = field.getOrdinalMap().firstKey();
- sb.append(indent + tab + "clearEncodedForm();" + CR);
- sb.append(indent + tab + "propertyFlags[" + ordinal + "] = false;" + CR);
- }
- else
- {
- Iterator<Integer> oItr = field.getOrdinalMap().keySet().iterator();
- while (oItr.hasNext())
- {
- int ordinal = oItr.next();
- AmqpVersionSet versionSet = field.getOrdinalMap().get(ordinal);
- sb.append(indent + tab);
- if (ordinal != field.getOrdinalMap().firstKey())
- {
- sb.append("else ");
- }
- sb.append("if (");
- sb.append(generateVersionCheck(versionSet));
- sb.append(")" + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "clearEncodedForm();" + CR);
- sb.append(indent + tab + tab + "propertyFlags[" + ordinal + "] = false;" + CR);
- sb.append(indent + tab + "}" + CR);
- }
- }
- sb.append(indent + "}" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchGetMethod(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer(indent + "public " + codeType + " get" +
- Utils.firstUpper(field.getName()) + "()" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + "decodeIfNecessary();" + CR);
- sb.append(indent + tab + "return " + field.getName() + ";" + CR);
- sb.append(indent + "}" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchMangledGetMethod(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer(indent + "public <T> T get" +
- Utils.firstUpper(field.getName()) +
- "(Class<T> classObj) throws AMQProtocolVersionException" + CR);
- sb.append(indent + "{" + CR);
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- String codeType = getGeneratedType(domainName, versionSet.first());
- sb.append(indent + tab + "if (classObj.equals(" + codeType +
- ".class)) // AMQP Version(s): " + versionSet + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "decodeIfNecessary();" + CR);
- sb.append(indent + tab + tab + "return (T)(Object)" + field.getName() + "_" +
- (domainCntr++) + ";" + CR);
- sb.append(indent + tab + "}" + CR);
- }
- sb.append(indent + tab +
- "throw new AMQProtocolVersionException(\"None of the AMQP versions defines \" +" +
- CR + " \"field \\\"" + field.getName() +
- "\\\" as domain \\\"\" + classObj.getName() + \"\\\".\");" + CR);
- sb.append(indent + "}" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchSetMethod(String codeType, AmqpField field,
- AmqpVersionSet versionSet, int indentSize, int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "public void set" + Utils.firstUpper(field.getName()) +
- "(" + codeType + " " + field.getName() + ")" + CR);
- sb.append(indent + "{" + CR);
-
- // If there is more than one ordinal for this field or the ordinal does not
- // apply to all known versions, then we need to generate version checks so
- // we know which fieldProperty to clear.
- if (field.getOrdinalMap().size() == 1 &&
- field.getOrdinalMap().get(field.getOrdinalMap().firstKey()).size() == field.getVersionSet().size())
- {
- int ordinal = field.getOrdinalMap().firstKey();
- sb.append(indent + tab + "clearEncodedForm();" + CR);
- sb.append(indent + tab + "propertyFlags[" + ordinal + "] = true;" + CR);
- sb.append(indent + tab + "this." + field.getName() + " = " + field.getName() + ";" + CR);
- }
- else
- {
- Iterator<Integer> oItr = field.getOrdinalMap().keySet().iterator();
- while (oItr.hasNext())
- {
- int ordinal = oItr.next();
- AmqpVersionSet oVersionSet = field.getOrdinalMap().get(ordinal);
- sb.append(indent + tab);
- if (ordinal != field.getOrdinalMap().firstKey())
- {
- sb.append("else ");
- }
- sb.append("if (");
- sb.append(generateVersionCheck(oVersionSet));
- sb.append(")" + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "clearEncodedForm();" + CR);
- sb.append(indent + tab + tab + "propertyFlags[" + ordinal + "] = true;" + CR);
- sb.append(indent + tab + tab + "this." + field.getName() + " = " + field.getName() + ";" + CR);
- sb.append(indent + tab + "}" + CR);
- }
- }
- sb.append(indent + "}" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchMangledSetMethod(AmqpField field, int indentSize,
- int tabSize, boolean nextFlag)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
-
- Iterator<String> dItr = field.getDomainMap().keySet().iterator();
- int domainCntr = 0;
- while (dItr.hasNext())
- {
- String domainName = dItr.next();
- AmqpVersionSet versionSet = field.getDomainMap().get(domainName);
- String codeType = getGeneratedType(domainName, versionSet.first());
-
- // Find ordinal with matching version
- AmqpVersionSet commonVersionSet = new AmqpVersionSet();
- Iterator<Integer> oItr = field.getOrdinalMap().keySet().iterator();
- while (oItr.hasNext())
- {
- int ordinal = oItr.next();
- AmqpVersionSet oVersionSet = field.getOrdinalMap().get(ordinal);
- Iterator<AmqpVersion> vItr = oVersionSet.iterator();
- boolean first = true;
- while (vItr.hasNext())
- {
- AmqpVersion thisVersion = vItr.next();
- if (versionSet.contains(thisVersion))
- {
- commonVersionSet.add(thisVersion);
- }
- }
- if (!commonVersionSet.isEmpty())
- {
- sb.append(indent + "public void set" + Utils.firstUpper(field.getName()) +
- "(" + codeType + " " + field.getName() + ")" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab);
- if (!first)
- {
- sb.append("else ");
- }
- sb.append("if (");
- sb.append(generateVersionCheck(commonVersionSet));
- sb.append(")" + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "clearEncodedForm();" + CR);
- sb.append(indent + tab + tab + "propertyFlags[" + ordinal + "] = true;" + CR);
- sb.append(indent + tab + tab + "this." + field.getName() + "_" + (domainCntr++) +
- " = " + field.getName() + ";" + CR);
- sb.append(indent + tab + "}" + CR);
- sb.append(indent + "}" + CR);
- sb.append(CR);
- first = false;
- }
- }
- }
- return sb.toString();
- }
-
- protected String generatePchFieldSize(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer(indent + "if (propertyFlags[" + ordinal + "]) // " +
- fieldName + ": " + domainType + CR);
- sb.append(indent + Utils.createSpaces(tabSize) + "size += " +
- typeMap.get(domainType).size.replaceAll("#", fieldName) + ";" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchBitArrayFieldSize(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- String comment = bitFieldList.size() == 1 ?
- bitFieldList.get(0) + ": bit" :
- "Combinded bits: " + bitFieldList;
- StringBuffer sb = new StringBuffer();
-
- if (bitFieldList.size() == 1) // single bit
- {
- sb.append(indent + "if (propertyFlags[" + (ordinal - 1) + "]) // " + comment + CR);
- sb.append(indent + tab + "size += " +
- typeMap.get("bit").size.replaceAll("~", "1") + ";" + CR);
- }
- else // multiple bits - up to 8 are combined into one byte
- {
- String bitCntrName = "bitCntr_" + ordinal;
- int startOrdinal = ordinal - bitFieldList.size();
- sb.append(indent + "// " + comment + CR);
- sb.append(indent + "int " + bitCntrName + " = 0;" + CR);
- sb.append(indent + "for (int i=" + startOrdinal + "; i<" + ordinal + "; i++)" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + "if (propertyFlags[i])" + CR);
- sb.append(indent + tab + tab + bitCntrName + "++;" + CR);
- sb.append(indent + "}" + CR);
- sb.append(indent + "size += " +
- typeMap.get("bit").size.replaceAll("~", bitCntrName +
- " > 0 ? ((" + bitCntrName + " - 1) / 8) + 1 : 0") + ";" + CR);
- }
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchFieldEncode(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "if (propertyFlags[" + ordinal + "]) // " + fieldName + ": " +
- domainType + CR);
- sb.append(indent + Utils.createSpaces(tabSize) +
- typeMap.get(domainType).encodeExpression.replaceAll("#", fieldName) + ";" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchBitFieldEncode(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- String comment = bitFieldList.size() == 1 ?
- bitFieldList.get(0) + ": bit" :
- "Combinded bits: " + bitFieldList;
- StringBuffer sb = new StringBuffer();
-
- if (bitFieldList.size() == 1) // single bit
- {
- sb.append(indent + "if (propertyFlags[" + (ordinal - 1) + "]) // " +
- bitFieldList.get(0) + ": bit" + CR);
- sb.append(indent + tab + typeMap.get("bit").encodeExpression.replaceAll("#",
- "new boolean[] {" + bitFieldList.get(0) + "}") + ";" + CR);
- }
- else // multiple bits - up to 8 are combined into one byte
- {
- int startOrdinal = ordinal - bitFieldList.size();
- String bitCntrName = "bitCntr" + startOrdinal;
- sb.append(indent + "// " + comment + CR);
- sb.append(indent + "int " + bitCntrName + " = 0;" + CR);
- sb.append(indent + "for (int i=" + startOrdinal + "; i<=" + (ordinal - 1) + "; i++)" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + "if (propertyFlags[i])" + CR);
- sb.append(indent + tab + tab + bitCntrName + "++;" + CR);
- sb.append(indent + "}" + CR);
- sb.append(indent + "if (" + bitCntrName + " > 0) // Are any of the property bits set?" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + "boolean[] fullBitArray = new boolean[] { ");
- for (int i = 0; i < bitFieldList.size(); i++)
- {
- if (i != 0)
- {
- sb.append(", ");
- }
- sb.append(bitFieldList.get(i));
- }
- sb.append(" };" + CR);
- sb.append(indent + tab + "boolean[] flaggedBitArray = new boolean[" + bitCntrName +
- "];" + CR);
- sb.append(indent + tab + bitCntrName + " = 0;" + CR);
- sb.append(indent + tab + "for (int i=" + startOrdinal + "; i<=" + (ordinal - 1) +
- "; i++)" + CR);
- sb.append(indent + tab + "{" + CR);
- sb.append(indent + tab + tab + "if (propertyFlags[i])" + CR);
- sb.append(indent + tab + tab + tab + "flaggedBitArray[" + bitCntrName +
- "++] = fullBitArray[i];" + CR);
- sb.append(indent + tab + "}" + CR);
- sb.append(indent + tab + typeMap.get("bit").encodeExpression.replaceAll("#",
- "flaggedBitArray") + ";" + CR);
- sb.append(indent + "}" + CR);
- }
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchFieldDecode(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
- sb.append(indent + "if (propertyFlags[" + ordinal + "]) // " + fieldName + ": " +
- domainType + CR);
- sb.append(indent + Utils.createSpaces(tabSize) +
- typeMap.get(domainType).decodeExpression.replaceAll("#", fieldName) + ";" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchBitFieldDecode(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- String comment = bitFieldList.size() == 1 ?
- bitFieldList.get(0) + ": bit" :
- "Combinded bits: " + bitFieldList;
- StringBuffer sb = new StringBuffer();
-
- if (bitFieldList.size() == 1) // single bit
- {
- sb.append(indent + "if (propertyFlags[" + (ordinal - 1) + "]) // " +
- bitFieldList.get(0) + ": bit" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + typeMap.get("bit").decodeExpression.replaceAll("#",
- "boolean[] flaggedBitArray") + ";" + CR);
- sb.append(indent + tab + bitFieldList.get(0) + " = flaggedBitArray[0];" + CR);
- sb.append(indent + "}" + CR);
- }
- else // multiple bits - up to 8 are combined into one byte
- {
- int startOrdinal = ordinal - bitFieldList.size();
- String bitCntr = "bitCntr" + startOrdinal;
- sb.append(indent + "// " + comment + CR);
- sb.append(indent + "int " + bitCntr + " = 0;" + CR);
- sb.append(indent + "for (int i=" + startOrdinal + "; i<=" + (ordinal - 1) + "; i++)" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + "if (propertyFlags[i])" + CR);
- sb.append(indent + tab + tab + bitCntr + "++;" + CR);
- sb.append(indent + "}" + CR);
- sb.append(indent + "if (" + bitCntr + " > 0) // Are any of the property bits set?" + CR);
- sb.append(indent + "{" + CR);
- sb.append(indent + tab + typeMap.get("bit").decodeExpression.replaceAll("#",
- "boolean[] flaggedBitArray") + ";" + CR);
- sb.append(indent + tab + bitCntr + " = 0;" + CR);
- for (int i = 0; i < bitFieldList.size(); i++)
- {
- sb.append(indent + tab + "if (propertyFlags[" + (startOrdinal + i) + "])" + CR);
- sb.append(indent + tab + tab + bitFieldList.get(i) + " = flaggedBitArray[" +
- bitCntr + "++];" + CR);
- }
- sb.append(indent + "}" + CR);
- }
-
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchGetPropertyFlags(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- int word = ordinal / 15;
- int bit = 15 - (ordinal % 15);
- sb.append(indent + "if (propertyFlags[" + ordinal + "]) // " + fieldName + ": " +
- domainType + CR);
- sb.append(indent + tab + "compactPropertyFlags[" + word + "] |= (1 << " +
- bit + ");" + CR);
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchBitGetPropertyFlags(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- int startOrdinal = ordinal - bitFieldList.size();
-
- for (int i = 0; i < bitFieldList.size(); i++)
- {
- int thisOrdinal = startOrdinal + i;
- int word = thisOrdinal / 15;
- int bit = 15 - (thisOrdinal % 15);
- sb.append(indent + "if (propertyFlags[" + thisOrdinal + "])" + CR);
- sb.append(indent + tab + "compactPropertyFlags[" + word +
- "] |= (1 << " + bit + ");" + CR);
- }
-
- sb.append(CR);
- return sb.toString();
- }
-
- protected String generatePchSetPropertyFlags(String domainType, String fieldName,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
- int word = ordinal / 15;
- int bit = 15 - (ordinal % 15);
- sb.append(indent + "propertyFlags[" + ordinal + "] = (compactPropertyFlags[" +
- word + "] & (1 << " + bit + ")) > 0;" + CR);
- return sb.toString();
- }
-
- protected String generatePchBitSetPropertyFlags(List<String> bitFieldList,
- int ordinal, int indentSize, int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer();
- int startOrdinal = ordinal - bitFieldList.size();
-
- for (int i = 0; i < bitFieldList.size(); i++)
- {
- int thisOrdinal = startOrdinal + i;
- int word = thisOrdinal / 15;
- int bit = 15 - (thisOrdinal % 15);
- sb.append(indent + "propertyFlags[" + thisOrdinal + "] = (compactPropertyFlags[" +
- word + "] & (1 << " + bit + ")) > 0;" + CR);
- }
- return sb.toString();
- }
-
- private String generatePchPropertyFlagsDeclare()
- {
- return "private boolean[] propertyFlags;";
- }
-
- private String generatePchPropertyFlagsInitializer(int totNumFields)
- {
- return "propertyFlags = new boolean[" + totNumFields + "];";
- }
-
- private String generatePchCompactPropertyFlagsInitializer(AmqpClass thisClass, int indentSize,
- int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- Iterator<AmqpVersion> vItr = thisClass.getVersionSet().iterator();
- while (vItr.hasNext())
- {
- AmqpVersion version = vItr.next();
- int numBytes = ((thisClass.getFieldMap().getNumFields(version) - 1) / 15) + 1;
-
- sb.append(indent);
- if (!version.equals(thisClass.getVersionSet().first()))
- {
- sb.append("else ");
- }
- sb.append("if ( major == " + version.getMajor() + " && minor == " +
- version.getMinor() + " )" + CR);
- sb.append(indent + tab + "compactPropertyFlags = new int[] { ");
- for (int i = 0; i < numBytes; i++)
- {
- if (i != 0)
- {
- sb.append(", ");
- }
- sb.append(i < numBytes - 1 ? "1" : "0"); // Set the "continue" flag where required
- }
- sb.append(" };" + CR);
- }
- return sb.toString();
- }
-
- private String generatePchCompactPropertyFlagsCheck(AmqpClass thisClass, int indentSize,
- int tabSize)
- {
- String indent = Utils.createSpaces(indentSize);
- String tab = Utils.createSpaces(tabSize);
- StringBuffer sb = new StringBuffer();
- Iterator<AmqpVersion> vItr = thisClass.getVersionSet().iterator();
- while (vItr.hasNext())
- {
- AmqpVersion version = vItr.next();
- int numFields = thisClass.getFieldMap().getNumFields(version);
- int numBytes = ((numFields - 1) / 15) + 1;
-
- sb.append(indent);
- if (!version.equals(thisClass.getVersionSet().first()))
- {
- sb.append("else ");
- }
- sb.append("if ( major == " + version.getMajor() + " && minor == " +
- version.getMinor() + " && compactPropertyFlags.length != " + numBytes + " )" + CR);
- sb.append(indent + tab +
- "throw new AMQProtocolVersionException(\"Property flag array size mismatch:\" +" + CR);
- sb.append(indent + tab + tab + "\"(Size found: \" + compactPropertyFlags.length +" + CR);
- sb.append(indent + tab + tab + "\") Version " + version + " has " + numFields +
- " fields which requires an int array of size " + numBytes + ".\");" + CR);
- }
- return sb.toString();
- }
-
- private String generateVersionCheck(AmqpVersionSet v)
- {
- StringBuffer sb = new StringBuffer();
- AmqpVersion[] versionArray = new AmqpVersion[v.size()];
- v.toArray(versionArray);
- for (int i = 0; i < versionArray.length; i++)
- {
- if (i != 0)
- {
- sb.append(" || ");
- }
- if (versionArray.length > 1)
- {
- sb.append("(");
- }
- sb.append("major == (byte)" + versionArray[i].getMajor() + " && minor == (byte)" +
- versionArray[i].getMinor());
- if (versionArray.length > 1)
- {
- sb.append(")");
- }
- }
- return sb.toString();
- }
-
- private String camelCaseName(String name, boolean upperFirstFlag)
- {
- StringBuffer ccn = new StringBuffer();
- String[] toks = name.split("[-_.\\ ]");
- for (int i = 0; i < toks.length; i++)
- {
- StringBuffer b = new StringBuffer(toks[i]);
- if (upperFirstFlag || i > 0)
- {
- b.setCharAt(0, Character.toUpperCase(toks[i].charAt(0)));
- }
- ccn.append(b);
- }
- return ccn.toString();
- }
-
-
- private String upperCaseName(String name)
- {
- StringBuffer ccn = new StringBuffer();
- String[] toks = name.split("[-_.\\ ]");
- for (int i = 0; i < toks.length; i++)
- {
- if (i != 0)
- {
- ccn.append('_');
- }
- ccn.append(toks[i].toUpperCase());
-
-
- }
- return ccn.toString();
- }
-
-
- public static Factory<JavaGenerator> _factoryInstance = new Factory<JavaGenerator>()
- {
-
- public JavaGenerator newInstance()
- {
- return new JavaGenerator();
- }
- };
-
- public static Factory<JavaGenerator> getFactory()
- {
- return _factoryInstance;
- }
-
-
- void processModelTemplate(NamedTemplate template, AmqpVersion version)
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- void processClassTemplate(NamedTemplate template, AmqpClass amqpClass, AmqpVersion version)
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- void processMethodTemplate(NamedTemplate template, AmqpClass amqpClass, AmqpMethod amqpMethod, AmqpVersion version)
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- void processFieldTemplate(NamedTemplate template, AmqpClass amqpClass, AmqpMethod amqpMethod, AmqpField amqpField, AmqpVersion version)
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
-
-}