001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.isis.core.progmodel.facets.collections.collection;
021
022 import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
023 import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
024 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
025 import org.apache.isis.core.metamodel.facetapi.FeatureType;
026 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
027 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacet;
028 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacetDefaultToObject;
029 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacetInferredFromArray;
030 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacetInferredFromGenerics;
031 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistry;
032 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistryAware;
033
034 public class CollectionFacetFactory extends FacetFactoryAbstract implements CollectionTypeRegistryAware,
035 AdapterMapAware {
036
037 private CollectionTypeRegistry collectionTypeRegistry;
038 private AdapterMap adapterMap;
039
040 public CollectionFacetFactory() {
041 super(FeatureType.OBJECTS_ONLY);
042 }
043
044 @Override
045 public void process(final ProcessClassContext processClassContaxt) {
046
047 if (collectionTypeRegistry.isCollectionType(processClassContaxt.getCls())) {
048 processCollectionType(processClassContaxt);
049 } else if (collectionTypeRegistry.isArrayType(processClassContaxt.getCls())) {
050 processAsArrayType(processClassContaxt);
051 }
052
053 }
054
055 private void processCollectionType(final ProcessClassContext processClassContaxt) {
056 final FacetHolder facetHolder = processClassContaxt.getFacetHolder();
057 final TypeOfFacet typeOfFacet = facetHolder.getFacet(TypeOfFacet.class);
058 if (typeOfFacet == null) {
059 final Class<?> collectionElementType = collectionElementType(processClassContaxt.getCls());
060 facetHolder.addFacet(collectionElementType != Object.class ? new TypeOfFacetInferredFromGenerics(
061 collectionElementType, facetHolder, getSpecificationLookup()) : new TypeOfFacetDefaultToObject(
062 facetHolder, getSpecificationLookup()));
063 } else {
064 // nothing
065 }
066 facetHolder.addFacet(new JavaCollectionFacet(facetHolder, getAdapterMap()));
067 return;
068 }
069
070 private void processAsArrayType(final ProcessClassContext processClassContaxt) {
071 final FacetHolder facetHolder = processClassContaxt.getFacetHolder();
072 facetHolder.addFacet(new JavaArrayFacet(facetHolder, getAdapterMap()));
073 facetHolder.addFacet(new TypeOfFacetInferredFromArray(processClassContaxt.getCls().getComponentType(),
074 facetHolder, getSpecificationLookup()));
075 }
076
077 private Class<?> collectionElementType(final Class<?> cls) {
078 return Object.class;
079 }
080
081 // //////////////////////////////////////////////////////////////
082 // Dependencies (injected)
083 // //////////////////////////////////////////////////////////////
084
085 /**
086 * Injected since {@link CollectionTypeRegistryAware}.
087 */
088 @Override
089 public void setCollectionTypeRegistry(final CollectionTypeRegistry collectionTypeRegistry) {
090 this.collectionTypeRegistry = collectionTypeRegistry;
091 }
092
093 public AdapterMap getAdapterMap() {
094 return adapterMap;
095 }
096
097 @Override
098 public void setAdapterMap(final AdapterMap adapterManager) {
099 this.adapterMap = adapterManager;
100 }
101
102 }