001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.tools.samplesqlbuilder;
016    
017    import com.liferay.portal.freemarker.FreeMarkerUtil;
018    import com.liferay.portal.kernel.dao.db.DB;
019    import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
020    import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;
021    import com.liferay.portal.kernel.util.GetterUtil;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.StringUtil_IW;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
026    import com.liferay.portal.model.Company;
027    import com.liferay.portal.model.Contact;
028    import com.liferay.portal.model.Group;
029    import com.liferay.portal.model.Layout;
030    import com.liferay.portal.model.Resource;
031    import com.liferay.portal.model.Role;
032    import com.liferay.portal.model.User;
033    import com.liferay.portal.util.InitUtil;
034    import com.liferay.portlet.asset.model.AssetEntry;
035    import com.liferay.portlet.blogs.model.BlogsEntry;
036    import com.liferay.portlet.blogs.model.BlogsStatsUser;
037    import com.liferay.portlet.messageboards.model.MBCategory;
038    import com.liferay.portlet.messageboards.model.MBDiscussion;
039    import com.liferay.portlet.messageboards.model.MBMessage;
040    import com.liferay.portlet.messageboards.model.MBStatsUser;
041    import com.liferay.portlet.messageboards.model.MBThread;
042    import com.liferay.portlet.wiki.model.WikiNode;
043    import com.liferay.portlet.wiki.model.WikiPage;
044    import com.liferay.util.SimpleCounter;
045    
046    import java.io.File;
047    import java.io.FileReader;
048    import java.io.FileWriter;
049    import java.io.Writer;
050    
051    import java.util.HashMap;
052    import java.util.List;
053    import java.util.Map;
054    
055    /**
056     * @author Brian Wing Shun Chan
057     */
058    public class SampleSQLBuilder {
059    
060            public static void main(String[] args) {
061                    InitUtil.initWithSpring();
062    
063                    String outputDir = System.getProperty("sample.sql.output.dir");
064                    String dbType = System.getProperty("sample.sql.db.type");
065                    int maxBlogsEntryCommentCount = GetterUtil.getInteger(
066                            System.getProperty("sample.sql.blogs.entry.comment.count"));
067                    int maxBlogsEntryCount = GetterUtil.getInteger(
068                            System.getProperty("sample.sql.blogs.entry.count"));
069                    int maxGroupCount = GetterUtil.getInteger(
070                            System.getProperty("sample.sql.group.count"));
071                    int maxMBCategoryCount = GetterUtil.getInteger(
072                            System.getProperty("sample.sql.mb.category.count"));
073                    int maxMBMessageCount = GetterUtil.getInteger(
074                            System.getProperty("sample.sql.mb.message.count"));
075                    int maxMBThreadCount = GetterUtil.getInteger(
076                            System.getProperty("sample.sql.mb.thread.count"));
077                    int maxUserCount = GetterUtil.getInteger(
078                            System.getProperty("sample.sql.user.count"));
079                    int maxUserToGroupCount = GetterUtil.getInteger(
080                            System.getProperty("sample.sql.user.to.group.count"));
081                    int maxWikiNodeCount = GetterUtil.getInteger(
082                            System.getProperty("sample.sql.wiki.node.count"));
083                    int maxWikiPageCommentCount = GetterUtil.getInteger(
084                            System.getProperty("sample.sql.wiki.page.comment.count"));
085                    int maxWikiPageCount = GetterUtil.getInteger(
086                            System.getProperty("sample.sql.wiki.page.count"));
087                    boolean securityEnabled = GetterUtil.getBoolean(
088                            System.getProperty("sample.sql.security.enabled"));
089    
090                    new SampleSQLBuilder(
091                            outputDir, dbType, maxBlogsEntryCommentCount, maxBlogsEntryCount,
092                            maxGroupCount, maxMBCategoryCount, maxMBMessageCount,
093                            maxMBThreadCount, maxUserCount, maxUserToGroupCount,
094                            maxWikiNodeCount, maxWikiPageCommentCount, maxWikiPageCount,
095                            securityEnabled);
096            }
097    
098            public SampleSQLBuilder(
099                    String outputDir, String dbType, int maxBlogsEntryCommentCount,
100                    int maxBlogsEntryCount, int maxGroupCount, int maxMBCategoryCount,
101                    int maxMBMessageCount, int maxMBThreadCount, int maxUserCount,
102                    int maxUserToGroupCount, int maxWikiNodeCount,
103                    int maxWikiPageCommentCount, int maxWikiPageCount,
104                    boolean securityEnabled) {
105    
106                    try {
107                            _outputDir = outputDir;
108                            _dbType = dbType;
109                            _maxBlogsEntryCommentCount = maxBlogsEntryCommentCount;
110                            _maxBlogsEntryCount = maxBlogsEntryCount;
111                            _maxGroupCount = maxGroupCount;
112                            _maxMBCategoryCount = maxMBCategoryCount;
113                            _maxMBMessageCount = maxMBMessageCount;
114                            _maxMBThreadCount = maxMBThreadCount;
115                            _maxUserCount = maxUserCount;
116                            _maxUserToGroupCount = maxUserToGroupCount;
117                            _maxWikiNodeCount = maxWikiNodeCount;
118                            _maxWikiPageCommentCount = maxWikiPageCommentCount;
119                            _maxWikiPageCount = maxWikiPageCount;
120                            _securityEnabled = securityEnabled;
121    
122                            int totalMThreadCount = maxMBCategoryCount * maxMBThreadCount;
123                            int totalMBMessageCount = totalMThreadCount * maxMBMessageCount;
124    
125                            int counterOffset =
126                                    _maxGroupCount +
127                                    (_maxGroupCount *
128                                            (maxMBCategoryCount + totalMThreadCount +
129                                                    totalMBMessageCount)
130                                    ) + 1;
131    
132                            _counter = new SimpleCounter(counterOffset);
133                            _permissionCounter = new SimpleCounter();
134                            _resourceCounter = new SimpleCounter();
135                            _resourceCodeCounter = new SimpleCounter();
136    
137                            _userScreenNameIncrementer = new SimpleCounter();
138    
139                            _dataFactory = new DataFactory(
140                                    _maxGroupCount, _maxUserToGroupCount, _counter,
141                                    _permissionCounter, _resourceCounter, _resourceCodeCounter);
142    
143                            // Generic
144    
145                            _writerGeneric = new FileWriter(_outputDir +  "/sample.sql");
146    
147                            createSample();
148    
149                            _writerGeneric.flush();
150    
151                            // Specific
152    
153                            _writerSpecific = new FileWriter(
154                                    _outputDir +  "/sample-" + dbType + ".sql");
155    
156                            DB specificDB = DBFactoryUtil.getDB(_dbType);
157    
158                            boolean previousBlankLine = false;
159    
160                            UnsyncBufferedReader unsyncBufferedReader =
161                                    new UnsyncBufferedReader(
162                                            new FileReader(_outputDir +  "/sample.sql"));
163    
164                            String s = null;
165    
166                            while ((s = unsyncBufferedReader.readLine()) != null) {
167                                    s = specificDB.buildSQL(s).trim();
168    
169                                    _writerSpecific.write(s);
170    
171                                    if (previousBlankLine && Validator.isNull(s)) {
172                                    }
173                                    else {
174                                            _writerSpecific.write(StringPool.NEW_LINE);
175                                    }
176    
177                                    if (Validator.isNull(s)) {
178                                            previousBlankLine = true;
179                                    }
180                            }
181    
182                            unsyncBufferedReader.close();
183    
184                            _writerSpecific.flush();
185                    }
186                    catch (Exception e) {
187                            e.printStackTrace();
188                    }
189            }
190    
191            public void insertAssetEntry(AssetEntry assetEntry) throws Exception {
192                    Map<String, Object> context = getContext();
193    
194                    put(context, "assetEntry", assetEntry);
195    
196                    processTemplate(_tplAssetEntry, context);
197            }
198    
199            public void insertBlogsEntry(BlogsEntry blogsEntry) throws Exception {
200                    Map<String, Object> context = getContext();
201    
202                    put(context, "blogsEntry", blogsEntry);
203    
204                    processTemplate(_tplBlogsEntry, context);
205            }
206    
207            public void insertBlogsStatsUser(BlogsStatsUser blogsStatsUser)
208                    throws Exception {
209    
210                    Map<String, Object> context = getContext();
211    
212                    put(context, "blogsStatsUser", blogsStatsUser);
213    
214                    processTemplate(_tplBlogsStatsUser, context);
215            }
216    
217            public void insertGroup(
218                            Group group, List<Layout> privateLayouts,
219                            List<Layout> publicLayouts)
220                    throws Exception {
221    
222                    Map<String, Object> context = getContext();
223    
224                    put(context, "group", group);
225                    put(context, "privateLayouts", privateLayouts);
226                    put(context, "publicLayouts", publicLayouts);
227    
228                    processTemplate(_tplGroup, context);
229            }
230    
231            public void insertMBCategory(MBCategory mbCategory) throws Exception {
232                    Map<String, Object> context = getContext();
233    
234                    put(context, "mbCategory", mbCategory);
235    
236                    processTemplate(_tplMBCategory, context);
237            }
238    
239            public void insertMBDiscussion(MBDiscussion mbDiscussion) throws Exception {
240                    Map<String, Object> context = getContext();
241    
242                    put(context, "mbDiscussion", mbDiscussion);
243    
244                    processTemplate(_tplMBDiscussion, context);
245            }
246    
247            public void insertMBMessage(MBMessage mbMessage) throws Exception {
248                    Map<String, Object> context = getContext();
249    
250                    put(context, "mbMessage", mbMessage);
251    
252                    processTemplate(_tplMBMessage, context);
253            }
254    
255            public void insertMBStatsUser(MBStatsUser mbStatsUser) throws Exception {
256                    Map<String, Object> context = getContext();
257    
258                    put(context, "mbStatsUser", mbStatsUser);
259    
260                    processTemplate(_tplMBStatsUser, context);
261            }
262    
263            public void insertMBThread(MBThread mbThread) throws Exception {
264                    Map<String, Object> context = getContext();
265    
266                    put(context, "mbThread", mbThread);
267    
268                    processTemplate(_tplMBThread, context);
269            }
270    
271            public void insertSecurity(String name, long primKey) throws Exception {
272                    insertSecurity(name, String.valueOf(primKey));
273            }
274    
275            public void insertSecurity(String name, String primKey) throws Exception {
276                    if (!_securityEnabled) {
277                            return;
278                    }
279    
280                    Map<String, Object> context = getContext();
281    
282                    Resource resource = _dataFactory.addResource(name, primKey);
283    
284                    put(context, "resource", resource);
285    
286                    processTemplate(_tplSecurity, context);
287            }
288    
289            public void insertUser(
290                            Contact contact, Group group, List<Long> groupIds,
291                            List<Long> organizationIds, List<Layout> privateLayouts,
292                            List<Layout> publicLayouts, List<Role> roleIds, User user)
293                    throws Exception {
294    
295                    Map<String, Object> context = getContext();
296    
297                    put(context, "contact", contact);
298                    put(context, "group", group);
299                    put(context, "groupIds", groupIds);
300                    put(context, "organizationIds", organizationIds);
301                    put(context, "privateLayouts", privateLayouts);
302                    put(context, "publicLayouts", publicLayouts);
303                    put(context, "roleIds", roleIds);
304                    put(context, "user", user);
305    
306                    processTemplate(_tplUser, context);
307            }
308    
309            public void insertWikiNode(WikiNode wikiNode) throws Exception {
310                    Map<String, Object> context = getContext();
311    
312                    put(context, "wikiNode", wikiNode);
313    
314                    processTemplate(_tplWikiNode, context);
315            }
316    
317            public void insertWikiPage(WikiNode wikiNode, WikiPage wikiPage)
318                    throws Exception {
319    
320                    Map<String, Object> context = getContext();
321    
322                    put(context, "wikiNode", wikiNode);
323                    put(context, "wikiPage", wikiPage);
324    
325                    processTemplate(_tplWikiPage, context);
326            }
327    
328            protected void createSample() throws Exception {
329                    Map<String, Object> context = getContext();
330    
331                    Writer blogsEntriesCsvWriter = getWriter("blogs_entries.csv");
332                    Writer mbMessagesCsvWriter = getWriter("mb_messages.csv");
333                    Writer usersCsvWriter = getWriter("users.csv");
334                    Writer wikiPagesCsvWriter = getWriter("wiki_pages.csv");
335    
336                    put(context, "blogsEntriesCsvWriter", blogsEntriesCsvWriter);
337                    put(context, "mbMessagesCsvWriter", mbMessagesCsvWriter);
338                    put(context, "usersCsvWriter", usersCsvWriter);
339                    put(context, "wikiPagesCsvWriter", wikiPagesCsvWriter);
340    
341                    processTemplate(_tplSample, context);
342    
343                    blogsEntriesCsvWriter.flush();
344                    mbMessagesCsvWriter.flush();
345                    usersCsvWriter.flush();
346                    wikiPagesCsvWriter.flush();
347            }
348    
349            protected Map<String, Object> getContext() {
350                    Map<String, Object> context = new HashMap<String, Object>();
351    
352                    Company company = _dataFactory.getCompany();
353                    User defaultUser = _dataFactory.getDefaultUser();
354    
355                    put(context, "companyId", company.getCompanyId());
356                    put(context, "counter", _counter);
357                    put(context, "dataFactory", _dataFactory);
358                    put(context, "defaultUserId", defaultUser.getCompanyId());
359                    put(context, "maxBlogsEntryCommentCount", _maxBlogsEntryCommentCount);
360                    put(context, "maxBlogsEntryCount", _maxBlogsEntryCount);
361                    put(context, "maxGroupCount", _maxGroupCount);
362                    put(context, "maxMBCategoryCount", _maxMBCategoryCount);
363                    put(context, "maxMBMessageCount", _maxMBMessageCount);
364                    put(context, "maxMBThreadCount", _maxMBThreadCount);
365                    put(context, "maxUserCount", _maxUserCount);
366                    put(context, "maxUserToGroupCount", _maxUserToGroupCount);
367                    put(context, "maxWikiNodeCount", _maxWikiNodeCount);
368                    put(context, "maxWikiPageCommentCount", _maxWikiPageCommentCount);
369                    put(context, "maxWikiPageCount", _maxWikiPageCount);
370                    put(context, "portalUUIDUtil", PortalUUIDUtil.getPortalUUID());
371                    put(context, "sampleSQLBuilder", this);
372                    put(context, "stringUtil", StringUtil_IW.getInstance());
373                    put(context, "userScreenNameIncrementer", _userScreenNameIncrementer);
374    
375                    return context;
376            }
377    
378            protected Writer getWriter(String fileName) throws Exception {
379                    return new FileWriter(new File(_outputDir + "/" + fileName));
380            }
381    
382            protected void processTemplate(String name, Map<String, Object> context)
383                    throws Exception {
384    
385                    FreeMarkerUtil.process(name, context, _writerGeneric);
386            }
387    
388            protected void put(Map<String, Object> context, String key, Object value) {
389                    context.put(key, value);
390            }
391    
392            private static final String _TPL_ROOT =
393                    "com/liferay/portal/tools/samplesqlbuilder/dependencies/";
394    
395            private SimpleCounter _counter;
396            private DataFactory _dataFactory;
397            private String _dbType;
398            private int _maxBlogsEntryCommentCount;
399            private int _maxBlogsEntryCount;
400            private int _maxGroupCount;
401            private int _maxMBCategoryCount;
402            private int _maxMBMessageCount;
403            private int _maxMBThreadCount;
404            private int _maxUserCount;
405            private int _maxUserToGroupCount;
406            private int _maxWikiNodeCount;
407            private int _maxWikiPageCommentCount;
408            private int _maxWikiPageCount;
409            private String _outputDir;
410            private SimpleCounter _permissionCounter;
411            private SimpleCounter _resourceCodeCounter;
412            private SimpleCounter _resourceCounter;
413            private boolean _securityEnabled;
414            private String _tplAssetEntry = _TPL_ROOT + "asset_entry.ftl";
415            private String _tplGroup = _TPL_ROOT + "group.ftl";
416            private String _tplBlogsEntry = _TPL_ROOT + "blogs_entry.ftl";
417            private String _tplBlogsStatsUser = _TPL_ROOT + "blogs_stats_user.ftl";
418            private String _tplMBCategory = _TPL_ROOT + "mb_category.ftl";
419            private String _tplMBDiscussion = _TPL_ROOT + "mb_discussion.ftl";
420            private String _tplMBMessage = _TPL_ROOT + "mb_message.ftl";
421            private String _tplMBStatsUser = _TPL_ROOT + "mb_stats_user.ftl";
422            private String _tplMBThread = _TPL_ROOT + "mb_thread.ftl";
423            private String _tplSample = _TPL_ROOT + "sample.ftl";
424            private String _tplSecurity = _TPL_ROOT + "security.ftl";
425            private String _tplUser = _TPL_ROOT + "user.ftl";
426            private String _tplWikiNode = _TPL_ROOT + "wiki_node.ftl";
427            private String _tplWikiPage = _TPL_ROOT + "wiki_page.ftl";
428            private SimpleCounter _userScreenNameIncrementer;
429            private Writer _writerGeneric;
430            private Writer _writerSpecific;
431    
432    }