content: package com.acmeair.morphia.services;
  
  import java.util.Date;
  
  import javax.annotation.PostConstruct;
  
  import com.acmeair.entities.Customer;
  import com.acmeair.entities.Customer.MemberShipStatus;
  import com.acmeair.entities.Customer.PhoneType;
  import com.acmeair.entities.CustomerAddress;
  import com.acmeair.entities.CustomerSession;
  import com.acmeair.morphia.entities.CustomerAddressImpl;
  import com.acmeair.morphia.entities.CustomerSessionImpl;
  import com.acmeair.morphia.MorphiaConstants;
  import com.acmeair.morphia.entities.CustomerImpl;
  import com.acmeair.morphia.services.util.MongoConnectionManager;
  import com.acmeair.service.DataService;
  import com.acmeair.service.CustomerService;
  
  import org.mongodb.morphia.Datastore;
  import org.mongodb.morphia.query.Query;
  
  
  
  @DataService(name=MorphiaConstants.KEY,description=MorphiaConstants.KEY_DESCRIPTION)
  public class CustomerServiceImpl extends CustomerService implements MorphiaConstants {	
  		
  //	private final static Logger logger = Logger.getLogger(CustomerService.class.getName()); 
  	
  	protected Datastore datastore;
  		
  	
  	@PostConstruct
  	public void initialization() {	
  		datastore = MongoConnectionManager.getConnectionManager().getDatastore();
  	}
  	
  	@Override
  	public Long count() {
  		return datastore.find(CustomerImpl.class).countAll();
  	}
  	
  	@Override
  	public Long countSessions() {
  		return datastore.find(CustomerSessionImpl.class).countAll();
  	}
  	
  	@Override
  	public Customer createCustomer(String username, String password,
  			MemberShipStatus status, int total_miles, int miles_ytd,
  			String phoneNumber, PhoneType phoneNumberType,
  			CustomerAddress address) {
  	
  		Customer customer = new CustomerImpl(username, password, status, total_miles, miles_ytd, address, phoneNumber, phoneNumberType);
  		datastore.save(customer);
  		return customer;
  	}
  	
  	@Override 
  	public CustomerAddress createAddress (String streetAddress1, String streetAddress2,
  			String city, String stateProvince, String country, String postalCode){
  		CustomerAddress address = new CustomerAddressImpl(streetAddress1, streetAddress2,
  				 city, stateProvince,  country,  postalCode);
  		return address;
  	}
  
  	@Override
  	public Customer updateCustomer(Customer customer) {
  		datastore.save(customer);
  		return customer;
  	}
  
  	@Override
  	protected Customer getCustomer(String username) {
  		Query<CustomerImpl> q = datastore.find(CustomerImpl.class).field("_id").equal(username);
  		Customer customer = q.get();					
  		return customer;
  	}
  	
  	@Override
  	public Customer getCustomerByUsername(String username) {
  		Query<CustomerImpl> q = datastore.find(CustomerImpl.class).field("_id").equal(username);
  		Customer customer = q.get();
  		if (customer != null) {
  			customer.setPassword(null);
  		}			
  		return customer;
  	}
  	
  	@Override
  	protected CustomerSession getSession(String sessionid){
  		Query<CustomerSessionImpl> q = datastore.find(CustomerSessionImpl.class).field("_id").equal(sessionid);		
  		return q.get();
  	}
  	
  	@Override
  	protected void removeSession(CustomerSession session){		
  		datastore.delete(session);	
  	}
  	
  	@Override
  	protected  CustomerSession createSession(String sessionId, String customerId, Date creation, Date expiration) {
  		CustomerSession cSession = new CustomerSessionImpl(sessionId, customerId, creation, expiration);
  		datastore.save(cSession);
  		return cSession;
  	}
  
  	@Override
  	public void invalidateSession(String sessionid) {		
  		Query<CustomerSessionImpl> q = datastore.find(CustomerSessionImpl.class).field("_id").equal(sessionid);
  		datastore.delete(q);
  	}
  
  }
  