001package org.nuxeo.apidoc.snapshot;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.HashMap;
006import java.util.List;
007import java.util.Map;
008
009public class SnapshotResolverHelper {
010
011    protected static final String[] capaliases = { "cap", "Nuxeo Platform", "Nuxeo cap", "Nuxeo DM", "dm" };
012
013    public static String findBestMatch(List<DistributionSnapshot> snaps, String distributionId) {
014
015        if (distributionId == null || "".equals(distributionId.trim())) {
016            return null;
017        }
018        if ("current".equalsIgnoreCase((distributionId.trim()))) {
019            return "current";
020        }
021
022        // exact match
023        for (DistributionSnapshot snap : snaps) {
024            if (snap.getKey().equalsIgnoreCase(distributionId)) {
025                return snap.getKey();
026            }
027        }
028
029        // name match + best version
030        String[] parts = distributionId.split("-");
031        if (parts.length > 1) {
032            String name = parts[0];
033            String version = distributionId.replace(name + "-", "");
034            name = getName(name);
035            List<String> potentialVersions = new ArrayList<String>();
036            Map<String, String> dist4Version = new HashMap<String, String>();
037            for (DistributionSnapshot snap : snaps) {
038                if (getName(snap.getName()).equalsIgnoreCase(name)) {
039                    potentialVersions.add(snap.getVersion());
040                    dist4Version.put(snap.getVersion(), snap.getName());
041                    if (snap.getVersion().equals(version)) {
042                        return snap.getKey();
043                    }
044                }
045            }
046
047            potentialVersions.add(version);
048            Collections.sort(potentialVersions);
049            int idx = potentialVersions.indexOf(version);
050
051            String targetVersion = null;
052            if (idx == potentialVersions.size() - 1) {
053                targetVersion = potentialVersions.get(idx - 1);
054            } else if (idx < potentialVersions.size() - 1) {
055                targetVersion = potentialVersions.get(idx + 1);
056            }
057
058            if (targetVersion != null) {
059                return dist4Version.get(targetVersion) + "-" + targetVersion;
060            }
061        }
062        return null;
063    }
064
065    protected static String getName(String name) {
066        for (String dname : capaliases) {
067            if (dname.equalsIgnoreCase(name)) {
068                return "cap";
069            }
070        }
071        return name;
072    }
073
074}