/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.plex.internal;
import static org.apache.commons.lang.StringUtils.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* This enum keeps track of changes within the Plex API. These are not "official" API levels used by Plex.
* They are however necessary for supporting different versions of the Plex Media Server within this binding.
*
* @author Jeroen Idserda
* @since 1.9.0
*/
public enum PlexApiLevel {
v1("0.0"),
v2("1.3.2.3112");
private String fromVersion;
private PlexApiLevel(String fromVersion) {
this.fromVersion = fromVersion;
}
/**
* Gets the latest (most recent) api level
*
* @return Latest api level
*/
public static PlexApiLevel getLatest() {
return values()[values().length - 1];
}
/**
* Get the API level for a certain version of the Plex Media Server.
*
* @param version Version of the Plex Media Server
* @return The appropriate API level for this version
*/
public static PlexApiLevel getApiLevel(String version) {
if (isNotBlank(version)) {
String[] versionWithBuildnumber = version.split("-");
String versionOnly = versionWithBuildnumber[0];
if (isNotBlank(versionOnly) && isNumeric(versionOnly.replaceAll("\\.", ""))) {
List<PlexApiLevel> levels = Arrays.asList(values());
Collections.reverse(levels);
for (PlexApiLevel level : levels) {
if (level.isEqualOrBeforeVersion(versionOnly)) {
return level;
}
}
}
}
// Assume latest version for unprocessable version numbers
return getLatest();
}
private boolean isEqualOrBeforeVersion(String version) {
String[] v1 = fromVersion.split("\\.");
String[] v2 = version.split("\\.");
int length = Math.min(v1.length, v2.length);
for (int i = 0; i < length; i++) {
int result = new Integer(v1[i]).compareTo(Integer.parseInt(v2[i]));
if (result != 0) {
return result <= 0;
}
}
return Integer.compare(v1.length, v2.length) <= 0;
}
}