Implement security, domain object graph and product service

This update ties together the domain object mapping correctly and simplifies the implementation. Transferable objects now have DTO transforms and replace their counterparts on the REST interfaces. JavaEE security groups have been mapped to the appropriate classes and/or methods. If you try access these and you are not logged in or have the correct permissions you will be redirected to the login page (work in progress - this currently just sends you to the index.html - modifications are required to be made to the front end to make this work).

- Update the .gitignore file with common files that should not be committed
- Add the Category domain class to represent product categories
- Update the Product domain class
  - The category is now mapped to the product
  - Add various length and nullable attributes
  - Add preview and full image blobs - currently not utilized
  - Add asDto method that return the equivalent DTO
  - Add the ProductDto domain object
- Update the ShoppingCart domain class
  - Replace composite foreign key with mapped entities
  - Add asDto method that return the equivalent DTO
  - Delete the ShoppingCartId class
- Update the User domain class
  - Add unique constraint on the username and email
  - Add various length and not nullable attributes
  - Correct the shoppingCart mapping
  - Replace the userRoles mapping with the a ElementCollection
  - Delete the UserRole and UserRoleId classes as replaced by above
- Add Guice 'LoggedInUserProvider' to inject the currently logged in user
- Update the ProductRestService
  - Add new method getAllProductCategories -> GET {DOMAIN}/rest/product/categories that returns a JSON array of all available product categories
  - Add new method addProduct(ProductDto) -> PUT {DOMAIN}/rest/product that adds a new product into the database
  - Add new method deleteProduct(int) -> DELETE {DOMAIN}/rest/product/{id} that deletes a product from the database
  - All PUT and DELETE HTTP methods on the ProductRestService require the ADMIN security role
- Update the ShoppingCartRestService
  - All HTTP methods on this service now requires the CUSTOMER security role
  - Update implementation class to dependency inject the logged in user
  - Implement the getCartContents() and emptyCart() methods
- Update the UserRestService
  - Fix bug that did not assign the CUSTOMER role to registered users
  - Roles are now assigned to users with the user.addRole(Role) method
- All service implementations now extend BaseService that provides shared methods
- Update the dialect in META-INF/persistance.xml to MySQLDialect
  - This now allows the hibernate.hbm2ddl.auto property to function