// Path: src/main/java/nl/uva/larissa/json/ParseException.java
// public class ParseException extends Exception {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -786854572139522845L;
// 
// 	public ParseException(String message) {
// 		super(message);
// 	}
// 	public ParseException(Exception e) {
// 		super(e);
// 	}
// 
// }
// 
// Path: src/main/java/nl/uva/larissa/json/StatementParser.java
// @Contract
// public interface StatementParser {
// 	public Statement parseStatement(String json) throws ParseException;
// 
// 	public StatementDocument parseStatementDocument(String doc)
// 			throws ParseException;
// 
// 	public <T> T parse(Class<T> type, String json) throws ParseException;
// 
// 	public List<Statement> parseStatementList(String json)
// 			throws ParseException;;
// }
// 
// Path: src/main/java/nl/uva/larissa/json/StatementPrinter.java
// public interface StatementPrinter {
// 	public String printStatement(Statement statement) throws IOException;
// 
// 	public String print(StatementResult result) throws IOException;
// 
// 	String printCompact(Object object) throws IOException;
// 
// 	/**
// 	 * print Statement as defined in xAPI spec 7.2.3 for parameter 'format' with
// 	 * value 'ids'; Only print minimum info in Agent, Activity and Group Objects
// 	 * necessary to identify them
// 	 **/
// 	String printIds(Statement statement) throws IOException;
// 
// 	public String printIds(StatementResult result) throws IOException;
// }
// 
// Path: src/main/java/nl/uva/larissa/json/model/Agent.java
// @JsonInclude(Include.NON_NULL)
// public class Agent implements Actor, Authority, Instructor, StatementObject {
// 
// 	private String objectType;
// 	private String name;
// 	@JsonUnwrapped
// 	@Valid
// 	@NotNull
// 	private IFI identifier;
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public IFI getIdentifier() {
// 		return identifier;
// 	}
// 
// 	public void setIdentifier(IFI identifier) {
// 		this.identifier = identifier;
// 	}
// 
// 	public String getObjectType() {
// 		return objectType;
// 	}
// 
// 	public void setObjectType(String objectType) {
// 		this.objectType = objectType;
// 	}
// }


import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.inject.Inject;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import nl.uva.larissa.json.ParseException;
import nl.uva.larissa.json.StatementParser;
import nl.uva.larissa.json.StatementPrinter;
import nl.uva.larissa.json.model.Agent;
package nl.uva.larissa.service;




@Provider
public class AgentStringReaderProvider implements ParamConverterProvider {

	@Inject
	StatementParser parser;

	@Inject
	StatementPrinter printer;

	@SuppressWarnings("unchecked")
	@Override
	public <T> ParamConverter<T> getConverter(Class<T> arg0, Type arg1,
			Annotation[] arg2) {
		if (arg1.equals(Agent.class)) {
			return (ParamConverter<T>) new AgentParamConverter();
		}
		return null;
	}
	
	// TODO static class (but keep injection working?)

	class AgentParamConverter implements ParamConverter<Agent> {

		@Override
		public Agent fromString(String arg0) {
			try {
				return parser.parse(Agent.class, arg0);
// Path: src/main/java/nl/uva/larissa/json/ParseException.java
// public class ParseException extends Exception {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -786854572139522845L;
// 
// 	public ParseException(String message) {
// 		super(message);
// 	}
// 	public ParseException(Exception e) {
// 		super(e);
// 	}
// 
// }
// 
// Path: src/main/java/nl/uva/larissa/json/StatementParser.java
// @Contract
// public interface StatementParser {
// 	public Statement parseStatement(String json) throws ParseException;
// 
// 	public StatementDocument parseStatementDocument(String doc)
// 			throws ParseException;
// 
// 	public <T> T parse(Class<T> type, String json) throws ParseException;
// 
// 	public List<Statement> parseStatementList(String json)
// 			throws ParseException;;
// }
// 
// Path: src/main/java/nl/uva/larissa/json/StatementPrinter.java
// public interface StatementPrinter {
// 	public String printStatement(Statement statement) throws IOException;
// 
// 	public String print(StatementResult result) throws IOException;
// 
// 	String printCompact(Object object) throws IOException;
// 
// 	/**
// 	 * print Statement as defined in xAPI spec 7.2.3 for parameter 'format' with
// 	 * value 'ids'; Only print minimum info in Agent, Activity and Group Objects
// 	 * necessary to identify them
// 	 **/
// 	String printIds(Statement statement) throws IOException;
// 
// 	public String printIds(StatementResult result) throws IOException;
// }
// 
// Path: src/main/java/nl/uva/larissa/json/model/Agent.java
// @JsonInclude(Include.NON_NULL)
// public class Agent implements Actor, Authority, Instructor, StatementObject {
// 
// 	private String objectType;
// 	private String name;
// 	@JsonUnwrapped
// 	@Valid
// 	@NotNull
// 	private IFI identifier;
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public IFI getIdentifier() {
// 		return identifier;
// 	}
// 
// 	public void setIdentifier(IFI identifier) {
// 		this.identifier = identifier;
// 	}
// 
// 	public String getObjectType() {
// 		return objectType;
// 	}
// 
// 	public void setObjectType(String objectType) {
// 		this.objectType = objectType;
// 	}
// }


// Path: src/main/java/nl/uva/larissa/service/AgentStringReaderProvider.java
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.inject.Inject;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import nl.uva.larissa.json.ParseException;
import nl.uva.larissa.json.StatementParser;
import nl.uva.larissa.json.StatementPrinter;
import nl.uva.larissa.json.model.Agent;

package nl.uva.larissa.service;




@Provider
public class AgentStringReaderProvider implements ParamConverterProvider {

	@Inject
	StatementParser parser;

	@Inject
	StatementPrinter printer;

	@SuppressWarnings("unchecked")
	@Override
	public <T> ParamConverter<T> getConverter(Class<T> arg0, Type arg1,
			Annotation[] arg2) {
		if (arg1.equals(Agent.class)) {
			return (ParamConverter<T>) new AgentParamConverter();
		}
		return null;
	}
	
	// TODO static class (but keep injection working?)

	class AgentParamConverter implements ParamConverter<Agent> {

		@Override
		public Agent fromString(String arg0) {
			try {
				return parser.parse(Agent.class, arg0);
			} catch (ParseException e) {