class OutputRedisTopology(Topology):

    files_spout = IterFilesMailSpout.spec(name="iter-files-mails")

    tokenizer = Tokenizer.spec(name="tokenizer", inputs=[files_spout], par=2)

    attachments = Attachments.spec(
        name="attachments",
        inputs={tokenizer['attachments']: Grouping.fields('sha256_random')},
        par=2)

    urls = Urls.spec(name="urls",
                     inputs={
                         attachments: Grouping.fields('sha256_random'),
                         tokenizer['body']: Grouping.fields('sha256_random')
                     },
                     par=2)

    phishing = Phishing.spec(name="phishing",
                             inputs={
                                 attachments:
                                 Grouping.fields('sha256_random'),
                                 tokenizer['mail']:
                                 Grouping.fields('sha256_random'),
                                 urls:
                                 Grouping.fields('sha256_random')
                             })

    network = Network.spec(
        name="network",
        inputs={tokenizer['network']: Grouping.fields('sha256_random')},
        par=1)

    raw_mail = RawMail.spec(
        name="raw_mail",
        inputs={tokenizer['raw_mail']: Grouping.fields('sha256_random')},
        par=2)

    json_maker = JsonMaker.spec(name="json_maker",
                                inputs={
                                    attachments:
                                    Grouping.fields('sha256_random'),
                                    network:
                                    Grouping.fields('sha256_random'),
                                    phishing:
                                    Grouping.fields('sha256_random'),
                                    raw_mail:
                                    Grouping.fields('sha256_random'),
                                    tokenizer['mail']:
                                    Grouping.fields('sha256_random'),
                                    urls:
                                    Grouping.fields('sha256_random')
                                },
                                par=2)

    output_redis = OutputRedis.spec(name="output-redis", inputs=[json_maker])
class OutputElasticsearchTopology(Topology):

    files_spout = FilesMailSpout.spec(name="files-mails")

    tokenizer = Tokenizer.spec(name="tokenizer", inputs=[files_spout], par=1)

    attachments = Attachments.spec(
        name="attachments",
        inputs={tokenizer['attachments']: Grouping.fields('sha256_random')},
        par=2)

    urls_body = UrlsHandlerBody.spec(
        name="urls-handler-body",
        inputs={tokenizer['body']: Grouping.fields('sha256_random')})

    urls_attachments = UrlsHandlerAttachments.spec(
        name="urls-handler-attachments",
        inputs={attachments: Grouping.fields('sha256_random')})

    phishing = Phishing.spec(name="phishing",
                             inputs={
                                 tokenizer['mail']:
                                 Grouping.fields('sha256_random'),
                                 attachments:
                                 Grouping.fields('sha256_random'),
                                 urls_body:
                                 Grouping.fields('sha256_random'),
                                 urls_attachments:
                                 Grouping.fields('sha256_random')
                             })

    forms = Forms.spec(
        name="forms",
        inputs={tokenizer['body']: Grouping.fields('sha256_random')})

    network = Network.spec(
        name="network",
        inputs={tokenizer['network']: Grouping.fields('sha256_random')},
        par=2)

    json = JsonMaker.spec(name="json",
                          inputs={
                              tokenizer['mail']:
                              Grouping.fields('sha256_random'),
                              phishing: Grouping.fields('sha256_random'),
                              attachments: Grouping.fields('sha256_random'),
                              forms: Grouping.fields('sha256_random'),
                              network: Grouping.fields('sha256_random'),
                              urls_body: Grouping.fields('sha256_random'),
                              urls_attachments:
                              Grouping.fields('sha256_random')
                          })

    output_elasticsearch = OutputElasticsearch.spec(
        name="output-elasticsearch", inputs=[json], par=1)