From b2eb312b5e18179051f5dc12bddff27a1c6388fe Mon Sep 17 00:00:00 2001 From: Shivanagouda Agasimani <88313126+shivu2002a@users.noreply.github.com> Date: Sun, 4 Dec 2022 22:01:29 +0530 Subject: [PATCH] feature: Embedded value pattern (#2384) * Emdedded value design pattern * Adding suggested changes * Adding module in parent POM * Fixed checkstyle errors --- embedded-value/README.md | 124 ++++++++++ embedded-value/etc/embedded-value.urm.png | Bin 0 -> 107518 bytes embedded-value/etc/embedded-value.urm.puml | 79 +++++++ embedded-value/pom.xml | 66 ++++++ .../java/com/iluwatar/embedded/value/App.java | 114 +++++++++ .../iluwatar/embedded/value/DataSource.java | 217 ++++++++++++++++++ .../embedded/value/DataSourceInterface.java | 69 ++++++ .../com/iluwatar/embedded/value/Order.java | 61 +++++ .../embedded/value/ShippingAddress.java | 54 +++++ .../com/iluwatar/embedded/value/AppTest.java | 41 ++++ pom.xml | 1 + 11 files changed, 826 insertions(+) create mode 100644 embedded-value/README.md create mode 100644 embedded-value/etc/embedded-value.urm.png create mode 100644 embedded-value/etc/embedded-value.urm.puml create mode 100644 embedded-value/pom.xml create mode 100644 embedded-value/src/main/java/com/iluwatar/embedded/value/App.java create mode 100644 embedded-value/src/main/java/com/iluwatar/embedded/value/DataSource.java create mode 100644 embedded-value/src/main/java/com/iluwatar/embedded/value/DataSourceInterface.java create mode 100644 embedded-value/src/main/java/com/iluwatar/embedded/value/Order.java create mode 100644 embedded-value/src/main/java/com/iluwatar/embedded/value/ShippingAddress.java create mode 100644 embedded-value/src/test/java/com/iluwatar/embedded/value/AppTest.java diff --git a/embedded-value/README.md b/embedded-value/README.md new file mode 100644 index 000000000..dc924cb45 --- /dev/null +++ b/embedded-value/README.md @@ -0,0 +1,124 @@ +--- +title: Embedded Value +category: Structural +language: en +tag: + - Data Access + - Enterprise Application Pattern +--- + +## Also known as +Aggregate Mapping, Composer + +## Intent +Many small objects make sense in an OO system that don’t make sense as +tables in a database. An Embedded Value maps the values of an object to fields in the record of the object’s owner. + +## Explanation + +Real-world example + +> Examples include currency-aware money objects and date +ranges. Although the default thinking is to save an object as a table, no sane person would want a table of money values. +> Another example would be the online orders which have a shipping address like street, city, state. We map these values of Shipping address object to fields in record of Order object. + +In plain words + +> Embedded value pattern let's you map an object into several fields of another object’s table. + +**Programmatic Example** + +Consider online order's example where we have details of item ordered and shipping address. We have Shipping address embedded in Order object. But in database we map shipping address values in Order record instead of creating a separate table for Shipping address and using foreign key to reference the order object. + +First, we have POJOs `Order` and `ShippingAddress` + +```java +public class Order { + + private int id; + private String item; + private String orderedBy; + private ShippingAddress ShippingAddress; + + public Order(String item, String orderedBy, ShippingAddress ShippingAddress) { + this.item = item; + this.orderedBy = orderedBy; + this.ShippingAddress = ShippingAddress; + } +``` +```java +public class ShippingAddress { + + private String city; + private String state; + private String pincode; + + public ShippingAddress(String city, String state, String pincode) { + this.city = city; + this.state = state; + this.pincode = pincode; + } +} +``` +Now, we have to create only one table for Order along with fields for shipping address attributes. + +```Sql +CREATE TABLE Orders (Id INT AUTO_INCREMENT, item VARCHAR(50) NOT NULL, orderedBy VARCHAR(50) city VARCHAR(50), state VARCHAR(50), pincode CHAR(6) NOT NULL, PRIMARY KEY(Id)) +``` + +While performing the database queries and inserts, we box and unbox shipping address details. + +```java +final String INSERT_ORDER = "INSERT INTO Orders (item, orderedBy, city, state, pincode) VALUES (?, ?, ?, ?, ?)"; + +public boolean insertOrder(Order order) throws Exception { + var insertOrder = new PreparedStatement(INSERT_ORDER); + var address = order.getShippingAddress(); + conn.setAutoCommit(false); + insertIntoOrders.setString(1, order.getItem()); + insertIntoOrders.setString(2, order.getOrderedBy()); + insertIntoOrders.setString(3, address.getCity()); + insertIntoOrders.setString(4, address.getState()); + insertIntoOrders.setString(5, address.getPincode()); + + var affectedRows = insertIntoOrders.executeUpdate(); + if(affectedRows == 1){ + Logger.info("Inserted successfully"); + }else{ + Logger.info("Couldn't insert " + order); + } +} +``` + +## Class diagram +![alt text](./etc/embedded-value.urm.png "Embedded value class diagram") + +## Applicability + +Use the Embedded value pattern when + +* Many small objects make sense in an OO system that don’t make sense as tables in a database. +* The simplest cases for Embedded Value are the clear, simple Value Objects like money and date range. +* If you’re mapping to an existing schema, you can use this pattern when a table contains data that you want to split into more than one object in memory. This can occur when you want to factor out some behaviour in object model. +* In most cases you’ll only use Embedded Value on a reference object when the association between them is single valued at both ends (a one-to-one association). +* It can only be used for fairly simple dependents. A solitary dependent, or a few separated dependents, works well. + +## Tutorials + +* [Dzone](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-3) +* [Ram N Java](https://ramj2ee.blogspot.com/2013/08/embedded-value-design-pattern.html) +* [Five's Weblog](https://powerdream5.wordpress.com/2007/10/09/embedded-value/) + +## Consequences + +* The great advantage of Embedded Value is that it allows SQL queries to be made against the values in the dependent object. +* The embedded value object has no persistence behaviour at all. +* While using this, you have to be careful that any change to the dependent marks the owner as dirty—which isn’t an issue with Value Objects that are replaced in the owner. +* Another issue is the loading and saving. If you only load the embedded object memory when you load the owner, that’s an argument for saving both in the same table. +* Another question is whether you’ll want to access the embedded objects' data separately through SQL. This can be important if you’re reporting through SQL and don’t have a separate database for reporting. + + +## Credits + +* [Fowler, Martin - Patterns of enterprise application architecture-Addison-Wesley](https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420) +* [Ram N Java](https://ramj2ee.blogspot.com/2013/08/embedded-value-design-pattern.html) \ No newline at end of file diff --git a/embedded-value/etc/embedded-value.urm.png b/embedded-value/etc/embedded-value.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..52d3ffb6235273bed61c972a87f056707ea02eb0 GIT binary patch literal 107518 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 C3s$lK literal 0 HcmV?d00001 diff --git a/embedded-value/etc/embedded-value.urm.puml b/embedded-value/etc/embedded-value.urm.puml new file mode 100644 index 000000000..ed7380279 --- /dev/null +++ b/embedded-value/etc/embedded-value.urm.puml @@ -0,0 +1,79 @@ +@startuml +package com.iluwatar.embedded.value { + class App { + - LOGGER : Logger {static} + + App() + + main(args : String[]) {static} + } + class DataSource { + - LOGGER : Logger {static} + - conn : Connection + - createschema : Statement + - deleteschema : Statement + - getschema : Statement + - insertIntoOrders : PreparedStatement + - queryOrders : Statement + - queyOrderByID : PreparedStatement + - removeorder : PreparedStatement + + DataSource() + + createSchema() : boolean + + deleteSchema() : boolean + + getSchema() : String + + insertOrder(order : Order) : boolean + + queryOrder(id : int) : Order + + queryOrders() : Stream + + removeOrder(id : int) + } + ~interface DataSourceInterface { + + CREATE_SCHEMA : String {static} + + DELETE_SCHEMA : String {static} + + GET_SCHEMA : String {static} + + INSERT_ORDER : String {static} + + JDBC_URL : String {static} + + QUERY_ORDER : String {static} + + QUERY_ORDERS : String {static} + + REMOVE_ORDER : String {static} + + createSchema() : boolean {abstract} + + deleteSchema() : boolean {abstract} + + getSchema() : String {abstract} + + insertOrder(Order) : boolean {abstract} + + queryOrder(int) : Order {abstract} + + queryOrders() : Stream {abstract} + + removeOrder(int) {abstract} + } + class Order { + - id : int + - item : String + - orderedBy : String + - shippingAddress : ShippingAddress + + Order() + + Order(id : int, item : String, orderedBy : String, shippingAddress : ShippingAddress) + + Order(item : String, orderedBy : String, shippingAddress : ShippingAddress) + + getId() : int + + getItem() : String + + getOrderedBy() : String + + getShippingAddress() : ShippingAddress + + setId(id : int) + + setItem(item : String) + + setOrderedBy(orderedBy : String) + + setShippingAddress(shippingAddress : ShippingAddress) + + toString() : String + } + class ShippingAddress { + - city : String + - pincode : String + - state : String + + ShippingAddress() + + ShippingAddress(city : String, state : String, pincode : String) + + getCity() : String + + getPincode() : String + + getState() : String + + setCity(city : String) + + setPincode(pincode : String) + + setState(state : String) + + toString() : String + } +} +Order --> "-shippingAddress" ShippingAddress +DataSource ..|> DataSourceInterface +@enduml \ No newline at end of file diff --git a/embedded-value/pom.xml b/embedded-value/pom.xml new file mode 100644 index 000000000..ccef450e4 --- /dev/null +++ b/embedded-value/pom.xml @@ -0,0 +1,66 @@ + + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT + + embedded-value + + + com.h2database + h2 + + + org.junit.jupiter + junit-jupiter-engine + test + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + + + com.iluwatar.embedded.value.App + + + + + + + + + \ No newline at end of file diff --git a/embedded-value/src/main/java/com/iluwatar/embedded/value/App.java b/embedded-value/src/main/java/com/iluwatar/embedded/value/App.java new file mode 100644 index 000000000..9e5011c59 --- /dev/null +++ b/embedded-value/src/main/java/com/iluwatar/embedded/value/App.java @@ -0,0 +1,114 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import java.util.stream.Collectors; + +import lombok.extern.slf4j.Slf4j; + +/* + * Many small objects make sense in an OO system that don’t make sense as + * tables in a database. Examples include currency-aware money objects (amount, currency) and date + * ranges. Although the default thinking is to save an object as a table, no sane + * person would want a table of money values. + * + * An Embedded Value maps the values of an object to fields in the record of + * the object’s owner. In this implementation we have an Order object with links to an + * ShippingAddress object. In the resulting table the fields in the ShippingAddress + * object map to fields in the Order table rather than make new records + * themselves. + */ + +@Slf4j +public class App { + + /** + * Program entry point. + * + * @param args command line args. + * @throws Exception if any error occurs. + * + */ + public static void main(String[] args) throws Exception { + final var dataSource = new DataSource(); + + // Orders to insert into database + final var order1 = new Order("JBL headphone", "Ram", + new ShippingAddress("Bangalore", "Karnataka", "560040")); + final var order2 = new Order("MacBook Pro", "Manjunath", + new ShippingAddress("Bangalore", "Karnataka", "581204")); + final var order3 = new Order("Carrie Soto is Back", "Shiva", + new ShippingAddress("Bangalore", "Karnataka", "560004")); + + /** + * Create table for orders - Orders(id, name, orderedBy, city, state, pincode). + * We can see that table is different from the Order object we have. + * We're mapping ShippingAddress into city, state, pincode colummns of the database and not creating a separate table. + */ + if (dataSource.createSchema()) { + LOGGER.info("TABLE CREATED"); + LOGGER.info("Table \"Orders\" schema:\n" + dataSource.getSchema()); + } else { + //If not able to create table, there's nothing we can do further. + LOGGER.error("Error creating table"); + System.exit(0); + } + + // Initially, database is empty + LOGGER.info("Orders Query: {}", dataSource.queryOrders().collect(Collectors.toList())); + + //Insert orders where shippingAddress is mapped to different columns of the same table + dataSource.insertOrder(order1); + dataSource.insertOrder(order2); + dataSource.insertOrder(order3); + + /** + * Query orders + * We'll create ShippingAddress object from city, state, pincode values from the table + * and add it to Order object + */ + LOGGER.info("Orders Query: {}", dataSource.queryOrders().collect(Collectors.toList()) + "\n"); + + //Query order by given id + LOGGER.info("Query Order with id=2: {}", dataSource.queryOrder(2)); + + /** + * Remove order by given id. + * Since we'd mapped address in the same table, deleting order will also take + * out the shipping address details + */ + LOGGER.info("Remove Order with id=1"); + dataSource.removeOrder(1); + LOGGER.info("\nOrders Query: {}", dataSource.queryOrders().collect(Collectors.toList()) + "\n"); + + //After successfull demonstration of the pattern, drop the table + if (dataSource.deleteSchema()) { + LOGGER.info("TABLE DROPPED"); + } else { + //If there's a potential error while dropping table + LOGGER.error("Error deleting table"); + } + } +} diff --git a/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSource.java b/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSource.java new file mode 100644 index 000000000..e2ec2ed7c --- /dev/null +++ b/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSource.java @@ -0,0 +1,217 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.stream.Stream; + +import lombok.extern.slf4j.Slf4j; +/* + * Communicates with H2 database with the help of JDBC API + * + * Inherits the SQL queries and methods from @link AbstractDataSource class + */ + +@Slf4j +public class DataSource implements DataSourceInterface { + private Connection conn; + + /** + * Statements are objects which are used to execute queries which will not be + * repeated. + */ + private Statement getschema; + private Statement deleteschema; + private Statement queryOrders; + + /* + * PreparedStatements are used to execute queries which will be repeated. + */ + private PreparedStatement insertIntoOrders; + private PreparedStatement removeorder; + private PreparedStatement queyOrderByID; + + /** + * {@summary} + * Establish connection to database. + */ + public DataSource() { + try { + conn = DriverManager.getConnection(JDBC_URL); + LOGGER.info("Connected to H2 in-memory database: " + conn.getCatalog()); + } catch (SQLException e) { + LOGGER.error(e.getLocalizedMessage(), e.getCause()); + } + } + + @Override + public boolean createSchema() { + try (Statement createschema = conn.createStatement()) { + createschema.execute(CREATE_SCHEMA); + insertIntoOrders = conn.prepareStatement(INSERT_ORDER, PreparedStatement.RETURN_GENERATED_KEYS); + getschema = conn.createStatement(); + queryOrders = conn.createStatement(); + removeorder = conn.prepareStatement(REMOVE_ORDER); + queyOrderByID = conn.prepareStatement(QUERY_ORDER); + deleteschema = conn.createStatement(); + } catch (SQLException e) { + LOGGER.error(e.getLocalizedMessage(), e.getCause()); + return false; + } + return true; + } + + @Override + public String getSchema() { + try { + var resultSet = getschema.executeQuery(GET_SCHEMA); + var sb = new StringBuilder(); + while (resultSet.next()) { + sb.append("Col name: " + resultSet.getString(1) + ", Col type: " + resultSet.getString(2) + "\n"); + } + getschema.close(); + return sb.toString(); + } catch (Exception e) { + LOGGER.error("Error in retrieving schema: {}", e.getLocalizedMessage(), e.getCause()); + } + return "Schema unavailable"; + } + + @Override + public boolean insertOrder(Order order) { + try { + conn.setAutoCommit(false); + insertIntoOrders.setString(1, order.getItem()); + insertIntoOrders.setString(2, order.getOrderedBy()); + var address = order.getShippingAddress(); + insertIntoOrders.setString(3, address.getCity()); + insertIntoOrders.setString(4, address.getState()); + insertIntoOrders.setString(5, address.getPincode()); + var affectedRows = insertIntoOrders.executeUpdate(); + if (affectedRows == 1) { + var rs = insertIntoOrders.getGeneratedKeys(); + rs.last(); + var insertedAddress = new ShippingAddress(address.getCity(), address.getState(), address.getPincode()); + var insertedOrder = new Order(rs.getInt(1), order.getItem(), order.getOrderedBy(), + insertedAddress); + conn.commit(); + LOGGER.info("Inserted: {}", insertedOrder); + } else { + conn.rollback(); + } + } catch (Exception e) { + LOGGER.error(e.getLocalizedMessage()); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + LOGGER.error(e.getLocalizedMessage()); + } + } + return true; + } + + @Override + public Stream queryOrders() { + var ordersList = new ArrayList(); + try (var rSet = queryOrders.executeQuery(QUERY_ORDERS)) { + while (rSet.next()) { + var order = new Order(rSet.getInt(1), rSet.getString(2), rSet.getString(3), + new ShippingAddress(rSet.getString(4), rSet.getString(5), + rSet.getString(6))); + ordersList.add(order); + } + rSet.close(); + } catch (SQLException e) { + LOGGER.error(e.getMessage(), e.getCause()); + } + return ordersList.stream(); + } + + /** + * {@summary} + * Query order by given id. + * @param id as the parameter + * @return Order objct + * @throws SQLException in case of unexpected events + */ + + @Override + public Order queryOrder(int id) throws SQLException { + Order order = null; + queyOrderByID.setInt(1, id); + try (var rSet = queyOrderByID.executeQuery()) { + queyOrderByID.setInt(1, id); + if (rSet.next()) { + var address = new ShippingAddress(rSet.getString(4), + rSet.getString(5), rSet.getString(6)); + order = new Order(rSet.getInt(1), rSet.getString(2), rSet.getString(3), address); + } + rSet.close(); + } catch (Exception e) { + LOGGER.error(e.getLocalizedMessage(), e.getCause()); + } + return order; + } + + @Override + public void removeOrder(int id) throws Exception { + try { + conn.setAutoCommit(false); + removeorder.setInt(1, id); + if (removeorder.executeUpdate() == 1) { + LOGGER.info("Order with id " + id + " successfully removed"); + } else { + LOGGER.info("Order with id " + id + " unavailable."); + } + } catch (Exception e) { + LOGGER.error(e.getLocalizedMessage(), e.getCause()); + conn.rollback(); + } finally { + conn.setAutoCommit(true); + } + } + + @Override + public boolean deleteSchema() throws Exception { + try { + deleteschema.execute(DELETE_SCHEMA); + queryOrders.close(); + queyOrderByID.close(); + deleteschema.close(); + insertIntoOrders.close(); + conn.close(); + return true; + } catch (Exception e) { + LOGGER.error(e.getLocalizedMessage(), e.getCause()); + } + return false; + } +} diff --git a/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSourceInterface.java b/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSourceInterface.java new file mode 100644 index 000000000..deddf55b9 --- /dev/null +++ b/embedded-value/src/main/java/com/iluwatar/embedded/value/DataSourceInterface.java @@ -0,0 +1,69 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import java.sql.SQLException; +import java.util.stream.Stream; + +/* + * Abstract class which contains the required SQL queries and basic methods declaration. + * + * The main thing to consider is that the ShippingAddress object doesn't have it's own class + * but it's values are stored into the Orders table as city, state, pincode + * + */ +interface DataSourceInterface { + + final String JDBC_URL = "jdbc:h2:mem:Embedded-Value"; + + final String CREATE_SCHEMA = "CREATE TABLE Orders (Id INT AUTO_INCREMENT, item VARCHAR(50) NOT NULL, orderedBy VARCHAR(50)" + + ", city VARCHAR(50), state VARCHAR(50), pincode CHAR(6) NOT NULL, PRIMARY KEY(Id))"; + + final String GET_SCHEMA = "SHOW COLUMNS FROM Orders"; + + final String INSERT_ORDER = "INSERT INTO Orders (item, orderedBy, city, state, pincode) VALUES(?, ?, ?, ?, ?)"; + + final String QUERY_ORDERS = "SELECT * FROM Orders"; + + final String QUERY_ORDER = QUERY_ORDERS + " WHERE Id = ?"; + + final String REMOVE_ORDER = "DELETE FROM Orders WHERE Id = ?"; + + final String DELETE_SCHEMA = "DROP TABLE Orders"; + + boolean createSchema() throws SQLException; + + String getSchema() throws SQLException; + + boolean insertOrder(Order order) throws SQLException; + + Stream queryOrders() throws SQLException; + + Order queryOrder(int id) throws SQLException; + + void removeOrder(int id) throws Exception; + + boolean deleteSchema() throws Exception; +} diff --git a/embedded-value/src/main/java/com/iluwatar/embedded/value/Order.java b/embedded-value/src/main/java/com/iluwatar/embedded/value/Order.java new file mode 100644 index 000000000..9c87a83f6 --- /dev/null +++ b/embedded-value/src/main/java/com/iluwatar/embedded/value/Order.java @@ -0,0 +1,61 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +/* + * A POJO which represents the Order object. + */ +@ToString +@Setter +@Getter +public class Order { + + private int id; + private String item; + private String orderedBy; + private ShippingAddress shippingAddress; + + /** + * Constructor for Item object. + * @param item item name + * @param orderedBy item orderer + * @param shippingAddress shipping address details + */ + + public Order(String item, String orderedBy, ShippingAddress shippingAddress) { + this.item = item; + this.orderedBy = orderedBy; + this.shippingAddress = shippingAddress; + } + + public Order(int id, String item, String orderedBy, ShippingAddress shippingAddress) { + this(item, orderedBy, shippingAddress); + this.id = id; + } + +} diff --git a/embedded-value/src/main/java/com/iluwatar/embedded/value/ShippingAddress.java b/embedded-value/src/main/java/com/iluwatar/embedded/value/ShippingAddress.java new file mode 100644 index 000000000..9b04519dd --- /dev/null +++ b/embedded-value/src/main/java/com/iluwatar/embedded/value/ShippingAddress.java @@ -0,0 +1,54 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import lombok.Getter; +import lombok.ToString; + +/** + * Another POJO which wraps the Shipping details of order into Object. + */ +@ToString +@Getter +public class ShippingAddress { + + private String city; + private String state; + private String pincode; + + /** + * Constructor for Shipping Address object. + * @param city City name + * @param state State name + * @param pincode Pin code of the city + * + */ + public ShippingAddress(String city, String state, String pincode) { + this.city = city; + this.state = state; + this.pincode = pincode; + } +} + diff --git a/embedded-value/src/test/java/com/iluwatar/embedded/value/AppTest.java b/embedded-value/src/test/java/com/iluwatar/embedded/value/AppTest.java new file mode 100644 index 000000000..1e97bfabc --- /dev/null +++ b/embedded-value/src/test/java/com/iluwatar/embedded/value/AppTest.java @@ -0,0 +1,41 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.embedded.value; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import org.junit.jupiter.api.Test; + +/** + * Check whether the execution of the main method in {@link App} + * throws an exception. +*/ +public class AppTest { + + @Test + public void doesNotThrowException() { + assertDoesNotThrow(() -> App.main(new String[] {})); + } +} diff --git a/pom.xml b/pom.xml index 68714e28a..3f491033a 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,7 @@ composite-view metadata-mapping service-to-worker + embedded-value currying serialized-entity identity-map