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.param.defaults.fromtype;
021
022 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
023 import org.apache.isis.core.metamodel.facetapi.FeatureType;
024 import org.apache.isis.core.metamodel.facets.AnnotationBasedFacetFactoryAbstract;
025 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
026 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
027 import org.apache.isis.core.progmodel.facets.object.defaults.DefaultedFacet;
028
029 public class ParameterDefaultDerivedFromTypeFacetFactory extends AnnotationBasedFacetFactoryAbstract {
030
031 public ParameterDefaultDerivedFromTypeFacetFactory() {
032 super(FeatureType.PARAMETERS_ONLY);
033 }
034
035 /**
036 * If there is a {@link DefaultedFacet} on any of the action's parameter types, then installs a
037 * {@link ActionDefaultsFacet} for the action.
038 */
039 @Override
040 public void processParams(final ProcessParameterContext processParameterContext) {
041 // don't overwrite any defaults already picked up
042 if (processParameterContext.getFacetHolder().getFacet(ActionDefaultsFacet.class) != null) {
043 return;
044 }
045
046 // try to infer defaults from any of the parameter's underlying types
047 final Class<?>[] parameterTypes = processParameterContext.getMethod().getParameterTypes();
048 final DefaultedFacet[] parameterTypeDefaultedFacets = new DefaultedFacet[parameterTypes.length];
049 boolean hasAtLeastOneDefault = false;
050 for (int i = 0; i < parameterTypes.length; i++) {
051 final Class<?> paramType = parameterTypes[i];
052 parameterTypeDefaultedFacets[i] = getDefaultedFacet(paramType);
053 hasAtLeastOneDefault = hasAtLeastOneDefault | (parameterTypeDefaultedFacets[i] != null);
054 }
055 if (hasAtLeastOneDefault) {
056 FacetUtil.addFacet(new ActionParameterDefaultFacetDerivedFromTypeFacets(parameterTypeDefaultedFacets,
057 processParameterContext.getFacetHolder()));
058 }
059 }
060
061 private DefaultedFacet getDefaultedFacet(final Class<?> paramType) {
062 final ObjectSpecification paramTypeSpec = getSpecificationLookup().loadSpecification(paramType);
063 return paramTypeSpec.getFacet(DefaultedFacet.class);
064 }
065
066 }