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}