Search in sources :

Example 1 with Extends

use of org.eclipse.scout.rt.platform.extension.Extends in project scout.rt by eclipse.

the class ExtensionRegistry method autoRegisterInternal.

protected void autoRegisterInternal(Class<?> extensionClass, Class<?> declaringClass, ClassIdentifier ownerClassIdentifier, ClassIdentifier ownerClassIdentifierFromDeclaring, Double order) {
    if (extensionClass == null) {
        throw new IllegalExtensionException("Extension or contribution cannot be null.");
    }
    boolean isExtension = IExtension.class.isAssignableFrom(extensionClass);
    Class<?> extensionGeneric = null;
    if (isExtension) {
        extensionGeneric = TypeCastUtility.getGenericsParameterClass(extensionClass, IExtension.class);
    }
    if (ownerClassIdentifier == null) {
        if (isExtension) {
            // 1. try type parameter of extension
            InheritOuterExtensionScope inheritOuterExtensionScope = extensionClass.getAnnotation(InheritOuterExtensionScope.class);
            if (inheritOuterExtensionScope == null || inheritOuterExtensionScope.value()) {
                ownerClassIdentifier = new ClassIdentifier(ownerClassIdentifierFromDeclaring, extensionGeneric);
            } else {
                ownerClassIdentifier = new ClassIdentifier(extensionGeneric);
            }
        }
        if (ownerClassIdentifier == null) {
            // 2. try @Extends annotation
            Extends extendsAnnotation = getExtendsAnnotation(extensionClass);
            if (extendsAnnotation != null) {
                int pathToContainerLength = extendsAnnotation.pathToContainer().length;
                if (pathToContainerLength > 0) {
                    Class[] segments = new Class[pathToContainerLength + 1];
                    System.arraycopy(extendsAnnotation.pathToContainer(), 0, segments, 0, pathToContainerLength);
                    segments[pathToContainerLength] = extendsAnnotation.value();
                    ownerClassIdentifier = new ClassIdentifier(segments);
                } else {
                    ownerClassIdentifier = new ClassIdentifier(extendsAnnotation.value());
                }
            }
            if (ownerClassIdentifier == null) {
                // 3. inherit owner from declaring type
                ownerClassIdentifier = ownerClassIdentifierFromDeclaring;
            }
        }
    }
    if (Modifier.isStatic(extensionClass.getModifiers())) {
        // not required
        declaringClass = null;
    }
    registerInternal(ownerClassIdentifier, declaringClass, extensionClass, order, extensionGeneric, isExtension);
    if (isExtension) {
        // only step in if it is an "unmanaged" extension.
        // managed scout objects (e.g. AbstractCompositeField) create their inner classes itself, therefore inner classes must not be registered
        List<Class<?>> innerExtensionClasses = collectInnerExtensionClasses(extensionClass);
        for (Class<?> innerExtensionClass : innerExtensionClasses) {
            autoRegisterInternal(innerExtensionClass, extensionClass, null, ownerClassIdentifier, null);
        }
    } else {
        // step into all static inner classes for form field data if the inner class itself has an @Extends annotation: this is a row data extension
        boolean isFormFieldData = AbstractFormFieldData.class.isAssignableFrom(extensionClass);
        if (isFormFieldData) {
            List<Class<?>> innerExtensionClasses = collectInnerExtensionClasses(extensionClass);
            for (Class<?> innerExtensionClass : innerExtensionClasses) {
                if (innerExtensionClass.isAnnotationPresent(Extends.class) && Modifier.isStatic(innerExtensionClass.getModifiers())) {
                    autoRegisterInternal(innerExtensionClass, extensionClass, null, ownerClassIdentifier, null);
                }
            }
        }
    }
}
Also used : InheritOuterExtensionScope(org.eclipse.scout.rt.platform.extension.InheritOuterExtensionScope) ClassIdentifier(org.eclipse.scout.rt.platform.classid.ClassIdentifier) Extends(org.eclipse.scout.rt.platform.extension.Extends)

Example 2 with Extends

use of org.eclipse.scout.rt.platform.extension.Extends in project scout.rt by eclipse.

the class ExtensionRegistry method getExtendsAnnotation.

protected Extends getExtendsAnnotation(Class<?> c) {
    Extends result = null;
    Class<?> currentClass = c;
    while (result == null && currentClass != null) {
        result = currentClass.getAnnotation(Extends.class);
        currentClass = currentClass.getSuperclass();
    }
    return result;
}
Also used : Extends(org.eclipse.scout.rt.platform.extension.Extends)

Aggregations

Extends (org.eclipse.scout.rt.platform.extension.Extends)2 ClassIdentifier (org.eclipse.scout.rt.platform.classid.ClassIdentifier)1 InheritOuterExtensionScope (org.eclipse.scout.rt.platform.extension.InheritOuterExtensionScope)1