/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.core.version.impl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.orcid.core.version.V2Convertible; import org.orcid.core.version.V2VersionConverter; import org.orcid.core.version.V2VersionConverterChain; /** * * @author Will Simpson * */ public class V2VersionConverterChainImpl implements V2VersionConverterChain { private List<V2VersionConverter> converters; private List<V2VersionConverter> descendingConverters; private ArrayList<String> versionIndex; public void setConverters(List<V2VersionConverter> converters) { this.converters = converters; this.descendingConverters = new ArrayList<>(converters); Collections.reverse(this.descendingConverters); versionIndex = new ArrayList<String>(); for (int i = 0; i < converters.size(); i++) { if (i == 0) { versionIndex.add(converters.get(i).getLowerVersion()); } versionIndex.add(converters.get(i).getUpperVersion()); } } @Override public V2Convertible downgrade(V2Convertible objectToDowngrade, String requiredVersion) { for (V2VersionConverter converter : descendingConverters) { if (compareVersion(converter.getLowerVersion(), requiredVersion) > -1) { objectToDowngrade = converter.downgrade(objectToDowngrade); } else { return objectToDowngrade; } } return objectToDowngrade; } @Override public V2Convertible upgrade(V2Convertible objectToUpgrade, String requiredVersion) { String objectVersion = objectToUpgrade.getCurrentVersion(); if(compareVersion(objectVersion, requiredVersion) < 0) { for (V2VersionConverter converter : converters) { if(compareVersion(objectVersion, converter.getUpperVersion()) < 0) { if (compareVersion(converter.getUpperVersion(), requiredVersion) < 1) { objectToUpgrade = converter.upgrade(objectToUpgrade); } else { return objectToUpgrade; } } } } return objectToUpgrade; } private int compareVersion(String v1, String v2) { if (versionIndex.indexOf(v1) < versionIndex.indexOf(v2)) { return -1; } else if (versionIndex.indexOf(v1) > versionIndex.indexOf(v2)) { return 1; } return 0; } }