| /* |
| * Copyright (c) 2010-2018 BSI Business Systems Integration AG. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * BSI Business Systems Integration AG - initial API and implementation |
| */ |
| package org.eclipse.scout.rt.jackson.dataobject; |
| |
| import org.eclipse.scout.rt.dataobject.DataObjectInventory; |
| import org.eclipse.scout.rt.dataobject.DoEntity; |
| import org.eclipse.scout.rt.dataobject.IDoEntity; |
| import org.eclipse.scout.rt.platform.BEANS; |
| import org.eclipse.scout.rt.platform.Bean; |
| |
| import com.fasterxml.jackson.annotation.JsonTypeInfo; |
| import com.fasterxml.jackson.databind.AnnotationIntrospector; |
| import com.fasterxml.jackson.databind.JavaType; |
| import com.fasterxml.jackson.databind.cfg.MapperConfig; |
| import com.fasterxml.jackson.databind.introspect.AnnotatedClass; |
| import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; |
| import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; |
| import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder; |
| |
| /** |
| * Jackson {@link AnnotationIntrospector} implementation adding type resolver for all {@link IDoEntity} data object |
| * instances. |
| */ |
| @Bean |
| public class DataObjectAnnotationIntrospector extends JacksonAnnotationIntrospector { |
| |
| private static final long serialVersionUID = 1L; |
| |
| protected ScoutDataObjectModuleContext m_moduleContext; |
| |
| public DataObjectAnnotationIntrospector withModuleContext(ScoutDataObjectModuleContext moduleContext) { |
| m_moduleContext = moduleContext; |
| return this; |
| } |
| |
| @Override |
| public TypeResolverBuilder<?> findTypeResolver(MapperConfig<?> config, AnnotatedClass ac, JavaType baseType) { |
| if (!(ac.getRawType() == DoEntity.class) && !(ac.getRawType() == IDoEntity.class) && !BEANS.get(DataObjectInventory.class).hasTypeName(ac.getRawType())) { |
| return StdTypeResolverBuilder.noTypeInfoBuilder(); |
| } |
| if (IDoEntity.class.isAssignableFrom(ac.getRawType())) { |
| DataObjectTypeResolverBuilder doTypeResolverBuilder = BEANS.get(DataObjectTypeResolverBuilder.class); |
| doTypeResolverBuilder.init(JsonTypeInfo.Id.NAME, BEANS.get(DataObjectTypeIdResolver.class)); |
| doTypeResolverBuilder.inclusion(JsonTypeInfo.As.PROPERTY); |
| doTypeResolverBuilder.typeProperty(m_moduleContext.getTypeAttributeName()); |
| return doTypeResolverBuilder; |
| } |
| return super.findTypeResolver(config, ac, baseType); |
| } |
| } |