001// Licensed to the Apache Software Foundation (ASF) under one
002// or more contributor license agreements.  See the NOTICE file
003// distributed with this work for additional information
004// regarding copyright ownership.  The ASF licenses this file
005// to you under the Apache License, Version 2.0 (the
006// "License"); you may not use this file except in compliance
007// with the License.  You may obtain a copy of the License at
008//
009// http://www.apache.org/licenses/LICENSE-2.0
010//
011// Unless required by applicable law or agreed to in writing,
012// software distributed under the License is distributed on an
013// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
014// KIND, either express or implied.  See the License for the
015// specific language governing permissions and limitations
016// under the License.
017package org.apache.tapestry5.rest.jackson.internal;
018
019import java.lang.reflect.Method;
020import java.lang.reflect.Parameter;
021import java.util.Set;
022
023import org.apache.tapestry5.json.JSONObject;
024import org.apache.tapestry5.services.rest.MappedEntityManager;
025import org.apache.tapestry5.services.rest.OpenApiTypeDescriber;
026
027import com.github.victools.jsonschema.generator.SchemaGenerator;
028
029/**
030 * {@link OpenApiTypeDescriber} implementation using 
031 * <a href="https://victools.github.io/jsonschema-generator/#introduction">Java JSONSchema Generator</a>,
032 * by default generating JSON Schema 2019-09.
033 */
034public class JacksonOpenApiTypeDescriber implements OpenApiTypeDescriber 
035{
036    
037    final private SchemaGenerator schemaGenerator;
038    final Set<Class<?>> entities;
039    public JacksonOpenApiTypeDescriber(SchemaGenerator schemaGenerator, MappedEntityManager mappedEntityManager) {
040        super();
041        this.schemaGenerator = schemaGenerator;
042        entities = mappedEntityManager.getEntities();
043    }
044
045    @Override
046    public void describe(JSONObject description, Parameter parameter) 
047    {
048    }
049
050    @Override
051    public void describeReturnType(JSONObject description, Method method) 
052    {
053    }
054
055    @Override
056    public void describeSchema(Class<?> entity, JSONObject schemas) 
057    {
058        if (entities.contains(entity))
059        {
060            final JSONObject schema = new JSONObject(
061                    schemaGenerator.generateSchema(entity).toString());
062            schema.remove("$schema");
063            schemas.put(getSchemaName(entity), schema);
064        }
065    }
066    
067    private String getSchemaName(final Class<?> returnType) {
068        return returnType.getSimpleName();
069    }
070
071}