/** * ============================================================================= * * 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.OrcidMessageVersionConverter; import org.orcid.core.version.OrcidMessageVersionConverterChain; import org.orcid.jaxb.model.message.OrcidMessage; /** * * @author Will Simpson * */ public class OrcidMessageVersionConverterChainImpl implements OrcidMessageVersionConverterChain { public List<OrcidMessageVersionConverter> converters; public ArrayList<String> versionIndex; public List<OrcidMessageVersionConverter> descendingConverters; public void setConverters(List<OrcidMessageVersionConverter> converters) { this.converters = converters; versionIndex = new ArrayList<String>(); for (int i = 0; i < converters.size(); i ++) { if (i == 0) versionIndex.add(converters.get(i).getFromVersion()); versionIndex.add(converters.get(i).getToVersion()); } List<OrcidMessageVersionConverter> descendingConverters = new ArrayList<>(converters); Collections.reverse(descendingConverters); this.descendingConverters = descendingConverters; } @Override public OrcidMessage downgradeMessage(OrcidMessage orcidMessage, String requiredVersion) { if (orcidMessage == null) { return null; } for (OrcidMessageVersionConverter converter : descendingConverters) { String oldVersion = orcidMessage.getMessageVersion(); if (requiredVersion.equals(oldVersion)) { break; } String fromVersion = converter.getFromVersion(); if (compareVersion(fromVersion,oldVersion) < 0 && compareVersion(fromVersion, requiredVersion) >= 0) { orcidMessage = converter.downgradeMessage(orcidMessage); } } return orcidMessage; } @Override public OrcidMessage upgradeMessage(OrcidMessage orcidMessage, String requiredVersion) { if (orcidMessage == null) { return null; } for (OrcidMessageVersionConverter converter : converters) { String oldVersion = orcidMessage.getMessageVersion(); if (requiredVersion.equals(oldVersion)) { break; } String toVersion = converter.getToVersion(); if (compareVersion(toVersion, oldVersion) > 0 && compareVersion(toVersion,requiredVersion) <= 0) { orcidMessage = converter.upgradeMessage(orcidMessage); } } return orcidMessage; } public 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; } }