All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nakedobjects.metamodel.facets.collections.CollectionFacetFactory Maven / Gradle / Ivy

The newest version!
package org.nakedobjects.metamodel.facets.collections;

import org.nakedobjects.metamodel.facets.FacetFactoryAbstract;
import org.nakedobjects.metamodel.facets.FacetHolder;
import org.nakedobjects.metamodel.facets.MethodRemover;
import org.nakedobjects.metamodel.facets.actcoll.typeof.TypeOfFacet;
import org.nakedobjects.metamodel.facets.actcoll.typeof.TypeOfFacetDefaultToObject;
import org.nakedobjects.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
import org.nakedobjects.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
import org.nakedobjects.metamodel.runtimecontext.RuntimeContext;
import org.nakedobjects.metamodel.runtimecontext.RuntimeContextAware;
import org.nakedobjects.metamodel.spec.feature.NakedObjectFeatureType;
import org.nakedobjects.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistry;
import org.nakedobjects.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistryAware;


public class CollectionFacetFactory extends FacetFactoryAbstract implements CollectionTypeRegistryAware, RuntimeContextAware {

    private CollectionTypeRegistry collectionTypeRegistry;
	private RuntimeContext runtimeContext;

    public CollectionFacetFactory() {
        super(NakedObjectFeatureType.OBJECTS_ONLY);
    }

    
    @Override
    public boolean process(final Class cls, final MethodRemover methodRemover, final FacetHolder holder) {
        if (collectionTypeRegistry.isCollectionType(cls)) {
            final TypeOfFacet typeOfFacet = holder.getFacet(TypeOfFacet.class);
            Class collectionElementType;
            if (typeOfFacet != null) {
                collectionElementType = typeOfFacet.value();
            } else {
                collectionElementType = collectionElementType(cls);
                holder.addFacet(collectionElementType != Object.class ? new TypeOfFacetInferredFromGenerics(
                        collectionElementType, holder, getSpecificationLoader()) : new TypeOfFacetDefaultToObject(holder, getSpecificationLoader()));
            }
            holder.addFacet(new JavaCollectionFacet(holder, getRuntimeContext()));
            return true;
        }
        if (collectionTypeRegistry.isArrayType(cls)) {
            holder.addFacet(new JavaArrayFacet(holder, getRuntimeContext()));
            holder.addFacet(new TypeOfFacetInferredFromArray(cls.getComponentType(), holder, getSpecificationLoader()));
            return true;
        }

        return false;
    }

    private Class collectionElementType(final Class cls) {
        return Object.class;
    }

    
    ////////////////////////////////////////////////////////////////
    // Dependencies (injected)
    ////////////////////////////////////////////////////////////////
    
    /**
     * Injected since {@link CollectionTypeRegistryAware}.
     */
    public void setCollectionTypeRegistry(final CollectionTypeRegistry collectionTypeRegistry) {
        this.collectionTypeRegistry = collectionTypeRegistry;
    }

    
    /**
     * As per {@link #setRuntimeContext(RuntimeContext)}
     */
    public RuntimeContext getRuntimeContext() {
		return runtimeContext;
	}

    /**
     * Injected since {@link RuntimeContextAware}.
     */
	public void setRuntimeContext(final RuntimeContext runtimeContext) {
		this.runtimeContext = runtimeContext;
	}


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy