content: package com.alecgorge.minecraft.jsonapi.config;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import com.alecgorge.minecraft.jsonapi.JSONAPI;
  
  public class JSONAPIGroupConfigObject extends ConfigObject {
  	public String name;
  	public List<String> streams = new ArrayList<String>();
  	public List<String> permissions = new ArrayList<String>();
  	public List<String> methods = new ArrayList<String>();
  	
  	public String getName() {
  		return name;
  	}
  	
  	public List<String> getStreams() {
  		return streams != null ? streams : new ArrayList<String>();
  	}
  	
  	private List<JSONAPIPermissionNode> _list = null;
  	public List<JSONAPIPermissionNode> getPermissions() {
  		if(_list == null) {
  			_list = new ArrayList<JSONAPIPermissionNode>();
  			if(permissions != null) {
  				for(String name : permissions) {
  					_list.add(PermissionNodesConfig.fromName(name));
  				}
  			}
  		}
  		return _list;
  	}
  	
  	public List<String> getMethods() {
  		return methods != null ? methods : new ArrayList<String>();
  	}
  	
  	public boolean canUseStream(String streamName) {
  		if(getStreams().contains("ALLOW_ALL")) {
  			return true;
  		}
  		
  		for(JSONAPIPermissionNode node : getPermissions()) {
  			if(node.canUseStream(streamName)) {
  				return true;
  			}
  		}
  		
  		return getStreams().contains(streamName);
  	}
  	
  	public boolean canUseMethod(String methodName) {
  		JSONAPI.dbug("Testing permissions for " + methodName);
  		
  		if(getMethods().contains("ALLOW_ALL")) {
  			JSONAPI.dbug("ALLOW_ALL found in methods");
  			return true;
  		}
  		
  		for(JSONAPIPermissionNode node : getPermissions()) {
  			if(node.canUseMethod(methodName)) {
  				JSONAPI.dbug(node.getName() + " allows usage of " + methodName);
  				return true;
  			}
  		}
  		
  		if(getMethods().contains(methodName)) {
  			JSONAPI.dbug("the user's method list explicitly contains " + methodName);
  			return true;
  		}
  		else {
  			JSONAPI.dbug("the user cannot use " + methodName);
  			return false;
  		}
  	}
  	
  	public boolean hasPermission(String permission) {
  		for(JSONAPIPermissionNode node : getPermissions()) {
  			if(node.getName().equals(permission)) {
  				return true;
  			}
  		}
  		
  		return false;
  	}
  	
  	public String toString() {
  		return "name: " + name + "; streams: " + streams + "; permissions: " + permissions + "; methods: " + methods;
  	}
  }
  