1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
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.blogs.model.BlogsEntry;
35  import com.liferay.portlet.blogs.model.BlogsStatsUser;
36  import com.liferay.portlet.messageboards.model.MBCategory;
37  import com.liferay.portlet.messageboards.model.MBDiscussion;
38  import com.liferay.portlet.messageboards.model.MBMessage;
39  import com.liferay.portlet.messageboards.model.MBStatsUser;
40  import com.liferay.portlet.messageboards.model.MBThread;
41  import com.liferay.portlet.tags.model.TagsAsset;
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 insertBlogsEntry(BlogsEntry blogsEntry) throws Exception {
194         Map<String, Object> context = getContext();
195 
196         put(context, "blogsEntry", blogsEntry);
197 
198         processTemplate(_tplBlogsEntry, context);
199     }
200 
201     public void insertBlogsStatsUser(BlogsStatsUser blogsStatsUser)
202         throws Exception {
203 
204         Map<String, Object> context = getContext();
205 
206         put(context, "blogsStatsUser", blogsStatsUser);
207 
208         processTemplate(_tplBlogsStatsUser, context);
209     }
210 
211     public void insertGroup(
212             Group group, List<Layout> privateLayouts,
213             List<Layout> publicLayouts)
214         throws Exception {
215 
216         Map<String, Object> context = getContext();
217 
218         put(context, "group", group);
219         put(context, "privateLayouts", privateLayouts);
220         put(context, "publicLayouts", publicLayouts);
221 
222         processTemplate(_tplGroup, context);
223     }
224 
225     public void insertMBCategory(MBCategory mbCategory) throws Exception {
226         Map<String, Object> context = getContext();
227 
228         put(context, "mbCategory", mbCategory);
229 
230         processTemplate(_tplMBCategory, context);
231     }
232 
233     public void insertMBDiscussion(MBDiscussion mbDiscussion) throws Exception {
234         Map<String, Object> context = getContext();
235 
236         put(context, "mbDiscussion", mbDiscussion);
237 
238         processTemplate(_tplMBDiscussion, context);
239     }
240 
241     public void insertMBMessage(MBMessage mbMessage) throws Exception {
242         Map<String, Object> context = getContext();
243 
244         put(context, "mbMessage", mbMessage);
245 
246         processTemplate(_tplMBMessage, context);
247     }
248 
249     public void insertMBStatsUser(MBStatsUser mbStatsUser) throws Exception {
250         Map<String, Object> context = getContext();
251 
252         put(context, "mbStatsUser", mbStatsUser);
253 
254         processTemplate(_tplMBStatsUser, context);
255     }
256 
257     public void insertMBThread(MBThread mbThread) throws Exception {
258         Map<String, Object> context = getContext();
259 
260         put(context, "mbThread", mbThread);
261 
262         processTemplate(_tplMBThread, context);
263     }
264 
265     public void insertSecurity(String name, long primKey) throws Exception {
266         insertSecurity(name, String.valueOf(primKey));
267     }
268 
269     public void insertSecurity(String name, String primKey) throws Exception {
270         if (!_securityEnabled) {
271             return;
272         }
273 
274         Map<String, Object> context = getContext();
275 
276         Resource resource = _dataFactory.addResource(name, primKey);
277 
278         put(context, "resource", resource);
279 
280         processTemplate(_tplSecurity, context);
281     }
282 
283     public void insertTagsAsset(TagsAsset tagsAsset) throws Exception {
284         Map<String, Object> context = getContext();
285 
286         put(context, "tagsAsset", tagsAsset);
287 
288         processTemplate(_tplTagsAsset, 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 _tplGroup = _TPL_ROOT + "group.ftl";
417     private String _tplBlogsEntry = _TPL_ROOT + "blogs_entry.ftl";
418     private String _tplBlogsStatsUser = _TPL_ROOT + "blogs_stats_user.ftl";
419     private String _tplMBCategory = _TPL_ROOT + "mb_category.ftl";
420     private String _tplMBDiscussion = _TPL_ROOT + "mb_discussion.ftl";
421     private String _tplMBMessage = _TPL_ROOT + "mb_message.ftl";
422     private String _tplMBStatsUser = _TPL_ROOT + "mb_stats_user.ftl";
423     private String _tplMBThread = _TPL_ROOT + "mb_thread.ftl";
424     private String _tplSample = _TPL_ROOT + "sample.ftl";
425     private String _tplSecurity = _TPL_ROOT + "security.ftl";
426     private String _tplTagsAsset = _TPL_ROOT + "tags_asset.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 }