content: /*******************************************************************************
  * Copyright (c) 2013-2015 IBM Corp.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *    http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
  package com.acmeair.wxs.service;
  
  import java.util.Date;
  import java.util.Iterator;
  import java.util.logging.Logger;
  
  import javax.annotation.PostConstruct;
  import javax.enterprise.inject.Default;
  import javax.inject.Inject;
  
  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.service.BookingService;
  import com.acmeair.service.CustomerService;
  import com.acmeair.service.DataService;
  import com.acmeair.service.KeyGenerator;
  import com.acmeair.wxs.WXSConstants;
  import com.acmeair.wxs.entities.CustomerAddressImpl;
  import com.acmeair.wxs.entities.CustomerImpl;
  import com.acmeair.wxs.entities.CustomerSessionImpl;
  import com.acmeair.wxs.utils.WXSSessionManager;
  import com.ibm.websphere.objectgrid.ObjectGrid;
  import com.ibm.websphere.objectgrid.ObjectGridException;
  import com.ibm.websphere.objectgrid.ObjectMap;
  import com.ibm.websphere.objectgrid.Session;
  import com.ibm.websphere.objectgrid.UndefinedMapException;
  import com.ibm.websphere.objectgrid.plugins.TransactionCallbackException;
  import com.ibm.websphere.objectgrid.plugins.index.MapIndex;
  import com.ibm.websphere.objectgrid.plugins.index.MapIndexPlugin;
  
  
  @Default
  @DataService(name=WXSConstants.KEY,description=WXSConstants.KEY_DESCRIPTION)
  public class CustomerServiceImpl extends CustomerService implements WXSConstants{
  	
  	private static String BASE_CUSTOMER_MAP_NAME="Customer";
  	private static String BASE_CUSTOMER_SESSION_MAP_NAME="CustomerSession";
  	private static String CUSTOMER_MAP_NAME="Customer";
  	private static String CUSTOMER_SESSION_MAP_NAME="CustomerSession";
  	
  		
  	private final static Logger logger = Logger.getLogger(BookingService.class.getName()); 
  
  	private ObjectGrid og;
  	
  	@Inject
  	KeyGenerator keyGenerator;
  
  	
  	@PostConstruct
  	private void initialization()  {
  		try {
  			og = WXSSessionManager.getSessionManager().getObjectGrid();
  			CUSTOMER_MAP_NAME = BASE_CUSTOMER_MAP_NAME + WXSSessionManager.getSessionManager().getMapSuffix();
  			CUSTOMER_SESSION_MAP_NAME = BASE_CUSTOMER_SESSION_MAP_NAME + WXSSessionManager.getSessionManager().getMapSuffix();
  		} catch (ObjectGridException e) {
  			logger.severe("Unable to retreive the ObjectGrid reference " + e.getMessage());
  		}
  	}
  	
  	@Override
  	public Long count () {
  		try {
  			Session session = og.getSession();
  			ObjectMap objectMap = session.getMap(CUSTOMER_MAP_NAME);			
  			MapIndex mapIndex = (MapIndex)objectMap.getIndex(MapIndexPlugin.SYSTEM_KEY_INDEX_NAME);			
  			Iterator<?> keyIterator = mapIndex.findAll();
  			Long result = 0L;
  			while(keyIterator.hasNext()) {
  				keyIterator.next(); 
  				result++;
  			}
  			/*
  			int partitions = og.getMap(CUSTOMER_MAP_NAME).getPartitionManager().getNumOfPartitions();			
  			ObjectQuery query = og.getSession().createObjectQuery("SELECT COUNT ( o ) FROM " + CUSTOMER_MAP_NAME + " o ");
  			for(int i = 0; i<partitions;i++){
  				query.setPartition(i);
  				result += (Long) query.getSingleResult();
  			}
  			*/			
  			return result;
  		} catch (UndefinedMapException e) {
  			e.printStackTrace();
  		} catch (TransactionCallbackException e) {
  			e.printStackTrace();
  		} catch (ObjectGridException e) {
  			e.printStackTrace();
  		}		
  		return -1L;
  	}
  	
  	@Override
  	public Long countSessions () {
  		try {
  			Session session = og.getSession();
  			ObjectMap objectMap = session.getMap(CUSTOMER_SESSION_MAP_NAME);			
  			MapIndex mapIndex = (MapIndex)objectMap.getIndex(MapIndexPlugin.SYSTEM_KEY_INDEX_NAME);			
  			Iterator<?> keyIterator = mapIndex.findAll();
  			Long result = 0L;
  			while(keyIterator.hasNext()) {
  				keyIterator.next(); 
  				result++;
  			}
  			/*
  			int partitions = og.getMap(CUSTOMER_SESSION_MAP_NAME).getPartitionManager().getNumOfPartitions();
  			Long result = 0L;
  			ObjectQuery query = og.getSession().createObjectQuery("SELECT COUNT ( o ) FROM " + CUSTOMER_SESSION_MAP_NAME + " o ");
  			for(int i = 0; i<partitions;i++){
  				query.setPartition(i);
  				result += (Long) query.getSingleResult();
  			}
  			*/			
  			return result;
  		} catch (UndefinedMapException e) {
  			e.printStackTrace();
  		} catch (TransactionCallbackException e) {
  			e.printStackTrace();
  		} catch (ObjectGridException e) {
  			e.printStackTrace();
  		}	
  		return -1L;
  	}
  	
  	@Override
  	public Customer createCustomer(String username, String password,
  			MemberShipStatus status, int total_miles, int miles_ytd,
  			String phoneNumber, PhoneType phoneNumberType,
  			CustomerAddress address) {
  		try{
  			Customer customer = new CustomerImpl(username, password, status, total_miles, miles_ytd, address, phoneNumber, phoneNumberType);
  			// Session session = sessionManager.getObjectGridSession();
  			Session session = og.getSession();
  			ObjectMap customerMap = session.getMap(CUSTOMER_MAP_NAME);
  			customerMap.insert(customer.getUsername(), customer);
  			return customer;
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  
  	@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) {
  		try{
  			//Session session = sessionManager.getObjectGridSession();
  			Session session = og.getSession();
  			ObjectMap customerMap = session.getMap(CUSTOMER_MAP_NAME);
  			customerMap.update(customer.getUsername(), customer);
  			return customer;
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  
  	@Override
  	protected Customer getCustomer(String username) {
  		try{
  			//Session session = sessionManager.getObjectGridSession();
  			Session session = og.getSession();
  			ObjectMap customerMap = session.getMap(CUSTOMER_MAP_NAME);
  			
  			Customer c = (Customer) customerMap.get(username);
  			return c;
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  	
  
  	@Override
  	protected CustomerSession getSession(String sessionid){
  		try {
  			Session session = og.getSession();
  			ObjectMap customerSessionMap = session.getMap(CUSTOMER_SESSION_MAP_NAME);
  
  			return (CustomerSession)customerSessionMap.get(sessionid);
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  	
  	@Override
  	protected void removeSession(CustomerSession session){
  		try {
  			Session ogSession = og.getSession();
  			ObjectMap customerSessionMap = ogSession.getMap(CUSTOMER_SESSION_MAP_NAME);
  
  			customerSessionMap.remove(session.getId());
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  	
  	@Override
  	protected CustomerSession createSession(String sessionId, String customerId, Date creation, Date expiration) {
  		try{
  			CustomerSession cSession = new CustomerSessionImpl(sessionId, customerId, creation, expiration);
  			// Session session = sessionManager.getObjectGridSession();
  			Session session = og.getSession();
  			ObjectMap customerSessionMap = session.getMap(CUSTOMER_SESSION_MAP_NAME);
  			customerSessionMap.insert(cSession.getId(), cSession);
  			return cSession;
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  
  	@Override
  	public void invalidateSession(String sessionid) {
  		try{
  			//Session session = sessionManager.getObjectGridSession();
  			Session session = og.getSession();
  			ObjectMap customerSessionMap = session.getMap(CUSTOMER_SESSION_MAP_NAME);
  			customerSessionMap.remove(sessionid);
  		}catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  	}
  }
  