001/* 002 * Copyright 2015 DuraSpace, Inc. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.fcrepo.migration.handlers; 017 018import java.util.ArrayList; 019import java.util.Collections; 020import java.util.HashMap; 021import java.util.List; 022import java.util.Map; 023 024import org.fcrepo.migration.DatastreamVersion; 025import org.fcrepo.migration.FedoraObjectHandler; 026import org.fcrepo.migration.FedoraObjectVersionHandler; 027import org.fcrepo.migration.ObjectInfo; 028import org.fcrepo.migration.ObjectProperties; 029import org.fcrepo.migration.ObjectReference; 030import org.fcrepo.migration.ObjectVersionReference; 031 032/** 033 * A FedoraObjectHandler implementation that analyzes the ObjectReference provided 034 * to the processObject method and exposes the version abstraction to a wrapped 035 * FedoraObjectVersionHandler implementation. 036 * @author mdurbin 037 */ 038public class VersionAbstractionFedoraObjectHandler implements FedoraObjectHandler { 039 040 private FedoraObjectVersionHandler handler; 041 042 /** 043 * version abstraction fedora object handler. 044 * @param versionHandler the version handler 045 */ 046 public VersionAbstractionFedoraObjectHandler(final FedoraObjectVersionHandler versionHandler) { 047 this.handler = versionHandler; 048 } 049 050 @Override 051 public void processObject(final ObjectReference object) { 052 final Map<String, List<DatastreamVersion>> versionMap = buildVersionMap(object); 053 final List<String> versionDates = new ArrayList<String>(versionMap.keySet()); 054 Collections.sort(versionDates); 055 final List<ObjectVersionReference> versions = new ArrayList<ObjectVersionReference>(); 056 for (final String versionDate : versionDates) { 057 versions.add(new ObjectVersionReference() { 058 @Override 059 public ObjectReference getObject() { 060 return object; 061 } 062 063 @Override 064 public ObjectInfo getObjectInfo() { 065 return object.getObjectInfo(); 066 } 067 068 @Override 069 public ObjectProperties getObjectProperties() { 070 return object.getObjectProperties(); 071 } 072 073 @Override 074 public String getVersionDate() { 075 return versionDate; 076 } 077 078 @Override 079 public List<DatastreamVersion> listChangedDatastreams() { 080 return versionMap.get(versionDate); 081 } 082 083 @Override 084 public boolean isLastVersion() { 085 return versionDates.get(versionDates.size() - 1).equals(versionDate); 086 } 087 088 @Override 089 public boolean isFirstVersion() { 090 return versionDates.get(0).equals(versionDate); 091 } 092 093 @Override 094 public int getVersionIndex() { 095 return versionDates.indexOf(versionDate); 096 } 097 098 @Override 099 public boolean wasDatastreamChanged(final String dsId) { 100 for (final DatastreamVersion v : listChangedDatastreams()) { 101 if (v.getDatastreamInfo().getDatastreamId().equals(dsId)) { 102 return true; 103 } 104 } 105 return false; 106 } 107 108 }); 109 } 110 handler.processObjectVersions(versions); 111 112 } 113 114 private Map<String, List<DatastreamVersion>> buildVersionMap(final ObjectReference object) { 115 final Map<String, List<DatastreamVersion>> versionMap = new HashMap<String, List<DatastreamVersion>>(); 116 for (final String dsId : object.listDatastreamIds()) { 117 for (final DatastreamVersion v : object.getDatastreamVersions(dsId)) { 118 final String date = v.getCreated(); 119 List<DatastreamVersion> versionsForDate = versionMap.get(date); 120 if (versionsForDate == null) { 121 versionsForDate = new ArrayList<DatastreamVersion>(); 122 versionMap.put(date, versionsForDate); 123 } 124 versionsForDate.add(v); 125 } 126 } 127 return versionMap; 128 } 129}