/**
* DeveloperCapes by Jadar
* License: MIT License
* (https://raw.github.com/jadar/DeveloperCapes/master/LICENSE)
* version 4.0.0.x
*/
package com.jadarstudios.developercapes.cape;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.BitSet;
import java.util.Map;
import com.google.common.collect.HashBiMap;
import com.google.common.primitives.UnsignedBytes;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.jadarstudios.developercapes.DevCapes;
import com.jadarstudios.developercapes.user.Group;
import com.jadarstudios.developercapes.user.GroupManager;
import com.jadarstudios.developercapes.user.User;
import com.jadarstudios.developercapes.user.UserManager;
/**
* All configs need a manager, this is it.
*
* @author jadar
*/
public class CapeConfigManager {
protected static CapeConfigManager instance;
protected static BitSet availableIds = new BitSet(256);
protected HashBiMap<Integer, CapeConfig> configs;
static {
availableIds.clear(availableIds.size());
}
public CapeConfigManager () {
configs = HashBiMap.create();
}
public static CapeConfigManager getInstance () {
if (instance == null) instance = new CapeConfigManager();
return instance;
}
public void addConfig (int id, CapeConfig config) throws InvalidCapeConfigIdException {
int realId = claimId(id);
this.configs.put(realId, config);
addUsers(config.users);
addGroups(config.groups);
}
protected void addUsers (Map<String, User> users) {
try {
UserManager.getInstance().addUsers(users.values());
} catch (Exception e) {
e.printStackTrace();
}
}
protected void addGroups (Map<String, Group> groups) {
try {
GroupManager.getInstance().addGroups(groups.values());
} catch (Exception e) {
e.printStackTrace();
}
}
public CapeConfig getConfig (int id) {
return this.configs.get(id);
}
public int getIdForConfig (CapeConfig config) {
return this.configs.inverse().get(config);
}
public static int getUniqueId () {
return availableIds.nextClearBit(1);
}
public static int claimId (int id) throws InvalidCapeConfigIdException {
if (id <= 0) throw new InvalidCapeConfigIdException("The config ID must be a positive non-zero integer");
try {
UnsignedBytes.checkedCast(id);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
boolean isRegistered = availableIds.get(id);
if (isRegistered) throw new InvalidCapeConfigIdException(String.format("The config ID %d is already claimed.", id));
availableIds.set(id);
return id;
}
public CapeConfig parse (InputStream is) {
if (is == null) throw new NullPointerException("Can not parse a null input stream!");
CapeConfig instance = new CapeConfig();
InputStreamReader isr = new InputStreamReader(is);
try {
Map<String, Object> entries = new Gson().fromJson(isr, Map.class);
for (Map.Entry<String, Object> entry : entries.entrySet()) {
final String nodeName = entry.getKey();
final Object obj = entry.getValue();
if (obj instanceof Map)
parseGroup(instance, nodeName, (Map) obj);
else if (obj instanceof String) parseUser(instance, nodeName, (String) obj);
}
} catch (JsonSyntaxException e) {
DevCapes.logger.error("CapeConfig could not be parsed because:");
e.printStackTrace();
}
return instance;
}
protected void parseGroup (CapeConfig config, String node, Map group) {
Group g = GroupManager.getInstance().parse(node, group);
if (g != null) config.groups.put(g.name, g);
}
protected void parseUser (CapeConfig config, String node, String user) {
User u = UserManager.getInstance().parse(node, user);
if (u != null) config.users.put(node, u);
}
/**
* DEPRECATED! Please use
* {@link com.jadarstudios.developercapes.cape.CapeConfigManager#parse(java.io.InputStream is)}
* This will be removed in the next major release.
*/
@Deprecated
public CapeConfig parseFromStream (InputStream is) {
return parse(is);
}
public static class InvalidCapeConfigIdException extends Exception {
public InvalidCapeConfigIdException () {
super();
}
public InvalidCapeConfigIdException (String s) {
super(s);
}
public InvalidCapeConfigIdException (Throwable cause) {
super(cause);
}
public InvalidCapeConfigIdException (String message, Throwable cause) {
super(message, cause);
}
}
}