/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.model.minecraft;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.skcraft.launcher.util.Environment;
import com.skcraft.launcher.util.Platform;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Library {
private String name;
private transient String group;
private transient String artifact;
private transient String version;
@JsonProperty("url")
private String baseUrl;
private Map<String, String> natives;
private Extract extract;
private List<Rule> rules;
// Forge-added
private String comment;
// Custom
private boolean locallyAvailable;
public void setName(String name) {
this.name = name;
if (name != null) {
String[] parts = name.split(":");
this.group = parts[0];
this.artifact = parts[1];
this.version = parts[2];
} else {
this.group = null;
this.artifact = null;
this.version = null;
}
}
public boolean matches(Environment environment) {
boolean allow = false;
if (getRules() != null) {
for (Rule rule : getRules()) {
if (rule.matches(environment)) {
allow = rule.getAction() == Action.ALLOW;
}
}
} else {
allow = true;
}
return allow;
}
@JsonIgnore
public String getGroup() {
return group;
}
@JsonIgnore
public String getArtifact() {
return artifact;
}
@JsonIgnore
public String getVersion() {
return version;
}
public String getNativeString(Platform platform) {
if (getNatives() != null) {
switch (platform) {
case LINUX:
return getNatives().get("linux");
case WINDOWS:
return getNatives().get("windows");
case MAC_OS_X:
return getNatives().get("osx");
default:
return null;
}
} else {
return null;
}
}
public String getFilename(Environment environment) {
String nativeString = getNativeString(environment.getPlatform());
if (nativeString != null) {
return String.format("%s-%s-%s.jar",
getArtifact(), getVersion(), nativeString);
}
return String.format("%s-%s.jar", getArtifact(), getVersion());
}
public String getPath(Environment environment) {
StringBuilder builder = new StringBuilder();
builder.append(getGroup().replace('.', '/'));
builder.append("/");
builder.append(getArtifact());
builder.append("/");
builder.append(getVersion());
builder.append("/");
builder.append(getFilename(environment));
String path = builder.toString();
path = path.replace("${arch}", environment.getArchBits());
return path;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Library library = (Library) o;
if (name != null ? !name.equals(library.name) : library.name != null)
return false;
return true;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
@Data
public static class Rule {
private Action action;
private OS os;
public boolean matches(Environment environment) {
if (getOs() == null) {
return true;
} else {
return getOs().matches(environment);
}
}
}
@Data
public static class OS {
private Platform platform;
private Pattern version;
@JsonProperty("name")
@JsonDeserialize(using = PlatformDeserializer.class)
@JsonSerialize(using = PlatformSerializer.class)
public Platform getPlatform() {
return platform;
}
public boolean matches(Environment environment) {
return (getPlatform() == null || getPlatform().equals(environment.getPlatform())) &&
(getVersion() == null || getVersion().matcher(environment.getPlatformVersion()).matches());
}
}
@Data
public static class Extract {
private List<String> exclude;
}
private enum Action {
ALLOW,
DISALLOW;
@JsonCreator
public static Action fromJson(String text) {
return valueOf(text.toUpperCase());
}
@JsonValue
public String toJson() {
return name().toLowerCase();
}
}
}