Search in sources :

Example 16 with XClass

use of org.infinispan.protostream.annotations.impl.types.XClass in project protostream by infinispan.

the class ProtoMessageTypeMetadata method getCollectionImplementation.

private XClass getCollectionImplementation(XClass clazz, XClass fieldType, XClass configuredCollection, String fieldName, boolean isRepeated) {
    XClass collectionImplementation;
    XClass javaUtilCollectionClass = typeFactory.fromClass(Collection.class);
    if (isRepeated && !fieldType.isArray()) {
        collectionImplementation = configuredCollection;
        if (collectionImplementation == javaUtilCollectionClass) {
            // default
            if (fieldType == typeFactory.fromClass(Set.class)) {
                collectionImplementation = typeFactory.fromClass(HashSet.class);
            } else if (fieldType == typeFactory.fromClass(List.class) || fieldType == typeFactory.fromClass(Collection.class)) {
                collectionImplementation = typeFactory.fromClass(ArrayList.class);
            } else {
                collectionImplementation = fieldType;
            }
        }
        if (!collectionImplementation.isAssignableTo(javaUtilCollectionClass)) {
            throw new ProtoSchemaBuilderException("The collection class of repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " must implement java.util.Collection.");
        }
        if (collectionImplementation.isAbstract()) {
            throw new ProtoSchemaBuilderException("The collection class (" + collectionImplementation.getCanonicalName() + ") of repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " must not be abstract. Please specify an appropriate class in collectionImplementation member.");
        }
        XConstructor ctor = collectionImplementation.getDeclaredConstructor();
        if (ctor == null || ctor.isPrivate()) {
            throw new ProtoSchemaBuilderException("The collection class ('" + collectionImplementation.getCanonicalName() + "') of repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " must have a public no-argument constructor.");
        }
        if (!collectionImplementation.isAssignableTo(fieldType)) {
            throw new ProtoSchemaBuilderException("The collection implementation class ('" + collectionImplementation.getCanonicalName() + "') of repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " is not assignable to this field's type.");
        }
    } else {
        if (configuredCollection != javaUtilCollectionClass) {
            throw new ProtoSchemaBuilderException("Specifying the collection implementation class is only allowed for collection (repeated) fields: '" + fieldName + "' of " + clazz.getCanonicalName());
        }
        collectionImplementation = null;
    }
    return collectionImplementation;
}
Also used : ProtoUnknownFieldSet(org.infinispan.protostream.annotations.ProtoUnknownFieldSet) HashSet(java.util.HashSet) Set(java.util.Set) ProtoSchemaBuilderException(org.infinispan.protostream.annotations.ProtoSchemaBuilderException) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) XClass(org.infinispan.protostream.annotations.impl.types.XClass) HashSet(java.util.HashSet) XConstructor(org.infinispan.protostream.annotations.impl.types.XConstructor)

Example 17 with XClass

use of org.infinispan.protostream.annotations.impl.types.XClass in project protostream by infinispan.

the class ProtoMessageTypeMetadata method discoverFields.

private void discoverFields(XClass clazz, Set<XClass> examinedClasses) {
    if (!examinedClasses.add(clazz)) {
        // avoid re-examining classes due to multiple interface inheritance
        return;
    }
    if (clazz.getSuperclass() != null) {
        discoverFields(clazz.getSuperclass(), examinedClasses);
    }
    for (XClass i : clazz.getInterfaces()) {
        discoverFields(i, examinedClasses);
    }
    for (XField field : clazz.getDeclaredFields()) {
        if (field.getAnnotation(ProtoUnknownFieldSet.class) != null) {
            if (isAdapter) {
                throw new ProtoSchemaBuilderException("No ProtoStream annotations should be present on fields when @ProtoAdapter is present on a class : " + clazz.getCanonicalName() + '.' + field);
            }
            if (unknownFieldSetField != null || unknownFieldSetGetter != null || unknownFieldSetSetter != null) {
                throw new ProtoSchemaBuilderException("The @ProtoUnknownFieldSet annotation should not occur more than once in a class and its superclasses and superinterfaces : " + clazz.getCanonicalName() + '.' + field);
            }
            unknownFieldSetField = field;
        } else {
            ProtoField annotation = field.getAnnotation(ProtoField.class);
            if (annotation != null) {
                if (isAdapter) {
                    throw new ProtoSchemaBuilderException("No ProtoStream annotations should be present on fields when @ProtoAdapter is present on a class : " + clazz.getCanonicalName() + '.' + field);
                }
                if (field.isStatic()) {
                    throw new ProtoSchemaBuilderException("Static fields cannot be @ProtoField annotated: " + clazz.getCanonicalName() + '.' + field);
                }
                if (factory == null && field.isFinal()) {
                    // todo [anistor] maybe allow this
                    throw new ProtoSchemaBuilderException("Final fields cannot be @ProtoField annotated: " + clazz.getCanonicalName() + '.' + field);
                }
                if (field.isPrivate()) {
                    throw new ProtoSchemaBuilderException("Private fields cannot be @ProtoField annotated: " + clazz.getCanonicalName() + '.' + field);
                }
                int number = getNumber(annotation, field);
                String fieldName = annotation.name();
                if (fieldName.isEmpty()) {
                    fieldName = field.getName();
                }
                Type protobufType = annotation.type();
                if (field.getType() == typeFactory.fromClass(byte[].class) && protobufType == Type.MESSAGE) {
                    // MESSAGE is the default and stands for 'undefined', we can override it with a better default
                    protobufType = Type.BYTES;
                }
                boolean isArray = isArray(field.getType(), protobufType);
                boolean isRepeated = isRepeated(field.getType(), protobufType);
                boolean isRequired = annotation.required();
                if (isRepeated && isRequired) {
                    throw new ProtoSchemaBuilderException("Repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " cannot be marked required.");
                }
                XClass javaType = getJavaTypeFromAnnotation(annotation);
                if (javaType == typeFactory.fromClass(void.class)) {
                    javaType = isRepeated ? field.determineRepeatedElementType() : field.getType();
                }
                if (javaType == typeFactory.fromClass(byte[].class) && protobufType == Type.MESSAGE) {
                    // MESSAGE is the default and stands for 'undefined', we can override it with a better default
                    protobufType = Type.BYTES;
                }
                if (!javaType.isArray() && !javaType.isPrimitive() && javaType.isAbstract() && !javaType.isEnum()) {
                    throw new ProtoSchemaBuilderException("The type " + javaType.getCanonicalName() + " of field '" + fieldName + "' of " + clazz.getCanonicalName() + " should not be abstract.");
                }
                protobufType = getProtobufType(javaType, protobufType);
                Object defaultValue = getDefaultValue(clazz, fieldName, javaType, protobufType, annotation.defaultValue());
                if (!isRequired && !isRepeated && javaType.isPrimitive() && defaultValue == null) {
                    throw new ProtoSchemaBuilderException("Primitive field '" + fieldName + "' of " + clazz.getCanonicalName() + " is not nullable so it should be either marked required or should have a default value.");
                }
                XClass collectionImplementation = getCollectionImplementation(clazz, field.getType(), getCollectionImplementationFromAnnotation(annotation), fieldName, isRepeated);
                if (isArray) {
                    collectionImplementation = typeFactory.fromClass(ArrayList.class);
                }
                ProtoTypeMetadata protoTypeMetadata = null;
                if (protobufType.getJavaType() == JavaType.ENUM || protobufType.getJavaType() == JavaType.MESSAGE) {
                    protoTypeMetadata = protoSchemaGenerator.scanAnnotations(javaType);
                }
                ProtoFieldMetadata fieldMetadata = new ProtoFieldMetadata(number, fieldName, javaType, collectionImplementation, protobufType, protoTypeMetadata, isRequired, isRepeated, isArray, defaultValue, field);
                ProtoFieldMetadata existing = fieldsByNumber.get(number);
                if (existing != null) {
                    throw new ProtoSchemaBuilderException("Duplicate field number definition. Found two field definitions with number " + number + ": in " + fieldMetadata.getLocation() + " and in " + existing.getLocation());
                }
                existing = fieldsByName.get(fieldMetadata.getName());
                if (existing != null) {
                    throw new ProtoSchemaBuilderException("Duplicate field name definition. Found two field definitions with name '" + fieldMetadata.getName() + "': in " + fieldMetadata.getLocation() + " and in " + existing.getLocation());
                }
                checkReserved(fieldMetadata);
                fieldsByNumber.put(fieldMetadata.getNumber(), fieldMetadata);
                fieldsByName.put(fieldName, fieldMetadata);
            }
        }
    }
    for (XMethod method : clazz.getDeclaredMethods()) {
        if (method.getAnnotation(ProtoUnknownFieldSet.class) != null) {
            if (unknownFieldSetField != null || unknownFieldSetGetter != null || unknownFieldSetSetter != null) {
                throw new ProtoSchemaBuilderException("The @ProtoUnknownFieldSet annotation should not occur more than once in a class and its superclasses and superinterfaces : " + method);
            }
            String propertyName;
            if (method.getReturnType() == typeFactory.fromClass(void.class)) {
                // this method is expected to be a setter
                if (method.getName().startsWith("set") && method.getName().length() > 3) {
                    propertyName = Character.toLowerCase(method.getName().charAt(3)) + method.getName().substring(4);
                } else {
                    throw new ProtoSchemaBuilderException("Illegal setter method signature: " + method);
                }
                if (isAdapter && method.getParameterTypes().length != 2 || !isAdapter && method.getParameterTypes().length != 1) {
                    throw new ProtoSchemaBuilderException("Illegal setter method signature: " + method);
                }
                // TODO [anistor] also check setter args
                unknownFieldSetSetter = method;
                unknownFieldSetGetter = findGetter(propertyName, method.getParameterTypes()[0]);
            } else {
                // this method is expected to be a getter
                if (method.getName().startsWith("get") && method.getName().length() > 3) {
                    propertyName = Character.toLowerCase(method.getName().charAt(3)) + method.getName().substring(4);
                } else if (method.getName().startsWith("is") && method.getName().length() > 2) {
                    propertyName = Character.toLowerCase(method.getName().charAt(2)) + method.getName().substring(3);
                } else {
                    throw new ProtoSchemaBuilderException("Illegal getter method signature: " + method);
                }
                if (isAdapter && method.getParameterTypes().length != 1 || !isAdapter && method.getParameterTypes().length != 0) {
                    throw new ProtoSchemaBuilderException("Illegal getter method signature: " + method);
                }
                // TODO [anistor] also check getter args
                unknownFieldSetGetter = method;
                unknownFieldSetSetter = findSetter(propertyName, unknownFieldSetGetter.getReturnType());
            }
        } else {
            ProtoField annotation = method.getAnnotation(ProtoField.class);
            if (annotation != null) {
                if (method.isPrivate()) {
                    throw new ProtoSchemaBuilderException("Private methods cannot be @ProtoField annotated: " + method);
                }
                if (!isAdapter && method.isStatic()) {
                    throw new ProtoSchemaBuilderException("Static methods cannot be @ProtoField annotated: " + method);
                }
                String propertyName;
                XMethod getter;
                XMethod setter;
                XClass getterReturnType;
                // we can have the annotation present on either getter or setter but not both
                if (method.getReturnType() == typeFactory.fromClass(void.class)) {
                    // this method is expected to be a setter
                    if (method.getName().startsWith("set") && method.getName().length() >= 4) {
                        propertyName = Character.toLowerCase(method.getName().charAt(3)) + method.getName().substring(4);
                    } else {
                        // not a standard java-beans setter, use the whole name as property name
                        propertyName = method.getName();
                    }
                    if (isAdapter && method.getParameterTypes().length != 2 || !isAdapter && method.getParameterTypes().length != 1) {
                        throw new ProtoSchemaBuilderException("Illegal setter method signature: " + method);
                    }
                    // TODO [anistor] also check setter args
                    setter = method;
                    getter = findGetter(propertyName, method.getParameterTypes()[0]);
                    getterReturnType = getter.getReturnType();
                    if (getterReturnType == typeFactory.fromClass(Optional.class)) {
                        getterReturnType = getter.determineOptionalReturnType();
                    }
                } else {
                    // this method is expected to be a getter
                    if (method.getName().startsWith("get") && method.getName().length() >= 4) {
                        propertyName = Character.toLowerCase(method.getName().charAt(3)) + method.getName().substring(4);
                    } else if (method.getName().startsWith("is") && method.getName().length() >= 3) {
                        propertyName = Character.toLowerCase(method.getName().charAt(2)) + method.getName().substring(3);
                    } else {
                        // not a standard java-beans getter
                        propertyName = method.getName();
                    }
                    if (isAdapter && method.getParameterTypes().length != 1 || !isAdapter && method.getParameterTypes().length != 0) {
                        throw new ProtoSchemaBuilderException("Illegal setter method signature: " + method);
                    }
                    // TODO [anistor] also check getter args
                    getter = method;
                    getterReturnType = getter.getReturnType();
                    if (getterReturnType == typeFactory.fromClass(Optional.class)) {
                        getterReturnType = getter.determineOptionalReturnType();
                    }
                    setter = factory == null ? findSetter(propertyName, getterReturnType) : null;
                }
                int number = getNumber(annotation, method);
                String fieldName = annotation.name();
                if (fieldName.isEmpty()) {
                    fieldName = propertyName;
                }
                Type protobufType = annotation.type();
                if (getterReturnType == typeFactory.fromClass(byte[].class) && protobufType == Type.MESSAGE) {
                    // MESSAGE is the default and stands for 'undefined', we can override it with a better default
                    protobufType = Type.BYTES;
                }
                boolean isArray = isArray(getterReturnType, protobufType);
                boolean isRepeated = isRepeated(getterReturnType, protobufType);
                boolean isRequired = annotation.required();
                if (isRepeated && isRequired) {
                    throw new ProtoSchemaBuilderException("Repeated field '" + fieldName + "' of " + clazz.getCanonicalName() + " cannot be marked required.");
                }
                XClass javaType = getJavaTypeFromAnnotation(annotation);
                if (javaType == typeFactory.fromClass(void.class)) {
                    javaType = isRepeated ? getter.determineRepeatedElementType() : getterReturnType;
                }
                if (javaType == typeFactory.fromClass(byte[].class) && protobufType == Type.MESSAGE) {
                    // MESSAGE is the default and stands for 'undefined', we can override it with a better default
                    protobufType = Type.BYTES;
                }
                if (!javaType.isArray() && !javaType.isPrimitive() && javaType.isAbstract() && !javaType.isEnum()) {
                    throw new ProtoSchemaBuilderException("The type " + javaType.getCanonicalName() + " of field '" + fieldName + "' of " + clazz.getCanonicalName() + " should not be abstract.");
                }
                protobufType = getProtobufType(javaType, protobufType);
                Object defaultValue = getDefaultValue(clazz, fieldName, javaType, protobufType, annotation.defaultValue());
                if (!isRequired && !isRepeated && javaType.isPrimitive() && defaultValue == null) {
                    throw new ProtoSchemaBuilderException("Primitive field '" + fieldName + "' of " + clazz.getCanonicalName() + " is not nullable so it should be either marked required or should have a default value.");
                }
                XClass collectionImplementation = getCollectionImplementation(clazz, getterReturnType, getCollectionImplementationFromAnnotation(annotation), fieldName, isRepeated);
                if (isArray) {
                    collectionImplementation = typeFactory.fromClass(ArrayList.class);
                }
                ProtoTypeMetadata protoTypeMetadata = null;
                if (protobufType.getJavaType() == JavaType.ENUM || protobufType.getJavaType() == JavaType.MESSAGE) {
                    protoTypeMetadata = protoSchemaGenerator.scanAnnotations(javaType);
                }
                ProtoFieldMetadata fieldMetadata = new ProtoFieldMetadata(number, fieldName, javaType, collectionImplementation, protobufType, protoTypeMetadata, isRequired, isRepeated, isArray, defaultValue, propertyName, method, getter, setter);
                ProtoFieldMetadata existing = fieldsByNumber.get(number);
                if (existing != null) {
                    throw new ProtoSchemaBuilderException("Duplicate field definition. Found two field definitions with number " + number + ": in " + fieldMetadata.getLocation() + " and in " + existing.getLocation());
                }
                existing = fieldsByName.get(fieldMetadata.getName());
                if (existing != null) {
                    throw new ProtoSchemaBuilderException("Duplicate field definition. Found two field definitions with name '" + fieldMetadata.getName() + "': in " + fieldMetadata.getLocation() + " and in " + existing.getLocation());
                }
                checkReserved(fieldMetadata);
                fieldsByNumber.put(number, fieldMetadata);
                fieldsByName.put(fieldName, fieldMetadata);
            }
        }
    }
}
Also used : Optional(java.util.Optional) ProtoField(org.infinispan.protostream.annotations.ProtoField) ArrayList(java.util.ArrayList) XClass(org.infinispan.protostream.annotations.impl.types.XClass) ProtoUnknownFieldSet(org.infinispan.protostream.annotations.ProtoUnknownFieldSet) Type(org.infinispan.protostream.descriptors.Type) JavaType(org.infinispan.protostream.descriptors.JavaType) ProtoSchemaBuilderException(org.infinispan.protostream.annotations.ProtoSchemaBuilderException) XField(org.infinispan.protostream.annotations.impl.types.XField) XMethod(org.infinispan.protostream.annotations.impl.types.XMethod)

Example 18 with XClass

use of org.infinispan.protostream.annotations.impl.types.XClass in project protostream by infinispan.

the class ReservedProcessor method scanReserved.

private void scanReserved(XClass clazz, Set<XClass> processedClasses) {
    if (!processedClasses.add(clazz)) {
        // avoid re-processing classes due to multiple interface inheritance
        return;
    }
    if (clazz.getSuperclass() != null) {
        scanReserved(clazz.getSuperclass(), processedClasses);
    }
    for (XClass i : clazz.getInterfaces()) {
        scanReserved(i, processedClasses);
    }
    for (ProtoReserved reserved : clazz.getAnnotationsByType(ProtoReserved.class)) {
        int[] numbers = reserved.numbers();
        if (numbers.length == 0) {
            numbers = reserved.value();
        } else if (reserved.value().length > 0) {
            throw new ProtoSchemaBuilderException("@ProtoReserved annotation must not specify both 'value' and 'numbers' : " + clazz.getCanonicalName());
        }
        for (int number : numbers) {
            ReservedInterval i = new ReservedInterval(clazz, number);
            ReservedInterval dup = i.findOverlap(reservedNumbers);
            if (dup != null) {
                if (dup.where.equals(clazz)) {
                    throw new ProtoSchemaBuilderException("Found duplicate @ProtoReserved number " + number + " in " + clazz.getCanonicalName());
                } else {
                    throw new ProtoSchemaBuilderException("@ProtoReserved number " + number + " in " + clazz.getCanonicalName() + " conflicts with @ProtoReserved in " + dup.where.getCanonicalName());
                }
            }
            reservedNumbers.add(i);
        }
        for (ProtoReserved.Range range : reserved.ranges()) {
            ReservedInterval i = new ReservedInterval(clazz, range.from(), range.to());
            ReservedInterval dup = i.findOverlap(reservedNumbers);
            if (dup != null) {
                if (dup.where.equals(clazz)) {
                    throw new ProtoSchemaBuilderException("Found overlapping @ProtoReserved range \"" + i + "\" in " + clazz.getCanonicalName());
                } else {
                    throw new ProtoSchemaBuilderException("@ProtoReserved range \"" + i + "\" in " + clazz.getCanonicalName() + " conflicts with @ProtoReserved in " + dup.where.getCanonicalName());
                }
            }
            reservedNumbers.add(i);
        }
        for (String name : reserved.names()) {
            if (name.isEmpty()) {
                throw new ProtoSchemaBuilderException("@ProtoReserved name cannot be empty: " + clazz.getCanonicalName());
            }
            XClass dup = reservedNames.put(name, clazz);
            if (dup != null) {
                if (dup.equals(clazz)) {
                    throw new ProtoSchemaBuilderException("Found duplicate @ProtoReserved name \"" + name + "\" in " + clazz.getCanonicalName());
                } else {
                    throw new ProtoSchemaBuilderException("@ProtoReserved name \"" + name + "\" in " + clazz.getCanonicalName() + " conflicts with @ProtoReserved name in " + dup.getCanonicalName());
                }
            }
        }
    }
}
Also used : ProtoReserved(org.infinispan.protostream.annotations.ProtoReserved) ProtoSchemaBuilderException(org.infinispan.protostream.annotations.ProtoSchemaBuilderException) XClass(org.infinispan.protostream.annotations.impl.types.XClass)

Example 19 with XClass

use of org.infinispan.protostream.annotations.impl.types.XClass in project protostream by infinispan.

the class RuntimeProtoSchemaGenerator method getClassPool.

private static ClassPool getClassPool(Set<XClass> classes, ClassLoader classLoader) {
    ClassPool cp = classLoader == null ? new ClassPool(ClassPool.getDefault()) : new ClassPool(ClassPool.getDefault()) {

        @Override
        public ClassLoader getClassLoader() {
            return classLoader;
        }
    };
    for (XClass c : classes) {
        cp.appendClassPath(new ClassClassPath(c.asClass()));
    }
    ClassLoader myCL = RuntimeProtoSchemaGenerator.class.getClassLoader();
    cp.appendClassPath(new LoaderClassPath(myCL));
    if (classLoader != myCL) {
        cp.appendClassPath(new LoaderClassPath(classLoader));
    }
    return cp;
}
Also used : ClassPool(javassist.ClassPool) LoaderClassPath(javassist.LoaderClassPath) XClass(org.infinispan.protostream.annotations.impl.types.XClass) ClassClassPath(javassist.ClassClassPath)

Example 20 with XClass

use of org.infinispan.protostream.annotations.impl.types.XClass in project protostream by infinispan.

the class MarshallerSourceCodeGenerator method generateMessageMarshaller.

private void generateMessageMarshaller(ProtoMessageTypeMetadata pmtm) throws IOException {
    String marshallerClassName = makeUniqueMarshallerClassName(pmtm);
    if (log.isTraceEnabled()) {
        log.tracef("Generating message marshaller %s for %s", marshallerClassName, pmtm.getJavaClass().getName());
    }
    IndentWriter iw = new IndentWriter();
    addFileHeader(iw, pmtm.getAnnotatedClassName());
    String fqn;
    if (pmtm.getAnnotatedClass().getPackageName() != null) {
        fqn = pmtm.getAnnotatedClass().getPackageName() + '.' + marshallerClassName;
        iw.append("package ").append(pmtm.getAnnotatedClass().getPackageName()).append(";\n\n");
    } else {
        fqn = marshallerClassName;
    }
    if (pmtm.getJavaClass().getPackageName() != null) {
        XClass toImport = pmtm.getJavaClass().isArray() ? pmtm.getJavaClass().getComponentType() : pmtm.getJavaClass();
        String toImportName = toImport.getCanonicalName();
        iw.append("import ").append(toImportName != null ? toImportName : toImport.getName()).append(";\n\n");
    }
    AutoProtoSchemaBuilderAnnotationProcessor.addGeneratedClassHeader(iw, true);
    iw.append("@SuppressWarnings(\"all\")\n");
    iw.append("public final class ").append(marshallerClassName).append(" extends ").append(GeneratedMarshallerBase.class.getName()).append(" implements ").append(ProtobufTagMarshaller.class.getName()).append('<').append(pmtm.getJavaClassName()).append('>');
    String elementType = null;
    if (pmtm.isIndexedContainer()) {
        elementType = pmtm.getAnnotatedClass().getGenericInterfaceParameterTypes(IndexedElementContainerAdapter.class)[1];
        iw.append(", ").append(IndexedElementContainerAdapter.class.getName()).append('<').append(pmtm.getJavaClassName()).append(", ").append(elementType).append(">");
    } else if (pmtm.isIterableContainer()) {
        elementType = pmtm.getAnnotatedClass().getGenericInterfaceParameterTypes(IterableElementContainerAdapter.class)[1];
        iw.append(", ").append(IterableElementContainerAdapter.class.getName()).append('<').append(pmtm.getJavaClassName()).append(", ").append(elementType).append(">");
    }
    iw.append(" {\n\n");
    iw.inc();
    if (pmtm.isAdapter()) {
        addAdapterField(iw, pmtm);
    }
    addMarshallerDelegateFields(iw, pmtm);
    iw.append("@Override\npublic Class<").append(pmtm.getJavaClassName()).append("> getJavaClass() { return ").append(pmtm.getJavaClassName()).append(".class; }\n\n");
    iw.append("@Override\npublic String getTypeName() { return \"").append(makeQualifiedTypeName(pmtm.getFullName())).append("\"; }\n\n");
    if (pmtm.isIndexedContainer()) {
        if (pmtm.isAdapter()) {
            iw.append("@Override\npublic int getNumElements(").append(pmtm.getJavaClassName()).append(" container) { return ").append(ADAPTER_FIELD_NAME).append(".getNumElements(container); }\n");
            iw.append("@Override\npublic ").append(elementType).append(" getElement(").append(pmtm.getJavaClassName()).append(" container, int index) { return ").append(ADAPTER_FIELD_NAME).append(".getElement(container, index); }\n");
            iw.append("@Override\npublic void setElement(").append(pmtm.getJavaClassName()).append(" container, int index, ").append(elementType).append(" element) { ").append(ADAPTER_FIELD_NAME).append(".setElement(container, index, element); }\n");
        } else {
            iw.append("@Override\npublic int getNumElements(").append(pmtm.getJavaClassName()).append(" container) { return ((").append(IndexedElementContainerAdapter.class.getName()).append(") container).getNumElements(); }\n");
            iw.append("@Override\npublic ").append(elementType).append(" getElement(").append(pmtm.getJavaClassName()).append(" container, int index) { return ((").append(IndexedElementContainerAdapter.class.getName()).append(") container).getElement(index); }\n");
            iw.append("@Override\npublic void setElement(").append(pmtm.getJavaClassName()).append(" container, int index, ").append(elementType).append(" element) { ((").append(IndexedElementContainerAdapter.class.getName()).append(") container).setElement(index, element); }\n");
        }
    } else if (pmtm.isIterableContainer()) {
        if (pmtm.isAdapter()) {
            iw.append("@Override\npublic int getNumElements(").append(pmtm.getJavaClassName()).append(" container) { return ").append(ADAPTER_FIELD_NAME).append(".getNumElements(container); }\n");
            iw.append("@Override\npublic java.util.Iterator getElements(").append(pmtm.getJavaClassName()).append(" container) { return ").append(ADAPTER_FIELD_NAME).append(".getElements(container); }\n");
            iw.append("@Override\npublic void appendElement(").append(pmtm.getJavaClassName()).append(" container, ").append(elementType).append(" element) { ").append(ADAPTER_FIELD_NAME).append(".appendElement(container, element); }\n");
        } else {
            iw.append("@Override\npublic int getNumElements(").append(pmtm.getJavaClassName()).append(" container) { return ((").append(IterableElementContainerAdapter.class.getName()).append(") container).getNumElements(); }\n");
            iw.append("@Override\npublic java.util.Iterator getElements(").append(pmtm.getJavaClassName()).append(" container) { return ((").append(IterableElementContainerAdapter.class.getName()).append(") container).getElements(); }\n");
            iw.append("@Override\npublic void appendElement(").append(pmtm.getJavaClassName()).append(" container, ").append(elementType).append(" element) { ((").append(IterableElementContainerAdapter.class.getName()).append(") container).appendElement(element); }\n");
        }
    }
    String readMethodSrc = generateReadMethodBody(pmtm);
    String readMethodSig = "public " + pmtm.getJavaClassName() + " read(" + ProtobufTagMarshaller.ReadContext.class.getCanonicalName() + " $1) throws java.io.IOException";
    if (log.isTraceEnabled()) {
        log.tracef("%s %s", readMethodSig, readMethodSrc);
    }
    iw.append("@Override\n").append(readMethodSig).append(' ').append(readMethodSrc).append('\n');
    String writeMethodSrc = generateWriteMethodBody(pmtm);
    String writeMethodSig = "public void write(" + ProtobufTagMarshaller.WriteContext.class.getCanonicalName() + " $1, " + pmtm.getJavaClassName() + " $2) throws java.io.IOException";
    if (log.isTraceEnabled()) {
        log.tracef("%s %s", writeMethodSig, writeMethodSrc);
    }
    iw.append("@Override\n").append(writeMethodSig).append(' ').append(writeMethodSrc);
    iw.dec();
    iw.append("}\n");
    emitSource(fqn, iw.toString(), pmtm);
}
Also used : IndentWriter(org.infinispan.protostream.annotations.impl.IndentWriter) ProtobufTagMarshaller(org.infinispan.protostream.ProtobufTagMarshaller) IterableElementContainerAdapter(org.infinispan.protostream.containers.IterableElementContainerAdapter) XClass(org.infinispan.protostream.annotations.impl.types.XClass)

Aggregations

XClass (org.infinispan.protostream.annotations.impl.types.XClass)24 ProtoSchemaBuilderException (org.infinispan.protostream.annotations.ProtoSchemaBuilderException)11 Test (org.junit.Test)6 ReflectionTypeFactory (org.infinispan.protostream.annotations.impl.types.ReflectionTypeFactory)5 ArrayList (java.util.ArrayList)3 Optional (java.util.Optional)3 TypeElement (javax.lang.model.element.TypeElement)3 XConstructor (org.infinispan.protostream.annotations.impl.types.XConstructor)3 Collection (java.util.Collection)2 List (java.util.List)2 ProcessingEnvironment (javax.annotation.processing.ProcessingEnvironment)2 Name (javax.lang.model.element.Name)2 DeclaredType (javax.lang.model.type.DeclaredType)2 TypeMirror (javax.lang.model.type.TypeMirror)2 Elements (javax.lang.model.util.Elements)2 Types (javax.lang.model.util.Types)2 ProtoUnknownFieldSet (org.infinispan.protostream.annotations.ProtoUnknownFieldSet)2 XMethod (org.infinispan.protostream.annotations.impl.types.XMethod)2 JavaType (org.infinispan.protostream.descriptors.JavaType)2 Type (org.infinispan.protostream.descriptors.Type)2