Search in sources :

Example 1 with BeanProperty

use of com.thoughtworks.qdox.model.BeanProperty in project geronimo-xbean by apache.

the class QdoxMappingLoader method loadElement.

private ElementMapping loadElement(JavaDocBuilder builder, JavaClass javaClass) {
    DocletTag xbeanTag = javaClass.getTagByName(XBEAN_ANNOTATION);
    if (xbeanTag == null) {
        return null;
    }
    String element = getElementName(javaClass, xbeanTag);
    String description = getProperty(xbeanTag, "description");
    if (description == null) {
        description = javaClass.getComment();
    }
    String namespace = getProperty(xbeanTag, "namespace", defaultNamespace);
    boolean root = getBooleanProperty(xbeanTag, "rootElement");
    String contentProperty = getProperty(xbeanTag, "contentProperty");
    String factoryClass = getProperty(xbeanTag, "factoryClass");
    Map<String, MapMapping> mapsByPropertyName = new HashMap<String, MapMapping>();
    List<String> flatProperties = new ArrayList<String>();
    Map<String, String> flatCollections = new HashMap<String, String>();
    Set<AttributeMapping> attributes = new HashSet<AttributeMapping>();
    Map<String, AttributeMapping> attributesByPropertyName = new HashMap<String, AttributeMapping>();
    for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
        BeanProperty[] beanProperties = jClass.getBeanProperties();
        for (BeanProperty beanProperty : beanProperties) {
            // we only care about properties with a setter
            if (beanProperty.getMutator() != null) {
                AttributeMapping attributeMapping = loadAttribute(beanProperty, "");
                if (attributeMapping != null) {
                    attributes.add(attributeMapping);
                    attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
                }
                JavaMethod acc = beanProperty.getAccessor();
                if (acc != null) {
                    DocletTag mapTag = acc.getTagByName(MAP_ANNOTATION);
                    if (mapTag != null) {
                        MapMapping mm = new MapMapping(mapTag.getNamedParameter("entryName"), mapTag.getNamedParameter("keyName"), Boolean.valueOf(mapTag.getNamedParameter("flat")), mapTag.getNamedParameter("dups"), mapTag.getNamedParameter("defaultKey"));
                        mapsByPropertyName.put(beanProperty.getName(), mm);
                    }
                    DocletTag flatColTag = acc.getTagByName(FLAT_COLLECTION_ANNOTATION);
                    if (flatColTag != null) {
                        String childName = flatColTag.getNamedParameter("childElement");
                        if (childName == null)
                            throw new InvalidModelException("Flat collections must specify the childElement attribute.");
                        flatCollections.put(beanProperty.getName(), childName);
                    }
                    DocletTag flatPropTag = acc.getTagByName(FLAT_PROPERTY_ANNOTATION);
                    if (flatPropTag != null) {
                        flatProperties.add(beanProperty.getName());
                    }
                }
            }
        }
    }
    String initMethod = null;
    String destroyMethod = null;
    String factoryMethod = null;
    for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
        JavaMethod[] methods = javaClass.getMethods();
        for (JavaMethod method : methods) {
            if (method.isPublic() && !method.isConstructor()) {
                if (initMethod == null && method.getTagByName(INIT_METHOD_ANNOTATION) != null) {
                    initMethod = method.getName();
                }
                if (destroyMethod == null && method.getTagByName(DESTROY_METHOD_ANNOTATION) != null) {
                    destroyMethod = method.getName();
                }
                if (factoryMethod == null && method.getTagByName(FACTORY_METHOD_ANNOTATION) != null) {
                    factoryMethod = method.getName();
                }
            }
        }
    }
    List<List<ParameterMapping>> constructorArgs = new ArrayList<List<ParameterMapping>>();
    JavaMethod[] methods = javaClass.getMethods();
    for (JavaMethod method : methods) {
        JavaParameter[] parameters = method.getParameters();
        if (isValidConstructor(factoryMethod, method, parameters)) {
            List<ParameterMapping> args = new ArrayList<ParameterMapping>(parameters.length);
            for (JavaParameter parameter : parameters) {
                AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName());
                if (attributeMapping == null) {
                    attributeMapping = loadParameter(parameter);
                    attributes.add(attributeMapping);
                    attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
                }
                args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null)));
            }
            constructorArgs.add(Collections.unmodifiableList(args));
        }
    }
    HashSet<String> interfaces = new HashSet<String>();
    interfaces.addAll(getFullyQualifiedNames(javaClass.getImplementedInterfaces()));
    JavaClass actualClass = javaClass;
    if (factoryClass != null) {
        JavaClass clazz = builder.getClassByName(factoryClass);
        if (clazz != null) {
            log.info("Detected factory: using " + factoryClass + " instead of " + javaClass.getFullyQualifiedName());
            actualClass = clazz;
        } else {
            log.info("Could not load class built by factory: " + factoryClass);
        }
    }
    ArrayList<String> superClasses = new ArrayList<String>();
    JavaClass p = actualClass;
    if (actualClass != javaClass) {
        superClasses.add(actualClass.getFullyQualifiedName());
    }
    while (true) {
        JavaClass s = p.getSuperJavaClass();
        if (s == null || s.equals(p) || "java.lang.Object".equals(s.getFullyQualifiedName())) {
            break;
        }
        p = s;
        superClasses.add(p.getFullyQualifiedName());
        interfaces.addAll(getFullyQualifiedNames(p.getImplementedInterfaces()));
    }
    return new ElementMapping(namespace, element, javaClass.getFullyQualifiedName(), description, root, initMethod, destroyMethod, factoryMethod, contentProperty, attributes, constructorArgs, flatProperties, mapsByPropertyName, flatCollections, superClasses, interfaces);
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) JavaMethod(com.thoughtworks.qdox.model.JavaMethod) JavaParameter(com.thoughtworks.qdox.model.JavaParameter) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) BeanProperty(com.thoughtworks.qdox.model.BeanProperty) JavaClass(com.thoughtworks.qdox.model.JavaClass) DocletTag(com.thoughtworks.qdox.model.DocletTag)

Example 2 with BeanProperty

use of com.thoughtworks.qdox.model.BeanProperty in project geronimo-xbean by apache.

the class QdoxMappingLoader method loadParameter.

private AttributeMapping loadParameter(JavaParameter parameter) {
    String parameterName = parameter.getName();
    String parameterDescription = getParameterDescription(parameter);
    // first attempt to load the attribute from the java beans accessor methods
    JavaClass javaClass = parameter.getParentMethod().getParentClass();
    BeanProperty beanProperty = javaClass.getBeanProperty(parameterName);
    if (beanProperty != null) {
        AttributeMapping attributeMapping = loadAttribute(beanProperty, parameterDescription);
        // if the attribute mapping is null, the property was tagged as hidden and this is an error
        if (attributeMapping == null) {
            throw new InvalidModelException("Hidden property usage: " + "The construction method " + toMethodLocator(parameter.getParentMethod()) + " can not use a hidded property " + parameterName);
        }
        return attributeMapping;
    }
    // create an attribute solely based on the parameter information
    return new AttributeMapping(parameterName, parameterName, parameterDescription, toMappingType(parameter.getType(), null), null, false, false, null);
}
Also used : JavaClass(com.thoughtworks.qdox.model.JavaClass) BeanProperty(com.thoughtworks.qdox.model.BeanProperty)

Example 3 with BeanProperty

use of com.thoughtworks.qdox.model.BeanProperty in project geronimo-xbean by apache.

the class QdoxMappingLoader method loadParameter.

private AttributeMapping loadParameter(JavaParameter parameter) {
    String parameterName = parameter.getName();
    String parameterDescription = getParameterDescription(parameter);
    // first attempt to load the attribute from the java beans accessor methods
    JavaClass javaClass = parameter.getParentMethod().getParentClass();
    BeanProperty beanProperty = javaClass.getBeanProperty(parameterName);
    if (beanProperty != null) {
        AttributeMapping attributeMapping = loadAttribute(beanProperty, parameterDescription);
        // if the attribute mapping is null, the property was tagged as hidden and this is an error
        if (attributeMapping == null) {
            throw new InvalidModelException("Hidden property usage: " + "The construction method " + toMethodLocator(parameter.getParentMethod()) + " can not use a hidded property " + parameterName);
        }
        return attributeMapping;
    }
    // create an attribute solely based on the parameter information
    return new AttributeMapping(parameterName, parameterName, parameterDescription, toMappingType(parameter.getType(), null), null, false, false, null);
}
Also used : JavaClass(com.thoughtworks.qdox.model.JavaClass) BeanProperty(com.thoughtworks.qdox.model.BeanProperty)

Example 4 with BeanProperty

use of com.thoughtworks.qdox.model.BeanProperty in project geronimo-xbean by apache.

the class QdoxMappingLoader method loadElement.

private ElementMapping loadElement(JavaDocBuilder builder, JavaClass javaClass) {
    DocletTag xbeanTag = javaClass.getTagByName(XBEAN_ANNOTATION);
    if (xbeanTag == null) {
        return null;
    }
    String element = getElementName(javaClass, xbeanTag);
    String description = getProperty(xbeanTag, "description");
    if (description == null) {
        description = javaClass.getComment();
    }
    String namespace = getProperty(xbeanTag, "namespace", defaultNamespace);
    boolean root = getBooleanProperty(xbeanTag, "rootElement");
    String contentProperty = getProperty(xbeanTag, "contentProperty");
    String factoryClass = getProperty(xbeanTag, "factoryClass");
    Map<String, MapMapping> mapsByPropertyName = new HashMap<String, MapMapping>();
    List<String> flatProperties = new ArrayList<String>();
    Map<String, String> flatCollections = new HashMap<String, String>();
    Set<AttributeMapping> attributes = new HashSet<AttributeMapping>();
    Map<String, AttributeMapping> attributesByPropertyName = new HashMap<String, AttributeMapping>();
    for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
        BeanProperty[] beanProperties = jClass.getBeanProperties();
        for (BeanProperty beanProperty : beanProperties) {
            // we only care about properties with a setter
            if (beanProperty.getMutator() != null) {
                AttributeMapping attributeMapping = loadAttribute(beanProperty, "");
                if (attributeMapping != null) {
                    attributes.add(attributeMapping);
                    attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
                }
                JavaMethod acc = beanProperty.getAccessor();
                if (acc != null) {
                    DocletTag mapTag = acc.getTagByName(MAP_ANNOTATION);
                    if (mapTag != null) {
                        MapMapping mm = new MapMapping(mapTag.getNamedParameter("entryName"), mapTag.getNamedParameter("keyName"), Boolean.valueOf(mapTag.getNamedParameter("flat")), mapTag.getNamedParameter("dups"), mapTag.getNamedParameter("defaultKey"));
                        mapsByPropertyName.put(beanProperty.getName(), mm);
                    }
                    DocletTag flatColTag = acc.getTagByName(FLAT_COLLECTION_ANNOTATION);
                    if (flatColTag != null) {
                        String childName = flatColTag.getNamedParameter("childElement");
                        if (childName == null)
                            throw new InvalidModelException("Flat collections must specify the childElement attribute.");
                        flatCollections.put(beanProperty.getName(), childName);
                    }
                    DocletTag flatPropTag = acc.getTagByName(FLAT_PROPERTY_ANNOTATION);
                    if (flatPropTag != null) {
                        flatProperties.add(beanProperty.getName());
                    }
                }
            }
        }
    }
    String initMethod = null;
    String destroyMethod = null;
    String factoryMethod = null;
    for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
        JavaMethod[] methods = javaClass.getMethods();
        for (JavaMethod method : methods) {
            if (method.isPublic() && !method.isConstructor()) {
                if (initMethod == null && method.getTagByName(INIT_METHOD_ANNOTATION) != null) {
                    initMethod = method.getName();
                }
                if (destroyMethod == null && method.getTagByName(DESTROY_METHOD_ANNOTATION) != null) {
                    destroyMethod = method.getName();
                }
                if (factoryMethod == null && method.getTagByName(FACTORY_METHOD_ANNOTATION) != null) {
                    factoryMethod = method.getName();
                }
            }
        }
    }
    List<List<ParameterMapping>> constructorArgs = new ArrayList<List<ParameterMapping>>();
    JavaMethod[] methods = javaClass.getMethods();
    for (JavaMethod method : methods) {
        JavaParameter[] parameters = method.getParameters();
        if (isValidConstructor(factoryMethod, method, parameters)) {
            List<ParameterMapping> args = new ArrayList<ParameterMapping>(parameters.length);
            for (JavaParameter parameter : parameters) {
                AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName());
                if (attributeMapping == null) {
                    attributeMapping = loadParameter(parameter);
                    attributes.add(attributeMapping);
                    attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
                }
                args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null)));
            }
            constructorArgs.add(Collections.unmodifiableList(args));
        }
    }
    HashSet<String> interfaces = new HashSet<String>();
    interfaces.addAll(getFullyQualifiedNames(javaClass.getImplementedInterfaces()));
    JavaClass actualClass = javaClass;
    if (factoryClass != null) {
        JavaClass clazz = builder.getClassByName(factoryClass);
        if (clazz != null) {
            log.info("Detected factory: using " + factoryClass + " instead of " + javaClass.getFullyQualifiedName());
            actualClass = clazz;
        } else {
            log.info("Could not load class built by factory: " + factoryClass);
        }
    }
    ArrayList<String> superClasses = new ArrayList<String>();
    JavaClass p = actualClass;
    if (actualClass != javaClass) {
        superClasses.add(actualClass.getFullyQualifiedName());
    }
    while (true) {
        JavaClass s = p.getSuperJavaClass();
        if (s == null || s.equals(p) || "java.lang.Object".equals(s.getFullyQualifiedName())) {
            break;
        }
        p = s;
        superClasses.add(p.getFullyQualifiedName());
        interfaces.addAll(getFullyQualifiedNames(p.getImplementedInterfaces()));
    }
    return new ElementMapping(namespace, element, javaClass.getFullyQualifiedName(), description, root, initMethod, destroyMethod, factoryMethod, contentProperty, attributes, constructorArgs, flatProperties, mapsByPropertyName, flatCollections, superClasses, interfaces);
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) JavaMethod(com.thoughtworks.qdox.model.JavaMethod) JavaParameter(com.thoughtworks.qdox.model.JavaParameter) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) BeanProperty(com.thoughtworks.qdox.model.BeanProperty) JavaClass(com.thoughtworks.qdox.model.JavaClass) DocletTag(com.thoughtworks.qdox.model.DocletTag)

Aggregations

BeanProperty (com.thoughtworks.qdox.model.BeanProperty)4 JavaClass (com.thoughtworks.qdox.model.JavaClass)4 DocletTag (com.thoughtworks.qdox.model.DocletTag)2 JavaMethod (com.thoughtworks.qdox.model.JavaMethod)2 JavaParameter (com.thoughtworks.qdox.model.JavaParameter)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 List (java.util.List)2