1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.tools.samplesqlbuilder;
24  
25  import com.liferay.portal.freemarker.FreeMarkerUtil;
26  import com.liferay.portal.kernel.util.GetterUtil;
27  import com.liferay.portal.kernel.util.StringPool;
28  import com.liferay.portal.kernel.util.StringUtil_IW;
29  import com.liferay.portal.kernel.util.Validator;
30  import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
31  import com.liferay.portal.model.Company;
32  import com.liferay.portal.model.Contact;
33  import com.liferay.portal.model.Group;
34  import com.liferay.portal.model.Layout;
35  import com.liferay.portal.model.Resource;
36  import com.liferay.portal.model.Role;
37  import com.liferay.portal.model.User;
38  import com.liferay.portal.tools.sql.DBUtil;
39  import com.liferay.portal.util.InitUtil;
40  import com.liferay.portlet.blogs.model.BlogsEntry;
41  import com.liferay.portlet.blogs.model.BlogsStatsUser;
42  import com.liferay.portlet.messageboards.model.MBCategory;
43  import com.liferay.portlet.messageboards.model.MBDiscussion;
44  import com.liferay.portlet.messageboards.model.MBMessage;
45  import com.liferay.portlet.messageboards.model.MBStatsUser;
46  import com.liferay.portlet.messageboards.model.MBThread;
47  import com.liferay.portlet.tags.model.TagsAsset;
48  import com.liferay.portlet.wiki.model.WikiNode;
49  import com.liferay.portlet.wiki.model.WikiPage;
50  import com.liferay.util.SimpleCounter;
51  
52  import java.io.BufferedReader;
53  import java.io.File;
54  import java.io.FileReader;
55  import java.io.FileWriter;
56  import java.io.Writer;
57  
58  import java.util.HashMap;
59  import java.util.List;
60  import java.util.Map;
61  
62  /**
63   * <a href="SampleSQLBuilder.java.html"><b><i>View Source</i></b></a>
64   *
65   * @author Brian Wing Shun Chan
66   */
67  public class SampleSQLBuilder {
68  
69      public static void main(String[] args) {
70          InitUtil.initWithSpring();
71  
72          String outputDir = System.getProperty("sample.sql.output.dir");
73          int maxBlogsEntryCommentCount = GetterUtil.getInteger(
74              System.getProperty("sample.sql.blogs.entry.comment.count"));
75          int maxBlogsEntryCount = GetterUtil.getInteger(
76              System.getProperty("sample.sql.blogs.entry.count"));
77          int maxGroupCount = GetterUtil.getInteger(
78              System.getProperty("sample.sql.group.count"));
79          int maxMBCategoryCount = GetterUtil.getInteger(
80              System.getProperty("sample.sql.mb.category.count"));
81          int maxMBMessageCount = GetterUtil.getInteger(
82              System.getProperty("sample.sql.mb.message.count"));
83          int maxMBThreadCount = GetterUtil.getInteger(
84              System.getProperty("sample.sql.mb.thread.count"));
85          int maxUserCount = GetterUtil.getInteger(
86              System.getProperty("sample.sql.user.count"));
87          int maxUserToGroupCount = GetterUtil.getInteger(
88              System.getProperty("sample.sql.user.to.group.count"));
89          int maxWikiNodeCount = GetterUtil.getInteger(
90              System.getProperty("sample.sql.wiki.node.count"));
91          int maxWikiPageCommentCount = GetterUtil.getInteger(
92              System.getProperty("sample.sql.wiki.page.comment.count"));
93          int maxWikiPageCount = GetterUtil.getInteger(
94              System.getProperty("sample.sql.wiki.page.count"));
95          boolean securityEnabled = GetterUtil.getBoolean(
96              System.getProperty("sample.sql.security.enabled"));
97  
98          new SampleSQLBuilder(
99              outputDir, maxBlogsEntryCommentCount, maxBlogsEntryCount,
100             maxGroupCount, maxMBCategoryCount, maxMBMessageCount,
101             maxMBThreadCount, maxUserCount, maxUserToGroupCount,
102             maxWikiNodeCount, maxWikiPageCommentCount, maxWikiPageCount,
103             securityEnabled);
104     }
105 
106     public SampleSQLBuilder(
107         String outputDir, int maxBlogsEntryCommentCount, int maxBlogsEntryCount,
108         int maxGroupCount, int maxMBCategoryCount, int maxMBMessageCount,
109         int maxMBThreadCount, int maxUserCount, int maxUserToGroupCount,
110         int maxWikiNodeCount, int maxWikiPageCommentCount, int maxWikiPageCount,
111         boolean securityEnabled) {
112 
113         try {
114             _outputDir = outputDir;
115             _maxBlogsEntryCommentCount = maxBlogsEntryCommentCount;
116             _maxBlogsEntryCount = maxBlogsEntryCount;
117             _maxGroupCount = maxGroupCount;
118             _maxMBCategoryCount = maxMBCategoryCount;
119             _maxMBMessageCount = maxMBMessageCount;
120             _maxMBThreadCount = maxMBThreadCount;
121             _maxUserCount = maxUserCount;
122             _maxUserToGroupCount = maxUserToGroupCount;
123             _maxWikiNodeCount = maxWikiNodeCount;
124             _maxWikiPageCommentCount = maxWikiPageCommentCount;
125             _maxWikiPageCount = maxWikiPageCount;
126             _securityEnabled = securityEnabled;
127 
128             int totalMThreadCount = maxMBCategoryCount * maxMBThreadCount;
129             int totalMBMessageCount = totalMThreadCount * maxMBMessageCount;
130 
131             int counterOffset =
132                 _maxGroupCount +
133                 (_maxGroupCount *
134                     (maxMBCategoryCount + totalMThreadCount +
135                         totalMBMessageCount)
136                 ) + 1;
137 
138             _counter = new SimpleCounter(counterOffset);
139             _permissionCounter = new SimpleCounter();
140             _resourceCounter = new SimpleCounter();
141             _resourceCodeCounter = new SimpleCounter();
142 
143             _userScreenNameIncrementer = new SimpleCounter();
144 
145             _dataFactory = new DataFactory(
146                 _maxGroupCount, _maxUserToGroupCount, _counter,
147                 _permissionCounter, _resourceCounter, _resourceCodeCounter);
148 
149             // Generic
150 
151             _writerGeneric = new FileWriter(_outputDir +  "/sample.sql");
152 
153             createSample();
154 
155             _writerGeneric.flush();
156 
157             // MySQL
158 
159             _writerMySQL = new FileWriter(_outputDir +  "/sample-mysql.sql");
160 
161             DBUtil mysqlDBUtil = DBUtil.getInstance(DBUtil.TYPE_MYSQL);
162 
163             boolean previousBlankLine = false;
164 
165             BufferedReader br = new BufferedReader(
166                 new FileReader(_outputDir +  "/sample.sql"));
167 
168             String s = null;
169 
170             while ((s = br.readLine()) != null) {
171                 s = mysqlDBUtil.buildSQL(s).trim();
172 
173                 _writerMySQL.write(s);
174 
175                 if (previousBlankLine && Validator.isNull(s)) {
176                 }
177                 else {
178                     _writerMySQL.write(StringPool.NEW_LINE);
179                 }
180 
181                 if (Validator.isNull(s)) {
182                     previousBlankLine = true;
183                 }
184             }
185 
186             br.close();
187 
188             _writerMySQL.flush();
189         }
190         catch (Exception e) {
191             e.printStackTrace();
192         }
193     }
194 
195     public void insertBlogsEntry(BlogsEntry blogsEntry) throws Exception {
196         Map<String, Object> context = getContext();
197 
198         put(context, "blogsEntry", blogsEntry);
199 
200         processTemplate(_tplBlogsEntry, context);
201     }
202 
203     public void insertBlogsStatsUser(BlogsStatsUser blogsStatsUser)
204         throws Exception {
205 
206         Map<String, Object> context = getContext();
207 
208         put(context, "blogsStatsUser", blogsStatsUser);
209 
210         processTemplate(_tplBlogsStatsUser, context);
211     }
212 
213     public void insertGroup(
214             Group group, List<Layout> privateLayouts,
215             List<Layout> publicLayouts)
216         throws Exception {
217 
218         Map<String, Object> context = getContext();
219 
220         put(context, "group", group);
221         put(context, "privateLayouts", privateLayouts);
222         put(context, "publicLayouts", publicLayouts);
223 
224         processTemplate(_tplGroup, context);
225     }
226 
227     public void insertMBCategory(MBCategory mbCategory) throws Exception {
228         Map<String, Object> context = getContext();
229 
230         put(context, "mbCategory", mbCategory);
231 
232         processTemplate(_tplMBCategory, context);
233     }
234 
235     public void insertMBDiscussion(MBDiscussion mbDiscussion) throws Exception {
236         Map<String, Object> context = getContext();
237 
238         put(context, "mbDiscussion", mbDiscussion);
239 
240         processTemplate(_tplMBDiscussion, context);
241     }
242 
243     public void insertMBMessage(MBMessage mbMessage) throws Exception {
244         Map<String, Object> context = getContext();
245 
246         put(context, "mbMessage", mbMessage);
247 
248         processTemplate(_tplMBMessage, context);
249     }
250 
251     public void insertMBStatsUser(MBStatsUser mbStatsUser) throws Exception {
252         Map<String, Object> context = getContext();
253 
254         put(context, "mbStatsUser", mbStatsUser);
255 
256         processTemplate(_tplMBStatsUser, context);
257     }
258 
259     public void insertMBThread(MBThread mbThread) throws Exception {
260         Map<String, Object> context = getContext();
261 
262         put(context, "mbThread", mbThread);
263 
264         processTemplate(_tplMBThread, context);
265     }
266 
267     public void insertSecurity(String name, long primKey) throws Exception {
268         insertSecurity(name, String.valueOf(primKey));
269     }
270 
271     public void insertSecurity(String name, String primKey) throws Exception {
272         if (!_securityEnabled) {
273             return;
274         }
275 
276         Map<String, Object> context = getContext();
277 
278         Resource resource = _dataFactory.addResource(name, primKey);
279 
280         put(context, "resource", resource);
281 
282         processTemplate(_tplSecurity, context);
283     }
284 
285     public void insertTagsAsset(TagsAsset tagsAsset) throws Exception {
286         Map<String, Object> context = getContext();
287 
288         put(context, "tagsAsset", tagsAsset);
289 
290         processTemplate(_tplTagsAsset, context);
291     }
292 
293     public void insertUser(
294             Contact contact, Group group, List<Long> groupIds,
295             List<Long> organizationIds, List<Layout> privateLayouts,
296             List<Layout> publicLayouts, List<Role> roleIds, User user)
297         throws Exception {
298 
299         Map<String, Object> context = getContext();
300 
301         put(context, "contact", contact);
302         put(context, "group", group);
303         put(context, "groupIds", groupIds);
304         put(context, "organizationIds", organizationIds);
305         put(context, "privateLayouts", privateLayouts);
306         put(context, "publicLayouts", publicLayouts);
307         put(context, "roleIds", roleIds);
308         put(context, "user", user);
309 
310         processTemplate(_tplUser, context);
311     }
312 
313     public void insertWikiNode(WikiNode wikiNode) throws Exception {
314         Map<String, Object> context = getContext();
315 
316         put(context, "wikiNode", wikiNode);
317 
318         processTemplate(_tplWikiNode, context);
319     }
320 
321     public void insertWikiPage(WikiNode wikiNode, WikiPage wikiPage)
322         throws Exception {
323 
324         Map<String, Object> context = getContext();
325 
326         put(context, "wikiNode", wikiNode);
327         put(context, "wikiPage", wikiPage);
328 
329         processTemplate(_tplWikiPage, context);
330     }
331 
332     protected void createSample() throws Exception {
333         Map<String, Object> context = getContext();
334 
335         Writer blogsEntriesCsvWriter = getWriter("blogs_entries.csv");
336         Writer mbMessagesCsvWriter = getWriter("mb_messages.csv");
337         Writer usersCsvWriter = getWriter("users.csv");
338         Writer wikiPagesCsvWriter = getWriter("wiki_pages.csv");
339 
340         put(context, "blogsEntriesCsvWriter", blogsEntriesCsvWriter);
341         put(context, "mbMessagesCsvWriter", mbMessagesCsvWriter);
342         put(context, "usersCsvWriter", usersCsvWriter);
343         put(context, "wikiPagesCsvWriter", wikiPagesCsvWriter);
344 
345         processTemplate(_tplSample, context);
346 
347         blogsEntriesCsvWriter.flush();
348         mbMessagesCsvWriter.flush();
349         usersCsvWriter.flush();
350         wikiPagesCsvWriter.flush();
351     }
352 
353     protected Map<String, Object> getContext() {
354         Map<String, Object> context = new HashMap<String, Object>();
355 
356         Company company = _dataFactory.getCompany();
357         User defaultUser = _dataFactory.getDefaultUser();
358 
359         put(context, "companyId", company.getCompanyId());
360         put(context, "counter", _counter);
361         put(context, "dataFactory", _dataFactory);
362         put(context, "defaultUserId", defaultUser.getCompanyId());
363         put(context, "maxBlogsEntryCommentCount", _maxBlogsEntryCommentCount);
364         put(context, "maxBlogsEntryCount", _maxBlogsEntryCount);
365         put(context, "maxGroupCount", _maxGroupCount);
366         put(context, "maxMBCategoryCount", _maxMBCategoryCount);
367         put(context, "maxMBMessageCount", _maxMBMessageCount);
368         put(context, "maxMBThreadCount", _maxMBThreadCount);
369         put(context, "maxUserCount", _maxUserCount);
370         put(context, "maxUserToGroupCount", _maxUserToGroupCount);
371         put(context, "maxWikiNodeCount", _maxWikiNodeCount);
372         put(context, "maxWikiPageCommentCount", _maxWikiPageCommentCount);
373         put(context, "maxWikiPageCount", _maxWikiPageCount);
374         put(context, "portalUUIDUtil", PortalUUIDUtil.getPortalUUID());
375         put(context, "sampleSQLBuilder", this);
376         put(context, "stringUtil", StringUtil_IW.getInstance());
377         put(context, "userScreenNameIncrementer", _userScreenNameIncrementer);
378 
379         return context;
380     }
381 
382     protected Writer getWriter(String fileName) throws Exception {
383         return new FileWriter(new File(_outputDir + "/" + fileName));
384     }
385 
386     protected void processTemplate(String name, Map<String, Object> context)
387         throws Exception {
388 
389         FreeMarkerUtil.process(name, context, _writerGeneric);
390     }
391 
392     protected void put(Map<String, Object> context, String key, Object value) {
393         context.put(key, value);
394     }
395 
396     private static final String _TPL_ROOT =
397         "com/liferay/portal/tools/samplesqlbuilder/dependencies/";
398 
399     private SimpleCounter _counter;
400     private DataFactory _dataFactory;
401     private int _maxBlogsEntryCommentCount;
402     private int _maxBlogsEntryCount;
403     private int _maxGroupCount;
404     private int _maxMBCategoryCount;
405     private int _maxMBMessageCount;
406     private int _maxMBThreadCount;
407     private int _maxUserCount;
408     private int _maxUserToGroupCount;
409     private int _maxWikiNodeCount;
410     private int _maxWikiPageCommentCount;
411     private int _maxWikiPageCount;
412     private String _outputDir;
413     private SimpleCounter _permissionCounter;
414     private SimpleCounter _resourceCodeCounter;
415     private SimpleCounter _resourceCounter;
416     private boolean _securityEnabled;
417     private String _tplGroup = _TPL_ROOT + "group.ftl";
418     private String _tplBlogsEntry = _TPL_ROOT + "blogs_entry.ftl";
419     private String _tplBlogsStatsUser = _TPL_ROOT + "blogs_stats_user.ftl";
420     private String _tplMBCategory = _TPL_ROOT + "mb_category.ftl";
421     private String _tplMBDiscussion = _TPL_ROOT + "mb_discussion.ftl";
422     private String _tplMBMessage = _TPL_ROOT + "mb_message.ftl";
423     private String _tplMBStatsUser = _TPL_ROOT + "mb_stats_user.ftl";
424     private String _tplMBThread = _TPL_ROOT + "mb_thread.ftl";
425     private String _tplSample = _TPL_ROOT + "sample.ftl";
426     private String _tplSecurity = _TPL_ROOT + "security.ftl";
427     private String _tplTagsAsset = _TPL_ROOT + "tags_asset.ftl";
428     private String _tplUser = _TPL_ROOT + "user.ftl";
429     private String _tplWikiNode = _TPL_ROOT + "wiki_node.ftl";
430     private String _tplWikiPage = _TPL_ROOT + "wiki_page.ftl";
431     private SimpleCounter _userScreenNameIncrementer;
432     private Writer _writerGeneric;
433     private Writer _writerMySQL;
434 
435 }