From ae20ff353fddea201db204f490d6ee394ef14516 Mon Sep 17 00:00:00 2001 From: cooligc Date: Fri, 4 Sep 2015 00:57:57 +0530 Subject: [PATCH] Entire Customer Module Integrated and Swagger also Intgrated --- TicketBookingSystem/booking-core/pom.xml | 5 + .../core/api/config/ApiApplicationConfig.java | 4 +- .../core/api/jaxb/user/UserDetails.java | 1 + .../web/customer/CusomerApiServiceImpl.java | 20 ++- .../core/dao/address/AddressDao.java | 4 +- .../core/dao/address/AddressDaoImpl.java | 7 +- .../customer/address/CustomerAddressDao.java | 9 ++ .../address/CustomerAddressDaoImpl.java | 18 +++ .../core/domain/common/audit/Auditable.java | 84 +++++++++++ .../common/listener/AuditableListener.java | 70 +++++++++ .../core/domain/user/Address.java | 15 +- .../core/domain/user/AddressImpl.java | 139 +++++++++++++----- .../core/domain/user/Customer.java | 14 +- .../core/domain/user/CustomerAddress.java | 7 + .../core/domain/user/CustomerAddressImpl.java | 123 ++++++++++++++++ .../core/domain/user/CustomerImpl.java | 90 +++++------- .../core/helper/AddressHelper.java | 24 ++- .../core/service/address/AddressService.java | 4 +- .../service/address/AddressServiceImpl.java | 4 +- .../address/CustomerAddressService.java | 7 + .../address/CustomerAddressServiceImpl.java | 21 +++ .../src/main/resources/config.properties | 2 +- .../src/main/resources/swagger.properties | 2 + .../api/web/customer/CustomerController.java | 15 +- .../src/main/resources/swagger.properties | 2 + .../webapp/WEB-INF/applicationContext.xml | 14 -- .../webapp/WEB-INF/dispatcher-servlet.xml | 13 ++ .../src/main/webapp/WEB-INF/web.xml | 2 +- TicketBookingSystem/pom.xml | 20 ++- 29 files changed, 581 insertions(+), 159 deletions(-) create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDao.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDaoImpl.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/audit/Auditable.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/listener/AuditableListener.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddress.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddressImpl.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressService.java create mode 100644 TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressServiceImpl.java create mode 100644 TicketBookingSystem/booking-core/src/main/resources/swagger.properties create mode 100644 TicketBookingSystem/booking-site/src/main/resources/swagger.properties diff --git a/TicketBookingSystem/booking-core/pom.xml b/TicketBookingSystem/booking-core/pom.xml index 1d30907..ff5833b 100644 --- a/TicketBookingSystem/booking-core/pom.xml +++ b/TicketBookingSystem/booking-core/pom.xml @@ -184,5 +184,10 @@ org.hibernate hibernate-entitymanager + + + com.mangofactory + swagger-springmvc + \ No newline at end of file diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/config/ApiApplicationConfig.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/config/ApiApplicationConfig.java index 6244d7a..8d9fefb 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/config/ApiApplicationConfig.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/config/ApiApplicationConfig.java @@ -1,12 +1,14 @@ package org.ticketbooking.core.api.config; +import javax.ws.rs.ApplicationPath; + import org.apache.log4j.Logger; import org.glassfish.jersey.server.ResourceConfig; import org.ticketbooking.core.api.web.CheckBookingStatus; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; -//@ApplicationPath("/api/*") +@ApplicationPath("/api/*") public class ApiApplicationConfig extends ResourceConfig { private final static Logger LOGGER = Logger.getLogger(ApiApplicationConfig.class); diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/jaxb/user/UserDetails.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/jaxb/user/UserDetails.java index 504f038..1962af9 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/jaxb/user/UserDetails.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/jaxb/user/UserDetails.java @@ -9,6 +9,7 @@ import org.ticketbooking.core.api.jaxb.other.Links; + @XmlRootElement(name="user") public class UserDetails { diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/web/customer/CusomerApiServiceImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/web/customer/CusomerApiServiceImpl.java index cd0f1fd..b2085f9 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/web/customer/CusomerApiServiceImpl.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/api/web/customer/CusomerApiServiceImpl.java @@ -1,5 +1,7 @@ package org.ticketbooking.core.api.web.customer; +import java.util.Set; + import javax.annotation.Resource; import javax.ws.rs.Consumes; import javax.ws.rs.POST; @@ -12,14 +14,20 @@ import org.springframework.stereotype.Service; import org.ticketbooking.core.api.jaxb.user.UserDetails; +import org.ticketbooking.core.domain.user.AddressImpl; import org.ticketbooking.core.domain.user.Customer; import org.ticketbooking.core.domain.user.CustomerImpl; import org.ticketbooking.core.helper.AddressHelper; import org.ticketbooking.core.service.customer.CustomerService; +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; +import com.wordnik.swagger.annotations.ApiParam; + +@Api(value="CustomerDetails",description="Service to get the details about Customer") @Path("/user") @Service("apiCustomer") -public class CusomerApiServiceImpl implements CustomerApiService{ +public class CusomerApiServiceImpl implements CustomerApiService{ @Resource(name="customerService") CustomerService customerService; @@ -27,10 +35,12 @@ public class CusomerApiServiceImpl implements CustomerApiService{ @Resource(name="addressHelper") AddressHelper addressHelper; + + @ApiOperation(httpMethod="POST",value="To create a customer") @POST @Produces(value={MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) @Consumes(value={MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) - public Response createCustomer(UserDetails userDetails) { + public Response createCustomer(@ApiParam(name="userDetails",value="XML/JSON for creating user")UserDetails userDetails) { Customer customer = new CustomerImpl(); customer.setUsername(userDetails.getUserName()); @@ -40,11 +50,11 @@ public Response createCustomer(UserDetails userDetails) { customer.setEmail(userDetails.getEmail()); customer.setPhone(userDetails.getPhone()); customer.setPassword(userDetails.getPassword()); - customer.setAddresses(addressHelper.convertAddressEntity(userDetails.getAddresses())); - customer.setUsername(userDetails.getUserName()); customer.setUsername(userDetails.getUserName()); customerService.createCustomer(customer); - + Set address = addressHelper.convertAddressEntity(userDetails.getAddresses()); + //TODO Logic to be changed + addressHelper.createCustomerAddress(customer,address.iterator().next()); return Response.status(Status.CREATED).header("X-header-message", "User created").build(); } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDao.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDao.java index b957bf9..7bc08cd 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDao.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDao.java @@ -1,13 +1,11 @@ package org.ticketbooking.core.dao.address; -import java.util.List; - import org.ticketbooking.core.domain.user.AddressImpl; public interface AddressDao { void createAddress(AddressImpl address); void deleteAddress(Long id); AddressImpl fetchAddress(Long id); - List fetchAddressByCustomer(Long customerId); + //List fetchAddressByCustomer(Long customerId); void updateAddress(AddressImpl address); } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDaoImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDaoImpl.java index c512c9f..fb54de0 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDaoImpl.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/address/AddressDaoImpl.java @@ -1,10 +1,7 @@ package org.ticketbooking.core.dao.address; -import java.util.List; - import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import javax.persistence.Query; import org.springframework.stereotype.Repository; import org.ticketbooking.core.domain.user.AddressImpl; @@ -28,12 +25,12 @@ public AddressImpl fetchAddress(Long id) { return entityManager.find(AddressImpl.class, id); } - @SuppressWarnings("unchecked") + /*@SuppressWarnings("unchecked") public List fetchAddressByCustomer(Long customerId) { Query query = entityManager.createNamedQuery("AddressImpl.fetchByCustomer"); query.setParameter("id", customerId); return query.getResultList(); - } + }*/ public void updateAddress(AddressImpl address) { entityManager.merge(address); diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDao.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDao.java new file mode 100644 index 0000000..86daba5 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDao.java @@ -0,0 +1,9 @@ +package org.ticketbooking.core.dao.customer.address; + +import org.ticketbooking.core.domain.user.CustomerAddressImpl; + + + +public interface CustomerAddressDao{ + void createCustomerAddress(CustomerAddressImpl customerAddress); +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDaoImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDaoImpl.java new file mode 100644 index 0000000..0211e57 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/dao/customer/address/CustomerAddressDaoImpl.java @@ -0,0 +1,18 @@ +package org.ticketbooking.core.dao.customer.address; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.ticketbooking.core.domain.user.CustomerAddressImpl; + +@Repository("customerAddressDao") +public class CustomerAddressDaoImpl implements CustomerAddressDao{ + + @PersistenceContext + EntityManager entityManager; + + public void createCustomerAddress(CustomerAddressImpl customerAddress){ + entityManager.persist(customerAddress); + } +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/audit/Auditable.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/audit/Auditable.java new file mode 100644 index 0000000..e4413d5 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/audit/Auditable.java @@ -0,0 +1,84 @@ +package org.ticketbooking.core.domain.common.audit; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +@Embeddable +public class Auditable implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -2384592094387880727L; + + @Column(name="TBS_CREATED_DATE") + @Temporal(TemporalType.TIMESTAMP) + private Date createdDate; + + @Column(name="TBS_UPDATED_DATE") + @Temporal(TemporalType.TIMESTAMP) + private Date lastUpdatedDate; + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public Date getLastUpdatedDate() { + return lastUpdatedDate; + } + + public void setLastUpdatedDate(Date lastUpdatedDate) { + this.lastUpdatedDate = lastUpdatedDate; + } + + @Override + public String toString() { + return "Auditable [createdDate=" + createdDate + ", lastUpdatedDate=" + + lastUpdatedDate + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((createdDate == null) ? 0 : createdDate.hashCode()); + result = prime * result + + ((lastUpdatedDate == null) ? 0 : lastUpdatedDate.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Auditable other = (Auditable) obj; + if (createdDate == null) { + if (other.createdDate != null) + return false; + } else if (!createdDate.equals(other.createdDate)) + return false; + if (lastUpdatedDate == null) { + if (other.lastUpdatedDate != null) + return false; + } else if (!lastUpdatedDate.equals(other.lastUpdatedDate)) + return false; + return true; + } + + + +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/listener/AuditableListener.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/listener/AuditableListener.java new file mode 100644 index 0000000..68bf479 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/common/listener/AuditableListener.java @@ -0,0 +1,70 @@ +package org.ticketbooking.core.domain.common.listener; + +import java.lang.reflect.Field; +import java.util.Date; + +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; + +import org.ticketbooking.core.domain.common.audit.Auditable; + +public class AuditableListener { + + @PrePersist + public void setAuditableFieldforCreate(Object entity) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { + if (entity.getClass().isAnnotationPresent(Entity.class)) { + Field field = getSingleField(entity.getClass(), "auditable"); + field.setAccessible(true); + if (field.isAnnotationPresent(Embedded.class)) { + Object auditable = field.get(entity); + if (auditable == null) { + field.set(entity, new Auditable()); + auditable = field.get(entity); + } + Field temporalField = auditable.getClass().getDeclaredField("createdDate"); + Field agentField = auditable.getClass().getDeclaredField("lastUpdatedDate"); + setAuditValueTemporal(temporalField, auditable); + setAuditValueTemporal(agentField, auditable); + } + } + } + + @PreUpdate + public void setAuditableFieldForUdate(Object entity) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{ + if (entity.getClass().isAnnotationPresent(Entity.class)) { + Field field = getSingleField(entity.getClass(), "auditable"); + field.setAccessible(true); + if (field.isAnnotationPresent(Embedded.class)) { + Object auditable = field.get(entity); + if (auditable == null) { + field.set(entity, new Auditable()); + auditable = field.get(entity); + } + Field agentField = auditable.getClass().getDeclaredField("lastUpdatedDate"); + setAuditValueTemporal(agentField, auditable); + } + } + } + + + private void setAuditValueTemporal(Field temporalField, Object auditable) throws IllegalArgumentException, IllegalAccessException { + temporalField.setAccessible(true); + temporalField.set(auditable, new Date()); + } + + private Field getSingleField(Class clazz, String fieldName) + throws IllegalStateException { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException nsf) { + // Try superclass + if (clazz.getSuperclass() != null) { + return getSingleField(clazz.getSuperclass(), fieldName); + } + + return null; + } + } +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Address.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Address.java index 72bc63e..f1381d3 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Address.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Address.java @@ -1,8 +1,8 @@ package org.ticketbooking.core.domain.user; -import java.util.Date; +import java.io.Serializable; -public interface Address { +public interface Address extends Serializable{ public Long getId(); public void setId(Long id); public String getStreet1(); @@ -11,13 +11,10 @@ public interface Address { public void setStree2(String stree2); public Long getPin(); public void setPin(Long pin); - public Date getCreatedDate(); - public void setCreatedDate(Date createdDate); - public Date getUpdatedDate(); - public void setUpdatedDate(Date updatedDate); public State getState(); public void setState(StateImpl state); - public Customer getCustomer(); - public void setCustomer(CustomerImpl customer); - + public boolean isDefaultAddress(); + public void setDefaultAddress(boolean isDefaultAddress); + public boolean isActiveAddress(); + public void setActiveAddress(boolean isActiveAddress); } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/AddressImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/AddressImpl.java index d41924d..7248649 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/AddressImpl.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/AddressImpl.java @@ -1,33 +1,32 @@ package org.ticketbooking.core.domain.user; -import java.io.Serializable; -import java.util.Date; - import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; + +import org.ticketbooking.core.domain.common.audit.Auditable; +import org.ticketbooking.core.domain.common.listener.AuditableListener; @Entity +@EntityListeners(value=AuditableListener.class) @Table(name="TBS_ADDRESS") -@NamedQueries(value={ - @NamedQuery(name="AddressImpl.fetchByCustomer",query="from AddressImpl a where a.customer.id=:id") -}) -public class AddressImpl implements Serializable,Address{ +public class AddressImpl implements Address{ /** * */ private static final long serialVersionUID = 1L; + @Embedded + protected Auditable auditable = new Auditable(); + @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="TBS_ADDRESS_ID") @@ -42,21 +41,16 @@ public class AddressImpl implements Serializable,Address{ @Column(name="TBS_ADDRESS_PIN") private Long pin; - @Column(name="TBS_ADDRESS_CREATED_DATE") - @Temporal(TemporalType.TIMESTAMP) - private Date createdDate; + @Column(name="TBS_DEFAULT_ADDRESS") + private boolean isDefaultAddress; - @Column(name="TBS_ADDRESS_UPDATED_DATE") - @Temporal(TemporalType.TIMESTAMP) - private Date updatedDate; + @Column(name="TBS_ACTIVE_ADDRESS") + private boolean isActiveAddress; @ManyToOne @JoinColumn(name="TBS_STATE_ID",nullable=false) private StateImpl state; - @ManyToOne - @JoinColumn(name="TBS_CUSTOMER_ID") - private CustomerImpl customer; public Long getId() { return id; @@ -90,45 +84,110 @@ public void setPin(Long pin) { this.pin = pin; } - public Date getCreatedDate() { - return createdDate; + public State getState() { + return state; } - public void setCreatedDate(Date createdDate) { - this.createdDate = createdDate; + public void setState(StateImpl state) { + this.state = state; } - public Date getUpdatedDate() { - return updatedDate; + + public Auditable getAudit() { + return auditable; } - public void setUpdatedDate(Date updatedDate) { - this.updatedDate = updatedDate; + public void setAudit(Auditable audit) { + this.auditable = audit; } - public State getState() { - return state; + public boolean isDefaultAddress() { + return isDefaultAddress; } - public void setState(StateImpl state) { - this.state = state; + public void setDefaultAddress(boolean isDefaultAddress) { + this.isDefaultAddress = isDefaultAddress; } - public Customer getCustomer() { - return customer; + public boolean isActiveAddress() { + return isActiveAddress; } - public void setCustomer(CustomerImpl customer) { - this.customer = customer; + public void setActiveAddress(boolean isActiveAddress) { + this.isActiveAddress = isActiveAddress; } @Override public String toString() { - return "AddressImpl [id=" + id + ", street1=" + street1 + ", stree2=" - + stree2 + ", pin=" + pin + ", createdDate=" + createdDate - + ", updatedDate=" + updatedDate + ", state=" + state - + ", customer=" + customer + "]"; + return "AddressImpl [audit=" + auditable + ", id=" + id + ", street1=" + + street1 + ", stree2=" + stree2 + ", pin=" + pin + + ", isDefaultAddress=" + isDefaultAddress + + ", isActiveAddress=" + isActiveAddress + ", state=" + state + + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((auditable == null) ? 0 : auditable.hashCode()); + + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (isActiveAddress ? 1231 : 1237); + result = prime * result + (isDefaultAddress ? 1231 : 1237); + result = prime * result + ((pin == null) ? 0 : pin.hashCode()); + result = prime * result + ((state == null) ? 0 : state.hashCode()); + result = prime * result + ((stree2 == null) ? 0 : stree2.hashCode()); + result = prime * result + ((street1 == null) ? 0 : street1.hashCode()); + return result; } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AddressImpl other = (AddressImpl) obj; + if (auditable == null) { + if (other.auditable != null) + return false; + } else if (!auditable.equals(other.auditable)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (isActiveAddress != other.isActiveAddress) + return false; + if (isDefaultAddress != other.isDefaultAddress) + return false; + if (pin == null) { + if (other.pin != null) + return false; + } else if (!pin.equals(other.pin)) + return false; + if (state == null) { + if (other.state != null) + return false; + } else if (!state.equals(other.state)) + return false; + if (stree2 == null) { + if (other.stree2 != null) + return false; + } else if (!stree2.equals(other.stree2)) + return false; + if (street1 == null) { + if (other.street1 != null) + return false; + } else if (!street1.equals(other.street1)) + return false; + return true; + } + } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Customer.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Customer.java index 580bd00..4f89894 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Customer.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/Customer.java @@ -1,9 +1,8 @@ package org.ticketbooking.core.domain.user; -import java.util.Date; -import java.util.Set; +import java.io.Serializable; -public interface Customer { +public interface Customer extends Serializable { public Long getId(); public void setId(Long id); public String getUsername(); @@ -20,10 +19,7 @@ public interface Customer { public void setEmail(String email); public String getPhone(); public void setPhone(String phone); - public Date getCreatedDate(); - public void setCreatedDate(Date createdDate); - public Date getLastUpdated(); - public void setLastUpdated(Date lastUpdated); - public Set getAddresses(); - public void setAddresses(Set addresses); + public boolean isActive(); + public void setActive(boolean isActive); + } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddress.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddress.java new file mode 100644 index 0000000..1daf5b0 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddress.java @@ -0,0 +1,7 @@ +package org.ticketbooking.core.domain.user; + +import java.io.Serializable; + +public interface CustomerAddress extends Serializable { + +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddressImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddressImpl.java new file mode 100644 index 0000000..62886ad --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerAddressImpl.java @@ -0,0 +1,123 @@ +package org.ticketbooking.core.domain.user; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + + +@Entity +@Table(name="TBS_CUSTOMER_ADDRESS") +public class CustomerAddressImpl implements CustomerAddress{ + + /** + * + */ + private static final long serialVersionUID = -5517676145261999176L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="TBS_CUSTOMER_ADDRESS_ID") + private Long id; + + @Column(name="TBS_CUSTOMER_ADDRESS_NAME") + private String addressName; + + @ManyToOne(cascade=CascadeType.ALL,targetEntity=CustomerImpl.class) + @JoinColumn(name="TBS_CUSTOMER_ID") + private CustomerImpl customer; + + @ManyToOne(cascade=CascadeType.ALL,targetEntity=AddressImpl.class) + @JoinColumn(name="TBS_ADDRESS_ID") + private AddressImpl address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddressName() { + return addressName; + } + + public void setAddressName(String addressName) { + this.addressName = addressName; + } + + public CustomerImpl getCustomer() { + return customer; + } + + public void setCustomer(CustomerImpl customer) { + this.customer = customer; + } + + public AddressImpl getAddress() { + return address; + } + + public void setAddress(AddressImpl address) { + this.address = address; + } + + @Override + public String toString() { + return "CustomerAddressImpl [id=" + id + ", addressName=" + addressName + + ", customer=" + customer + ", address=" + address + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((address == null) ? 0 : address.hashCode()); + result = prime * result + + ((addressName == null) ? 0 : addressName.hashCode()); + result = prime * result + + ((customer == null) ? 0 : customer.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CustomerAddressImpl other = (CustomerAddressImpl) obj; + if (address == null) { + if (other.address != null) + return false; + } else if (!address.equals(other.address)) + return false; + if (addressName == null) { + if (other.addressName != null) + return false; + } else if (!addressName.equals(other.addressName)) + return false; + if (customer == null) { + if (other.customer != null) + return false; + } else if (!customer.equals(other.customer)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerImpl.java index 948f469..2de0cdd 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerImpl.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/domain/user/CustomerImpl.java @@ -1,33 +1,35 @@ package org.ticketbooking.core.domain.user; -import java.io.Serializable; -import java.util.Date; -import java.util.Set; - import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; + +import org.ticketbooking.core.domain.common.audit.Auditable; +import org.ticketbooking.core.domain.common.listener.AuditableListener; @Entity +@EntityListeners(value=AuditableListener.class) @Table(name="TBS_CUSTOMER") @NamedQueries(value={ @NamedQuery(name="CustomerImpl.fetchByUsername",query="from CustomerImpl c where c.username=:username") }) -public class CustomerImpl implements Serializable,Customer{ +public class CustomerImpl implements Customer{ /** * */ private static final long serialVersionUID = 1L; + @Embedded + protected Auditable auditable = new Auditable(); + @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="TBS_CUSTOMER_ID") @@ -54,16 +56,9 @@ public class CustomerImpl implements Serializable,Customer{ @Column(name="TBS_CUSTOMER_PHONE") private String phone; - @Column(name="TBS_CUSTOMER_CREATED_DATE") - @Temporal(TemporalType.TIMESTAMP) - private Date createdDate; - - @Column(name="TBS_CUSTOMER_UPDATED_DATE") - @Temporal(TemporalType.TIMESTAMP) - private Date lastUpdated; + @Column(name="TBS_CUSTOMER_ACTIVE") + private boolean isActive; - @OneToMany(mappedBy="customer") - private Set addresses; public Long getId() { return id; @@ -129,56 +124,44 @@ public void setPhone(String phone) { this.phone = phone; } - public Date getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Date createdDate) { - this.createdDate = createdDate; - } - public Date getLastUpdated() { - return lastUpdated; + public Auditable getAudit() { + return auditable; } - public void setLastUpdated(Date lastUpdated) { - this.lastUpdated = lastUpdated; + public void setAudit(Auditable audit) { + this.auditable = audit; } - public Set getAddresses() { - return addresses; + public boolean isActive() { + return isActive; } - public void setAddresses(Set addresses) { - this.addresses = addresses; + public void setActive(boolean isActive) { + this.isActive = isActive; } @Override public String toString() { - return "CustomerImpl [id=" + id + ", username=" + username - + ", password=" + password + ", firstName=" + firstName - + ", lastName=" + lastName + ", middleName=" + middleName - + ", email=" + email + ", phone=" + phone + ", createdDate=" - + createdDate + ", lastUpdated=" + lastUpdated + ", addresses=" - + addresses + "]"; + return "CustomerImpl [audit=" + auditable + ", id=" + id + ", username=" + + username + ", password=" + password + ", firstName=" + + firstName + ", lastName=" + lastName + ", middleName=" + + middleName + ", email=" + email + ", phone=" + phone + + ", isActive=" + isActive + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result - + ((addresses == null) ? 0 : addresses.hashCode()); - result = prime * result - + ((createdDate == null) ? 0 : createdDate.hashCode()); + result = prime * result + ((auditable == null) ? 0 : auditable.hashCode()); result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (isActive ? 1231 : 1237); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); - result = prime * result - + ((lastUpdated == null) ? 0 : lastUpdated.hashCode()); result = prime * result + ((middleName == null) ? 0 : middleName.hashCode()); result = prime * result @@ -198,15 +181,10 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; CustomerImpl other = (CustomerImpl) obj; - if (addresses == null) { - if (other.addresses != null) - return false; - } else if (!addresses.equals(other.addresses)) - return false; - if (createdDate == null) { - if (other.createdDate != null) + if (auditable == null) { + if (other.auditable != null) return false; - } else if (!createdDate.equals(other.createdDate)) + } else if (!auditable.equals(other.auditable)) return false; if (email == null) { if (other.email != null) @@ -223,16 +201,13 @@ public boolean equals(Object obj) { return false; } else if (!id.equals(other.id)) return false; + if (isActive != other.isActive) + return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; - if (lastUpdated == null) { - if (other.lastUpdated != null) - return false; - } else if (!lastUpdated.equals(other.lastUpdated)) - return false; if (middleName == null) { if (other.middleName != null) return false; @@ -255,6 +230,7 @@ public boolean equals(Object obj) { return false; return true; } + diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/helper/AddressHelper.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/helper/AddressHelper.java index f5df5cb..5df2bf3 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/helper/AddressHelper.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/helper/AddressHelper.java @@ -1,6 +1,5 @@ package org.ticketbooking.core.helper; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -8,14 +7,20 @@ import javax.annotation.Resource; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import org.ticketbooking.core.api.jaxb.user.Address; import org.ticketbooking.core.domain.other.LocaleImpl; import org.ticketbooking.core.domain.user.AddressImpl; import org.ticketbooking.core.domain.user.CountryImpl; +import org.ticketbooking.core.domain.user.Customer; +import org.ticketbooking.core.domain.user.CustomerAddressImpl; +import org.ticketbooking.core.domain.user.CustomerImpl; import org.ticketbooking.core.domain.user.StateImpl; import org.ticketbooking.core.service.address.AddressService; import org.ticketbooking.core.service.address.country.CountryService; import org.ticketbooking.core.service.address.state.StateService; +import org.ticketbooking.core.service.customer.CustomerService; +import org.ticketbooking.core.service.customer.address.CustomerAddressService; @Component("addressHelper") public class AddressHelper { @@ -28,6 +33,12 @@ public class AddressHelper { @Resource(name="countryService") CountryService countryService; + + @Resource(name="customerAddressService") + CustomerAddressService customerAddressService; + + @Resource(name="customerService") + CustomerService customerService; public Address convertAddress(org.ticketbooking.core.domain.user.Address address){ Address convertedAddress = new Address(); @@ -43,8 +54,6 @@ public Set convertAddressEntity(List
addresses) { Set addresses2 = new HashSet(); for (Address address : addresses) { AddressImpl address2 = new AddressImpl(); - address2.setCreatedDate(new Date()); - address2.setUpdatedDate(new Date()); address2.setPin(address.getPin()); address2.setStreet1(address.getStreet1()); address2.setStree2(address.getStreet2()); @@ -68,4 +77,13 @@ public Set convertAddressEntity(List
addresses) { return addresses2; } + + @Transactional("tbsTransaction") + public void createCustomerAddress(Customer customer,AddressImpl address){ + CustomerAddressImpl customerAddress = new CustomerAddressImpl(); + customerAddress.setCustomer((CustomerImpl) customerService.findCustomerById(customer.getId())); + customerAddress.setAddress(addressService.fetchAddress(address.getId())); + customerAddress.setAddressName("Address created for custoemr"); + customerAddressService.createCustomerAddress(customerAddress); + } } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressService.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressService.java index 12fcd17..b5227b0 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressService.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressService.java @@ -1,13 +1,11 @@ package org.ticketbooking.core.service.address; -import java.util.List; - import org.ticketbooking.core.domain.user.AddressImpl; public interface AddressService { void createAddress(AddressImpl address); void deleteAddress(Long id); AddressImpl fetchAddress(Long id); - List fetchAddressByCustomer(Long customerId); +// List fetchAddressByCustomer(Long customerId); void updateAddress(AddressImpl address); } diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressServiceImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressServiceImpl.java index d3f5dbb..ee4b3c6 100644 --- a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressServiceImpl.java +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/address/AddressServiceImpl.java @@ -32,10 +32,10 @@ public AddressImpl fetchAddress(Long id) { } - @Transactional(value="tbsTransaction",readOnly=true) + /*@Transactional(value="tbsTransaction",readOnly=true) public List fetchAddressByCustomer(Long customerId) { return addressDao.fetchAddressByCustomer(customerId); - } + }*/ @Transactional("tbsTransaction") public void updateAddress(AddressImpl address) { diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressService.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressService.java new file mode 100644 index 0000000..da22bf5 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressService.java @@ -0,0 +1,7 @@ +package org.ticketbooking.core.service.customer.address; + +import org.ticketbooking.core.domain.user.CustomerAddressImpl; + +public interface CustomerAddressService { + void createCustomerAddress(CustomerAddressImpl customerAddress); +} diff --git a/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressServiceImpl.java b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressServiceImpl.java new file mode 100644 index 0000000..0d05457 --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/java/org/ticketbooking/core/service/customer/address/CustomerAddressServiceImpl.java @@ -0,0 +1,21 @@ +package org.ticketbooking.core.service.customer.address; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.ticketbooking.core.dao.customer.address.CustomerAddressDao; +import org.ticketbooking.core.domain.user.CustomerAddressImpl; + +@Service("customerAddressService") +public class CustomerAddressServiceImpl implements CustomerAddressService{ + + @Resource(name="customerAddressDao") + CustomerAddressDao addressDao; + + @Transactional("tbsTransaction") + public void createCustomerAddress(CustomerAddressImpl customerAddress){ + addressDao.createCustomerAddress(customerAddress); + } + +} diff --git a/TicketBookingSystem/booking-core/src/main/resources/config.properties b/TicketBookingSystem/booking-core/src/main/resources/config.properties index 6b5ca6d..6a4aeff 100644 --- a/TicketBookingSystem/booking-core/src/main/resources/config.properties +++ b/TicketBookingSystem/booking-core/src/main/resources/config.properties @@ -19,4 +19,4 @@ application.host.name=localhost application.port.number=8080 application.path=/ application.channel=http -application.isHttps=false \ No newline at end of file +application.isHttps=false diff --git a/TicketBookingSystem/booking-core/src/main/resources/swagger.properties b/TicketBookingSystem/booking-core/src/main/resources/swagger.properties new file mode 100644 index 0000000..d9b35ed --- /dev/null +++ b/TicketBookingSystem/booking-core/src/main/resources/swagger.properties @@ -0,0 +1,2 @@ +documentation.services.version=1.0 +documentation.services.basePath=http://localhost:8080/ \ No newline at end of file diff --git a/TicketBookingSystem/booking-site/src/main/java/org/ticketbooking/site/api/web/customer/CustomerController.java b/TicketBookingSystem/booking-site/src/main/java/org/ticketbooking/site/api/web/customer/CustomerController.java index 26173ef..3359af7 100644 --- a/TicketBookingSystem/booking-site/src/main/java/org/ticketbooking/site/api/web/customer/CustomerController.java +++ b/TicketBookingSystem/booking-site/src/main/java/org/ticketbooking/site/api/web/customer/CustomerController.java @@ -16,6 +16,11 @@ import org.ticketbooking.core.helper.LinksHelper; import org.ticketbooking.core.service.customer.CustomerService; +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; +import com.wordnik.swagger.annotations.ApiParam; + +@Api(value="CustomerDetails",description="Service to get the details about Customer") @RestController @RequestMapping("/user") public class CustomerController { @@ -27,14 +32,16 @@ public class CustomerController { @Resource(name="addressHelper") AddressHelper addressHelper; - @RequestMapping(value="/{username}",produces="{application/json,application/xml}",method=RequestMethod.GET) - public UserDetails getUserDetails(@PathVariable("username") String username){ + @ApiOperation(httpMethod="GET",responseClass="UserDetails",value="will retrive all the details about the customer based on the username provided") + @RequestMapping(value="/{username}",produces={"application/json","application/xml"},method=RequestMethod.GET) + public UserDetails getUserDetails(@ApiParam(name="username",value="Username of the customer",required=true)@PathVariable("username") String username){ UserDetails userDetails = new UserDetails(); Customer customer = customerService.findCustomerByUserName(username); List
addresses = new ArrayList
(); - for (org.ticketbooking.core.domain.user.Address address : customer.getAddresses()) { + //TODO To Implement Address with Customer + /*for (org.ticketbooking.core.domain.user.Address address : customer.getAddresses()) { addresses.add(addressHelper.convertAddress(address)); - } + }*/ userDetails.setAddresses(addresses); userDetails.setEmail(customer.getEmail()); userDetails.setFirstName(customer.getFirstName()); diff --git a/TicketBookingSystem/booking-site/src/main/resources/swagger.properties b/TicketBookingSystem/booking-site/src/main/resources/swagger.properties new file mode 100644 index 0000000..d9b35ed --- /dev/null +++ b/TicketBookingSystem/booking-site/src/main/resources/swagger.properties @@ -0,0 +1,2 @@ +documentation.services.version=1.0 +documentation.services.basePath=http://localhost:8080/ \ No newline at end of file diff --git a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/applicationContext.xml b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/applicationContext.xml index 0b4473c..ace830a 100644 --- a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/applicationContext.xml +++ b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/applicationContext.xml @@ -19,18 +19,4 @@ - - - - - - - \ No newline at end of file diff --git a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/dispatcher-servlet.xml index e657348..a567273 100644 --- a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -11,4 +11,17 @@ http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> + + + + + + + + classpath:swagger.properties + + + + + \ No newline at end of file diff --git a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/web.xml b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/web.xml index cef8a99..67cfa97 100644 --- a/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/web.xml +++ b/TicketBookingSystem/booking-site/src/main/webapp/WEB-INF/web.xml @@ -6,10 +6,10 @@ contextConfigLocation + /WEB-INF/applicationContext-filter.xml classpath:applicationContext-core.xml /WEB-INF/applicationContext.xml /WEB-INF/applicationContext-security.xml - /WEB-INF/applicationContext-filter.xml diff --git a/TicketBookingSystem/pom.xml b/TicketBookingSystem/pom.xml index 8f1c94f..1681da1 100644 --- a/TicketBookingSystem/pom.xml +++ b/TicketBookingSystem/pom.xml @@ -234,7 +234,13 @@ org.hibernate hibernate-validator - 4.2.0.Final + 5.2.1.Final + + + com.fasterxml + classmate + + org.hibernate.common @@ -264,7 +270,17 @@ javax.servlet-api ${servlet.api.version} - + + + com.mangofactory + swagger-springmvc + 0.5.2 + + + com.fasterxml + classmate + 0.8.0 +