powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенести Java код на Groovy
6 сообщений из 6, страница 1 из 1
Перенести Java код на Groovy
    #40031113
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю проект в 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
Перенести Java код на Groovy
    #40031239
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wasteland Rebel,

если бы ты дал примеры что на входе и что ожидаешь на выходе - было бы легче
...
Рейтинг: 0 / 0
Перенести Java код на Groovy
    #40031242
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор не задал вопроса. Выбор - это не вопрос. Так он бы пришел сюда и спросил - я вот думаю жениться мне или еще
погулять холостяком.
...
Рейтинг: 0 / 0
Перенести Java код на Groovy
    #40031352
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, извиняюсь за неполноценный код, вот так должно быть лучше:
Код: 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
Перенести Java код на Groovy
    #40031449
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перенести Java код на Groovy
    #40031650
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry. ,
Благодарю, видел ваш (я так полагаю?) ответ на stackoverflow, всё прекрасно работает.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенести Java код на Groovy
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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