Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенести Java код на Groovy / 6 сообщений из 6, страница 1 из 1
25.12.2020, 14:36
    #40031113
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Делаю проект в Apache NiFi, точнее переношу Java код в NiFi. Есть один класс, который довольно тяжело реализовать на NiFi.
Логика в классе такая: на вход поступает строка, она разбивается на пару ключ/значение, ключ при этом преобразовывается в другой формат. И есть второй "главный" метод, который запаковывает мапу в строку.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@Service
@Setter
@Getter
public class GaUtmFactoryService {

    private static final String INVALID_MACRO_FOOTPRINTS = "^.*[{\\[%]+.+[}\\]%].*$";

    private Map<String, String> conversionTableWithCsKey;

    public Map<String, String> extractUtmMarks(String utmMarks) {
        if (utmMarks == null || utmMarks.isBlank()) {
            return Collections.emptyMap();
        }
        return Arrays.stream(utmMarks.split("\\s*&\\s*"))
                .map(s -> s.trim().split("\\s*=\\s*"))
                .filter(this::isUtmMarksValid)
                .collect(Collectors.toMap(
                        key -> convertCsUtmMarkToGa(key[0]),
                        value -> value[1],
                        (val1, val2) -> val2)
                );
    }

    private boolean isUtmMarksValid(String[] utmMarks) {
        return utmMarks.length == 2
                && !convertCsUtmMarkToGa(utmMarks[0]).isBlank()
                && !utmMarks[1].isBlank()
                && Arrays.stream(utmMarks).noneMatch(this::isUtmMarkContainsInvalidChars);
    }

    public String packUtmMarksIntoString(Map<String, String> utmMarks) {
        if (utmMarks == null || utmMarks.isEmpty()) {
            return "";
        }
        return Joiner.on("&").withKeyValueSeparator("=").join(utmMarks);
    }

    private boolean isUtmMarkContainsInvalidChars(String utmMark) {
        return utmMark.matches(INVALID_MACRO_FOOTPRINTS)
                || !StandardCharsets.US_ASCII.newEncoder().canEncode(utmMark);
    }

    private String convertCsUtmMarkToGa(String utmMark) {
        return conversionTableWithCsKey.getOrDefault(utmMark, "");
    }

}


В NiFi есть возможность писать свои процессоры, но это довольно муторно, тем более такой процессор под мою задачу не будет универсальным.

Сейчас у меня два варианта: написать скрипт на Groovy/Python/Ruby, который дублирует функционал класса выше (NiFi это поддерживает), либо делать микросервис (некий endpoint из 1 класса, ага), который будет заниматься только тем, что описано в классе. И соответственно осуществлять к нему обращение посредством запросов.

Нужен совет тех, кто работал с NiFi/Groovy, если здесь есть такие люди.

И заранее извиняюсь, если создал тему не в том месте.
...
Рейтинг: 0 / 0
25.12.2020, 20:17
    #40031239
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Wasteland Rebel,

если бы ты дал примеры что на входе и что ожидаешь на выходе - было бы легче
...
Рейтинг: 0 / 0
25.12.2020, 20:32
    #40031242
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Автор не задал вопроса. Выбор - это не вопрос. Так он бы пришел сюда и спросил - я вот думаю жениться мне или еще
погулять холостяком.
...
Рейтинг: 0 / 0
26.12.2020, 12:20
    #40031352
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Да, извиняюсь за неполноценный код, вот так должно быть лучше:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
public class GaUtmFactoryService {

    private static final String INVALID_MACRO_FOOTPRINTS = "^.*[{\\[%]+.+[}\\]%].*$";

    public Map<String, String> extractUtmMarks(String utmMarks) {
        if (utmMarks == null || utmMarks.isBlank()) {
            return Collections.emptyMap();
        }
        return Arrays.stream(utmMarks.split("\\s*&\\s*"))
                .map(s -> s.trim().split("\\s*=\\s*"))
                .filter(this::isUtmMarksValid)
                .collect(Collectors.toMap(
                        key -> convertCsUtmMarkToGa(key[0]),
                        value -> value[1],
                        (val1, val2) -> val2)
                );
    }

    
    private boolean isUtmMarksValid(String[] utmMarks) {
        return utmMarks.length == 2
                && !convertCsUtmMarkToGa(utmMarks[0]).isBlank()
                && !utmMarks[1].isBlank()
                && Arrays.stream(utmMarks).noneMatch(this::isUtmMarkContainsInvalidChars);
    }

    private boolean isUtmMarkContainsInvalidChars(String utmMark) {
        return utmMark.matches(INVALID_MACRO_FOOTPRINTS)
                || !StandardCharsets.US_ASCII.newEncoder().canEncode(utmMark);
    }

   
    private String convertCsUtmMarkToGa(String utmMark) {
       switch (utmMark) {
            case "utm_medium":
                return "ga:medium";
            case "utm_campaign":
                return "ga:campaign";
            case "utm_source":
                return "ga:source";
            case "utm_content":
                return "ga:adContent";
            case "utm_term":
                return "ga:keyword";
            case "utm_target":
            case "utm_a":
                return "";
            default:
                return rowUtmMarks;
        }
    }

}


Примерное использование извне:
Код: java
1.
2.
3.
4.
5.
6.
public Map<String, String> getConvertedMarks() {
   GaUtmFactoryService gaUtmFactoryService = new GaUtmFactoryService();
   String utmMarks = "utm_campaign=toyota&utm_content=multiformat_sites&utm_medium=cpc&utm_source=facebook";
   Map<String, String> converted = gaUtmFactoryService.extractUtmMarks(utmMarks);
   return converted;
}


Т.е. строка
Код: java
1.
utm_campaign=toyota&utm_content=multiformat_sites&utm_medium=cpc&utm_source=facebook

должна преобразоваться в мапу:
Код: java
1.
{ga:campaign=toyota, ga:adContent=multiformat_sites, ga:medium=cpc, ga:source=facebook}
...
Рейтинг: 0 / 0
26.12.2020, 21:54
    #40031449
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Wasteland Rebel,

как-то так

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
String utmMarks = "utm_campaign=toyota&utm_content=multiformat_sites&utm_medium=cpc&utm_source=facebook"
Map<String, String> converted = utmMarks
    .split("\\s*&\\s*")  //# to array
    .collectEntries{ 
            //# convert each item to map entry
            String[] kv = it.split("\\s*=\\s*")
            kv[0] = [
                "utm_medium"   : "ga:medium",
                "utm_campaign" : "ga:campaign",
                "utm_source"   : "ga:source",
                "utm_content"  : "ga:adContent",
                "utm_term"     : "ga:keyword",
            ].get( kv[0] )
            kv
        }
    .findAll{ k,v-> k } //# filter out empty/null keys



осталось засунуть это в нифи скрипт
...
Рейтинг: 0 / 0
27.12.2020, 23:39
    #40031650
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенести Java код на Groovy
Dmitry. ,
Благодарю, видел ваш (я так полагаю?) ответ на stackoverflow, всё прекрасно работает.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенести Java код на Groovy / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]