/**
* Copyright 2014 Comcast Cable Communications Management, LLC
*
* This file is part of CATS.
*
* CATS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CATS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CATS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.comcast.cats.keymanager.service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.comcast.cats.RemoteCommand;
import com.comcast.cats.keymanager.domain.Key;
import com.comcast.cats.keymanager.entity.IrNetBoxProEntity;
import com.comcast.cats.keymanager.entity.KeyCodeFormat;
import com.comcast.cats.keymanager.entity.KeyCodes;
import com.comcast.cats.keymanager.entity.KeyLayout;
import com.comcast.cats.keymanager.entity.RedRatHubEntity;
import com.comcast.cats.keymanager.entity.RemoteType;
/**
* Implementation of KeyManager Service.
* @author thusai000
*/
// @Stateless(mappedName = "cats/services/KeyManagerService")
@Stateless
@TransactionAttribute( TransactionAttributeType.SUPPORTS )
public class KeyManagerServiceImpl implements KeyManagerService
{
Logger logger = LoggerFactory.getLogger(KeyManagerServiceImpl.class);
@PersistenceContext(unitName = "key-manager-pu")
private EntityManager entityManager;
public KeyManagerServiceImpl()
{
}
public KeyManagerServiceImpl( EntityManager entityManager )
{
this.entityManager = entityManager;
}
public void setEntityManager( EntityManager entityManager )
{
this.entityManager = entityManager;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addRemoteType(RemoteType remote) {
// {
// try {
this.entityManager.persist(remote);
// } catch (javax.ejb.EJBTransactionRolledbackException trb) {
// logger.warn("Cannot add remote due to " + trb.getMessage());
// }
//}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addKeyCodeFormat(KeyCodeFormat kcFormat) {
try {
this.entityManager.persist(kcFormat);
} catch (Exception e) {
logger.warn("Cannot add new format due to " + e.getMessage());
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addKeyCode(KeyCodes kCode) {
try {
this.entityManager.persist(kCode);
} catch (Exception e) {
logger.warn("Cannot add new key code due to " + e.getMessage());
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addKeyLayout(KeyLayout layout) {
try {
this.entityManager.persist(layout);
} catch (Exception e) {
logger.warn("Cannot add new layout due to " + e.getMessage());
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteRemoteType(RemoteType remote) {
RemoteType toRem = this.entityManager.find(RemoteType.class, remote
.getRemoteTypeId());
if (toRem != null) {
this.entityManager.remove(toRem);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteKeyCodeFormat(KeyCodeFormat kcFormat) {
KeyCodeFormat toRem = this.entityManager.find(KeyCodeFormat.class,
kcFormat.getKeyCodeFormatId());
if (toRem != null) {
this.entityManager.remove(toRem);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteKeyCode(KeyCodes kCode) {
KeyCodes toRem = this.entityManager.find(KeyCodes.class, kCode
.getKeyCodesId());
if (toRem != null) {
this.entityManager.remove(toRem);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteKeyLayout(KeyLayout layout) {
KeyLayout toRem = this.entityManager.find(KeyLayout.class, layout
.getKeyLayoutId());
if (toRem != null) {
this.entityManager.remove(toRem);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public RemoteType updateRemoteType(RemoteType remote) {
return (this.entityManager.merge(remote));
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public KeyCodeFormat updateKeyCodeFormat(KeyCodeFormat kcFormat) {
return (this.entityManager.merge(kcFormat));
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public KeyCodes updateKeyCode(KeyCodes kCode) {
return (this.entityManager.merge(kCode));
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public KeyLayout updateKeyLayout(KeyLayout layout) {
return (this.entityManager.merge(layout));
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List<RemoteType> getAvailableRemotes() {
return (this.entityManager.createQuery("from RemoteType")
.getResultList());
}
@Override
public List<KeyCodeFormat> getAvailableKeyCodeFormats() {
return (this.entityManager.createQuery("from KeyCodeFormat")
.getResultList());
}
@Override
public List<KeyCodes> getAvailableKeys(String remoteTypeName,
String formatName) {
Query q = this.entityManager
.createNamedQuery("KeyCodes.FindByTypeFormat");
q.setParameter("remoteType", remoteTypeName);
q.setParameter("formatName", formatName);
List<KeyCodes> kcList = q.getResultList();
return kcList;
}
@Override
public KeyCodes getKey(String remoteType, String format, String name) {
KeyCodes kc = null;
Query q = this.entityManager
.createNamedQuery("KeyCodes.FindByTypeFormatName");
q.setParameter("formatName", format);
q.setParameter("remoteType", remoteType);
q.setParameter("keyName", name);
try {
kc = (KeyCodes) q.getSingleResult();
} catch (NoResultException nre) {
logger.warn("No key found based on criteria " + nre.getMessage());
}
return kc;
}
@Override
public RemoteType getRemote(String remoteType) {
RemoteType rt = null;
Query q = this.entityManager.createNamedQuery("RemoteType.FindByName");
q.setParameter("remoteType", remoteType);
try {
rt = (RemoteType) q.getSingleResult();
} catch (NoResultException nre) {
logger.warn("No remote found with given criteria "
+ nre.getMessage());
}
return (rt);
}
@Override
public KeyCodeFormat getFormat(String format) {
KeyCodeFormat kcf = null;
Query q = this.entityManager
.createNamedQuery("KeyCodeFormat.FindByName");
q.setParameter("keyCodeFormat", format);
try {
kcf = (KeyCodeFormat) q.getSingleResult();
} catch (NoResultException nre) {
logger.warn("No format found with given criteria "
+ nre.getMessage());
}
return (kcf);
}
@Override
public KeyLayout getLayout(String remoteType, String format, String name) {
KeyLayout kl = null;
Query q = this.entityManager
.createNamedQuery("KeyLayout.FindByTypeFormatName");
q.setParameter("formatName", format);
q.setParameter("remoteType", remoteType);
q.setParameter("keyName", name);
try {
kl = (KeyLayout) q.getSingleResult();
} catch (NoResultException nre) {
logger
.warn("No Layout found based on criteria "
+ nre.getMessage());
}
return kl;
}
@Override
public List<KeyLayout> getLayouts(String remoteType, String format) {
List<KeyLayout> layoutList = null;
Query q = this.entityManager
.createNamedQuery("KeyLayout.FindByTypeFormat");
q.setParameter("formatName", format);
q.setParameter("remoteType", remoteType);
try {
layoutList = q.getResultList();
} catch (NoResultException nre) {
logger
.warn("No Layout found based on criteria "
+ nre.getMessage());
}
return layoutList;
}
@Override
public List<com.comcast.cats.keymanager.domain.Remote> getRemoteTransferObjects() {
List<com.comcast.cats.keymanager.domain.Remote> remotes = new ArrayList<com.comcast.cats.keymanager.domain.Remote>();
for (RemoteType remote : getAvailableRemotes()) {
com.comcast.cats.keymanager.domain.Remote r = new com.comcast.cats.keymanager.domain.Remote();
r.setName(remote.getRemoteTypeName());
for (KeyCodes code : remote.getKeyCodes()) {
Key key = new Key();
key.setFormat(code.getKeyCodeFormat().getKeyCodeFormatName());
key.setName(code.getKeyName());
key.setValue(code.getKeyCodeValue());
r.getKeys().add(key);
}
remotes.add(r);
}
return remotes;
}
@Override
/**
* Note: This method will return the PROTO( format) key layout for a specified remoteType
* We can also specify a list of remote in which case we will return a union of all the keys
* TODO: Overloaded methods to get the layout for Raw format might be required,but
* for the time being this seems sufficient.
*/
public List<com.comcast.cats.RemoteLayout> getRemoteLayoutTrasferObjects(
String remoteTypes) {
logger.debug(" getRemoteLayoutTrasferObjects called for{} ",
remoteTypes);
Set<com.comcast.cats.RemoteLayout> remoteLayoutList = new HashSet<com.comcast.cats.RemoteLayout>();
StringTokenizer tokens = new StringTokenizer(remoteTypes, ",");
while (tokens.hasMoreTokens()) {
String remoteType = tokens.nextToken();
logger.debug(" Getting layout for remoteType:{}",remoteType);
for (KeyLayout remote : getLayouts(remoteType, "PRONTO")) {
com.comcast.cats.RemoteLayout remoteLayout = new com.comcast.cats.RemoteLayout();
remoteLayout.setBackgroundColor(remote.getBackColor());
remoteLayout.setColumn(remote.getColumn());
remoteLayout.setForegroundColor(remote.getForeColor());
remoteLayout.setPanel(remote.getPanel());
remoteLayout.setRemote(RemoteCommand.valueOf(remote
.getKeyName()));
remoteLayout.setRow(remote.getRow());
logger.debug("Retrieved remote layout: {}",
remoteLayout.toString());
remoteLayoutList.add(remoteLayout);
}
}
List<com.comcast.cats.RemoteLayout> returnList = new ArrayList();
returnList.addAll(remoteLayoutList);
return returnList;
}
@Override
@TransactionAttribute( TransactionAttributeType.REQUIRED )
public void addIrNetBoxDevice( IrNetBoxProEntity irNetBox )
{
if ( getIrNetBox( irNetBox.getIp() ) == null )
{
try
{
entityManager.persist( irNetBox );
}
catch ( Exception e )
{
logger.warn( "Cannot add new irNetBox due to " + e.getMessage() );
e.printStackTrace();
}
}
}
@Override
public List< IrNetBoxProEntity > getAllIrNetBox()
{
List< IrNetBoxProEntity > irNetBoxes = new ArrayList< IrNetBoxProEntity >();
try{
Query q = entityManager.createNamedQuery( "IrNetBoxProEntity.findAllIrNetBox", IrNetBoxProEntity.class );
irNetBoxes = q.getResultList();
}catch(Exception e){
logger.warn( "Cannot fetch IrNetBoxList because of "+ e.getMessage() );
}
return irNetBoxes;
}
@Override
public IrNetBoxProEntity getIrNetBox( String selectedIrNetBoxDeviceIp )
{
IrNetBoxProEntity irNetBox =null;
try{
Query q = entityManager.createNamedQuery( "IrNetBoxProEntity.findIrNetBox", IrNetBoxProEntity.class );
q.setParameter( "ip", selectedIrNetBoxDeviceIp );
irNetBox = ( IrNetBoxProEntity ) q.getSingleResult();
}catch(Exception e){
logger.warn( "Cannot fetch IrNetBox with IP"+selectedIrNetBoxDeviceIp+" because of "+ e.getMessage() );
}
return irNetBox;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void updateIrNetBoxDevice(IrNetBoxProEntity selectedIrNetBoxProEntity) {
try {
entityManager.merge(selectedIrNetBoxProEntity);
} catch (Exception e) {
logger.warn("Cannot add new irNetBox due to " + e.getMessage());
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteIrNetBoxDevice(IrNetBoxProEntity toDeleteIrNetBoxDevice) {
try {
IrNetBoxProEntity netBox = getIrNetBox(toDeleteIrNetBoxDevice
.getIp());
entityManager.remove(netBox);
} catch (Exception e) {
logger.warn("Cannot remove new irNetBox due to " + e.getMessage());
e.printStackTrace();
}
}
@Override
public RedRatHubEntity getRedRatHub(String redratHubIp) {
RedRatHubEntity redratHub = null;
try {
Query q = entityManager.createNamedQuery(
"RedRatHubEntity.findRedRatHub", RedRatHubEntity.class);
q.setParameter("ip", redratHubIp);
redratHub = (RedRatHubEntity) q.getSingleResult();
} catch (Exception e) {
logger.warn("Cannot fetch RedratHub with IP" + redratHubIp
+ " because of " + e.getMessage());
}
return redratHub;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addRedRatHub(RedRatHubEntity rrHub) {
if (getRedRatHub(rrHub.getIp()) == null) {
try {
entityManager.persist(rrHub);
} catch (Exception e) {
logger.warn("Cannot add new rrHub due to " + e.getMessage());
e.printStackTrace();
}
}
}
@Override
public List<RedRatHubEntity> getAllRedRatHubs() {
List<RedRatHubEntity> redratHubs = new ArrayList<RedRatHubEntity>();
try {
Query q = entityManager.createNamedQuery(
"RedRatHubEntity.findAllRedRatHubs", RedRatHubEntity.class);
redratHubs = q.getResultList();
} catch (Exception e) {
logger.warn("Cannot fetch RedRatHub list because of "
+ e.getMessage());
}
return redratHubs;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void updateRedRatHub(RedRatHubEntity selectedRRHub) {
if (getIrNetBox(selectedRRHub.getIp()) == null) {
try {
entityManager.merge(selectedRRHub);
} catch (Exception e) {
logger.warn("Cannot update redrathub due to " + e.getMessage());
}
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteRedRatHub(RedRatHubEntity toDeleteRRHub) {
try{
RedRatHubEntity rrHub = (RedRatHubEntity)getRedRatHub( toDeleteRRHub.getIp() );
entityManager.remove( rrHub );
}
catch ( Exception e )
{
logger.warn( "Cannot remove redratHub due to " + e.getMessage() );
e.printStackTrace();
}
}
}