package com.thinkbiganalytics.feedmgr.rest; /*- * #%L * thinkbig-metadata-rest-controller * %% * Copyright (C) 2017 ThinkBig Analytics * %% * 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. * #L% */ import com.thinkbiganalytics.feedmgr.service.datasource.DatasourceModelTransform; import com.thinkbiganalytics.metadata.api.feed.Feed; import com.thinkbiganalytics.metadata.rest.model.data.Datasource; import com.thinkbiganalytics.metadata.rest.model.feed.FeedDestination; import com.thinkbiganalytics.metadata.rest.model.feed.FeedSource; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; public class FeedLineageBuilder { Map<String, Feed> processedDomainFeeds = new HashMap<>(); Map<String, com.thinkbiganalytics.metadata.rest.model.feed.Feed> restFeeds = new HashMap<>(); Map<String, Datasource> restDatasources = new HashMap<>(); /** * The {@code Datasource} transformer */ @Nonnull private final DatasourceModelTransform datasourceTransform; private Feed domainFeed; /** * The feed model transformer */ @Nonnull private final Model model; /** * Constructs a {@code FeedLineageBuilder} for the specified feed. * * @param domainFeed the feed * @param model the feed model transformer * @param datasourceTransform the datasource transformer */ public FeedLineageBuilder(Feed domainFeed, @Nonnull final Model model, @Nonnull final DatasourceModelTransform datasourceTransform) { this.domainFeed = domainFeed; this.model = model; this.datasourceTransform = datasourceTransform; build(this.domainFeed); } public com.thinkbiganalytics.metadata.rest.model.feed.Feed build() { return build(this.domainFeed); } private Datasource buildDatasource(com.thinkbiganalytics.metadata.api.datasource.Datasource domainDatasource) { Datasource ds = restDatasources.get(domainDatasource.getId().toString()); if (ds == null) { // build the data source ds = datasourceTransform.toDatasource(domainDatasource, DatasourceModelTransform.Level.BASIC); restDatasources.put(ds.getId(), ds); //populate the Feed relationships if (domainDatasource.getFeedSources() != null) { List<com.thinkbiganalytics.metadata.rest.model.feed.Feed> feedList = new ArrayList<>(); for (com.thinkbiganalytics.metadata.api.feed.FeedSource domainSrc : domainDatasource.getFeedSources()) { com.thinkbiganalytics.metadata.rest.model.feed.Feed feed = build(domainSrc.getFeed()); feedList.add(feed); } ds.getSourceForFeeds().addAll(feedList); } if (domainDatasource.getFeedDestinations() != null) { List<com.thinkbiganalytics.metadata.rest.model.feed.Feed> feedList = new ArrayList<>(); for (com.thinkbiganalytics.metadata.api.feed.FeedDestination domainDest : domainDatasource.getFeedDestinations()) { com.thinkbiganalytics.metadata.rest.model.feed.Feed feed = build(domainDest.getFeed()); feedList.add(feed); } ds.getDestinationForFeeds().addAll(feedList); } } return ds; } private com.thinkbiganalytics.metadata.rest.model.feed.Feed build(Feed domainFeed) { com.thinkbiganalytics.metadata.rest.model.feed.Feed feed = restFeeds.containsKey(domainFeed.getId().toString()) ? restFeeds.get(domainFeed.getId().toString()) : model.domainToFeed(domainFeed); restFeeds.put(feed.getId(), feed); @SuppressWarnings("unchecked") List<? extends com.thinkbiganalytics.metadata.api.feed.FeedSource> sources = domainFeed.getSources(); Set<FeedSource> feedSources = new HashSet<FeedSource>(); if (sources != null) { sources.stream().forEach(feedSource -> { FeedSource src = new FeedSource(); Datasource ds = buildDatasource(feedSource.getDatasource()); src.setDatasource(ds); feedSources.add(src); }); } feed.setSources(feedSources); Set<FeedDestination> feedDestinations = new HashSet<FeedDestination>(); List<? extends com.thinkbiganalytics.metadata.api.feed.FeedDestination> destinations = domainFeed.getDestinations(); if (destinations != null) { destinations.stream().forEach(feedDestination -> { FeedDestination dest = new FeedDestination(); Datasource ds = buildDatasource(feedDestination.getDatasource()); dest.setDatasource(ds); feedDestinations.add(dest); }); } feed.setDestinations(feedDestinations); if (domainFeed.getDependentFeeds() != null) { List<Feed> depFeeds = domainFeed.getDependentFeeds(); depFeeds.stream().forEach(depFeed -> { com.thinkbiganalytics.metadata.rest.model.feed.Feed restFeed = restFeeds.get(depFeed.getId().toString()); if (restFeed == null) { com.thinkbiganalytics.metadata.rest.model.feed.Feed depRestFeed = model.domainToFeed(depFeed); restFeeds.put(depRestFeed.getId(), depRestFeed); feed.getDependentFeeds().add(depRestFeed); build(depFeed); } else { feed.getDependentFeeds().add(restFeed); } }); } if (domainFeed.getUsedByFeeds() != null) { List<Feed> usedByFeeds = domainFeed.getUsedByFeeds(); usedByFeeds.stream().forEach(usedByFeed -> { com.thinkbiganalytics.metadata.rest.model.feed.Feed restFeed = restFeeds.get(usedByFeed.getId().toString()); if (restFeed == null) { com.thinkbiganalytics.metadata.rest.model.feed.Feed usedByRestFeed = model.domainToFeed(usedByFeed); restFeeds.put(usedByRestFeed.getId(), usedByRestFeed); feed.getUsedByFeeds().add(usedByRestFeed); build(usedByFeed); } else { feed.getUsedByFeeds().add(restFeed); } }); } return feed; } }