package com.levelup.java.guava;

import static org.junit.Assert.assertEquals;

import org.apache.log4j.Logger;
import org.junit.Test;

import com.google.common.base.Objects;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.MutableClassToInstanceMap;

/**
 * This java example will demonstrate a use case for ClassToInstanceMap.
 * 
 * In many cases you need to gather multiple objects that relate to each other.  You may make 
 * 1:M db calls to get a set of objects, make web service requests, etc.  For instance, 
 * lets say you have a person, a person has addresses,  a person has jobs.  
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com/java/examples/guava-classtoinstancemap-example/'>ClassToInstanceMap Example</a>
 * 
 */
public class ClassToInstanceMapExample {

	private static final Logger logger = Logger.getLogger(ClassToInstanceMapExample.class);
	
	class Person {
		private String name;
		
		public Person(String name) {
			super();
			this.name = name;
		}

		public String getName() {
			return name;
		}
		
		@Override
		public String toString() {
			return Objects.toStringHelper(this)
					.add("name", name)
					.toString();
		}
	}
	
	class Jobs {
		private String jobName;

		public Jobs(String jobName) {
			super();
			this.jobName = jobName;
		}
		
		public String getJobName() {
			return jobName;
		}

		@Override
		public String toString() {
			return Objects.toStringHelper(this)
					.add("jobName", jobName)
					.toString();
		}
	}
	
	class Address {
		private String streetName;

		public Address(String streetName) {
			super();
			this.streetName = streetName;
		}

		public String getStreetName() {
			return streetName;
		}
		
		@Override
		public String toString() {
			return Objects.toStringHelper(this)
					.add("streetName", streetName)
					.toString();
		}
	}
	
	@Test
	public void classToINstanceMap_example () {
		
		Person person = new Person("Jackson");
		Jobs jobs = new Jobs("IT person");
		Address address = new  Address("505 Williams Street");
		
		ClassToInstanceMap<Object> classToInstanceMap = MutableClassToInstanceMap.create();
		classToInstanceMap.put(Person.class, person);
		classToInstanceMap.put(Jobs.class, jobs);
		classToInstanceMap.put(Address.class, address);
		
		logger.info(classToInstanceMap);
		
		assertEquals("IT person", classToInstanceMap.getInstance(Jobs.class).getJobName());
	}
	
}