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.encodeable; 021 022import com.google.common.base.Strings; 023 024import org.apache.isis.applib.annotation.Encodable; 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.adapter.mgr.AdapterManager; 029import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware; 030import org.apache.isis.core.metamodel.facetapi.FacetHolder; 031import org.apache.isis.core.metamodel.facetapi.FacetUtil; 032import org.apache.isis.core.metamodel.facetapi.FeatureType; 033import org.apache.isis.core.metamodel.facets.Annotations; 034import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; 035import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet; 036import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; 037import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware; 038 039public class EncodableAnnotationFacetFactory extends FacetFactoryAbstract implements IsisConfigurationAware, ServicesInjectorAware, AdapterManagerAware { 040 041 private IsisConfiguration configuration; 042 043 private AdapterManager adapterManager; 044 private ServicesInjector servicesInjector; 045 046 public EncodableAnnotationFacetFactory() { 047 super(FeatureType.OBJECTS_ONLY); 048 } 049 050 @Override 051 public void process(final ProcessClassContext processClassContaxt) { 052 FacetUtil.addFacet(create(processClassContaxt.getCls(), processClassContaxt.getFacetHolder())); 053 } 054 055 /** 056 * Returns a {@link EncodableFacet} implementation. 057 */ 058 private EncodableFacet create(final Class<?> cls, final FacetHolder holder) { 059 060 // create from annotation, if present 061 final Encodable annotation = Annotations.getAnnotation(cls, Encodable.class); 062 if (annotation != null) { 063 final EncodableFacetAnnotation facet = new EncodableFacetAnnotation(cls, getIsisConfiguration(), holder, adapterManager, servicesInjector); 064 if (facet.isValid()) { 065 return facet; 066 } 067 } 068 069 // otherwise, try to create from configuration, if present 070 final String encoderDecoderName = EncoderDecoderUtil.encoderDecoderNameFromConfiguration(cls, getIsisConfiguration()); 071 if (!Strings.isNullOrEmpty(encoderDecoderName)) { 072 final EncodableFacetFromConfiguration facet = new EncodableFacetFromConfiguration(encoderDecoderName, holder, adapterManager, servicesInjector); 073 if (facet.isValid()) { 074 return facet; 075 } 076 } 077 078 // otherwise, no value semantic 079 return null; 080 } 081 082 // //////////////////////////////////////////////////////////////////// 083 // Injected 084 // //////////////////////////////////////////////////////////////////// 085 086 public IsisConfiguration getIsisConfiguration() { 087 return configuration; 088 } 089 090 @Override 091 public void setConfiguration(final IsisConfiguration configuration) { 092 this.configuration = configuration; 093 } 094 095 @Override 096 public void setAdapterManager(final AdapterManager adapterManager) { 097 this.adapterManager = adapterManager; 098 } 099 100 @Override 101 public void setServicesInjector(final ServicesInjector dependencyInjector) { 102 this.servicesInjector = dependencyInjector; 103 } 104 105}