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 020package org.apache.isis.core.progmodel.facets.object.defaults.annotation; 021 022import com.google.common.base.Strings; 023 024import org.apache.isis.applib.annotation.Defaulted; 025import org.apache.isis.core.commons.config.IsisConfiguration; 026import org.apache.isis.core.commons.config.IsisConfigurationAware; 027import org.apache.isis.core.commons.lang.StringExtensions; 028import org.apache.isis.core.metamodel.facetapi.FacetHolder; 029import org.apache.isis.core.metamodel.facetapi.FacetUtil; 030import org.apache.isis.core.metamodel.facetapi.FeatureType; 031import org.apache.isis.core.metamodel.facets.Annotations; 032import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; 033import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; 034import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware; 035import org.apache.isis.core.progmodel.facets.object.defaults.DefaultedFacetAbstract; 036import org.apache.isis.core.progmodel.facets.object.defaults.DefaultsProviderUtil; 037 038public class DefaultedAnnotationFacetFactory extends FacetFactoryAbstract implements IsisConfigurationAware, ServicesInjectorAware { 039 040 private IsisConfiguration configuration; 041 private ServicesInjector servicesInjector; 042 043 public DefaultedAnnotationFacetFactory() { 044 super(FeatureType.OBJECTS_ONLY); 045 } 046 047 @Override 048 public void process(final ProcessClassContext processClassContext) { 049 FacetUtil.addFacet(create(processClassContext.getCls(), processClassContext.getFacetHolder())); 050 } 051 052 private DefaultedFacetAbstract create(final Class<?> cls, final FacetHolder holder) { 053 final Defaulted annotation = Annotations.getAnnotation(cls, Defaulted.class); 054 055 // create from annotation, if present 056 if (annotation != null) { 057 final DefaultedFacetAbstract facet = new DefaultedFacetAnnotation(cls, getIsisConfiguration(), holder, getServicesInjector()); 058 if (facet.isValid()) { 059 return facet; 060 } 061 } 062 063 // otherwise, try to create from configuration, if present 064 final String providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(cls, getIsisConfiguration()); 065 if (!Strings.isNullOrEmpty(providerName)) { 066 final DefaultedFacetFromConfiguration facet = new DefaultedFacetFromConfiguration(providerName, holder, getServicesInjector()); 067 if (facet.isValid()) { 068 return facet; 069 } 070 } 071 072 return null; 073 } 074 075 // //////////////////////////////////////////////////////////////////// 076 // Injected 077 // //////////////////////////////////////////////////////////////////// 078 079 public IsisConfiguration getIsisConfiguration() { 080 return configuration; 081 } 082 083 @Override 084 public void setConfiguration(final IsisConfiguration configuration) { 085 this.configuration = configuration; 086 } 087 088 private ServicesInjector getServicesInjector() { 089 return servicesInjector; 090 } 091 092 @Override 093 public void setServicesInjector(final ServicesInjector dependencyInjector) { 094 this.servicesInjector = dependencyInjector; 095 } 096 097}