From 22eb87f75bc116563d7eb1c12888d7c1cb172ca7 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sun, 4 Dec 2022 11:52:09 +0100 Subject: [PATCH] Only import contact entry keys once --- .../org/librecms/assets/ContactEntry.java | 4 +- .../org/librecms/assets/ContactEntryKey.java | 8 ++ .../assets/ContactEntryKeyResolver.java | 74 +++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyResolver.java diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java index 4e2b49242..3f9c3a307 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java @@ -18,8 +18,7 @@ */ package org.librecms.assets; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIdentityReference; import org.hibernate.envers.Audited; import java.io.Serializable; @@ -65,6 +64,7 @@ public class ContactEntry implements Serializable { // @Column(name = "ENTRY_KEY", length = 255, nullable = false) @OneToOne @JoinColumn(name = "CONTACT_ENTRY_KEY_ID") + @JsonIdentityReference(alwaysAsId = true) private ContactEntryKey key; /** diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java index 307126d06..05b526030 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java @@ -18,6 +18,8 @@ */ package org.librecms.assets; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import org.libreccm.l10n.LocalizedString; @@ -52,6 +54,12 @@ import static org.librecms.CmsConstants.*; query = "SELECT k FROM ContactEntryKey k WHERE k.entryKey = :entryKey" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = ContactEntryKeyResolver.class, + property = "entryKey", + scope = ContactEntryKey.class +) public class ContactEntryKey implements Comparable, Serializable { diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyResolver.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyResolver.java new file mode 100644 index 000000000..f3bc1b482 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyResolver.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.assets; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; +import java.util.Optional; + +/** + * + * @author Jens Pelzetter + */ +public class ContactEntryKeyResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey id, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + final ContactEntryKeyRepository keyRepo = CdiUtil + .createCdiUtil() + .findBean(ContactEntryKeyRepository.class); + final Optional result = keyRepo.findByEntryKey( + id.key.toString() + ); + if (result.isPresent()) { + return result.get(); + } else { + final ContactEntryKey key = new ContactEntryKey(); + key.setEntryKey(id.key.toString()); + keyRepo.save(key); + return key; + } + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new ContactEntryKeyResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof ContactEntryKeyResolver; + } + +}