diff --git a/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java b/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java index 075d8977b..e34cc990d 100644 --- a/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java +++ b/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; @@ -17,6 +18,7 @@ import run.halo.app.extension.GroupVersionKind; * @author guqing * @since 2.0.0 */ +@Slf4j @Component public class PermalinkIndexer { private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); @@ -173,8 +175,20 @@ public class PermalinkIndexer { return permalinkLocatorLookup.size(); } + /** + * Add a record to the {@link PermalinkIndexer}. + * If permalink already exists, it will not be added to indexer + * + * @param addCommand a command to add a record to {@link PermalinkIndexer} + */ @EventListener(PermalinkIndexAddCommand.class) public void onPermalinkAdd(PermalinkIndexAddCommand addCommand) { + if (checkPermalinkExists(addCommand.getLocator(), addCommand.getPermalink())) { + // TODO send an extension event to log this error + log.error("Permalink [{}] already exists, you can try to change the slug [{}].", + addCommand.getPermalink(), addCommand.getLocator()); + return; + } register(addCommand.getLocator(), addCommand.getPermalink()); } @@ -183,9 +197,26 @@ public class PermalinkIndexer { remove(deleteCommand.getLocator()); } + /** + * Update a {@link PermalinkIndexer} record by {@link ExtensionLocator} and permalink. + * If permalink already exists, it will not be updated + * + * @param updateCommand a command to update an indexer record + */ @EventListener(PermalinkIndexUpdateCommand.class) public void onPermalinkUpdate(PermalinkIndexUpdateCommand updateCommand) { + if (checkPermalinkExists(updateCommand.getLocator(), updateCommand.getPermalink())) { + // TODO send an extension event to log this error + log.error("Permalink [{}] already exists, you can try to change the slug [{}].", + updateCommand.getPermalink(), updateCommand.getLocator()); + return; + } remove(updateCommand.getLocator()); register(updateCommand.getLocator(), updateCommand.getPermalink()); } + + private boolean checkPermalinkExists(ExtensionLocator locator, String permalink) { + ExtensionLocator lookup = lookup(permalink); + return lookup != null && !lookup.equals(locator); + } }