1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.tools.samplesqlbuilder;
16  
17  import com.liferay.portal.freemarker.FreeMarkerUtil;
18  import com.liferay.portal.kernel.dao.db.DB;
19  import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
20  import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;
21  import com.liferay.portal.kernel.util.GetterUtil;
22  import com.liferay.portal.kernel.util.StringPool;
23  import com.liferay.portal.kernel.util.StringUtil_IW;
24  import com.liferay.portal.kernel.util.Validator;
25  import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
26  import com.liferay.portal.model.Company;
27  import com.liferay.portal.model.Contact;
28  import com.liferay.portal.model.Group;
29  import com.liferay.portal.model.Layout;
30  import com.liferay.portal.model.Resource;
31  import com.liferay.portal.model.Role;
32  import com.liferay.portal.model.User;
33  import com.liferay.portal.util.InitUtil;
34  import com.liferay.portlet.asset.model.AssetEntry;
35  import com.liferay.portlet.blogs.model.BlogsEntry;
36  import com.liferay.portlet.blogs.model.BlogsStatsUser;
37  import com.liferay.portlet.messageboards.model.MBCategory;
38  import com.liferay.portlet.messageboards.model.MBDiscussion;
39  import com.liferay.portlet.messageboards.model.MBMessage;
40  import com.liferay.portlet.messageboards.model.MBStatsUser;
41  import com.liferay.portlet.messageboards.model.MBThread;
42  import com.liferay.portlet.wiki.model.WikiNode;
43  import com.liferay.portlet.wiki.model.WikiPage;
44  import com.liferay.util.SimpleCounter;
45  
46  import java.io.File;
47  import java.io.FileReader;
48  import java.io.FileWriter;
49  import java.io.Writer;
50  
51  import java.util.HashMap;
52  import java.util.List;
53  import java.util.Map;
54  
55  /**
56   * <a href="SampleSQLBuilder.java.html"><b><i>View Source</i></b></a>
57   *
58   * @author Brian Wing Shun Chan
59   */
60  public class SampleSQLBuilder {
61  
62      public static void main(String[] args) {
63          InitUtil.initWithSpring();
64  
65          String outputDir = System.getProperty("sample.sql.output.dir");
66          String dbType = System.getProperty("sample.sql.db.type");
67          int maxBlogsEntryCommentCount = GetterUtil.getInteger(
68              System.getProperty("sample.sql.blogs.entry.comment.count"));
69          int maxBlogsEntryCount = GetterUtil.getInteger(
70              System.getProperty("sample.sql.blogs.entry.count"));
71          int maxGroupCount = GetterUtil.getInteger(
72              System.getProperty("sample.sql.group.count"));
73          int maxMBCategoryCount = GetterUtil.getInteger(
74              System.getProperty("sample.sql.mb.category.count"));
75          int maxMBMessageCount = GetterUtil.getInteger(
76              System.getProperty("sample.sql.mb.message.count"));
77          int maxMBThreadCount = GetterUtil.getInteger(
78              System.getProperty("sample.sql.mb.thread.count"));
79          int maxUserCount = GetterUtil.getInteger(
80              System.getProperty("sample.sql.user.count"));
81          int maxUserToGroupCount = GetterUtil.getInteger(
82              System.getProperty("sample.sql.user.to.group.count"));
83          int maxWikiNodeCount = GetterUtil.getInteger(
84              System.getProperty("sample.sql.wiki.node.count"));
85          int maxWikiPageCommentCount = GetterUtil.getInteger(
86              System.getProperty("sample.sql.wiki.page.comment.count"));
87          int maxWikiPageCount = GetterUtil.getInteger(
88              System.getProperty("sample.sql.wiki.page.count"));
89          boolean securityEnabled = GetterUtil.getBoolean(
90              System.getProperty("sample.sql.security.enabled"));
91  
92          new SampleSQLBuilder(
93              outputDir, dbType, maxBlogsEntryCommentCount, maxBlogsEntryCount,
94              maxGroupCount, maxMBCategoryCount, maxMBMessageCount,
95              maxMBThreadCount, maxUserCount, maxUserToGroupCount,
96              maxWikiNodeCount, maxWikiPageCommentCount, maxWikiPageCount,
97              securityEnabled);
98      }
99  
100     public SampleSQLBuilder(
101         String outputDir, String dbType, int maxBlogsEntryCommentCount,
102         int maxBlogsEntryCount, int maxGroupCount, int maxMBCategoryCount,
103         int maxMBMessageCount, int maxMBThreadCount, int maxUserCount,
104         int maxUserToGroupCount, int maxWikiNodeCount,
105         int maxWikiPageCommentCount, int maxWikiPageCount,
106         boolean securityEnabled) {
107 
108         try {
109             _outputDir = outputDir;
110             _dbType = dbType;
111             _maxBlogsEntryCommentCount = maxBlogsEntryCommentCount;
112             _maxBlogsEntryCount = maxBlogsEntryCount;
113             _maxGroupCount = maxGroupCount;
114             _maxMBCategoryCount = maxMBCategoryCount;
115             _maxMBMessageCount = maxMBMessageCount;
116             _maxMBThreadCount = maxMBThreadCount;
117             _maxUserCount = maxUserCount;
118             _maxUserToGroupCount = maxUserToGroupCount;
119             _maxWikiNodeCount = maxWikiNodeCount;
120             _maxWikiPageCommentCount = maxWikiPageCommentCount;
121             _maxWikiPageCount = maxWikiPageCount;
122             _securityEnabled = securityEnabled;
123 
124             int totalMThreadCount = maxMBCategoryCount * maxMBThreadCount;
125             int totalMBMessageCount = totalMThreadCount * maxMBMessageCount;
126 
127             int counterOffset =
128                 _maxGroupCount +
129                 (_maxGroupCount *
130                     (maxMBCategoryCount + totalMThreadCount +
131                         totalMBMessageCount)
132                 ) + 1;
133 
134             _counter = new SimpleCounter(counterOffset);
135             _permissionCounter = new SimpleCounter();
136             _resourceCounter = new SimpleCounter();
137             _resourceCodeCounter = new SimpleCounter();
138 
139             _userScreenNameIncrementer = new SimpleCounter();
140 
141             _dataFactory = new DataFactory(
142                 _maxGroupCount, _maxUserToGroupCount, _counter,
143                 _permissionCounter, _resourceCounter, _resourceCodeCounter);
144 
145             // Generic
146 
147             _writerGeneric = new FileWriter(_outputDir +  "/sample.sql");
148 
149             createSample();
150 
151             _writerGeneric.flush();
152 
153             // Specific
154 
155             _writerSpecific = new FileWriter(
156                 _outputDir +  "/sample-" + dbType + ".sql");
157 
158             DB specificDB = DBFactoryUtil.getDB(_dbType);
159 
160             boolean previousBlankLine = false;
161 
162             UnsyncBufferedReader unsyncBufferedReader =
163                 new UnsyncBufferedReader(
164                     new FileReader(_outputDir +  "/sample.sql"));
165 
166             String s = null;
167 
168             while ((s = unsyncBufferedReader.readLine()) != null) {
169                 s = specificDB.buildSQL(s).trim();
170 
171                 _writerSpecific.write(s);
172 
173                 if (previousBlankLine && Validator.isNull(s)) {
174                 }
175                 else {
176                     _writerSpecific.write(StringPool.NEW_LINE);
177                 }
178 
179                 if (Validator.isNull(s)) {
180                     previousBlankLine = true;
181                 }
182             }
183 
184             unsyncBufferedReader.close();
185 
186             _writerSpecific.flush();
187         }
188         catch (Exception e) {
189             e.printStackTrace();
190         }
191     }
192 
193     public void insertAssetEntry(AssetEntry assetEntry) throws Exception {
194         Map<String, Object> context = getContext();
195 
196         put(context, "assetEntry", assetEntry);
197 
198         processTemplate(_tplAssetEntry, context);
199     }
200 
201     public void insertBlogsEntry(BlogsEntry blogsEntry) throws Exception {
202         Map<String, Object> context = getContext();
203 
204         put(context, "blogsEntry", blogsEntry);
205 
206         processTemplate(_tplBlogsEntry, context);
207     }
208 
209     public void insertBlogsStatsUser(BlogsStatsUser blogsStatsUser)
210         throws Exception {
211 
212         Map<String, Object> context = getContext();
213 
214         put(context, "blogsStatsUser", blogsStatsUser);
215 
216         processTemplate(_tplBlogsStatsUser, context);
217     }
218 
219     public void insertGroup(
220             Group group, List<Layout> privateLayouts,
221             List<Layout> publicLayouts)
222         throws Exception {
223 
224         Map<String, Object> context = getContext();
225 
226         put(context, "group", group);
227         put(context, "privateLayouts", privateLayouts);
228         put(context, "publicLayouts", publicLayouts);
229 
230         processTemplate(_tplGroup, context);
231     }
232 
233     public void insertMBCategory(MBCategory mbCategory) throws Exception {
234         Map<String, Object> context = getContext();
235 
236         put(context, "mbCategory", mbCategory);
237 
238         processTemplate(_tplMBCategory, context);
239     }
240 
241     public void insertMBDiscussion(MBDiscussion mbDiscussion) throws Exception {
242         Map<String, Object> context = getContext();
243 
244         put(context, "mbDiscussion", mbDiscussion);
245 
246         processTemplate(_tplMBDiscussion, context);
247     }
248 
249     public void insertMBMessage(MBMessage mbMessage) throws Exception {
250         Map<String, Object> context = getContext();
251 
252         put(context, "mbMessage", mbMessage);
253 
254         processTemplate(_tplMBMessage, context);
255     }
256 
257     public void insertMBStatsUser(MBStatsUser mbStatsUser) throws Exception {
258         Map<String, Object> context = getContext();
259 
260         put(context, "mbStatsUser", mbStatsUser);
261 
262         processTemplate(_tplMBStatsUser, context);
263     }
264 
265     public void insertMBThread(MBThread mbThread) throws Exception {
266         Map<String, Object> context = getContext();
267 
268         put(context, "mbThread", mbThread);
269 
270         processTemplate(_tplMBThread, context);
271     }
272 
273     public void insertSecurity(String name, long primKey) throws Exception {
274         insertSecurity(name, String.valueOf(primKey));
275     }
276 
277     public void insertSecurity(String name, String primKey) throws Exception {
278         if (!_securityEnabled) {
279             return;
280         }
281 
282         Map<String, Object> context = getContext();
283 
284         Resource resource = _dataFactory.addResource(name, primKey);
285 
286         put(context, "resource", resource);
287 
288         processTemplate(_tplSecurity, context);
289     }
290 
291     public void insertUser(
292             Contact contact, Group group, List<Long> groupIds,
293             List<Long> organizationIds, List<Layout> privateLayouts,
294             List<Layout> publicLayouts, List<Role> roleIds, User user)
295         throws Exception {
296 
297         Map<String, Object> context = getContext();
298 
299         put(context, "contact", contact);
300         put(context, "group", group);
301         put(context, "groupIds", groupIds);
302         put(context, "organizationIds", organizationIds);
303         put(context, "privateLayouts", privateLayouts);
304         put(context, "publicLayouts", publicLayouts);
305         put(context, "roleIds", roleIds);
306         put(context, "user", user);
307 
308         processTemplate(_tplUser, context);
309     }
310 
311     public void insertWikiNode(WikiNode wikiNode) throws Exception {
312         Map<String, Object> context = getContext();
313 
314         put(context, "wikiNode", wikiNode);
315 
316         processTemplate(_tplWikiNode, context);
317     }
318 
319     public void insertWikiPage(WikiNode wikiNode, WikiPage wikiPage)
320         throws Exception {
321 
322         Map<String, Object> context = getContext();
323 
324         put(context, "wikiNode", wikiNode);
325         put(context, "wikiPage", wikiPage);
326 
327         processTemplate(_tplWikiPage, context);
328     }
329 
330     protected void createSample() throws Exception {
331         Map<String, Object> context = getContext();
332 
333         Writer blogsEntriesCsvWriter = getWriter("blogs_entries.csv");
334         Writer mbMessagesCsvWriter = getWriter("mb_messages.csv");
335         Writer usersCsvWriter = getWriter("users.csv");
336         Writer wikiPagesCsvWriter = getWriter("wiki_pages.csv");
337 
338         put(context, "blogsEntriesCsvWriter", blogsEntriesCsvWriter);
339         put(context, "mbMessagesCsvWriter", mbMessagesCsvWriter);
340         put(context, "usersCsvWriter", usersCsvWriter);
341         put(context, "wikiPagesCsvWriter", wikiPagesCsvWriter);
342 
343         processTemplate(_tplSample, context);
344 
345         blogsEntriesCsvWriter.flush();
346         mbMessagesCsvWriter.flush();
347         usersCsvWriter.flush();
348         wikiPagesCsvWriter.flush();
349     }
350 
351     protected Map<String, Object> getContext() {
352         Map<String, Object> context = new HashMap<String, Object>();
353 
354         Company company = _dataFactory.getCompany();
355         User defaultUser = _dataFactory.getDefaultUser();
356 
357         put(context, "companyId", company.getCompanyId());
358         put(context, "counter", _counter);
359         put(context, "dataFactory", _dataFactory);
360         put(context, "defaultUserId", defaultUser.getCompanyId());
361         put(context, "maxBlogsEntryCommentCount", _maxBlogsEntryCommentCount);
362         put(context, "maxBlogsEntryCount", _maxBlogsEntryCount);
363         put(context, "maxGroupCount", _maxGroupCount);
364         put(context, "maxMBCategoryCount", _maxMBCategoryCount);
365         put(context, "maxMBMessageCount", _maxMBMessageCount);
366         put(context, "maxMBThreadCount", _maxMBThreadCount);
367         put(context, "maxUserCount", _maxUserCount);
368         put(context, "maxUserToGroupCount", _maxUserToGroupCount);
369         put(context, "maxWikiNodeCount", _maxWikiNodeCount);
370         put(context, "maxWikiPageCommentCount", _maxWikiPageCommentCount);
371         put(context, "maxWikiPageCount", _maxWikiPageCount);
372         put(context, "portalUUIDUtil", PortalUUIDUtil.getPortalUUID());
373         put(context, "sampleSQLBuilder", this);
374         put(context, "stringUtil", StringUtil_IW.getInstance());
375         put(context, "userScreenNameIncrementer", _userScreenNameIncrementer);
376 
377         return context;
378     }
379 
380     protected Writer getWriter(String fileName) throws Exception {
381         return new FileWriter(new File(_outputDir + "/" + fileName));
382     }
383 
384     protected void processTemplate(String name, Map<String, Object> context)
385         throws Exception {
386 
387         FreeMarkerUtil.process(name, context, _writerGeneric);
388     }
389 
390     protected void put(Map<String, Object> context, String key, Object value) {
391         context.put(key, value);
392     }
393 
394     private static final String _TPL_ROOT =
395         "com/liferay/portal/tools/samplesqlbuilder/dependencies/";
396 
397     private SimpleCounter _counter;
398     private DataFactory _dataFactory;
399     private String _dbType;
400     private int _maxBlogsEntryCommentCount;
401     private int _maxBlogsEntryCount;
402     private int _maxGroupCount;
403     private int _maxMBCategoryCount;
404     private int _maxMBMessageCount;
405     private int _maxMBThreadCount;
406     private int _maxUserCount;
407     private int _maxUserToGroupCount;
408     private int _maxWikiNodeCount;
409     private int _maxWikiPageCommentCount;
410     private int _maxWikiPageCount;
411     private String _outputDir;
412     private SimpleCounter _permissionCounter;
413     private SimpleCounter _resourceCodeCounter;
414     private SimpleCounter _resourceCounter;
415     private boolean _securityEnabled;
416     private String _tplAssetEntry = _TPL_ROOT + "asset_entry.ftl";
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 _tplUser = _TPL_ROOT + "user.ftl";
428     private String _tplWikiNode = _TPL_ROOT + "wiki_node.ftl";
429     private String _tplWikiPage = _TPL_ROOT + "wiki_page.ftl";
430     private SimpleCounter _userScreenNameIncrementer;
431     private Writer _writerGeneric;
432     private Writer _writerSpecific;
433 
434 }