package org.realityforge.gwt.sample.contacts.server.service;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.realityforge.gwt.sample.contacts.server.data_type.ContactDTO;
import org.realityforge.gwt.sample.contacts.server.data_type.ContactDetailsDTO;
import org.realityforge.gwt.sample.contacts.server.entity.Contact;
import org.realityforge.gwt.sample.contacts.server.entity.ContactType;
import org.realityforge.gwt.sample.contacts.server.entity.dao.ContactRepository;
import org.realityforge.gwt.sample.contacts.server.entity.dao.ContactTypeRepository;
@Stateless( name = ContactsService.NAME )
public class ContactsEJB
implements ContactsService
{
private static final String[] CONTACT_TYPES =
new String[] { "Home", "Work", "Mobile", "Satellite" };
private static final String[] FIRST_NAMES = new String[]{
"Hollie", "Emerson", "Healy", "Brigitte", "Elba", "Claudio",
"Dena", "Christina", "Gail", "Orville", "Rae", "Mildred",
"Candice", "Louise", "Emilio", "Geneva", "Heriberto", "Bulrush",
"Abigail", "Chad", "Terry", "Bell" };
private static final String[] LAST_NAMES = new String[]{
"Voss", "Milton", "Colette", "Cobb", "Lockhart", "Engle",
"Pacheco", "Blake", "Horton", "Daniel", "Childers", "Starnes",
"Carson", "Kelchner", "Hutchinson", "Underwood", "Rush", "Bouchard",
"Louis", "Andrews", "English", "Snedden" };
private static final String[] EMAILS = new String[]{
"mark@example.com", "hollie@example.com", "boticario@example.com",
"emerson@example.com", "healy@example.com", "brigitte@example.com",
"elba@example.com", "claudio@example.com", "dena@example.com",
"brasilsp@example.com", "parker@example.com", "derbvktqsr@example.com",
"qetlyxxogg@example.com", "antenas_sul@example.com",
"cblake@example.com", "gailh@example.com", "orville@example.com",
"post_master@example.com", "rchilders@example.com", "buster@example.com",
"user31065@example.com", "ftsgeolbx@example.com" };
@EJB
private ContactRepository _contactDAO;
@EJB
private ContactTypeRepository _contactTypeDAO;
@Override
@Nonnull
public ContactDTO createOrUpdateContact( @Nonnull final ContactDTO dto )
{
if( null == dto.getID() )
{
final Contact contact = new Contact();
updatePersistentFromDTO( dto, contact );
_contactDAO.persist( contact );
return toContactDTO( contact );
}
else
{
final Contact contact = findByID( dto.getID() );
updatePersistentFromDTO( dto, contact );
return toContactDTO( contact );
}
}
@Override
public void deleteContacts( @Nonnull java.util.List<java.lang.String> ids )
{
for( final String id : ids )
{
_contactDAO.remove( findByID( id ) );
}
}
@Override
@Nonnull
public List<ContactDetailsDTO> getContactDetails()
{
initContactsIfRequired();
final ArrayList<ContactDetailsDTO> contactDetails = new ArrayList<ContactDetailsDTO>();
for( final Contact contact : _contactDAO.findAll() )
{
contactDetails.add( toLightWeightContactDTO( contact ) );
}
return contactDetails;
}
@Override
@Nonnull
public ContactDTO getContact( @Nonnull final String id )
{
return toContactDTO( findByID( id ) );
}
private ContactDTO toContactDTO( final Contact result )
{
return new ContactDTO( String.valueOf( result.getID() ),
result.getContactType().getName(),
result.getFirstName(),
result.getLastName(),
result.getEmailAddress() );
}
private ContactDetailsDTO toLightWeightContactDTO( final Contact contact )
{
return new ContactDetailsDTO( String.valueOf( contact.getID() ),
contact.getContactType().getName(),
contact.getFirstName() + " " + contact.getLastName() );
}
private Contact findByID( final String id )
{
return _contactDAO.findByID( Integer.parseInt( id ) );
}
private ContactType findOrCreateTypeByName( final String name )
{
final ContactType type = _contactTypeDAO.findByName( name );
if( null != type )
{
return type;
}
else
{
final ContactType ct = new ContactType();
ct.setName( name );
ct.setRenderCode( name );
_contactTypeDAO.persist( ct );
return ct;
}
}
private void updatePersistentFromDTO( final ContactDTO contact, final Contact persistent )
{
String type = contact.getType();
type = ( null == type || "".equals( type ) ) ? CONTACT_TYPES[ 0 ] : type;
persistent.setContactType( findOrCreateTypeByName( type ) );
persistent.setFirstName( contact.getFirstName() );
persistent.setLastName( contact.getLastName() );
persistent.setEmailAddress( contact.getEmailAddress() );
}
private void initContactsIfRequired()
{
if( 0 == _contactDAO.findAll().size() )
{
for( int i = 0; i < FIRST_NAMES.length && i < LAST_NAMES.length && i < EMAILS.length; ++i )
{
final ContactDTO dto = new ContactDTO( null,
CONTACT_TYPES[ i % CONTACT_TYPES.length ],
FIRST_NAMES[ i ],
LAST_NAMES[ i ],
EMAILS[ i ] );
createOrUpdateContact( dto );
}
}
}
}