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}