1 //----------------------------------------------------------------------
2 //
3 // PerfectJPattern: "Design patterns are good but components are better!"
4 // Example.java Copyright (c) 2009 Giovanni Azua Garcia
5 // bravegag@hotmail.com
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 3
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, see <http://www.gnu.org/licenses/>.
19 //
20 //----------------------------------------------------------------------
21 package org.perfectjpattern.jee.integration.dao.spring;
22
23 import java.text.*;
24 import java.util.*;
25
26 import org.perfectjpattern.example.datamodel.*;
27 import org.perfectjpattern.example.datamodel.visitor.*;
28 import org.perfectjpattern.jee.api.integration.dao.*;
29 import org.slf4j.*;
30 import org.springframework.context.support.*;
31
32 /**
33 * Startup Main for the Hibernate-Spring Generic DAO Pattern Example code
34 *
35 * @author <a href="mailto:bravegag@hotmail.com">Giovanni Azua</a>
36 * @version $ $Date: Dec 5, 2008 2:06:29 AM $
37 */
38 //CHECKSTYLE:OFF
39 public final
40 class Example
41 // CHECKSTYLE:ON
42 {
43 //------------------------------------------------------------------------
44 // public
45 //------------------------------------------------------------------------
46 public static void
47 main(String[] anArguments)
48 throws ParseException
49 {
50 // ToStringVisitor needs loading a ResourceBundle
51 Locale.setDefault(new Locale("en", "US"));
52
53 // initialize IoC Spring container
54 new ClassPathXmlApplicationContext(
55 new String[]
56 {
57 "genericDao-applicationContext.xml",
58 "example-applicationContext.xml"
59 });
60
61 try
62 {
63 //---------------------------------------------------------------
64 // Create fixture/ business model
65 //---------------------------------------------------------------
66
67 // available products
68 Product myProduct1 = new Product("Nikon D700", 3200.0);
69 Product myProduct2 = new Product("Nikon D300", 2000.0);
70 Product myProduct3 = new Product("Nikon D40x", 350.0);
71 Product myProduct4 = new Product("Nikon 80-400mm", 1500.0);
72 Product myProduct5 = new Product("Nikon 70-200mm", 1800.0);
73 Product myProduct6 = new Product("Nikon 17-55mm", 1200.0);
74
75 // new customer
76 Customer myCustomer1 = new Customer("Ernesto");
77
78 // add customer orders
79 Date myDate = DATE_FORMAT.parse("14.03.2007 08:00:00");
80 Set<Product> myProducts = new HashSet<Product>();
81 myProducts.addAll(Arrays.asList(new Product[] {myProduct1,
82 myProduct4, myProduct5 }));
83 Order myOrder1 = new Order(myCustomer1, myDate, myProducts);
84 myCustomer1.getOrders().add(myOrder1);
85
86 //-----------------------------------------------------------
87 // Accesses the AbstractFactory singleton LocalDaoFactory and
88 // persists Customer model in storage. Note how the
89 // LocalDaoFactory hides the framework-specific complexities.
90 // LocalDaoFactory gets constructed from the Spring
91 // configuration to:
92 //
93 // - HibernateCurrentSessionStrategy:
94 // a) Receives a new SessionFactory via IoC defined in
95 // the Spring configuration
96 // b) Uses the getCurrentSession Hibernate API that
97 // looks into the "current_session_context_class"
98 // configuration, for this example is set to "thread"
99 //
100 // - HibernateConfiguredTransactionStrategy:
101 // Simply accesses the Session Strategy and calls
102 // getTransaction, that will load whatever is configured
103 // in "hibernate.transaction_factory" configuration
104 //-----------------------------------------------------------
105 ICustomerDao myCustomerDao = LocalDaoFactory.
106 getInstance().createCustomerDao();
107 myCustomerDao.create(myCustomer1);
108
109 //-----------------------------------------------------------
110 // Commit changes. Note how accessing whatever Transaction
111 // implementation is transparent to the client
112 //-----------------------------------------------------------
113 myCustomerDao.getTransaction().commit();
114
115 //-----------------------------------------------------------
116 // Extend fixture/ business model
117 //-----------------------------------------------------------
118 Customer myCustomer2 = new Customer("Giovanni");
119
120 // add customer orders
121 myDate = DATE_FORMAT.parse("17.11.2007 08:00:00");
122 myProducts = new HashSet<Product>();
123 myProducts.addAll(Arrays.asList(new Product[] {myProduct1,
124 myProduct2, myProduct3 }));
125 myOrder1 = new Order(myCustomer2, myDate, myProducts);
126 myCustomer2.getOrders().add(myOrder1);
127
128 myDate = DATE_FORMAT.parse("15.01.2008 17:35:00");
129 myProducts = new HashSet<Product>();
130 myProducts.addAll(Arrays.asList(new Product[] {myProduct4,
131 myProduct5, myProduct6 }));
132 Order myOrder2 = new Order(myCustomer2, myDate, myProducts);
133 myCustomer2.getOrders().add(myOrder2);
134
135 //-----------------------------------------------------------
136 // Persist Customer models in storage
137 //-----------------------------------------------------------
138 myCustomerDao.create(myCustomer2);
139
140 //-----------------------------------------------------------
141 // Commit changes.
142 //-----------------------------------------------------------
143 myCustomerDao.getTransaction().commit();
144
145 //-----------------------------------------------------------
146 // Now we can try our new search capabilities
147 //-----------------------------------------------------------
148 long myMinimum = 2;
149 Date myBegin = DATE_FORMAT.parse("01.01.2007 00:00:00");
150 Date myEnd = DATE_FORMAT.parse("01.01.2009 00:00:00");
151 List<Customer> myCustomers = myCustomerDao.
152 findByNumberOfOrdersBetween(myBegin, myEnd, myMinimum);
153
154 ToStringVisitor myVisitor = new ToStringVisitor();
155 for (Customer myCustomer : myCustomers)
156 {
157 myVisitor.visit(myCustomer);
158 String myResult = myVisitor.getResult();
159
160 theLogger.debug(myResult);
161 }
162 }
163 finally
164 {
165 //-----------------------------------------------------------
166 // Final cleanup
167 //-----------------------------------------------------------
168 LocalDaoFactory.getInstance().shutdown();
169 }
170 }
171
172 //------------------------------------------------------------------------
173 // protected
174 //------------------------------------------------------------------------
175 protected static void
176 setLogger(Logger aLogger)
177 {
178 theLogger = aLogger;
179 }
180
181 //------------------------------------------------------------------------
182 // members
183 //------------------------------------------------------------------------
184 /**
185 * Provides logging facilities for this class
186 */
187 private static Logger theLogger = LoggerFactory.getLogger(Example.class);
188 private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(
189 "dd.MM.yyyy HH:mm:ss");
190 }