package org.atomhopper.migration.adapter; import org.apache.abdera.model.Entry; import org.apache.commons.lang.StringUtils; import org.atomhopper.adapter.FeedPublisher; import org.atomhopper.adapter.NotImplemented; import org.atomhopper.adapter.jpa.PersistedEntry; import org.atomhopper.adapter.request.adapter.DeleteEntryRequest; import org.atomhopper.adapter.request.adapter.PostEntryRequest; import org.atomhopper.adapter.request.adapter.PutEntryRequest; import org.atomhopper.migration.domain.MigrationReadFrom; import org.atomhopper.migration.domain.MigrationWriteTo; import org.atomhopper.response.AdapterResponse; import org.atomhopper.response.EmptyBody; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.UUID; public class MigrationFeedPublisher implements FeedPublisher { private static final Logger LOG = LoggerFactory.getLogger(MigrationFeedPublisher.class); private static final String UUID_URI_SCHEME = "urn:uuid:"; private FeedPublisher oldFeedPublisher; private FeedPublisher newFeedPublisher; private MigrationWriteTo writeTo; private MigrationReadFrom readFrom; private boolean allowOverrideId = false; private boolean allowOverrideDate = false; public void setOldFeedPublisher(FeedPublisher oldFeedPublisher) { this.oldFeedPublisher = oldFeedPublisher; } public void setNewFeedPublisher(FeedPublisher newFeedPublisher) { this.newFeedPublisher = newFeedPublisher; } public void setWriteTo(MigrationWriteTo writeTo) { this.writeTo = writeTo; } public void setReadFrom(MigrationReadFrom readFrom) { this.readFrom = readFrom; } public void setAllowOverrideId(boolean allowOverrideId) { this.allowOverrideId = allowOverrideId; } public void setAllowOverrideDate(boolean allowOverrideDate) { this.allowOverrideDate = allowOverrideDate; } @Override public AdapterResponse<Entry> postEntry(PostEntryRequest postEntryRequest) { PersistedEntry entry = new PersistedEntry(); // If allowOverrideId is false then set the Id // Also set the id if allowOverrideId is true, but no Id was sent in the entry if (!allowOverrideId || postEntryRequest.getEntry().getId() == null || StringUtils.isBlank(postEntryRequest.getEntry().getId().toString().trim())) { postEntryRequest.getEntry().setId(UUID_URI_SCHEME + UUID.randomUUID().toString()); } // If allowOverrideDate is false then set the DateLastUpdated // Also set the DateLastUpdated if allowOverrideDate is true, but no DateLastUpdated was sent in the entry if (!allowOverrideDate || postEntryRequest.getEntry().getUpdated() == null) { postEntryRequest.getEntry().setUpdated(entry.getDateLastUpdated()); } switch (writeTo) { case OLD: return oldFeedPublisher.postEntry(postEntryRequest); case NEW: return newFeedPublisher.postEntry(postEntryRequest); case BOTH: default: switch (readFrom) { case NEW: AdapterResponse<Entry> newEntry = newFeedPublisher.postEntry(postEntryRequest); try { oldFeedPublisher.postEntry(postEntryRequest); } catch (Exception ex) { LOG.error("Error writing entry to OLD feed:" + postEntryRequest.getFeedName() + " EntryId=" + postEntryRequest.getEntry().getId()); } return newEntry; case OLD: default: AdapterResponse<Entry> oldEntry = oldFeedPublisher.postEntry(postEntryRequest); try { newFeedPublisher.postEntry(postEntryRequest); } catch (Exception ex) { LOG.error("Error writing entry to NEW feed:" + postEntryRequest.getFeedName() + " EntryId=" + postEntryRequest.getEntry().getId()); } return oldEntry; } } } @Override @NotImplemented public AdapterResponse<Entry> putEntry(PutEntryRequest putEntryRequest) { throw new UnsupportedOperationException("Not supported."); } @Override @NotImplemented public AdapterResponse<EmptyBody> deleteEntry(DeleteEntryRequest deleteEntryRequest) { throw new UnsupportedOperationException("Not supported."); } @Override @NotImplemented public void setParameters(Map<String, String> params) { throw new UnsupportedOperationException("Not supported."); } }