📄 synchronizingbean.java
字号:
syncClient.setLastSynchronizationTime(0L); // to force slow sync return new SyncClientAnchor(syncClient.getId(), 0L, true); } public MovieRatingData[] synchronizeMovieRatings(MovieRatingData[] movieRatings, int conflictResolutionStrategyId) { try { syncConduit = account.getMovieRatingSyncConduit(); Collection serverSideChanges = syncConduit.getChangedSyncMetaData(syncClient.getLastSynchronizationTime()); Map clientSideChanges = movieRatingsArrayToMap(movieRatings); updatedMovieRatings.clear(); if (conflictResolutionStrategyId == SyncConstants.STRATEGY_FIRST_MODIFIED_WINS || conflictResolutionStrategyId == SyncConstants.STRATEGY_LAST_MODIFIED_WINS) { // Handle conflicting changes and build the list of updates for (Iterator i = serverSideChanges.iterator(); i.hasNext(); ) { SyncMetaDataLocal serverSideChange = (SyncMetaDataLocal) i.next(); MovieRatingData clientSideChange = (MovieRatingData) clientSideChanges.get(serverSideChange.getId()); if (clientSideChange != null) { // Align the time clientSideChange.alignTime(timeShift); // Conflicting changes if ((conflictResolutionStrategyId == SyncConstants.STRATEGY_FIRST_MODIFIED_WINS && serverSideChange.getLastModificationTime() > clientSideChange.getLastModificationDate()) || (conflictResolutionStrategyId == SyncConstants.STRATEGY_LAST_MODIFIED_WINS && serverSideChange.getLastModificationTime() < clientSideChange.getLastModificationDate())) { if (clientSideChange.getModificationStatus() == SyncConstants.STATUS_DELETED) { removeMovieRating(clientSideChange.getMovieId()); } else { updateMovieRating(clientSideChange); } } else { if (serverSideChange.getDeleted()) { if (clientSideChange.getModificationStatus() != SyncConstants.STATUS_DELETED) { clientSideChange.setModificationStatus(SyncConstants.STATUS_DELETED); updatedMovieRatings.put(clientSideChange.getMovieId(), clientSideChange); } } else { updatedMovieRatings.put(serverSideChange.getId(), account.getMovieRating(serverSideChange.getId()).getData()); } } clientSideChanges.remove(clientSideChange.getMovieId()); } else { // Non-conflicting changes MovieRatingData movieRating = !serverSideChange.getDeleted() ? account.getMovieRating(serverSideChange.getId()).getData() : new MovieRatingData(serverSideChange.getId(), serverSideChange.getLastModificationTime()); updatedMovieRatings.put(serverSideChange.getId(), movieRating); } } // Apply directly remaining non-conflicting client-side changes for (Iterator i = clientSideChanges.values().iterator(); i.hasNext(); ) { MovieRatingData clientSideChange = (MovieRatingData) i.next(); updateMovieRating(clientSideChange); } syncClient.setLastSynchronizationTime(initiationTime); return (MovieRatingData[]) new ArrayList(updatedMovieRatings.values()).toArray(new MovieRatingData[0]); } else { // SyncConstants.STRATEGY_ASK_USER HashMap conflictingMovieRatings = new HashMap(); // Handle conflicting changes and build the list of updates for (Iterator i = serverSideChanges.iterator(); i.hasNext(); ) { SyncMetaDataLocal serverSideChange = (SyncMetaDataLocal) i.next(); MovieRatingData clientSideChange = (MovieRatingData) clientSideChanges.get(serverSideChange.getId()); if (clientSideChange != null) { MovieRatingData movieRating = !serverSideChange.getDeleted() ? account.getMovieRating(serverSideChange.getId()).getData() : new MovieRatingData(serverSideChange.getId(), serverSideChange.getLastModificationTime()); conflictingMovieRatings.put(serverSideChange.getId(), movieRating); clientSideChanges.remove(clientSideChange.getMovieId()); } else { // Non-conflicting changes MovieRatingData movieRating = !serverSideChange.getDeleted() ? account.getMovieRating(serverSideChange.getId()).getData() : new MovieRatingData(serverSideChange.getId(), serverSideChange.getLastModificationTime()); updatedMovieRatings.put(serverSideChange.getId(), movieRating); } } // Apply directly remaining non-conflicting client-side changes for (Iterator i = clientSideChanges.values().iterator(); i.hasNext(); ) { MovieRatingData clientSideChange = (MovieRatingData) i.next(); if (clientSideChange.getModificationStatus() == SyncConstants.STATUS_DELETED) { removeMovieRating(clientSideChange.getMovieId()); } else { updateMovieRating(clientSideChange); } } return (MovieRatingData[]) new ArrayList(conflictingMovieRatings.values()).toArray(new MovieRatingData[0]); } } catch (Exception e) { e.printStackTrace(System.err); throw new EJBException("SynchronizingBean.synchronizeMovieRatings: " + e); } } public MovieRatingData[] commitMovieRatings(MovieRatingData[] movieRatings) { try { syncConduit = account.getMovieRatingSyncConduit(); for (int i = 0; i < movieRatings.length; i++) { MovieRatingData change = movieRatings[i]; if (change.isModifiedOnClient()) { if (change.getModificationStatus() == SyncConstants.STATUS_DELETED) { removeMovieRating(change.getMovieId()); } else { updateMovieRating(change); } } else { if (change.getModificationStatus() == SyncConstants.STATUS_DELETED) { updatedMovieRatings.put(change.getMovieId(), change); } else { MovieRatingLocal movieRating = account.getMovieRating(change.getMovieId()); if (movieRating != null) { updatedMovieRatings.put(change.getMovieId(), movieRating.getData()); } } } } syncClient.setLastSynchronizationTime(initiationTime); return (MovieRatingData[]) new ArrayList(updatedMovieRatings.values()).toArray(new MovieRatingData[0]); } catch (Exception e) { throw new EJBException("SynchronizingBean.synchronizeMovieRatings: " + e); } } private Map movieRatingsArrayToMap(MovieRatingData[] movieRatings) { Map map = new HashMap(); for (int i = 0; i < movieRatings.length; i++) { map.put(movieRatings[i].getMovieId(), movieRatings[i]); } return map; } private void updateMovieRating(MovieRatingData data) throws FinderException, CreateException, RemoveException { MovieRatingLocal movieRating = account.getMovieRating(data.getMovieId()); if (movieRating == null) { SyncMetaDataLocal metaData = syncConduit.getSyncMetaData(data.getMovieId()); if (metaData != null) { metaData.remove(); } MovieLocal movie = movieHome.findByPrimaryKey(data.getMovieId()); movieRating = movieRatingHome.create(movie, account); } movieRating.setData(data, initiationTime); return; } private void removeMovieRating(String movieId) throws FinderException, CreateException, RemoveException { MovieRatingLocal movieRating = account.getMovieRating(movieId); if (movieRating != null) { movieRating.remove(); } return; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -