From 7e788445c011ce450ca93d9bf626cedcb93e0156 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Tue, 24 Dec 2024 18:32:28 -0500 Subject: [PATCH 1/6] snapshot --- .../nostr/event/impl/CalendarContent.java | 24 +++++++++---------- .../event/impl/CalendarTimeBasedEvent.java | 21 +++++++++------- .../event/impl/ClassifiedListingEvent.java | 1 + .../java/nostr/test/event/ApiEventTest.java | 8 +++---- .../java/nostr/test/event/NIP52ImplTest.java | 10 ++++---- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java b/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java index 41204381d..4df55c40f 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java @@ -20,25 +20,25 @@ @EqualsAndHashCode(callSuper = false) public class CalendarContent extends AbstractEventContent { //@JsonProperty - private final String id; + private String id; // below fields mandatory - private final IdentifierTag identifierTag; - private final String title; - private final Long start; + private IdentifierTag identifierTag; + private String title; + private Long start; // below fields optional - private Long end; - private String startTzid; - private String endTzid; +// private Long end; +// private String startTzid; +// private String endTzid; private String summary; - private String image; +// private String image; private String location; - private GeohashTag geohashTag; +// private GeohashTag geohashTag; private List participantPubKeys; - private List labels; - private List hashtagTags; - private List referenceTags; +// private List labels; +// private List hashtagTags; +// private List referenceTags; public static CalendarContentBuilder builder(@NonNull IdentifierTag identifierTag, @NonNull String title, @NonNull Long start) { return new CalendarContentBuilder() diff --git a/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java b/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java index 812f73146..45204d499 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java @@ -20,6 +20,7 @@ import nostr.event.impl.CalendarTimeBasedEvent.CalendarTimeBasedEventDeserializer; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; +import nostr.util.NostrUtil; import java.io.IOException; import java.util.HashMap; @@ -42,20 +43,24 @@ public CalendarTimeBasedEvent(@NonNull PublicKey sender, @NonNull List } private void mapCustomTags() { +// below, required addStandardTag(calendarContent.getIdentifierTag()); addGenericTag("title", getNip(), calendarContent.getTitle()); addGenericTag("start", getNip(), calendarContent.getStart()); - addGenericTag("end", getNip(), calendarContent.getEnd()); - addGenericTag("start_tzid", getNip(), calendarContent.getStartTzid()); - addGenericTag("end_tzid", getNip(), calendarContent.getEndTzid()); + +// below, optional +// addGenericTag("end", getNip(), calendarContent.getEnd()); +// addGenericTag("start_tzid", getNip(), calendarContent.getStartTzid()); +// addGenericTag("end_tzid", getNip(), calendarContent.getEndTzid()); addGenericTag("summary", getNip(), calendarContent.getSummary()); - addGenericTag("image", getNip(), calendarContent.getImage()); +// addGenericTag("image", getNip(), calendarContent.getImage()); addGenericTag("location", getNip(), calendarContent.getLocation()); - addStandardTag(calendarContent.getGeohashTag()); +// addStandardTag(calendarContent.getGeohashTag()); addStandardTag(calendarContent.getParticipantPubKeys()); - addStringListTag("l", getNip(), calendarContent.getLabels()); - addStandardTag(calendarContent.getHashtagTags()); - addStandardTag(calendarContent.getReferenceTags()); + +// addStringListTag("l", getNip(), calendarContent.getLabels()); +// addStandardTag(calendarContent.getHashtagTags()); +// addStandardTag(calendarContent.getReferenceTags()); } public static class CalendarTimeBasedEventDeserializer extends StdDeserializer { diff --git a/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java b/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java index 6d392578a..18733865c 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java @@ -98,6 +98,7 @@ public ClassifiedListingEvent deserialize(JsonParser jsonParser, Deserialization getTagValueFromString(genericTags, "summary"), priceTag) .build(); + classifiedListing.setLocation(getTagValueFromString(genericTags, "location")); Map generalMap = new HashMap<>(); classifiedListingEventNode.fields().forEachRemaining(generalTag -> diff --git a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java index a146f0d25..f10124cb8 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java @@ -320,10 +320,10 @@ public void testNIP52CalendarTimeBasedEventEvent() throws IOException { "Calendar Time-Based Event title", 1716513986268L).build(); - calendarContent.setStartTzid("1687765220"); - calendarContent.setEndTzid("1687765230"); - - calendarContent.setLabels(List.of("english", "mycenaean greek")); +// calendarContent.setStartTzid("1687765220"); +// calendarContent.setEndTzid("1687765230"); +// +// calendarContent.setLabels(List.of("english", "mycenaean greek")); List tags = new ArrayList<>(); tags.add(new PubKeyTag(new PublicKey("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76985"), diff --git a/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java b/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java index e4400f76f..3e08ad91d 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java @@ -55,12 +55,12 @@ static void setup() { .build(); timeBasedCalendarContent.setParticipantPubKeys(List.of(P_1_TAG, P_2_TAG)); - timeBasedCalendarContent.setGeohashTag(G_TAG); - timeBasedCalendarContent.setHashtagTags(List.of(T_TAG)); - timeBasedCalendarContent.setStartTzid(CALENDAR_TIME_BASED_EVENT_START_TZID); - timeBasedCalendarContent.setEndTzid(START.toString()); +// timeBasedCalendarContent.setGeohashTag(G_TAG); +// timeBasedCalendarContent.setHashtagTags(List.of(T_TAG)); +// timeBasedCalendarContent.setStartTzid(CALENDAR_TIME_BASED_EVENT_START_TZID); +// timeBasedCalendarContent.setEndTzid(START.toString()); Long l = START + 100L; - timeBasedCalendarContent.setEndTzid(l.toString()); +// timeBasedCalendarContent.setEndTzid(l.toString()); timeBasedCalendarContent.setSummary(CALENDAR_TIME_BASED_EVENT_SUMMARY); timeBasedCalendarContent.setLocation(CALENDAR_TIME_BASED_EVENT_LOCATION); timeBasedSender = Identity.generateRandomIdentity(); From ce52766a9771cda828a8e9d17da1500fbdf011df Mon Sep 17 00:00:00 2001 From: nick avlo Date: Wed, 25 Dec 2024 20:46:32 -0500 Subject: [PATCH 2/6] simplified GenericTagQuery serialization using jackson @JsonAnyGetter & @JsonAnySetter via Map GenericTagQuery usages replaced with Map Filters now use @JsonAnyGetter & @JsonAnySetter FDecoder interface method decode() refactored to decode(String str) FiltersDecoder refactored to FiltersDecoder, constructor json String parameter removed CustomGenericTagQuerySerializer no longer necessary, removed tests updated --- .../src/main/java/nostr/api/NIP01.java | 3 ++- .../src/main/java/nostr/api/Nostr.java | 4 ++-- .../main/java/nostr/event/impl/Filters.java | 19 ++++++++++++++----- .../java/nostr/event/json/codec/FDecoder.java | 4 ++-- .../event/json/codec/FiltersDecoder.java | 13 ++++++------- .../main/java/nostr/test/EntityFactory.java | 4 +++- 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/nostr-java-api/src/main/java/nostr/api/NIP01.java b/nostr-java-api/src/main/java/nostr/api/NIP01.java index 92a1e1016..1e8be9c33 100644 --- a/nostr-java-api/src/main/java/nostr/api/NIP01.java +++ b/nostr-java-api/src/main/java/nostr/api/NIP01.java @@ -42,6 +42,7 @@ import nostr.id.Identity; import java.util.List; +import java.util.Map; /** * @@ -208,7 +209,7 @@ public static Filters createFilters(List events, List a return Filters.builder() .authors(authors) .events(events) - .genericTagQuery(genericTagQuery) + .genericTagQuery(Map.of(genericTagQuery.getTagName(), genericTagQuery.getValue())) .kinds(kinds).limit(limit) .referencePubKeys(referencePubKeys) .referencedEvents(referencedEvents) diff --git a/nostr-java-api/src/main/java/nostr/api/Nostr.java b/nostr-java-api/src/main/java/nostr/api/Nostr.java index 7231b7e3f..e5a792a51 100644 --- a/nostr-java-api/src/main/java/nostr/api/Nostr.java +++ b/nostr-java-api/src/main/java/nostr/api/Nostr.java @@ -281,8 +281,8 @@ public static String encode(@NonNull List filtersList) { * @param json */ public static Filters decodeFilters(@NonNull String json) { - final var dec = new FiltersDecoder(json); - return dec.decode(); + final var dec = new FiltersDecoder(); + return dec.decode(json); } // Generic Tag Queries diff --git a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java index 90c2e546a..4a3248cb7 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java @@ -1,6 +1,8 @@ package nostr.event.impl; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -9,15 +11,14 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import nostr.base.GenericTagQuery; import nostr.base.PublicKey; import nostr.base.annotation.Key; import nostr.event.Kind; import nostr.event.json.deserializer.CustomGenericTagQueryDeserializer; -import nostr.event.json.serializer.CustomGenericTagQuerySerializer; import nostr.event.json.serializer.CustomIdEventListSerializer; import java.util.List; +import java.util.Map; /** * @@ -61,7 +62,15 @@ public class Filters { private Integer limit; @Key(nip = 12) - @JsonSerialize(using=CustomGenericTagQuerySerializer.class) - @JsonDeserialize(using=CustomGenericTagQueryDeserializer.class) - private GenericTagQuery genericTagQuery; + @JsonDeserialize(using= CustomGenericTagQueryDeserializer.class) + private Map genericTagQuery; + @JsonAnyGetter + public Map getGenericTagQuery() { + return genericTagQuery; + } + + @JsonAnySetter + public void setGenericTagQuery(Map genericTagQuery) { + this.genericTagQuery = genericTagQuery; + } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java index 17c26ff61..48160a18b 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java @@ -1,5 +1,5 @@ package nostr.event.json.codec; -public interface FDecoder { - Filters decode(); +public interface FDecoder { + T decode(String str); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java index 0001c44eb..9aa13c3dd 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; +import lombok.NonNull; import nostr.event.impl.Filters; /** @@ -10,17 +11,15 @@ * @author eric */ @Data -public class FiltersDecoder implements FDecoder { - private final Class clazz; - private final String jsonString; +public class FiltersDecoder implements FDecoder { + private final Class clazz; - public FiltersDecoder(String jsonString) { - this.clazz = Filters.class; - this.jsonString = jsonString; + public FiltersDecoder() { + this.clazz = (Class)Filters.class; } @Override - public Filters decode() { + public T decode(@NonNull String jsonString) { try { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(jsonString, clazz); diff --git a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java index d0bc0e72a..21bc7dfa3 100644 --- a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java +++ b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java @@ -29,6 +29,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Random; /** @@ -146,7 +147,8 @@ public static Filters createFilters(PublicKey publicKey) { List refEvents = new ArrayList<>(); refEvents.add(createTextNoteEvent(publicKey)); - return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQuery(createGenericTagQuery()).build(); + GenericTagQuery genericTagQuery = createGenericTagQuery(); + return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQuery(Map.of(genericTagQuery.getTagName(), genericTagQuery.getValue())).build(); } public static GenericTagQuery createGenericTagQuery() { From 4ee16abeb2135eea1c12f2c2a1870ebecaec7e49 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Thu, 26 Dec 2024 12:59:47 -0500 Subject: [PATCH 3/6] GenericTagQuery decoder and deserizlier now working, with lists too --- .../main/java/nostr/event/impl/Filters.java | 19 +++-- .../event/json/codec/FiltersDecoder.java | 6 +- .../event/json/codec/FiltersListDecoder.java | 51 ++++++------ .../json/codec/GenericTagQueryDecoder.java | 55 +++++++------ .../CustomFiltersListDeserializer.java | 4 +- .../CustomGenericTagQueryDeserializer.java | 74 ++++++++--------- .../CustomGenericTagQuerySerializer.java | 77 +++++++++--------- .../java/nostr/test/json/JsonParseTest.java | 81 ++++++++++++++++--- 8 files changed, 214 insertions(+), 153 deletions(-) diff --git a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java index 4a3248cb7..7b93fd374 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java @@ -1,24 +1,25 @@ - package nostr.event.impl; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.Setter; import nostr.base.PublicKey; import nostr.base.annotation.Key; import nostr.event.Kind; -import nostr.event.json.deserializer.CustomGenericTagQueryDeserializer; import nostr.event.json.serializer.CustomIdEventListSerializer; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; /** * @@ -62,15 +63,17 @@ public class Filters { private Integer limit; @Key(nip = 12) - @JsonDeserialize(using= CustomGenericTagQueryDeserializer.class) - private Map genericTagQuery; + @Setter(AccessLevel.NONE) + private Map> genericTagQuery; + @JsonAnyGetter - public Map getGenericTagQuery() { + public Map> getGenericTagQuery() { return genericTagQuery; } @JsonAnySetter - public void setGenericTagQuery(Map genericTagQuery) { - this.genericTagQuery = genericTagQuery; + public void setGenericTagQuery(String key, List value) { + this.genericTagQuery = new HashMap<>(); + this.genericTagQuery.put(key, value); } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java index 9aa13c3dd..b957d1c00 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java @@ -12,11 +12,7 @@ */ @Data public class FiltersDecoder implements FDecoder { - private final Class clazz; - - public FiltersDecoder() { - this.clazz = (Class)Filters.class; - } + private final Class clazz = (Class)Filters.class; @Override public T decode(@NonNull String jsonString) { diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java index aec013598..a15e12f77 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java @@ -1,26 +1,25 @@ -package nostr.event.json.codec; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.Data; -import nostr.event.impl.Filters; - -@Data -public class FiltersListDecoder implements FDecoder { - private final Class clazz; - private final String jsonString; - - public FiltersListDecoder(String jsonString) { - this.clazz = Filters.class; - this.jsonString = jsonString; - } - - public Filters decode() { - try { - ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(jsonString, clazz); - } catch (JsonProcessingException ex) { - throw new RuntimeException(ex); - } - } -} +//package nostr.event.json.codec; +// +//import com.fasterxml.jackson.core.JsonProcessingException; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import lombok.Data; +//import nostr.event.impl.Filters; +// +//@Data +//public class FiltersListDecoder implements FDecoder { +// private final Class clazz; +// +// public FiltersListDecoder() { +// this.clazz = (Class)Filters.class; +// } +// +// @Override +// public T decode(String jsonString) { +// try { +// ObjectMapper mapper = new ObjectMapper(); +// return mapper.readValue(jsonString, clazz); +// } catch (JsonProcessingException ex) { +// throw new RuntimeException(ex); +// } +// } +//} diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java index efd32285a..d17aa5c8c 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java @@ -1,25 +1,30 @@ -package nostr.event.json.codec; - -import lombok.Data; -import nostr.base.GenericTagQuery; - -/** - * - * @author eric - */ -@Data -public class GenericTagQueryDecoder implements FDecoder { - private final Class clazz; - private final String json; - - public GenericTagQueryDecoder(String json) { - this.clazz = (Class) GenericTagQuery.class; - this.json = json; - } - - @Override - public T decode() { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody - } - -} +//package nostr.event.json.codec; +// +//import com.fasterxml.jackson.core.JsonProcessingException; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import lombok.Data; +//import nostr.base.GenericTagQuery; +// +///** +// * +// * @author eric +// */ +//@Data +//public class GenericTagQueryDecoder implements FDecoder { +// private final Class clazz; +// +// public GenericTagQueryDecoder() { +// this.clazz = (Class) GenericTagQuery.class; +// } +// +// @Override +// public T decode(String json) { +// try { +// ObjectMapper mapper = new ObjectMapper(); +// return mapper.readValue(json, clazz); +// } catch (JsonProcessingException ex) { +// throw new RuntimeException(ex); +// } +// } +// +//} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java index ceedc2da9..56e365a01 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java @@ -38,8 +38,8 @@ public List parseJson(@NonNull String jsonString) throws IOException { while (elementsIterator.hasNext()) { JsonNode element = elementsIterator.next(); String strFilters = element.toString(); - FiltersDecoder decoder = new FiltersDecoder(strFilters); - filtersList.add(decoder.decode()); + FiltersDecoder decoder = new FiltersDecoder(); + filtersList.add(decoder.decode(strFilters)); } return filtersList; diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java index 30ba5d10f..2fcd8cfa6 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java @@ -1,37 +1,37 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import nostr.base.GenericTagQuery; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -public class CustomGenericTagQueryDeserializer extends JsonDeserializer { - - @Override - public GenericTagQuery deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser); - - var genericTagQuery = new GenericTagQuery(); - - Iterator> fields = rootNode.fields(); - if (fields.hasNext()) { - Map.Entry field = fields.next(); - String tagName = field.getKey(); - JsonNode valuesNode = field.getValue(); - List values = objectMapper.convertValue(valuesNode, ArrayList.class); - genericTagQuery.setTagName(tagName); // Assuming tagName is always a single character preceded by '#' - genericTagQuery.setValue(values); - } - - return genericTagQuery; - } -} +//package nostr.event.json.deserializer; +// +//import com.fasterxml.jackson.core.JsonParser; +//import com.fasterxml.jackson.databind.DeserializationContext; +//import com.fasterxml.jackson.databind.JsonDeserializer; +//import com.fasterxml.jackson.databind.JsonNode; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import nostr.base.GenericTagQuery; +// +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.Iterator; +//import java.util.List; +//import java.util.Map; +// +//public class CustomGenericTagQueryDeserializer extends JsonDeserializer { +// +// @Override +// public GenericTagQuery deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { +// ObjectMapper objectMapper = new ObjectMapper(); +// JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser); +// +// var genericTagQuery = new GenericTagQuery(); +// +// Iterator> fields = rootNode.fields(); +// if (fields.hasNext()) { +// Map.Entry field = fields.next(); +// String tagName = field.getKey(); +// JsonNode valuesNode = field.getValue(); +// List values = objectMapper.convertValue(valuesNode, ArrayList.class); +// genericTagQuery.setTagName(tagName); // Assuming tagName is always a single character preceded by '#' +// genericTagQuery.setValue(values); +// } +// +// return genericTagQuery; +// } +//} diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java index 155af514f..af676064d 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java @@ -1,38 +1,39 @@ -package nostr.event.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import nostr.base.GenericTagQuery; -import nostr.base.IEncoder; - -import java.io.IOException; -import java.io.Serial; - -/** - * @author guilhermegps - */ -public class CustomGenericTagQuerySerializer extends StdSerializer { - - @Serial - private static final long serialVersionUID = 6803478463890319884L; - - public CustomGenericTagQuerySerializer() { - super(GenericTagQuery.class); - } - - @Override - public void serialize(GenericTagQuery value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - var mapper = IEncoder.MAPPER; - JsonNode node = mapper.valueToTree(value); - ObjectNode objNode = (ObjectNode) node; - String attrName = "#" + value.getTagName(); - objNode.set(attrName, node.get("value")); - objNode.remove("tagName"); - objNode.remove("value"); - - gen.writeTree(objNode); - } -} +//package nostr.event.json.serializer; +// +//import com.fasterxml.jackson.core.JsonGenerator; +//import com.fasterxml.jackson.databind.JsonNode; +//import com.fasterxml.jackson.databind.SerializerProvider; +//import com.fasterxml.jackson.databind.node.ObjectNode; +//import com.fasterxml.jackson.databind.ser.std.StdSerializer; +//import nostr.base.GenericTagQuery; +//import nostr.base.IEncoder; +//import nostr.event.BaseTag; +// +//import java.io.IOException; +//import java.io.Serial; +//import java.util.Map; +// +///** +// * @author guilhermegps +// */ +//public class CustomGenericTagQuerySerializer> extends StdSerializer { +// +// @Serial +// private static final long serialVersionUID = 6803478463890319884L; +// +// protected CustomGenericTagQuerySerializer() { +// super((Class) Map.class); +// } +// +// @Override +// public void serialize(T value, JsonGenerator gen, SerializerProvider serializers) throws IOException { +// var mapper = IEncoder.MAPPER; +// JsonNode node = mapper.valueToTree(value); +// ObjectNode objNode = (ObjectNode) node; +//// String key = value.entrySet().stream().findFirst().get().getKey(); +//// String attrName = "#" + key; +//// objNode.set(attrName, node.get(key)); +//// objNode.remove(key); +// gen.writeTree(objNode); +// } +//} diff --git a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java index 0dd8dcef7..2f787b029 100644 --- a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java +++ b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java @@ -18,6 +18,7 @@ import nostr.event.json.codec.BaseEventEncoder; import nostr.event.json.codec.BaseMessageDecoder; import nostr.event.json.codec.BaseTagDecoder; +import nostr.event.json.codec.FiltersDecoder; import nostr.event.json.codec.FiltersEncoder; import nostr.event.json.codec.GenericEventDecoder; import nostr.event.json.codec.GenericTagDecoder; @@ -32,10 +33,12 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -279,10 +282,7 @@ public void testFiltersEncoder() { String new_geohash = "2vghde"; List geohashList = new ArrayList<>(); geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + Filters filters = Filters.builder().genericTagQuery(Map.of("#g", geohashList)).build(); FiltersEncoder encoder = new FiltersEncoder(filters); String jsonMessage = encoder.encode(); @@ -290,23 +290,80 @@ public void testFiltersEncoder() { } @Test - public void testReqMessageSerializer() { - log.info("testFiltersEncoder"); + public void testReqMessageFilterListSerializer() { + log.info("testReqMessageFilterListSerializer"); String new_geohash = "2vghde"; + String second_geohash = "3abcde"; List geohashList = new ArrayList<>(); geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + geohashList.add(second_geohash); + Filters filters = Filters.builder().genericTagQuery(Map.of("#g", geohashList)).build(); ReqMessage reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new ArrayList(List.of(filters))); assertDoesNotThrow(() -> { String jsonMessage = reqMessage.encode(); - assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]", jsonMessage); + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\",\"3abcde\"]}]", jsonMessage); }); } -} \ No newline at end of file + @Test + public void testReqMessageFiltersDecoder() { + log.info("testReqMessageFiltersDecoder"); + + String reqJsonWithCustomTagQueryFilterToDecode = "{\"#g\":[\"2vghde\"]}"; + + System.out.println(reqJsonWithCustomTagQueryFilterToDecode); + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + System.out.println(decodedFilters.toString()); + } + + @Test + public void testReqMessageFiltersListDecoder() { + log.info("testReqMessageFiltersListDecoder"); + + String reqJsonWithCustomTagQueryFilterToDecode = "{\"#g\":[\"2vghde\",\"3abcde\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + System.out.println(decodedFilters.toString()); + } + + @Test + public void testReqMessageDeserializer() { + log.info("testReqMessageDeserializer"); + + String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]"; + + ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + System.out.println(decoded.toString()); + } + + @Test + public void testReqMessageFilterListDecoder() { + log.info("testReqMessageFilterListDecoder"); + + String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\",\"3abcde\"]}]"; + + ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + System.out.println(decoded.toString()); + } + + @Test + public void testReqMessagePopulatedFilterDecoder() { + log.info("testReqMessageFilterListDecoder"); + + String reqJsonWithCustomTagQueryFilterToDecode = + "[\"REQ\", " + + "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\", " + + "{\"kinds\": [1], " + + "\"authors\": [\"f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75\"]," + + "\"#g\": [\"2vghde\",\"3abcde\"]," + + "\"#e\": [\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"]}]"; + + + ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + System.out.println(decoded.toString()); + } +} From 86add7e0a1c5593bae966ebca166bc5ff5e7d525 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Thu, 26 Dec 2024 17:29:25 -0500 Subject: [PATCH 4/6] removed superfluous deserializers since now using @JsonAnyGetter\/@JsonAnyGetter --- .../src/main/java/nostr/api/NIP01.java | 5 +- .../src/main/java/nostr/api/Nostr.java | 3 +- .../main/java/nostr/event/impl/Filters.java | 2 +- .../CustomFiltersListDeserializer.java | 47 ------------------- .../CustomGenericTagQueryDeserializer.java | 37 --------------- ...CustomGenericTagQueryListDeserializer.java | 21 --------- .../CustomGenericTagQueryListSerializer.java | 46 ------------------ .../CustomGenericTagQuerySerializer.java | 39 --------------- .../main/java/nostr/test/EntityFactory.java | 9 +++- 9 files changed, 14 insertions(+), 195 deletions(-) delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java diff --git a/nostr-java-api/src/main/java/nostr/api/NIP01.java b/nostr-java-api/src/main/java/nostr/api/NIP01.java index 1e8be9c33..d0819dfc3 100644 --- a/nostr-java-api/src/main/java/nostr/api/NIP01.java +++ b/nostr-java-api/src/main/java/nostr/api/NIP01.java @@ -209,7 +209,10 @@ public static Filters createFilters(List events, List a return Filters.builder() .authors(authors) .events(events) - .genericTagQuery(Map.of(genericTagQuery.getTagName(), genericTagQuery.getValue())) + .genericTagQuery( + Map.of( + genericTagQuery.getTagName(), + genericTagQuery.getValue())) .kinds(kinds).limit(limit) .referencePubKeys(referencePubKeys) .referencedEvents(referencedEvents) diff --git a/nostr-java-api/src/main/java/nostr/api/Nostr.java b/nostr-java-api/src/main/java/nostr/api/Nostr.java index e5a792a51..aaf4b488d 100644 --- a/nostr-java-api/src/main/java/nostr/api/Nostr.java +++ b/nostr-java-api/src/main/java/nostr/api/Nostr.java @@ -281,8 +281,7 @@ public static String encode(@NonNull List filtersList) { * @param json */ public static Filters decodeFilters(@NonNull String json) { - final var dec = new FiltersDecoder(); - return dec.decode(json); + return new FiltersDecoder<>().decode(json); } // Generic Tag Queries diff --git a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java index 7b93fd374..44272f9f3 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java @@ -73,7 +73,7 @@ public Map> getGenericTagQuery() { @JsonAnySetter public void setGenericTagQuery(String key, List value) { - this.genericTagQuery = new HashMap<>(); + this.genericTagQuery = Optional.ofNullable(genericTagQuery).orElse(new HashMap<>()); this.genericTagQuery.put(key, value); } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java deleted file mode 100644 index 56e365a01..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java +++ /dev/null @@ -1,47 +0,0 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import nostr.event.impl.Filters; -import nostr.event.json.codec.FiltersDecoder; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@NoArgsConstructor -public class CustomFiltersListDeserializer extends JsonDeserializer> { - @Override - public List deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException { - JsonNode node = jsonParser.readValueAsTree(); - return parseJson(node.toString()); - } - - public List parseJson(@NonNull String jsonString) throws IOException { - if (!jsonString.startsWith("[")) { - jsonString = "[" + jsonString.trim(); - } - if (!jsonString.endsWith("]")) { - jsonString = jsonString + "]"; - } - - List filtersList = new ArrayList<>(); - ObjectMapper mapper = new ObjectMapper(); - JsonNode rootNode = mapper.readTree(jsonString); - Iterator elementsIterator = rootNode.elements(); - while (elementsIterator.hasNext()) { - JsonNode element = elementsIterator.next(); - String strFilters = element.toString(); - FiltersDecoder decoder = new FiltersDecoder(); - filtersList.add(decoder.decode(strFilters)); - } - - return filtersList; - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java deleted file mode 100644 index 2fcd8cfa6..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -//package nostr.event.json.deserializer; -// -//import com.fasterxml.jackson.core.JsonParser; -//import com.fasterxml.jackson.databind.DeserializationContext; -//import com.fasterxml.jackson.databind.JsonDeserializer; -//import com.fasterxml.jackson.databind.JsonNode; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import nostr.base.GenericTagQuery; -// -//import java.io.IOException; -//import java.util.ArrayList; -//import java.util.Iterator; -//import java.util.List; -//import java.util.Map; -// -//public class CustomGenericTagQueryDeserializer extends JsonDeserializer { -// -// @Override -// public GenericTagQuery deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { -// ObjectMapper objectMapper = new ObjectMapper(); -// JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser); -// -// var genericTagQuery = new GenericTagQuery(); -// -// Iterator> fields = rootNode.fields(); -// if (fields.hasNext()) { -// Map.Entry field = fields.next(); -// String tagName = field.getKey(); -// JsonNode valuesNode = field.getValue(); -// List values = objectMapper.convertValue(valuesNode, ArrayList.class); -// genericTagQuery.setTagName(tagName); // Assuming tagName is always a single character preceded by '#' -// genericTagQuery.setValue(values); -// } -// -// return genericTagQuery; -// } -//} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java deleted file mode 100644 index 891cf0d4e..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import lombok.NoArgsConstructor; -import nostr.base.GenericTagQuery; - -import java.util.List; - -/** - * - * @author eric - */ -@NoArgsConstructor -public class CustomGenericTagQueryListDeserializer, U extends GenericTagQuery> extends JsonDeserializer { - @Override - public T deserialize(JsonParser p, DeserializationContext ctxt) { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java deleted file mode 100644 index 615c0c273..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java +++ /dev/null @@ -1,46 +0,0 @@ -package nostr.event.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.node.ObjectNode; -import nostr.base.GenericTagQuery; -import nostr.base.IEncoder; - -import java.util.List; -import java.io.IOException; - -/** - * @author guilhermegps - * - */ -public class CustomGenericTagQueryListSerializer, U extends GenericTagQuery> extends JsonSerializer { - - @Override - public void serialize(T value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeStartObject(); - for (U gtq : value) { - JsonNode node = toJson(gtq); - gen.writeObjectField(node.fieldNames().next(), node.get(node.fieldNames().next())); - } - gen.writeEndObject(); - } - - private JsonNode toJson(GenericTagQuery gtq) { - var mapper = IEncoder.MAPPER; - try { - JsonNode node = mapper.valueToTree(gtq); - ObjectNode objNode = (ObjectNode) node; - objNode.set("#" + node.get("tagName").textValue(), node.get("value")); - objNode.remove("tagName"); - objNode.remove("value"); - objNode.remove("nip"); - - return node.get("genericTagQueryList").get(0); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java deleted file mode 100644 index af676064d..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java +++ /dev/null @@ -1,39 +0,0 @@ -//package nostr.event.json.serializer; -// -//import com.fasterxml.jackson.core.JsonGenerator; -//import com.fasterxml.jackson.databind.JsonNode; -//import com.fasterxml.jackson.databind.SerializerProvider; -//import com.fasterxml.jackson.databind.node.ObjectNode; -//import com.fasterxml.jackson.databind.ser.std.StdSerializer; -//import nostr.base.GenericTagQuery; -//import nostr.base.IEncoder; -//import nostr.event.BaseTag; -// -//import java.io.IOException; -//import java.io.Serial; -//import java.util.Map; -// -///** -// * @author guilhermegps -// */ -//public class CustomGenericTagQuerySerializer> extends StdSerializer { -// -// @Serial -// private static final long serialVersionUID = 6803478463890319884L; -// -// protected CustomGenericTagQuerySerializer() { -// super((Class) Map.class); -// } -// -// @Override -// public void serialize(T value, JsonGenerator gen, SerializerProvider serializers) throws IOException { -// var mapper = IEncoder.MAPPER; -// JsonNode node = mapper.valueToTree(value); -// ObjectNode objNode = (ObjectNode) node; -//// String key = value.entrySet().stream().findFirst().get().getKey(); -//// String attrName = "#" + key; -//// objNode.set(attrName, node.get(key)); -//// objNode.remove(key); -// gen.writeTree(objNode); -// } -//} diff --git a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java index 21bc7dfa3..67cfca4d6 100644 --- a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java +++ b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java @@ -148,7 +148,14 @@ public static Filters createFilters(PublicKey publicKey) { refEvents.add(createTextNoteEvent(publicKey)); GenericTagQuery genericTagQuery = createGenericTagQuery(); - return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQuery(Map.of(genericTagQuery.getTagName(), genericTagQuery.getValue())).build(); + return Filters.builder() + .events(eventList) + .referencedEvents(refEvents) + .genericTagQuery( + Map.of( + genericTagQuery.getTagName(), + genericTagQuery.getValue())) + .build(); } public static GenericTagQuery createGenericTagQuery() { From 3c6e37ef0b9b0de8bcf0c9a049177cd8d93f5f3f Mon Sep 17 00:00:00 2001 From: nick avlo Date: Thu, 26 Dec 2024 17:43:29 -0500 Subject: [PATCH 5/6] removed superfluous deserializers since now using @JsonAnyGetter\/@JsonAnyGetter --- .../nostr/event/impl/CalendarContent.java | 24 +++++++-------- .../event/impl/CalendarTimeBasedEvent.java | 21 +++++-------- .../event/impl/ClassifiedListingEvent.java | 1 - .../event/json/codec/FiltersListDecoder.java | 25 ---------------- .../json/codec/GenericTagQueryDecoder.java | 30 ------------------- .../java/nostr/test/event/ApiEventTest.java | 8 ++--- .../java/nostr/test/event/NIP52ImplTest.java | 10 +++---- 7 files changed, 29 insertions(+), 90 deletions(-) delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java delete mode 100644 nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java diff --git a/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java b/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java index 4df55c40f..41204381d 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/CalendarContent.java @@ -20,25 +20,25 @@ @EqualsAndHashCode(callSuper = false) public class CalendarContent extends AbstractEventContent { //@JsonProperty - private String id; + private final String id; // below fields mandatory - private IdentifierTag identifierTag; - private String title; - private Long start; + private final IdentifierTag identifierTag; + private final String title; + private final Long start; // below fields optional -// private Long end; -// private String startTzid; -// private String endTzid; + private Long end; + private String startTzid; + private String endTzid; private String summary; -// private String image; + private String image; private String location; -// private GeohashTag geohashTag; + private GeohashTag geohashTag; private List participantPubKeys; -// private List labels; -// private List hashtagTags; -// private List referenceTags; + private List labels; + private List hashtagTags; + private List referenceTags; public static CalendarContentBuilder builder(@NonNull IdentifierTag identifierTag, @NonNull String title, @NonNull Long start) { return new CalendarContentBuilder() diff --git a/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java b/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java index 45204d499..812f73146 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/CalendarTimeBasedEvent.java @@ -20,7 +20,6 @@ import nostr.event.impl.CalendarTimeBasedEvent.CalendarTimeBasedEventDeserializer; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; -import nostr.util.NostrUtil; import java.io.IOException; import java.util.HashMap; @@ -43,24 +42,20 @@ public CalendarTimeBasedEvent(@NonNull PublicKey sender, @NonNull List } private void mapCustomTags() { -// below, required addStandardTag(calendarContent.getIdentifierTag()); addGenericTag("title", getNip(), calendarContent.getTitle()); addGenericTag("start", getNip(), calendarContent.getStart()); - -// below, optional -// addGenericTag("end", getNip(), calendarContent.getEnd()); -// addGenericTag("start_tzid", getNip(), calendarContent.getStartTzid()); -// addGenericTag("end_tzid", getNip(), calendarContent.getEndTzid()); + addGenericTag("end", getNip(), calendarContent.getEnd()); + addGenericTag("start_tzid", getNip(), calendarContent.getStartTzid()); + addGenericTag("end_tzid", getNip(), calendarContent.getEndTzid()); addGenericTag("summary", getNip(), calendarContent.getSummary()); -// addGenericTag("image", getNip(), calendarContent.getImage()); + addGenericTag("image", getNip(), calendarContent.getImage()); addGenericTag("location", getNip(), calendarContent.getLocation()); -// addStandardTag(calendarContent.getGeohashTag()); + addStandardTag(calendarContent.getGeohashTag()); addStandardTag(calendarContent.getParticipantPubKeys()); - -// addStringListTag("l", getNip(), calendarContent.getLabels()); -// addStandardTag(calendarContent.getHashtagTags()); -// addStandardTag(calendarContent.getReferenceTags()); + addStringListTag("l", getNip(), calendarContent.getLabels()); + addStandardTag(calendarContent.getHashtagTags()); + addStandardTag(calendarContent.getReferenceTags()); } public static class CalendarTimeBasedEventDeserializer extends StdDeserializer { diff --git a/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java b/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java index 18733865c..6d392578a 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/ClassifiedListingEvent.java @@ -98,7 +98,6 @@ public ClassifiedListingEvent deserialize(JsonParser jsonParser, Deserialization getTagValueFromString(genericTags, "summary"), priceTag) .build(); - classifiedListing.setLocation(getTagValueFromString(genericTags, "location")); Map generalMap = new HashMap<>(); classifiedListingEventNode.fields().forEachRemaining(generalTag -> diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java deleted file mode 100644 index a15e12f77..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java +++ /dev/null @@ -1,25 +0,0 @@ -//package nostr.event.json.codec; -// -//import com.fasterxml.jackson.core.JsonProcessingException; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import lombok.Data; -//import nostr.event.impl.Filters; -// -//@Data -//public class FiltersListDecoder implements FDecoder { -// private final Class clazz; -// -// public FiltersListDecoder() { -// this.clazz = (Class)Filters.class; -// } -// -// @Override -// public T decode(String jsonString) { -// try { -// ObjectMapper mapper = new ObjectMapper(); -// return mapper.readValue(jsonString, clazz); -// } catch (JsonProcessingException ex) { -// throw new RuntimeException(ex); -// } -// } -//} diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java deleted file mode 100644 index d17aa5c8c..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java +++ /dev/null @@ -1,30 +0,0 @@ -//package nostr.event.json.codec; -// -//import com.fasterxml.jackson.core.JsonProcessingException; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import lombok.Data; -//import nostr.base.GenericTagQuery; -// -///** -// * -// * @author eric -// */ -//@Data -//public class GenericTagQueryDecoder implements FDecoder { -// private final Class clazz; -// -// public GenericTagQueryDecoder() { -// this.clazz = (Class) GenericTagQuery.class; -// } -// -// @Override -// public T decode(String json) { -// try { -// ObjectMapper mapper = new ObjectMapper(); -// return mapper.readValue(json, clazz); -// } catch (JsonProcessingException ex) { -// throw new RuntimeException(ex); -// } -// } -// -//} diff --git a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java index f10124cb8..a146f0d25 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java @@ -320,10 +320,10 @@ public void testNIP52CalendarTimeBasedEventEvent() throws IOException { "Calendar Time-Based Event title", 1716513986268L).build(); -// calendarContent.setStartTzid("1687765220"); -// calendarContent.setEndTzid("1687765230"); -// -// calendarContent.setLabels(List.of("english", "mycenaean greek")); + calendarContent.setStartTzid("1687765220"); + calendarContent.setEndTzid("1687765230"); + + calendarContent.setLabels(List.of("english", "mycenaean greek")); List tags = new ArrayList<>(); tags.add(new PubKeyTag(new PublicKey("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76985"), diff --git a/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java b/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java index 3e08ad91d..e4400f76f 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/NIP52ImplTest.java @@ -55,12 +55,12 @@ static void setup() { .build(); timeBasedCalendarContent.setParticipantPubKeys(List.of(P_1_TAG, P_2_TAG)); -// timeBasedCalendarContent.setGeohashTag(G_TAG); -// timeBasedCalendarContent.setHashtagTags(List.of(T_TAG)); -// timeBasedCalendarContent.setStartTzid(CALENDAR_TIME_BASED_EVENT_START_TZID); -// timeBasedCalendarContent.setEndTzid(START.toString()); + timeBasedCalendarContent.setGeohashTag(G_TAG); + timeBasedCalendarContent.setHashtagTags(List.of(T_TAG)); + timeBasedCalendarContent.setStartTzid(CALENDAR_TIME_BASED_EVENT_START_TZID); + timeBasedCalendarContent.setEndTzid(START.toString()); Long l = START + 100L; -// timeBasedCalendarContent.setEndTzid(l.toString()); + timeBasedCalendarContent.setEndTzid(l.toString()); timeBasedCalendarContent.setSummary(CALENDAR_TIME_BASED_EVENT_SUMMARY); timeBasedCalendarContent.setLocation(CALENDAR_TIME_BASED_EVENT_LOCATION); timeBasedSender = Identity.generateRandomIdentity(); From afb67acffbad488fc7aa9a3006f5e46c5cadf561 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Thu, 26 Dec 2024 20:23:10 -0500 Subject: [PATCH 6/6] added proper test assertions --- .../java/nostr/test/json/JsonParseTest.java | 132 ++++++++++++++---- 1 file changed, 107 insertions(+), 25 deletions(-) diff --git a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java index 2f787b029..1b39aa879 100644 --- a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java +++ b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java @@ -4,7 +4,6 @@ import nostr.api.NIP01; import nostr.base.Command; import nostr.base.ElementAttribute; -import nostr.base.GenericTagQuery; import nostr.base.PublicKey; import nostr.crypto.bech32.Bech32; import nostr.event.BaseEvent; @@ -38,7 +37,6 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -312,58 +310,142 @@ public void testReqMessageFilterListSerializer() { public void testReqMessageFiltersDecoder() { log.info("testReqMessageFiltersDecoder"); - String reqJsonWithCustomTagQueryFilterToDecode = "{\"#g\":[\"2vghde\"]}"; - - System.out.println(reqJsonWithCustomTagQueryFilterToDecode); + String geohashKey = "#g"; + String geohashValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue + "\"]}"; Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); - System.out.println(decodedFilters.toString()); + + Filters expectedFilters = new Filters(); + List expectedGeohashValueList = List.of(geohashValue); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValueList); + + assertEquals(expectedFilters, decodedFilters); } @Test public void testReqMessageFiltersListDecoder() { log.info("testReqMessageFiltersListDecoder"); - String reqJsonWithCustomTagQueryFilterToDecode = "{\"#g\":[\"2vghde\",\"3abcde\"]}"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]}"; Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); - System.out.println(decodedFilters.toString()); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + assertEquals(expectedFilters, decodedFilters); } @Test public void testReqMessageDeserializer() { log.info("testReqMessageDeserializer"); - String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]"; + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String geohashKey = "#g"; + String geohashValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + geohashKey + "\":[\"" + geohashValue + "\"]}]"; - ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); - System.out.println(decoded.toString()); + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); } @Test public void testReqMessageFilterListDecoder() { log.info("testReqMessageFilterListDecoder"); - String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\",\"3abcde\"]}]"; + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFiltersToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + geohashKey + "\":[\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFiltersToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); - ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); - System.out.println(decoded.toString()); + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); } @Test public void testReqMessagePopulatedFilterDecoder() { - log.info("testReqMessageFilterListDecoder"); - + log.info("testReqMessagePopulatedFilterDecoder"); + + String subscriptionId = "npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh"; + String kind = "1"; + String author = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String referencedEventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; String reqJsonWithCustomTagQueryFilterToDecode = - "[\"REQ\", " + - "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\", " + - "{\"kinds\": [1], " + - "\"authors\": [\"f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75\"]," + - "\"#g\": [\"2vghde\",\"3abcde\"]," + - "\"#e\": [\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"]}]"; - + "[\"REQ\", " + + "\"" + subscriptionId + "\", " + + "{\"kinds\": [" + kind + "], " + + "\"authors\": [\"" + author + "\"]," + + "\"" + geohashKey + "\": [\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]," + + "\"#e\": [\"" + referencedEventId + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + expectedFilters.setKinds(List.of(Kind.TEXT_NOTE)); + expectedFilters.setAuthors(List.of(new PublicKey(author))); + expectedFilters.setReferencedEvents(List.of(new GenericEvent(referencedEventId))); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); + } - ReqMessage decoded = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); - System.out.println(decoded.toString()); + @Test + public void testReqMessagePopulatedListOfFiltersListDecoder() { + log.info("testReqMessagePopulatedListOfFiltersListDecoder"); + + String subscriptionId = "npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh"; + String kind = "1"; + String author = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String referencedEventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; + String uuidKey = "#d"; + String uuidValue1 = "UUID-1"; + String uuidValue2 = "UUID-2"; + String reqJsonWithCustomTagQueryFilterToDecode = + "[\"REQ\", " + + "\"" + subscriptionId + "\", " + + "{\"kinds\": [" + kind + "], " + + "\"authors\": [\"" + author + "\"]," + + "\"" + geohashKey + "\": [\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]," + + "\"" + uuidKey + "\": [\"" + uuidValue1 + "\",\"" + uuidValue2 + "\"]," + + "\"#e\": [\"" + referencedEventId + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + expectedFilters.setKinds(List.of(Kind.TEXT_NOTE)); + expectedFilters.setAuthors(List.of(new PublicKey(author))); + expectedFilters.setReferencedEvents(List.of(new GenericEvent(referencedEventId))); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + List expectedIdentityTagValuesList = List.of(uuidValue1, uuidValue2); + expectedFilters.setGenericTagQuery(uuidKey, expectedIdentityTagValuesList); + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); } }