/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
 digraph g {

  graph [compound = true];

  //presentation
  splines = true;
  overlap = false;
  rankdir = TB;

  subgraph cluster_generators {
    label="generators";
    generators_youtube [label="https://api.youtube.com"]
    generators_instagram [label="https://api.instagram.com"]
  }

  subgraph cluster_providers {
    label="providers";
    subgraph cluster_providers_youtube {
      label="youtube";
      providers_youtube_channel [label="YoutubeChannelProvider"]
      providers_youtube_video [label="YoutubeUserActivityProvider"]
    }
    subgraph cluster_providers_instagram{
      label="instagram";
      providers_instagram_userinfo [label="InstagramUserInfoCollector"]
      providers_instagram_media [label="InstagramRecentMediaCollector"]
    }
  }

  subgraph cluster_processors {
    label="processors";
    processors_youtube_activity [label="YoutubeTypeConverter"]
    processors_youtube_activityobject [label="YoutubeTypeConverter"]
    processors_instagram_activity [label="InstagramTypeConverter"]
    processors_instagram_activityobject [label="InstagramTypeConverter"]
  }

  subgraph cluster_persisters_1 {
    label="persisters";
    persisters_kinesis_writer [label="KinesisPersistWriter"]
    persisters_kinesis_writer [label="KinesisPersistWriter"]
  }

  subgraph cluster_queues {
    label="queues";
    kinesis [label="kinesis://", shape="trapezium"]
  }
  subgraph cluster_persisters_2 {
    label="persisters";
    persisters_elasticsearch [label="ElasticsearchPersistWriter"]
    persisters_hdfs [label="WebHdfsPersistWriter"]
    persisters_kinesis_reader [label="KinesisPersistReader"]
    persisters_kinesis_reader [label="KinesisPersistReader"]
  }

  subgraph cluster_dbs {
    label="dbs";
    elasticsearch [label="elasticsearch", shape="cylinder"]
    hdfs [label="hdfs", shape="tab"]
  }

  generators_youtube -> providers_youtube_channel
  generators_youtube -> providers_youtube_video
  providers_youtube_channel -> processors_youtube_activityobject [label="o.a.s.y.Channel"]
  providers_youtube_video -> processors_youtube_activity [label="o.a.s.y.Video"]

  generators_instagram -> providers_instagram_userinfo
  generators_instagram -> providers_instagram_media
  providers_instagram_userinfo -> processors_instagram_activityobject [label="o.a.s.i.UserInfoData"]
  providers_instagram_media -> processors_instagram_activity [label="o.a.s.i.MediaFeedData"]

  processors_youtube_activityobject -> persisters_kinesis_writer [label="o.a.s.p.j.Page"]
  processors_youtube_activity -> persisters_kinesis_writer [label="o.a.s.p.j.Video\no.a.s.p.j.Comment"]
  processors_instagram_activityobject -> persisters_kinesis_writer [label="o.a.s.p.j.Page"]
  processors_instagram_activity -> persisters_kinesis_writer [label="o.a.s.p.j.Photo\no.a.s.p.j.Video\no.a.s.p.j.Comment"]

  persisters_kinesis_writer -> kinesis -> persisters_kinesis_reader [label="o.a.s.p.j.Activity"]
  persisters_kinesis_writer -> kinesis -> persisters_kinesis_reader [label="o.a.s.p.j.ActivityObject"]

  persisters_kinesis_reader -> persisters_elasticsearch
  persisters_kinesis_reader -> persisters_hdfs

  persisters_elasticsearch -> elasticsearch [label="es://"]
  persisters_hdfs -> hdfs [label="hdfs://"]

}
