All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.metacat.common.server.converter.ConverterUtil Maven / Gradle / Ivy

The newest version!
/*
 *
 *  Copyright 2017 Netflix, Inc.
 *
 *     Licensed under the Apache License, Version 2.0 (the "License");
 *     you may not use this file except in compliance with the License.
 *     You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *     Unless required by applicable law or agreed to in writing, software
 *     distributed under the License is distributed on an "AS IS" BASIS,
 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *     See the License for the specific language governing permissions and
 *     limitations under the License.
 *
 */
package com.netflix.metacat.common.server.converter;

import com.google.common.collect.Maps;
import com.netflix.metacat.common.MetacatRequestContext;
import com.netflix.metacat.common.dto.AuditDto;
import com.netflix.metacat.common.dto.CatalogDto;
import com.netflix.metacat.common.dto.ClusterDto;
import com.netflix.metacat.common.dto.DatabaseDto;
import com.netflix.metacat.common.dto.FieldDto;
import com.netflix.metacat.common.dto.GetPartitionsRequestDto;
import com.netflix.metacat.common.dto.ViewDto;
import com.netflix.metacat.common.dto.Pageable;
import com.netflix.metacat.common.dto.PartitionDto;
import com.netflix.metacat.common.dto.PartitionsSaveRequestDto;
import com.netflix.metacat.common.dto.PartitionsSaveResponseDto;
import com.netflix.metacat.common.dto.Sort;
import com.netflix.metacat.common.dto.StorageDto;
import com.netflix.metacat.common.dto.TableDto;
import com.netflix.metacat.common.server.connectors.ConnectorRequestContext;
import com.netflix.metacat.common.server.connectors.model.AuditInfo;
import com.netflix.metacat.common.server.connectors.model.CatalogInfo;
import com.netflix.metacat.common.server.connectors.model.ClusterInfo;
import com.netflix.metacat.common.server.connectors.model.DatabaseInfo;
import com.netflix.metacat.common.server.connectors.model.FieldInfo;
import com.netflix.metacat.common.server.connectors.model.ViewInfo;
import com.netflix.metacat.common.server.connectors.model.PartitionInfo;
import com.netflix.metacat.common.server.connectors.model.PartitionListRequest;
import com.netflix.metacat.common.server.connectors.model.PartitionsSaveRequest;
import com.netflix.metacat.common.server.connectors.model.PartitionsSaveResponse;
import com.netflix.metacat.common.server.connectors.model.StorageInfo;
import com.netflix.metacat.common.server.connectors.model.TableInfo;
import lombok.NonNull;
import org.dozer.CustomConverter;
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.dozer.loader.api.BeanMappingBuilder;
import org.dozer.loader.api.FieldsMappingOptions;
import org.dozer.loader.api.TypeMappingOptions;

import javax.annotation.Nonnull;
import java.util.List;
import java.util.Map;

/**
 * Mapper from Dto to Connector Info.
 *
 * @author amajumdar
 * @since 1.0.0
 */
public class ConverterUtil {
    private static final String ID_TYPE_CONVERTER = "typeConverter";
    private static final String ID_JSON_TYPE_CONVERTER = "jsonTypeConverter";
    private final Mapper mapper;

    /**
     * Constructor.
     *
     * @param dozerTypeConverter custom dozer converter for types
     * @param dozerJsonTypeConverter custom dozer converter for types to JSON format
     */
    public ConverterUtil(@Nonnull @NonNull final DozerTypeConverter dozerTypeConverter,
                         @Nonnull @NonNull final DozerJsonTypeConverter dozerJsonTypeConverter) {
        final DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
        final BeanMappingBuilder builder = new BeanMappingBuilder() {
            @Override
            protected void configure() {
                mapping(FieldDto.class, FieldInfo.class, TypeMappingOptions.oneWay())
                    .fields("type", "type", FieldsMappingOptions.customConverterId(ID_TYPE_CONVERTER))
                    .fields("partition_key", "partitionKey", FieldsMappingOptions.copyByReference())
                    .fields("source_type", "sourceType", FieldsMappingOptions.copyByReference());
                mapping(FieldInfo.class, FieldDto.class, TypeMappingOptions.oneWay())
                    .fields("type", "type", FieldsMappingOptions.customConverterId(ID_TYPE_CONVERTER))
                    .fields("partitionKey", "partition_key", FieldsMappingOptions.copyByReference())
                    .fields("sourceType", "source_type", FieldsMappingOptions.copyByReference())
                    .fields("type", "jsonType", FieldsMappingOptions.customConverterId(ID_JSON_TYPE_CONVERTER));
                mapping(TableDto.class, TableInfo.class)
                    .fields("name", "name", FieldsMappingOptions.copyByReference());
                mapping(DatabaseDto.class, DatabaseInfo.class)
                    .fields("name", "name", FieldsMappingOptions.copyByReference());
                mapping(PartitionDto.class, PartitionInfo.class)
                    .fields("name", "name", FieldsMappingOptions.copyByReference());
                mapping(CatalogDto.class, CatalogInfo.class);
                mapping(ClusterDto.class, ClusterInfo.class);
                mapping(AuditDto.class, AuditInfo.class);
                mapping(ViewDto.class, ViewInfo.class);
                mapping(StorageDto.class, StorageInfo.class);
            }
        };
        dozerBeanMapper.addMapping(builder);
        final Map customConverterMap = Maps.newHashMap();
        customConverterMap.put(ID_TYPE_CONVERTER, dozerTypeConverter);
        customConverterMap.put(ID_JSON_TYPE_CONVERTER, dozerJsonTypeConverter);
        dozerBeanMapper.setCustomConvertersWithId(customConverterMap);
        this.mapper = dozerBeanMapper;
    }

    /**
     * Converts from CatalogInfo to CatalogDto.
     *
     * @param catalogInfo connector catalog info
     * @return catalog dto
     */
    public CatalogDto toCatalogDto(final CatalogInfo catalogInfo) {
        return this.mapper.map(catalogInfo, CatalogDto.class);
    }

    /**
     * Converts from CatalogDto to CatalogInfo.
     *
     * @param catalogDto catalog dto
     * @return connector catalog info
     */
    public CatalogInfo fromCatalogDto(final CatalogDto catalogDto) {
        return this.mapper.map(catalogDto, CatalogInfo.class);
    }

    /**
     * Converts from ClusterInfo to ClusterDto.
     *
     * @param clusterInfo catalog cluster info
     * @return cluster dto
     */
    public ClusterDto toClusterDto(final ClusterInfo clusterInfo) {
        return this.mapper.map(clusterInfo, ClusterDto.class);
    }

    /**
     * Converts from ClusterDto to ClusterInfo.
     *
     * @param clusterDto catalog cluster dto
     * @return cluster info
     */
    public ClusterInfo fromClusterDto(final ClusterDto clusterDto) {
        return this.mapper.map(clusterDto, ClusterInfo.class);
    }

    /**
     * Converts from DatabaseInfo to DatabaseDto.
     *
     * @param databaseInfo connector table info
     * @return database dto
     */
    public DatabaseDto toDatabaseDto(final DatabaseInfo databaseInfo) {
        return this.mapper.map(databaseInfo, DatabaseDto.class);
    }

    /**
     * Converts from TableDto to TableInfo.
     *
     * @param databaseDto database dto
     * @return connector database info
     */
    public DatabaseInfo fromDatabaseDto(final DatabaseDto databaseDto) {
        return this.mapper.map(databaseDto, DatabaseInfo.class);
    }

    /**
     * Converts from TableInfo to TableDto.
     *
     * @param tableInfo connector table info
     * @return table dto
     */
    public TableDto toTableDto(final TableInfo tableInfo) {
        final TableDto result = this.mapper.map(tableInfo, TableDto.class);
        //TODO: Add this logic in the mapping
        final List fields = result.getFields();
        if (fields != null) {
            int index = 0;
            for (final FieldDto field : fields) {
                field.setPos(index++);
            }
        }
        return result;
    }

    /**
     * Converts from TableDto to TableInfo.
     *
     * @param tableDto table dto
     * @return connector table info
     */
    public TableInfo fromTableDto(final TableDto tableDto) {
        return mapper.map(tableDto, TableInfo.class);
    }

    /**
     * Converts from PartitionInfo to PartitionDto.
     *
     * @param partitionInfo connector partition info
     * @return partition dto
     */
    public PartitionDto toPartitionDto(final PartitionInfo partitionInfo) {
        return mapper.map(partitionInfo, PartitionDto.class);
    }

    /**
     * Converts from PartitionDto to PartitionInfo.
     *
     * @param partitionDto partition dto
     * @return connector partition info
     */
    public PartitionInfo fromPartitionDto(final PartitionDto partitionDto) {
        return mapper.map(partitionDto, PartitionInfo.class);
    }

    /**
     * Creates the connector context.
     *
     * @param metacatRequestContext request context
     * @return connector context
     */
    public ConnectorRequestContext toConnectorContext(final MetacatRequestContext metacatRequestContext) {
        return mapper.map(metacatRequestContext, ConnectorRequestContext.class);
    }

    /**
     * Creates the partition list connector request.
     *
     * @param partitionsRequestDto request containing the filter and other properties used for listing
     * @param pageable             pageable info
     * @param sort                 sort info
     * @return connector request
     */
    public PartitionListRequest toPartitionListRequest(final GetPartitionsRequestDto partitionsRequestDto,
                                                       final Pageable pageable, final Sort sort) {
        if (partitionsRequestDto != null) {
            if (partitionsRequestDto.getIncludePartitionDetails() == null) {
                partitionsRequestDto.setIncludePartitionDetails(false);
            }
            if (partitionsRequestDto.getIncludeAuditOnly() == null) {
                partitionsRequestDto.setIncludeAuditOnly(false);
            }
            final PartitionListRequest result = mapper.map(partitionsRequestDto, PartitionListRequest.class);
            result.setPageable(pageable);
            result.setSort(sort);
            return result;
        } else {
            return new PartitionListRequest(null, null, false, pageable, sort, false);
        }
    }

    /**
     * Creates the partition list connector request.
     *
     * @param partitionsRequestDto request containing the save request information
     * @return connector request
     */
    public PartitionsSaveRequest toPartitionsSaveRequest(final PartitionsSaveRequestDto partitionsRequestDto) {
        return mapper.map(partitionsRequestDto, PartitionsSaveRequest.class);
    }

    /**
     * Creates the partition list connector request.
     *
     * @param partitionsSaveResponse response on saving partitions
     * @return response dto
     */
    public PartitionsSaveResponseDto toPartitionsSaveResponseDto(final PartitionsSaveResponse partitionsSaveResponse) {
        return mapper.map(partitionsSaveResponse, PartitionsSaveResponseDto.class);
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy