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.dao.db.DB;
27  import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
28  import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;
29  import com.liferay.portal.kernel.util.GetterUtil;
30  import com.liferay.portal.kernel.util.StringPool;
31  import com.liferay.portal.kernel.util.StringUtil_IW;
32  import com.liferay.portal.kernel.util.Validator;
33  import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
34  import com.liferay.portal.model.Company;
35  import com.liferay.portal.model.Contact;
36  import com.liferay.portal.model.Group;
37  import com.liferay.portal.model.Layout;
38  import com.liferay.portal.model.Resource;
39  import com.liferay.portal.model.Role;
40  import com.liferay.portal.model.User;
41  import com.liferay.portal.util.InitUtil;
42  import com.liferay.portlet.blogs.model.BlogsEntry;
43  import com.liferay.portlet.blogs.model.BlogsStatsUser;
44  import com.liferay.portlet.messageboards.model.MBCategory;
45  import com.liferay.portlet.messageboards.model.MBDiscussion;
46  import com.liferay.portlet.messageboards.model.MBMessage;
47  import com.liferay.portlet.messageboards.model.MBStatsUser;
48  import com.liferay.portlet.messageboards.model.MBThread;
49  import com.liferay.portlet.tags.model.TagsAsset;
50  import com.liferay.portlet.wiki.model.WikiNode;
51  import com.liferay.portlet.wiki.model.WikiPage;
52  import com.liferay.util.SimpleCounter;
53  
54  import java.io.File;
55  import java.io.FileReader;
56  import java.io.FileWriter;
57  import java.io.Writer;
58  
59  import java.util.HashMap;
60  import java.util.List;
61  import java.util.Map;
62  
63  /**
64   * <a href="SampleSQLBuilder.java.html"><b><i>View Source</i></b></a>
65   *
66   * @author Brian Wing Shun Chan
67   */
68  public class SampleSQLBuilder {
69  
70      public static void main(String[] args) {
71          InitUtil.initWithSpring();
72  
73          String outputDir = System.getProperty("sample.sql.output.dir");
74          String dbType = System.getProperty("sample.sql.db.type");
75          int maxBlogsEntryCommentCount = GetterUtil.getInteger(
76              System.getProperty("sample.sql.blogs.entry.comment.count"));
77          int maxBlogsEntryCount = GetterUtil.getInteger(
78              System.getProperty("sample.sql.blogs.entry.count"));
79          int maxGroupCount = GetterUtil.getInteger(
80              System.getProperty("sample.sql.group.count"));
81          int maxMBCategoryCount = GetterUtil.getInteger(
82              System.getProperty("sample.sql.mb.category.count"));
83          int maxMBMessageCount = GetterUtil.getInteger(
84              System.getProperty("sample.sql.mb.message.count"));
85          int maxMBThreadCount = GetterUtil.getInteger(
86              System.getProperty("sample.sql.mb.thread.count"));
87          int maxUserCount = GetterUtil.getInteger(
88              System.getProperty("sample.sql.user.count"));
89          int maxUserToGroupCount = GetterUtil.getInteger(
90              System.getProperty("sample.sql.user.to.group.count"));
91          int maxWikiNodeCount = GetterUtil.getInteger(
92              System.getProperty("sample.sql.wiki.node.count"));
93          int maxWikiPageCommentCount = GetterUtil.getInteger(
94              System.getProperty("sample.sql.wiki.page.comment.count"));
95          int maxWikiPageCount = GetterUtil.getInteger(
96              System.getProperty("sample.sql.wiki.page.count"));
97          boolean securityEnabled = GetterUtil.getBoolean(
98              System.getProperty("sample.sql.security.enabled"));
99  
100         new SampleSQLBuilder(
101             outputDir, dbType, maxBlogsEntryCommentCount, maxBlogsEntryCount,
102             maxGroupCount, maxMBCategoryCount, maxMBMessageCount,
103             maxMBThreadCount, maxUserCount, maxUserToGroupCount,
104             maxWikiNodeCount, maxWikiPageCommentCount, maxWikiPageCount,
105             securityEnabled);
106     }
107 
108     public SampleSQLBuilder(
109         String outputDir, String dbType, int maxBlogsEntryCommentCount,
110         int maxBlogsEntryCount, int maxGroupCount, int maxMBCategoryCount,
111         int maxMBMessageCount, int maxMBThreadCount, int maxUserCount,
112         int maxUserToGroupCount, int maxWikiNodeCount,
113         int maxWikiPageCommentCount, int maxWikiPageCount,
114         boolean securityEnabled) {
115 
116         try {
117             _outputDir = outputDir;
118             _dbType = dbType;
119             _maxBlogsEntryCommentCount = maxBlogsEntryCommentCount;
120             _maxBlogsEntryCount = maxBlogsEntryCount;
121             _maxGroupCount = maxGroupCount;
122             _maxMBCategoryCount = maxMBCategoryCount;
123             _maxMBMessageCount = maxMBMessageCount;
124             _maxMBThreadCount = maxMBThreadCount;
125             _maxUserCount = maxUserCount;
126             _maxUserToGroupCount = maxUserToGroupCount;
127             _maxWikiNodeCount = maxWikiNodeCount;
128             _maxWikiPageCommentCount = maxWikiPageCommentCount;
129             _maxWikiPageCount = maxWikiPageCount;
130             _securityEnabled = securityEnabled;
131 
132             int totalMThreadCount = maxMBCategoryCount * maxMBThreadCount;
133             int totalMBMessageCount = totalMThreadCount * maxMBMessageCount;
134 
135             int counterOffset =
136                 _maxGroupCount +
137                 (_maxGroupCount *
138                     (maxMBCategoryCount + totalMThreadCount +
139                         totalMBMessageCount)
140                 ) + 1;
141 
142             _counter = new SimpleCounter(counterOffset);
143             _permissionCounter = new SimpleCounter();
144             _resourceCounter = new SimpleCounter();
145             _resourceCodeCounter = new SimpleCounter();
146 
147             _userScreenNameIncrementer = new SimpleCounter();
148 
149             _dataFactory = new DataFactory(
150                 _maxGroupCount, _maxUserToGroupCount, _counter,
151                 _permissionCounter, _resourceCounter, _resourceCodeCounter);
152 
153             // Generic
154 
155             _writerGeneric = new FileWriter(_outputDir +  "/sample.sql");
156 
157             createSample();
158 
159             _writerGeneric.flush();
160 
161             // Specific
162 
163             _writerSpecific = new FileWriter(
164                 _outputDir +  "/sample-" + dbType + ".sql");
165 
166             DB specificDB = DBFactoryUtil.getDB(_dbType);
167 
168             boolean previousBlankLine = false;
169 
170             UnsyncBufferedReader unsyncBufferedReader =
171                 new UnsyncBufferedReader(
172                     new FileReader(_outputDir +  "/sample.sql"));
173 
174             String s = null;
175 
176             while ((s = unsyncBufferedReader.readLine()) != null) {
177                 s = specificDB.buildSQL(s).trim();
178 
179                 _writerSpecific.write(s);
180 
181                 if (previousBlankLine && Validator.isNull(s)) {
182                 }
183                 else {
184                     _writerSpecific.write(StringPool.NEW_LINE);
185                 }
186 
187                 if (Validator.isNull(s)) {
188                     previousBlankLine = true;
189                 }
190             }
191 
192             unsyncBufferedReader.close();
193 
194             _writerSpecific.flush();
195         }
196         catch (Exception e) {
197             e.printStackTrace();
198         }
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 insertTagsAsset(TagsAsset tagsAsset) throws Exception {
292         Map<String, Object> context = getContext();
293 
294         put(context, "tagsAsset", tagsAsset);
295 
296         processTemplate(_tplTagsAsset, context);
297     }
298 
299     public void insertUser(
300             Contact contact, Group group, List<Long> groupIds,
301             List<Long> organizationIds, List<Layout> privateLayouts,
302             List<Layout> publicLayouts, List<Role> roleIds, User user)
303         throws Exception {
304 
305         Map<String, Object> context = getContext();
306 
307         put(context, "contact", contact);
308         put(context, "group", group);
309         put(context, "groupIds", groupIds);
310         put(context, "organizationIds", organizationIds);
311         put(context, "privateLayouts", privateLayouts);
312         put(context, "publicLayouts", publicLayouts);
313         put(context, "roleIds", roleIds);
314         put(context, "user", user);
315 
316         processTemplate(_tplUser, context);
317     }
318 
319     public void insertWikiNode(WikiNode wikiNode) throws Exception {
320         Map<String, Object> context = getContext();
321 
322         put(context, "wikiNode", wikiNode);
323 
324         processTemplate(_tplWikiNode, context);
325     }
326 
327     public void insertWikiPage(WikiNode wikiNode, WikiPage wikiPage)
328         throws Exception {
329 
330         Map<String, Object> context = getContext();
331 
332         put(context, "wikiNode", wikiNode);
333         put(context, "wikiPage", wikiPage);
334 
335         processTemplate(_tplWikiPage, context);
336     }
337 
338     protected void createSample() throws Exception {
339         Map<String, Object> context = getContext();
340 
341         Writer blogsEntriesCsvWriter = getWriter("blogs_entries.csv");
342         Writer mbMessagesCsvWriter = getWriter("mb_messages.csv");
343         Writer usersCsvWriter = getWriter("users.csv");
344         Writer wikiPagesCsvWriter = getWriter("wiki_pages.csv");
345 
346         put(context, "blogsEntriesCsvWriter", blogsEntriesCsvWriter);
347         put(context, "mbMessagesCsvWriter", mbMessagesCsvWriter);
348         put(context, "usersCsvWriter", usersCsvWriter);
349         put(context, "wikiPagesCsvWriter", wikiPagesCsvWriter);
350 
351         processTemplate(_tplSample, context);
352 
353         blogsEntriesCsvWriter.flush();
354         mbMessagesCsvWriter.flush();
355         usersCsvWriter.flush();
356         wikiPagesCsvWriter.flush();
357     }
358 
359     protected Map<String, Object> getContext() {
360         Map<String, Object> context = new HashMap<String, Object>();
361 
362         Company company = _dataFactory.getCompany();
363         User defaultUser = _dataFactory.getDefaultUser();
364 
365         put(context, "companyId", company.getCompanyId());
366         put(context, "counter", _counter);
367         put(context, "dataFactory", _dataFactory);
368         put(context, "defaultUserId", defaultUser.getCompanyId());
369         put(context, "maxBlogsEntryCommentCount", _maxBlogsEntryCommentCount);
370         put(context, "maxBlogsEntryCount", _maxBlogsEntryCount);
371         put(context, "maxGroupCount", _maxGroupCount);
372         put(context, "maxMBCategoryCount", _maxMBCategoryCount);
373         put(context, "maxMBMessageCount", _maxMBMessageCount);
374         put(context, "maxMBThreadCount", _maxMBThreadCount);
375         put(context, "maxUserCount", _maxUserCount);
376         put(context, "maxUserToGroupCount", _maxUserToGroupCount);
377         put(context, "maxWikiNodeCount", _maxWikiNodeCount);
378         put(context, "maxWikiPageCommentCount", _maxWikiPageCommentCount);
379         put(context, "maxWikiPageCount", _maxWikiPageCount);
380         put(context, "portalUUIDUtil", PortalUUIDUtil.getPortalUUID());
381         put(context, "sampleSQLBuilder", this);
382         put(context, "stringUtil", StringUtil_IW.getInstance());
383         put(context, "userScreenNameIncrementer", _userScreenNameIncrementer);
384 
385         return context;
386     }
387 
388     protected Writer getWriter(String fileName) throws Exception {
389         return new FileWriter(new File(_outputDir + "/" + fileName));
390     }
391 
392     protected void processTemplate(String name, Map<String, Object> context)
393         throws Exception {
394 
395         FreeMarkerUtil.process(name, context, _writerGeneric);
396     }
397 
398     protected void put(Map<String, Object> context, String key, Object value) {
399         context.put(key, value);
400     }
401 
402     private static final String _TPL_ROOT =
403         "com/liferay/portal/tools/samplesqlbuilder/dependencies/";
404 
405     private SimpleCounter _counter;
406     private DataFactory _dataFactory;
407     private String _dbType;
408     private int _maxBlogsEntryCommentCount;
409     private int _maxBlogsEntryCount;
410     private int _maxGroupCount;
411     private int _maxMBCategoryCount;
412     private int _maxMBMessageCount;
413     private int _maxMBThreadCount;
414     private int _maxUserCount;
415     private int _maxUserToGroupCount;
416     private int _maxWikiNodeCount;
417     private int _maxWikiPageCommentCount;
418     private int _maxWikiPageCount;
419     private String _outputDir;
420     private SimpleCounter _permissionCounter;
421     private SimpleCounter _resourceCodeCounter;
422     private SimpleCounter _resourceCounter;
423     private boolean _securityEnabled;
424     private String _tplGroup = _TPL_ROOT + "group.ftl";
425     private String _tplBlogsEntry = _TPL_ROOT + "blogs_entry.ftl";
426     private String _tplBlogsStatsUser = _TPL_ROOT + "blogs_stats_user.ftl";
427     private String _tplMBCategory = _TPL_ROOT + "mb_category.ftl";
428     private String _tplMBDiscussion = _TPL_ROOT + "mb_discussion.ftl";
429     private String _tplMBMessage = _TPL_ROOT + "mb_message.ftl";
430     private String _tplMBStatsUser = _TPL_ROOT + "mb_stats_user.ftl";
431     private String _tplMBThread = _TPL_ROOT + "mb_thread.ftl";
432     private String _tplSample = _TPL_ROOT + "sample.ftl";
433     private String _tplSecurity = _TPL_ROOT + "security.ftl";
434     private String _tplTagsAsset = _TPL_ROOT + "tags_asset.ftl";
435     private String _tplUser = _TPL_ROOT + "user.ftl";
436     private String _tplWikiNode = _TPL_ROOT + "wiki_node.ftl";
437     private String _tplWikiPage = _TPL_ROOT + "wiki_page.ftl";
438     private SimpleCounter _userScreenNameIncrementer;
439     private Writer _writerGeneric;
440     private Writer _writerSpecific;
441 
442 }