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   */
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          int maxBlogsEntryCommentCount = GetterUtil.getInteger(
75              System.getProperty("sample.sql.blogs.entry.comment.count"));
76          int maxBlogsEntryCount = GetterUtil.getInteger(
77              System.getProperty("sample.sql.blogs.entry.count"));
78          int maxGroupCount = GetterUtil.getInteger(
79              System.getProperty("sample.sql.group.count"));
80          int maxMBCategoryCount = GetterUtil.getInteger(
81              System.getProperty("sample.sql.mb.category.count"));
82          int maxMBMessageCount = GetterUtil.getInteger(
83              System.getProperty("sample.sql.mb.message.count"));
84          int maxMBThreadCount = GetterUtil.getInteger(
85              System.getProperty("sample.sql.mb.thread.count"));
86          int maxUserCount = GetterUtil.getInteger(
87              System.getProperty("sample.sql.user.count"));
88          int maxUserToGroupCount = GetterUtil.getInteger(
89              System.getProperty("sample.sql.user.to.group.count"));
90          int maxWikiNodeCount = GetterUtil.getInteger(
91              System.getProperty("sample.sql.wiki.node.count"));
92          int maxWikiPageCommentCount = GetterUtil.getInteger(
93              System.getProperty("sample.sql.wiki.page.comment.count"));
94          int maxWikiPageCount = GetterUtil.getInteger(
95              System.getProperty("sample.sql.wiki.page.count"));
96          boolean securityEnabled = GetterUtil.getBoolean(
97              System.getProperty("sample.sql.security.enabled"));
98  
99          new SampleSQLBuilder(
100             outputDir, maxBlogsEntryCommentCount, maxBlogsEntryCount,
101             maxGroupCount, maxMBCategoryCount, maxMBMessageCount,
102             maxMBThreadCount, maxUserCount, maxUserToGroupCount,
103             maxWikiNodeCount, maxWikiPageCommentCount, maxWikiPageCount,
104             securityEnabled);
105     }
106 
107     public SampleSQLBuilder(
108         String outputDir, int maxBlogsEntryCommentCount, int maxBlogsEntryCount,
109         int maxGroupCount, int maxMBCategoryCount, int maxMBMessageCount,
110         int maxMBThreadCount, int maxUserCount, int maxUserToGroupCount,
111         int maxWikiNodeCount, int maxWikiPageCommentCount, int maxWikiPageCount,
112         boolean securityEnabled) {
113 
114         try {
115             _outputDir = outputDir;
116             _maxBlogsEntryCommentCount = maxBlogsEntryCommentCount;
117             _maxBlogsEntryCount = maxBlogsEntryCount;
118             _maxGroupCount = maxGroupCount;
119             _maxMBCategoryCount = maxMBCategoryCount;
120             _maxMBMessageCount = maxMBMessageCount;
121             _maxMBThreadCount = maxMBThreadCount;
122             _maxUserCount = maxUserCount;
123             _maxUserToGroupCount = maxUserToGroupCount;
124             _maxWikiNodeCount = maxWikiNodeCount;
125             _maxWikiPageCommentCount = maxWikiPageCommentCount;
126             _maxWikiPageCount = maxWikiPageCount;
127             _securityEnabled = securityEnabled;
128 
129             int totalMThreadCount = maxMBCategoryCount * maxMBThreadCount;
130             int totalMBMessageCount = totalMThreadCount * maxMBMessageCount;
131 
132             int counterOffset =
133                 _maxGroupCount +
134                 (_maxGroupCount *
135                     (maxMBCategoryCount + totalMThreadCount +
136                         totalMBMessageCount)
137                 ) + 1;
138 
139             _counter = new SimpleCounter(counterOffset);
140             _permissionCounter = new SimpleCounter();
141             _resourceCounter = new SimpleCounter();
142             _resourceCodeCounter = new SimpleCounter();
143 
144             _userScreenNameIncrementer = new SimpleCounter();
145 
146             _dataFactory = new DataFactory(
147                 _maxGroupCount, _maxUserToGroupCount, _counter,
148                 _permissionCounter, _resourceCounter, _resourceCodeCounter);
149 
150             // Generic
151 
152             _writerGeneric = new FileWriter(_outputDir +  "/sample.sql");
153 
154             createSample();
155 
156             _writerGeneric.flush();
157 
158             // MySQL
159 
160             _writerMySQL = new FileWriter(_outputDir +  "/sample-mysql.sql");
161 
162             DBUtil mysqlDBUtil = DBUtil.getInstance(DBUtil.TYPE_MYSQL);
163 
164             boolean previousBlankLine = false;
165 
166             BufferedReader br = new BufferedReader(
167                 new FileReader(_outputDir +  "/sample.sql"));
168 
169             String s = null;
170 
171             while ((s = br.readLine()) != null) {
172                 s = mysqlDBUtil.buildSQL(s).trim();
173 
174                 _writerMySQL.write(s);
175 
176                 if (previousBlankLine && Validator.isNull(s)) {
177                 }
178                 else {
179                     _writerMySQL.write(StringPool.NEW_LINE);
180                 }
181 
182                 if (Validator.isNull(s)) {
183                     previousBlankLine = true;
184                 }
185             }
186 
187             br.close();
188 
189             _writerMySQL.flush();
190         }
191         catch (Exception e) {
192             e.printStackTrace();
193         }
194     }
195 
196     public void insertBlogsEntry(BlogsEntry blogsEntry) throws Exception {
197         Map<String, Object> context = getContext();
198 
199         put(context, "blogsEntry", blogsEntry);
200 
201         processTemplate(_tplBlogsEntry, context);
202     }
203 
204     public void insertBlogsStatsUser(BlogsStatsUser blogsStatsUser)
205         throws Exception {
206 
207         Map<String, Object> context = getContext();
208 
209         put(context, "blogsStatsUser", blogsStatsUser);
210 
211         processTemplate(_tplBlogsStatsUser, context);
212     }
213 
214     public void insertGroup(
215             Group group, List<Layout> privateLayouts,
216             List<Layout> publicLayouts)
217         throws Exception {
218 
219         Map<String, Object> context = getContext();
220 
221         put(context, "group", group);
222         put(context, "privateLayouts", privateLayouts);
223         put(context, "publicLayouts", publicLayouts);
224 
225         processTemplate(_tplGroup, context);
226     }
227 
228     public void insertMBCategory(MBCategory mbCategory) throws Exception {
229         Map<String, Object> context = getContext();
230 
231         put(context, "mbCategory", mbCategory);
232 
233         processTemplate(_tplMBCategory, context);
234     }
235 
236     public void insertMBDiscussion(MBDiscussion mbDiscussion) throws Exception {
237         Map<String, Object> context = getContext();
238 
239         put(context, "mbDiscussion", mbDiscussion);
240 
241         processTemplate(_tplMBDiscussion, context);
242     }
243 
244     public void insertMBMessage(MBMessage mbMessage) throws Exception {
245         Map<String, Object> context = getContext();
246 
247         put(context, "mbMessage", mbMessage);
248 
249         processTemplate(_tplMBMessage, context);
250     }
251 
252     public void insertMBStatsUser(MBStatsUser mbStatsUser) throws Exception {
253         Map<String, Object> context = getContext();
254 
255         put(context, "mbStatsUser", mbStatsUser);
256 
257         processTemplate(_tplMBStatsUser, context);
258     }
259 
260     public void insertMBThread(MBThread mbThread) throws Exception {
261         Map<String, Object> context = getContext();
262 
263         put(context, "mbThread", mbThread);
264 
265         processTemplate(_tplMBThread, context);
266     }
267 
268     public void insertSecurity(String name, long primKey) throws Exception {
269         insertSecurity(name, String.valueOf(primKey));
270     }
271 
272     public void insertSecurity(String name, String primKey) throws Exception {
273         if (!_securityEnabled) {
274             return;
275         }
276 
277         Map<String, Object> context = getContext();
278 
279         Resource resource = _dataFactory.addResource(name, primKey);
280 
281         put(context, "resource", resource);
282 
283         processTemplate(_tplSecurity, context);
284     }
285 
286     public void insertTagsAsset(TagsAsset tagsAsset) throws Exception {
287         Map<String, Object> context = getContext();
288 
289         put(context, "tagsAsset", tagsAsset);
290 
291         processTemplate(_tplTagsAsset, context);
292     }
293 
294     public void insertUser(
295             Contact contact, Group group, List<Long> groupIds,
296             List<Long> organizationIds, List<Layout> privateLayouts,
297             List<Layout> publicLayouts, List<Role> roleIds, User user)
298         throws Exception {
299 
300         Map<String, Object> context = getContext();
301 
302         put(context, "contact", contact);
303         put(context, "group", group);
304         put(context, "groupIds", groupIds);
305         put(context, "organizationIds", organizationIds);
306         put(context, "privateLayouts", privateLayouts);
307         put(context, "publicLayouts", publicLayouts);
308         put(context, "roleIds", roleIds);
309         put(context, "user", user);
310 
311         processTemplate(_tplUser, context);
312     }
313 
314     public void insertWikiNode(WikiNode wikiNode) throws Exception {
315         Map<String, Object> context = getContext();
316 
317         put(context, "wikiNode", wikiNode);
318 
319         processTemplate(_tplWikiNode, context);
320     }
321 
322     public void insertWikiPage(WikiNode wikiNode, WikiPage wikiPage)
323         throws Exception {
324 
325         Map<String, Object> context = getContext();
326 
327         put(context, "wikiNode", wikiNode);
328         put(context, "wikiPage", wikiPage);
329 
330         processTemplate(_tplWikiPage, context);
331     }
332 
333     protected void createSample() throws Exception {
334         Map<String, Object> context = getContext();
335 
336         Writer blogsEntriesCsvWriter = getWriter("blogs_entries.csv");
337         Writer mbMessagesCsvWriter = getWriter("mb_messages.csv");
338         Writer usersCsvWriter = getWriter("users.csv");
339         Writer wikiPagesCsvWriter = getWriter("wiki_pages.csv");
340 
341         put(context, "blogsEntriesCsvWriter", blogsEntriesCsvWriter);
342         put(context, "mbMessagesCsvWriter", mbMessagesCsvWriter);
343         put(context, "usersCsvWriter", usersCsvWriter);
344         put(context, "wikiPagesCsvWriter", wikiPagesCsvWriter);
345 
346         processTemplate(_tplSample, context);
347 
348         blogsEntriesCsvWriter.flush();
349         mbMessagesCsvWriter.flush();
350         usersCsvWriter.flush();
351         wikiPagesCsvWriter.flush();
352     }
353 
354     protected Map<String, Object> getContext() {
355         Map<String, Object> context = new HashMap<String, Object>();
356 
357         Company company = _dataFactory.getCompany();
358         User defaultUser = _dataFactory.getDefaultUser();
359 
360         put(context, "companyId", company.getCompanyId());
361         put(context, "counter", _counter);
362         put(context, "dataFactory", _dataFactory);
363         put(context, "defaultUserId", defaultUser.getCompanyId());
364         put(context, "maxBlogsEntryCommentCount", _maxBlogsEntryCommentCount);
365         put(context, "maxBlogsEntryCount", _maxBlogsEntryCount);
366         put(context, "maxGroupCount", _maxGroupCount);
367         put(context, "maxMBCategoryCount", _maxMBCategoryCount);
368         put(context, "maxMBMessageCount", _maxMBMessageCount);
369         put(context, "maxMBThreadCount", _maxMBThreadCount);
370         put(context, "maxUserCount", _maxUserCount);
371         put(context, "maxUserToGroupCount", _maxUserToGroupCount);
372         put(context, "maxWikiNodeCount", _maxWikiNodeCount);
373         put(context, "maxWikiPageCommentCount", _maxWikiPageCommentCount);
374         put(context, "maxWikiPageCount", _maxWikiPageCount);
375         put(context, "portalUUIDUtil", PortalUUIDUtil.getPortalUUID());
376         put(context, "sampleSQLBuilder", this);
377         put(context, "stringUtil", StringUtil_IW.getInstance());
378         put(context, "userScreenNameIncrementer", _userScreenNameIncrementer);
379 
380         return context;
381     }
382 
383     protected Writer getWriter(String fileName) throws Exception {
384         return new FileWriter(new File(_outputDir + "/" + fileName));
385     }
386 
387     protected void processTemplate(String name, Map<String, Object> context)
388         throws Exception {
389 
390         FreeMarkerUtil.process(name, context, _writerGeneric);
391     }
392 
393     protected void put(Map<String, Object> context, String key, Object value) {
394         context.put(key, value);
395     }
396 
397     private static final String _TPL_ROOT =
398         "com/liferay/portal/tools/samplesqlbuilder/dependencies/";
399 
400     private SimpleCounter _counter;
401     private DataFactory _dataFactory;
402     private int _maxBlogsEntryCommentCount;
403     private int _maxBlogsEntryCount;
404     private int _maxGroupCount;
405     private int _maxMBCategoryCount;
406     private int _maxMBMessageCount;
407     private int _maxMBThreadCount;
408     private int _maxUserCount;
409     private int _maxUserToGroupCount;
410     private int _maxWikiNodeCount;
411     private int _maxWikiPageCommentCount;
412     private int _maxWikiPageCount;
413     private String _outputDir;
414     private SimpleCounter _permissionCounter;
415     private SimpleCounter _resourceCodeCounter;
416     private SimpleCounter _resourceCounter;
417     private boolean _securityEnabled;
418     private String _tplGroup = _TPL_ROOT + "group.ftl";
419     private String _tplBlogsEntry = _TPL_ROOT + "blogs_entry.ftl";
420     private String _tplBlogsStatsUser = _TPL_ROOT + "blogs_stats_user.ftl";
421     private String _tplMBCategory = _TPL_ROOT + "mb_category.ftl";
422     private String _tplMBDiscussion = _TPL_ROOT + "mb_discussion.ftl";
423     private String _tplMBMessage = _TPL_ROOT + "mb_message.ftl";
424     private String _tplMBStatsUser = _TPL_ROOT + "mb_stats_user.ftl";
425     private String _tplMBThread = _TPL_ROOT + "mb_thread.ftl";
426     private String _tplSample = _TPL_ROOT + "sample.ftl";
427     private String _tplSecurity = _TPL_ROOT + "security.ftl";
428     private String _tplTagsAsset = _TPL_ROOT + "tags_asset.ftl";
429     private String _tplUser = _TPL_ROOT + "user.ftl";
430     private String _tplWikiNode = _TPL_ROOT + "wiki_node.ftl";
431     private String _tplWikiPage = _TPL_ROOT + "wiki_page.ftl";
432     private SimpleCounter _userScreenNameIncrementer;
433     private Writer _writerGeneric;
434     private Writer _writerMySQL;
435 
436 }