--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.tools.servicebuilder;\r
+\r
+import com.liferay.portal.freemarker.FreeMarkerUtil;\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;\r
+import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;\r
+import com.liferay.portal.kernel.util.ArrayUtil;\r
+import com.liferay.portal.kernel.util.ArrayUtil_IW;\r
+import com.liferay.portal.kernel.util.CharPool;\r
+import com.liferay.portal.kernel.util.ClearThreadLocalUtil;\r
+import com.liferay.portal.kernel.util.FileUtil;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.ListUtil;\r
+import com.liferay.portal.kernel.util.PropertiesUtil;\r
+import com.liferay.portal.kernel.util.StringBundler;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.StringUtil_IW;\r
+import com.liferay.portal.kernel.util.TextFormatter;\r
+import com.liferay.portal.kernel.util.Time;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.util.Validator_IW;\r
+import com.liferay.portal.kernel.xml.Document;\r
+import com.liferay.portal.kernel.xml.Element;\r
+import com.liferay.portal.kernel.xml.SAXReaderUtil;\r
+import com.liferay.portal.model.CacheField;\r
+import com.liferay.portal.model.ModelHintsUtil;\r
+import com.liferay.portal.security.permission.ResourceActionsUtil;\r
+import com.liferay.portal.tools.ArgumentsUtil;\r
+import com.liferay.portal.tools.SourceFormatter;\r
+import com.liferay.portal.util.InitUtil;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.util.xml.XMLFormatter;\r
+\r
+import com.thoughtworks.qdox.JavaDocBuilder;\r
+import com.thoughtworks.qdox.model.Annotation;\r
+import com.thoughtworks.qdox.model.ClassLibrary;\r
+import com.thoughtworks.qdox.model.DocletTag;\r
+import com.thoughtworks.qdox.model.JavaClass;\r
+import com.thoughtworks.qdox.model.JavaField;\r
+import com.thoughtworks.qdox.model.JavaMethod;\r
+import com.thoughtworks.qdox.model.JavaParameter;\r
+import com.thoughtworks.qdox.model.Type;\r
+\r
+import de.hunsicker.io.FileFormat;\r
+import de.hunsicker.jalopy.Jalopy;\r
+import de.hunsicker.jalopy.storage.Convention;\r
+import de.hunsicker.jalopy.storage.ConventionKeys;\r
+import de.hunsicker.jalopy.storage.Environment;\r
+\r
+import freemarker.ext.beans.BeansWrapper;\r
+\r
+import freemarker.log.Logger;\r
+\r
+import freemarker.template.TemplateHashModel;\r
+import freemarker.template.TemplateModelException;\r
+\r
+import java.beans.Introspector;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileReader;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Locale;\r
+import java.util.Map;\r
+import java.util.Properties;\r
+import java.util.Set;\r
+import java.util.TreeMap;\r
+import java.util.TreeSet;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.dom4j.DocumentException;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Charles May\r
+ * @author Alexander Chow\r
+ * @author Harry Mark\r
+ * @author Tariq Dweik\r
+ * @author Glenn Powell\r
+ * @author Raymond Augé\r
+ * @author Prashant Dighe\r
+ * @author Shuyang Zhou\r
+ */\r
+public class ServiceBuilder {\r
+\r
+ public static final String AUTHOR = "Brian Wing Shun Chan";\r
+\r
+ public static void main(String[] args) {\r
+ Map<String, String> arguments = ArgumentsUtil.parseArguments(args);\r
+\r
+ InitUtil.initWithSpring(true);\r
+\r
+ String fileName = arguments.get("service.input.file");\r
+ String hbmFileName = arguments.get("service.hbm.file");\r
+ String ormFileName = arguments.get("service.orm.file");\r
+ String modelHintsFileName = arguments.get("service.model.hints.file");\r
+ String springFileName = arguments.get("service.spring.file");\r
+ String springBaseFileName = arguments.get("service.spring.base.file");\r
+ String springClusterFileName = arguments.get("service.spring.cluster.file");\r
+ String springDynamicDataSourceFileName = arguments.get("service.spring.dynamic.data.source.file");\r
+ String springHibernateFileName = arguments.get("service.spring.hibernate.file");\r
+ String springInfrastructureFileName = arguments.get("service.spring.infrastructure.file");\r
+ String springShardDataSourceFileName = arguments.get("service.spring.shard.data.source.file");\r
+ String apiDir = arguments.get("service.api.dir");\r
+ String implDir = arguments.get("service.impl.dir");\r
+ String jsonFileName = arguments.get("service.json.file");\r
+ String remotingFileName = arguments.get("service.remoting.file");\r
+ String sqlDir = arguments.get("service.sql.dir");\r
+ String sqlFileName = arguments.get("service.sql.file");\r
+ String sqlIndexesFileName = arguments.get("service.sql.indexes.file");\r
+ String sqlIndexesPropertiesFileName = arguments.get("service.sql.indexes.properties.file");\r
+ String sqlSequencesFileName = arguments.get("service.sql.sequences.file");\r
+ boolean autoNamespaceTables = GetterUtil.getBoolean(arguments.get("service.auto.namespace.tables"));\r
+ String beanLocatorUtil = arguments.get("service.bean.locator.util");\r
+ String propsUtil = arguments.get("service.props.util");\r
+ String pluginName = arguments.get("service.plugin.name");\r
+ String targetEntityName = arguments.get("service.target.entity.name");\r
+ String testDir = arguments.get("service.test.dir");\r
+ long buildNumber = GetterUtil.getLong(arguments.get("service.build.number"), 1);\r
+ boolean buildNumberIncrement = GetterUtil.getBoolean(arguments.get("service.build.number.increment"), true);\r
+\r
+ try {\r
+ new ServiceBuilder(\r
+ fileName, hbmFileName, ormFileName, modelHintsFileName,\r
+ springFileName, springBaseFileName, springClusterFileName,\r
+ springDynamicDataSourceFileName, springHibernateFileName,\r
+ springInfrastructureFileName, springShardDataSourceFileName,\r
+ apiDir, implDir, jsonFileName, remotingFileName, sqlDir,\r
+ sqlFileName, sqlIndexesFileName, sqlIndexesPropertiesFileName,\r
+ sqlSequencesFileName, autoNamespaceTables, beanLocatorUtil,\r
+ propsUtil, pluginName, targetEntityName, testDir, true,\r
+ buildNumber, buildNumberIncrement);\r
+ }\r
+ catch (RuntimeException re) {\r
+ System.out.println(\r
+ "Please set these required arguments. Sample values are:\n" +\r
+ "\n" +\r
+ "\tservice.input.file=${service.file}\n" +\r
+ "\tservice.hbm.file=${basedir}/src/META-INF/portal-hbm.xml\n" +\r
+ "\tservice.orm.file=${basedir}/src/META-INF/portal-orm.xml\n" +\r
+ "\tservice.model.hints.file=${basedir}/src/META-INF/portal-model-hints.xml\n" +\r
+ "\tservice.spring.file=${basedir}/src/META-INF/portal-spring.xml\n" +\r
+ "\tservice.api.dir=${basedir}/../portal-service/src\n" +\r
+ "\tservice.impl.dir=${basedir}/src\n" +\r
+ "\tservice.json.file=${basedir}/../portal-web/docroot/html/js/liferay/service.js\n" +\r
+ "\tservice.remoting.file=${basedir}/../portal-web/docroot/WEB-INF/remoting-servlet.xml\n" +\r
+ "\tservice.sql.dir=${basedir}/../sql\n" +\r
+ "\tservice.sql.file=portal-tables.sql\n" +\r
+ "\tservice.sql.indexes.file=indexes.sql\n" +\r
+ "\tservice.sql.indexes.properties.file=indexes.properties\n" +\r
+ "\tservice.sql.sequences.file=sequences.sql\n" +\r
+ "\tservice.bean.locator.util=com.liferay.portal.kernel.bean.PortalBeanLocatorUtil\n" +\r
+ "\tservice.props.util=com.liferay.portal.util.PropsUtil\n" +\r
+ "\tservice.target.entity.name=${service.target.entity.name}\n" +\r
+ "\tservice.test.dir=${basedir}/test/integration\n" +\r
+ "\tservice.build.number=1\n" +\r
+ "\tservice.build.number.increment=true\n" +\r
+ "\n" +\r
+ "You can also customize the generated code by overriding the default templates with these optional system properties:\n" +\r
+ "\n" +\r
+ "\t-Dservice.tpl.bad_alias_names=" + _TPL_ROOT + "bad_alias_names.txt\n"+\r
+ "\t-Dservice.tpl.bad_column_names=" + _TPL_ROOT + "bad_column_names.txt\n"+\r
+ "\t-Dservice.tpl.bad_json_types=" + _TPL_ROOT + "bad_json_types.txt\n"+\r
+ "\t-Dservice.tpl.bad_table_names=" + _TPL_ROOT + "bad_table_names.txt\n"+\r
+ "\t-Dservice.tpl.base_mode_impl=" + _TPL_ROOT + "base_mode_impl.ftl\n"+\r
+ "\t-Dservice.tpl.blob_model=" + _TPL_ROOT + "blob_model.ftl\n"+\r
+ "\t-Dservice.tpl.copyright.txt=copyright.txt\n"+\r
+ "\t-Dservice.tpl.ejb_pk=" + _TPL_ROOT + "ejb_pk.ftl\n"+\r
+ "\t-Dservice.tpl.exception=" + _TPL_ROOT + "exception.ftl\n"+\r
+ "\t-Dservice.tpl.extended_model=" + _TPL_ROOT + "extended_model.ftl\n"+\r
+ "\t-Dservice.tpl.extended_model_base_impl=" + _TPL_ROOT + "extended_model_base_impl.ftl\n"+\r
+ "\t-Dservice.tpl.extended_model_impl=" + _TPL_ROOT + "extended_model_impl.ftl\n"+\r
+ "\t-Dservice.tpl.finder=" + _TPL_ROOT + "finder.ftl\n"+\r
+ "\t-Dservice.tpl.finder_util=" + _TPL_ROOT + "finder_util.ftl\n"+\r
+ "\t-Dservice.tpl.hbm_xml=" + _TPL_ROOT + "hbm_xml.ftl\n"+\r
+ "\t-Dservice.tpl.orm_xml=" + _TPL_ROOT + "orm_xml.ftl\n"+\r
+ "\t-Dservice.tpl.json_js=" + _TPL_ROOT + "json_js.ftl\n"+\r
+ "\t-Dservice.tpl.json_js_method=" + _TPL_ROOT + "json_js_method.ftl\n"+\r
+ "\t-Dservice.tpl.model=" + _TPL_ROOT + "model.ftl\n"+\r
+ "\t-Dservice.tpl.model_cache=" + _TPL_ROOT + "model_cache.ftl\n"+\r
+ "\t-Dservice.tpl.model_hints_xml=" + _TPL_ROOT + "model_hints_xml.ftl\n"+\r
+ "\t-Dservice.tpl.model_impl=" + _TPL_ROOT + "model_impl.ftl\n"+\r
+ "\t-Dservice.tpl.model_soap=" + _TPL_ROOT + "model_soap.ftl\n"+\r
+ "\t-Dservice.tpl.model_wrapper=" + _TPL_ROOT + "model_wrapper.ftl\n"+\r
+ "\t-Dservice.tpl.persistence=" + _TPL_ROOT + "persistence.ftl\n"+\r
+ "\t-Dservice.tpl.persistence_impl=" + _TPL_ROOT + "persistence_impl.ftl\n"+\r
+ "\t-Dservice.tpl.persistence_util=" + _TPL_ROOT + "persistence_util.ftl\n"+\r
+ "\t-Dservice.tpl.props=" + _TPL_ROOT + "props.ftl\n"+\r
+ "\t-Dservice.tpl.remoting_xml=" + _TPL_ROOT + "remoting_xml.ftl\n"+\r
+ "\t-Dservice.tpl.service=" + _TPL_ROOT + "service.ftl\n"+\r
+ "\t-Dservice.tpl.service_base_impl=" + _TPL_ROOT + "service_base_impl.ftl\n"+\r
+ "\t-Dservice.tpl.service_clp=" + _TPL_ROOT + "service_clp.ftl\n"+\r
+ "\t-Dservice.tpl.service_clp_invoker=" + _TPL_ROOT + "service_clp_invoker.ftl\n"+\r
+ "\t-Dservice.tpl.service_clp_message_listener=" + _TPL_ROOT + "service_clp_message_listener.ftl\n"+\r
+ "\t-Dservice.tpl.service_clp_serializer=" + _TPL_ROOT + "service_clp_serializer.ftl\n"+\r
+ "\t-Dservice.tpl.service_http=" + _TPL_ROOT + "service_http.ftl\n"+\r
+ "\t-Dservice.tpl.service_impl=" + _TPL_ROOT + "service_impl.ftl\n"+\r
+ "\t-Dservice.tpl.service_soap=" + _TPL_ROOT + "service_soap.ftl\n"+\r
+ "\t-Dservice.tpl.service_util=" + _TPL_ROOT + "service_util.ftl\n"+\r
+ "\t-Dservice.tpl.service_wrapper=" + _TPL_ROOT + "service_wrapper.ftl\n"+\r
+ "\t-Dservice.tpl.spring_base_xml=" + _TPL_ROOT + "spring_base_xml.ftl\n"+\r
+ "\t-Dservice.tpl.spring_dynamic_data_source_xml=" + _TPL_ROOT + "spring_dynamic_data_source_xml.ftl\n"+\r
+ "\t-Dservice.tpl.spring_hibernate_xml=" + _TPL_ROOT + "spring_hibernate_xml.ftl\n"+\r
+ "\t-Dservice.tpl.spring_infrastructure_xml=" + _TPL_ROOT + "spring_infrastructure_xml.ftl\n"+\r
+ "\t-Dservice.tpl.spring_xml=" + _TPL_ROOT + "spring_xml.ftl\n"+\r
+ "\t-Dservice.tpl.spring_xml_session=" + _TPL_ROOT + "spring_xml_session.ftl");\r
+\r
+ throw re;\r
+ }\r
+\r
+ try {\r
+ ClearThreadLocalUtil.clearThreadLocal();\r
+ }\r
+ catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+\r
+ Introspector.flushCaches();\r
+ }\r
+\r
+ public static String toHumanName(String name) {\r
+ if (name == null) {\r
+ return null;\r
+ }\r
+\r
+ String humanName = TextFormatter.format(name, TextFormatter.H);\r
+\r
+ if (humanName.equals("id")) {\r
+ humanName = "ID";\r
+ }\r
+ else if (humanName.equals("ids")) {\r
+ humanName = "IDs";\r
+ }\r
+\r
+ if (humanName.endsWith(" id")) {\r
+ humanName = humanName.substring(0, humanName.length() - 3) + " ID";\r
+ }\r
+ else if (humanName.endsWith(" ids")) {\r
+ humanName = humanName.substring(0, humanName.length() - 4) + " IDs";\r
+ }\r
+\r
+ if (humanName.contains(" id ")) {\r
+ humanName = StringUtil.replace(humanName, " id ", " ID ");\r
+ }\r
+ else if (humanName.contains(" ids ")) {\r
+ humanName = StringUtil.replace(humanName, " ids ", " IDs ");\r
+ }\r
+\r
+ return humanName;\r
+ }\r
+\r
+ public static void writeFile(File file, String content)\r
+ throws IOException {\r
+\r
+ writeFile(file, content, AUTHOR);\r
+ }\r
+\r
+ public static void writeFile(File file, String content, String author)\r
+ throws IOException {\r
+\r
+ writeFile(file, content, author, null);\r
+ }\r
+\r
+ public static void writeFile(\r
+ File file, String content, String author,\r
+ Map<String, Object> jalopySettings)\r
+ throws IOException {\r
+\r
+ String packagePath = _getPackagePath(file);\r
+\r
+ String className = file.getName();\r
+\r
+ className = className.substring(0, className.length() - 5);\r
+\r
+ content = SourceFormatter.stripJavaImports(\r
+ content, packagePath, className);\r
+\r
+ File tempFile = new File("ServiceBuilder.temp");\r
+\r
+ FileUtil.write(tempFile, content);\r
+\r
+ // Beautify\r
+\r
+ StringBuffer sb = new StringBuffer();\r
+\r
+ Jalopy jalopy = new Jalopy();\r
+\r
+ jalopy.setFileFormat(FileFormat.UNIX);\r
+ jalopy.setInput(tempFile);\r
+ jalopy.setOutput(sb);\r
+\r
+ File jalopyXmlFile = new File("tools/jalopy.xml");\r
+\r
+ if (!jalopyXmlFile.exists()) {\r
+ jalopyXmlFile = new File("../tools/jalopy.xml");\r
+ }\r
+\r
+ if (!jalopyXmlFile.exists()) {\r
+ jalopyXmlFile = new File("misc/jalopy.xml");\r
+ }\r
+\r
+ if (!jalopyXmlFile.exists()) {\r
+ jalopyXmlFile = new File("../misc/jalopy.xml");\r
+ }\r
+\r
+ if (!jalopyXmlFile.exists()) {\r
+ jalopyXmlFile = new File("../../misc/jalopy.xml");\r
+ }\r
+\r
+ try {\r
+ Jalopy.setConvention(jalopyXmlFile);\r
+ }\r
+ catch (FileNotFoundException fnfe) {\r
+ }\r
+\r
+ if (jalopySettings == null) {\r
+ jalopySettings = new HashMap<String, Object>();\r
+ }\r
+\r
+ Environment env = Environment.getInstance();\r
+\r
+ // Author\r
+\r
+ author = GetterUtil.getString(\r
+ (String)jalopySettings.get("author"), author);\r
+\r
+ env.set("author", author);\r
+\r
+ // File name\r
+\r
+ env.set("fileName", file.getName());\r
+\r
+ Convention convention = Convention.getInstance();\r
+\r
+ String classMask = "/**\n * @author $author$\n*/";\r
+\r
+ convention.put(\r
+ ConventionKeys.COMMENT_JAVADOC_TEMPLATE_CLASS,\r
+ env.interpolate(classMask));\r
+\r
+ convention.put(\r
+ ConventionKeys.COMMENT_JAVADOC_TEMPLATE_INTERFACE,\r
+ env.interpolate(classMask));\r
+\r
+ jalopy.format();\r
+\r
+ String newContent = sb.toString();\r
+\r
+ // Remove double blank lines after the package or last import\r
+\r
+ newContent = newContent.replaceFirst(\r
+ "(?m)^[ \t]*((?:package|import) .*;)\\s*^[ \t]*/\\*\\*",\r
+ "$1\n\n/**");\r
+\r
+ /*\r
+ // Remove blank lines after try {\r
+\r
+ newContent = StringUtil.replace(newContent, "try {\n\n", "try {\n");\r
+\r
+ // Remove blank lines after ) {\r
+\r
+ newContent = StringUtil.replace(newContent, ") {\n\n", ") {\n");\r
+\r
+ // Remove blank lines empty braces { }\r
+\r
+ newContent = StringUtil.replace(newContent, "\n\n\t}", "\n\t}");\r
+\r
+ // Add space to last }\r
+\r
+ newContent = newContent.substring(0, newContent.length() - 2) + "\n\n}";\r
+ */\r
+\r
+ writeFileRaw(file, newContent);\r
+\r
+ tempFile.deleteOnExit();\r
+ }\r
+\r
+ public static void writeFileRaw(File file, String content)\r
+ throws IOException {\r
+\r
+ // Write file if and only if the file has changed\r
+\r
+ if (!file.exists() || !FileUtil.isSameContent(file, content)) {\r
+ FileUtil.write(file, content);\r
+\r
+ System.out.println("Writing " + file);\r
+ }\r
+ }\r
+\r
+ public ServiceBuilder(\r
+ String fileName, String hbmFileName, String ormFileName,\r
+ String modelHintsFileName, String springFileName,\r
+ String springBaseFileName, String springClusterFileName,\r
+ String springDynamicDataSourceFileName, String springHibernateFileName,\r
+ String springInfrastructureFileName,\r
+ String springShardDataSourceFileName, String apiDir, String implDir,\r
+ String jsonFileName, String remotingFileName, String sqlDir,\r
+ String sqlFileName, String sqlIndexesFileName,\r
+ String sqlIndexesPropertiesFileName, String sqlSequencesFileName,\r
+ boolean autoNamespaceTables, String beanLocatorUtil, String propsUtil,\r
+ String pluginName, String targetEntityName, String testDir) {\r
+\r
+ this(\r
+ fileName, hbmFileName, ormFileName, modelHintsFileName,\r
+ springFileName, springBaseFileName, springClusterFileName,\r
+ springDynamicDataSourceFileName, springHibernateFileName,\r
+ springInfrastructureFileName, springShardDataSourceFileName, apiDir,\r
+ implDir, jsonFileName, remotingFileName, sqlDir, sqlFileName,\r
+ sqlIndexesFileName, sqlIndexesPropertiesFileName,\r
+ sqlSequencesFileName, autoNamespaceTables, beanLocatorUtil,\r
+ propsUtil, pluginName, targetEntityName, testDir, true, 1, true);\r
+ }\r
+\r
+ public ServiceBuilder(\r
+ String fileName, String hbmFileName, String ormFileName,\r
+ String modelHintsFileName, String springFileName,\r
+ String springBaseFileName, String springClusterFileName,\r
+ String springDynamicDataSourceFileName, String springHibernateFileName,\r
+ String springInfrastructureFileName,\r
+ String springShardDataSourceFileName, String apiDir, String implDir,\r
+ String jsonFileName, String remotingFileName, String sqlDir,\r
+ String sqlFileName, String sqlIndexesFileName,\r
+ String sqlIndexesPropertiesFileName, String sqlSequencesFileName,\r
+ boolean autoNamespaceTables, String beanLocatorUtil, String propsUtil,\r
+ String pluginName, String targetEntityName, String testDir,\r
+ boolean build, long buildNumber, boolean buildNumberIncrement) {\r
+\r
+ _tplBadAliasNames = _getTplProperty(\r
+ "bad_alias_names", _tplBadAliasNames);\r
+ _tplBadColumnNames = _getTplProperty(\r
+ "bad_column_names", _tplBadColumnNames);\r
+ _tplBadJsonTypes = _getTplProperty("bad_json_types", _tplBadJsonTypes);\r
+ _tplBadTableNames = _getTplProperty(\r
+ "bad_table_names", _tplBadTableNames);\r
+ _tplBlobModel = _getTplProperty("blob_model", _tplBlobModel);\r
+ _tplEjbPk = _getTplProperty("ejb_pk", _tplEjbPk);\r
+ _tplException = _getTplProperty("exception", _tplException);\r
+ _tplExtendedModel = _getTplProperty(\r
+ "extended_model", _tplExtendedModel);\r
+ _tplExtendedModelBaseImpl = _getTplProperty(\r
+ "extended_model_base_impl", _tplExtendedModelBaseImpl);\r
+ _tplExtendedModelImpl = _getTplProperty(\r
+ "extended_model_impl", _tplExtendedModelImpl);\r
+ _tplFinder = _getTplProperty("finder", _tplFinder);\r
+ _tplFinderUtil = _getTplProperty("finder_util", _tplFinderUtil);\r
+ _tplHbmXml = _getTplProperty("hbm_xml", _tplHbmXml);\r
+ _tplOrmXml = _getTplProperty("orm_xml", _tplOrmXml);\r
+ _tplJsonJs = _getTplProperty("json_js", _tplJsonJs);\r
+ _tplJsonJsMethod = _getTplProperty("json_js_method", _tplJsonJsMethod);\r
+ _tplModel = _getTplProperty("model", _tplModel);\r
+ _tplModelCache = _getTplProperty("model_cache", _tplModelCache);\r
+ _tplModelClp = _getTplProperty("model", _tplModelClp);\r
+ _tplModelHintsXml = _getTplProperty(\r
+ "model_hints_xml", _tplModelHintsXml);\r
+ _tplModelImpl = _getTplProperty("model_impl", _tplModelImpl);\r
+ _tplModelSoap = _getTplProperty("model_soap", _tplModelSoap);\r
+ _tplModelWrapper = _getTplProperty("model_wrapper", _tplModelWrapper);\r
+ _tplPersistence = _getTplProperty("persistence", _tplPersistence);\r
+ _tplPersistenceImpl = _getTplProperty(\r
+ "persistence_impl", _tplPersistenceImpl);\r
+ _tplPersistenceUtil = _getTplProperty(\r
+ "persistence_util", _tplPersistenceUtil);\r
+ _tplProps = _getTplProperty("props", _tplProps);\r
+ _tplRemotingXml = _getTplProperty("remoting_xml", _tplRemotingXml);\r
+ _tplService = _getTplProperty("service", _tplService);\r
+ _tplServiceBaseImpl = _getTplProperty(\r
+ "service_base_impl", _tplServiceBaseImpl);\r
+ _tplServiceClp = _getTplProperty("service_clp", _tplServiceClp);\r
+ _tplServiceClpInvoker = _getTplProperty(\r
+ "service_clp_invoker", _tplServiceClpInvoker);\r
+ _tplServiceClpMessageListener = _getTplProperty(\r
+ "service_clp_message_listener", _tplServiceClpMessageListener);\r
+ _tplServiceClpSerializer = _getTplProperty(\r
+ "service_clp_serializer", _tplServiceClpSerializer);\r
+ _tplServiceHttp = _getTplProperty("service_http", _tplServiceHttp);\r
+ _tplServiceImpl = _getTplProperty("service_impl", _tplServiceImpl);\r
+ _tplServiceSoap = _getTplProperty("service_soap", _tplServiceSoap);\r
+ _tplServiceUtil = _getTplProperty("service_util", _tplServiceUtil);\r
+ _tplServiceWrapper = _getTplProperty(\r
+ "service_wrapper", _tplServiceWrapper);\r
+ _tplSpringBaseXml = _getTplProperty(\r
+ "spring_base_xml", _tplSpringBaseXml);\r
+ _tplSpringClusterXml = _getTplProperty(\r
+ "spring_cluster_xml", _tplSpringClusterXml);\r
+ _tplSpringDynamicDataSourceXml = _getTplProperty(\r
+ "spring_dynamic_data_source_xml", _tplSpringDynamicDataSourceXml);\r
+ _tplSpringHibernateXml = _getTplProperty(\r
+ "spring_hibernate_xml", _tplSpringHibernateXml);\r
+ _tplSpringInfrastructureXml = _getTplProperty(\r
+ "spring_infrastructure_xml", _tplSpringInfrastructureXml);\r
+ _tplSpringShardDataSourceXml = _getTplProperty(\r
+ "spring_shard_data_source_xml", _tplSpringShardDataSourceXml);\r
+ _tplSpringXml = _getTplProperty("spring_xml", _tplSpringXml);\r
+ _tplSpringClearService = _getTplProperty(\r
+ "spring_clear_service", _tplSpringClearService);\r
+ try {\r
+ _badTableNames = _readLines(_tplBadTableNames);\r
+ _badAliasNames = _readLines(_tplBadAliasNames);\r
+ _badColumnNames = _readLines(_tplBadColumnNames);\r
+ _badJsonTypes = _readLines(_tplBadJsonTypes);\r
+ _hbmFileName = hbmFileName;\r
+ _ormFileName = ormFileName;\r
+ _modelHintsFileName = modelHintsFileName;\r
+ _springFileName = springFileName;\r
+ _springBaseFileName = springBaseFileName;\r
+ _springClusterFileName = springClusterFileName;\r
+ _springDynamicDataSourceFileName = springDynamicDataSourceFileName;\r
+ _springHibernateFileName = springHibernateFileName;\r
+ _springInfrastructureFileName = springInfrastructureFileName;\r
+ _springShardDataSourceFileName = springShardDataSourceFileName;\r
+ _apiDir = apiDir;\r
+ _implDir = implDir;\r
+ _jsonFileName = jsonFileName;\r
+ _remotingFileName = remotingFileName;\r
+ _sqlDir = sqlDir;\r
+ _sqlFileName = sqlFileName;\r
+ _sqlIndexesFileName = sqlIndexesFileName;\r
+ _sqlIndexesPropertiesFileName = sqlIndexesPropertiesFileName;\r
+ _sqlSequencesFileName = sqlSequencesFileName;\r
+ _autoNamespaceTables = autoNamespaceTables;\r
+ _beanLocatorUtil = beanLocatorUtil;\r
+ _beanLocatorUtilShortName = _beanLocatorUtil.substring(\r
+ _beanLocatorUtil.lastIndexOf(".") + 1);\r
+ _propsUtil = propsUtil;\r
+ _pluginName = GetterUtil.getString(pluginName);\r
+ _targetEntityName = targetEntityName;\r
+ _testDir = testDir;\r
+ _build = build;\r
+ _buildNumber = buildNumber;\r
+ _buildNumberIncrement = buildNumberIncrement;\r
+\r
+ String content = _getContent(fileName);\r
+\r
+ Document document = SAXReaderUtil.read(content, true);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ String packagePath = rootElement.attributeValue("package-path");\r
+\r
+ if (Validator.isNull(packagePath)) {\r
+ throw new IllegalArgumentException(\r
+ "The package-path attribute is required");\r
+ }\r
+\r
+ _outputPath =\r
+ _implDir + "/" + StringUtil.replace(packagePath, ".", "/");\r
+\r
+ _serviceOutputPath =\r
+ _apiDir + "/" + StringUtil.replace(packagePath, ".", "/");\r
+\r
+ if (Validator.isNotNull(_testDir)) {\r
+ _testOutputPath =\r
+ _testDir + "/" + StringUtil.replace(packagePath, ".", "/");\r
+ }\r
+\r
+ _packagePath = packagePath;\r
+\r
+ _autoNamespaceTables = GetterUtil.getBoolean(\r
+ rootElement.attributeValue("auto-namespace-tables"),\r
+ _autoNamespaceTables);\r
+\r
+ Element authorElement = rootElement.element("author");\r
+\r
+ if (authorElement != null) {\r
+ _author = authorElement.getText();\r
+ }\r
+ else {\r
+ _author = AUTHOR;\r
+ }\r
+\r
+ Element portletElement = rootElement.element("portlet");\r
+ Element namespaceElement = rootElement.element("namespace");\r
+\r
+ if (portletElement != null) {\r
+ _portletName = portletElement.attributeValue("name");\r
+\r
+ _portletShortName = portletElement.attributeValue("short-name");\r
+\r
+ _portletPackageName = TextFormatter.format(\r
+ _portletName, TextFormatter.B);\r
+\r
+ _outputPath += "/" + _portletPackageName;\r
+\r
+ _serviceOutputPath += "/" + _portletPackageName;\r
+\r
+ _testOutputPath += "/" + _portletPackageName;\r
+\r
+ _packagePath += "." + _portletPackageName;\r
+ }\r
+ else {\r
+ _portletShortName = namespaceElement.getText();\r
+ }\r
+\r
+ _portletShortName = _portletShortName.trim();\r
+\r
+ for (char c : _portletShortName.toCharArray()) {\r
+ if (!Validator.isChar(c) && (c != CharPool.UNDERLINE)) {\r
+ throw new RuntimeException(\r
+ "The namespace element must be a valid keyword");\r
+ }\r
+ }\r
+\r
+ _ejbList = new ArrayList<Entity>();\r
+ _entityMappings = new HashMap<String, EntityMapping>();\r
+\r
+ List<Element> entityElements = rootElement.elements("entity");\r
+\r
+ for (Element entityElement : entityElements) {\r
+ _parseEntity(entityElement);\r
+ }\r
+\r
+ List<String> exceptionList = new ArrayList<String>();\r
+\r
+ Element exceptionsElement = rootElement.element("exceptions");\r
+\r
+ if (exceptionsElement != null) {\r
+ List<Element> exceptionElements = exceptionsElement.elements(\r
+ "exception");\r
+\r
+ for (Element exceptionElement : exceptionElements) {\r
+ exceptionList.add(exceptionElement.getText());\r
+ }\r
+ }\r
+\r
+ if (build) {\r
+ for (int x = 0; x < _ejbList.size(); x++) {\r
+ Entity entity = _ejbList.get(x);\r
+\r
+ if (_isTargetEntity(entity)) {\r
+ System.out.println("Building " + entity.getName());\r
+\r
+ if (entity.hasColumns()) {\r
+ _createHbm(entity);\r
+ _createHbmUtil(entity);\r
+\r
+ _createPersistenceImpl(entity);\r
+ _createPersistence(entity);\r
+ _createPersistenceUtil(entity);\r
+\r
+ if (Validator.isNotNull(_testDir)) {\r
+ _createPersistenceTest(entity);\r
+ }\r
+\r
+ _createModelImpl(entity);\r
+ _createExtendedModelBaseImpl(entity);\r
+ _createExtendedModelImpl(entity);\r
+\r
+ entity.setTransients(_getTransients(entity, false));\r
+ entity.setParentTransients(\r
+ _getTransients(entity, true));\r
+\r
+ _createModel(entity);\r
+ _createExtendedModel(entity);\r
+\r
+ _createModelCache(entity);\r
+ _createModelClp(entity);\r
+ _createModelWrapper(entity);\r
+\r
+ _createModelSoap(entity);\r
+\r
+ _createBlobModels(entity);\r
+\r
+ _createPool(entity);\r
+\r
+ if (entity.getPKList().size() > 1) {\r
+ _createEJBPK(entity);\r
+ }\r
+ }\r
+\r
+ _createFinder(entity);\r
+ _createFinderUtil(entity);\r
+\r
+ if (entity.hasLocalService()) {\r
+ _createServiceImpl(entity, _SESSION_TYPE_LOCAL);\r
+ _createServiceBaseImpl(entity, _SESSION_TYPE_LOCAL);\r
+ _createService(entity, _SESSION_TYPE_LOCAL);\r
+ _createServiceFactory(entity, _SESSION_TYPE_LOCAL);\r
+ _createServiceUtil(entity, _SESSION_TYPE_LOCAL);\r
+\r
+ _createServiceClp(entity, _SESSION_TYPE_LOCAL);\r
+ _createServiceClpInvoker(\r
+ entity, _SESSION_TYPE_LOCAL);\r
+ _createServiceWrapper(entity, _SESSION_TYPE_LOCAL);\r
+ }\r
+\r
+ if (entity.hasRemoteService()) {\r
+ _createServiceImpl(entity, _SESSION_TYPE_REMOTE);\r
+ _createServiceBaseImpl(\r
+ entity, _SESSION_TYPE_REMOTE);\r
+ _createService(entity, _SESSION_TYPE_REMOTE);\r
+ _createServiceFactory(entity, _SESSION_TYPE_REMOTE);\r
+ _createServiceUtil(entity, _SESSION_TYPE_REMOTE);\r
+\r
+ _createServiceClp(entity, _SESSION_TYPE_REMOTE);\r
+ _createServiceClpInvoker(\r
+ entity, _SESSION_TYPE_REMOTE);\r
+ _createServiceWrapper(entity, _SESSION_TYPE_REMOTE);\r
+\r
+ if (Validator.isNotNull(_remotingFileName)) {\r
+ _createServiceHttp(entity);\r
+ }\r
+\r
+ _createServiceJson(entity);\r
+\r
+ if (entity.hasColumns()) {\r
+ _createServiceJsonSerializer(entity);\r
+ }\r
+\r
+ _createServiceSoap(entity);\r
+ }\r
+ }\r
+ else {\r
+ if (entity.hasColumns()) {\r
+ entity.setTransients(_getTransients(entity, false));\r
+ entity.setParentTransients(\r
+ _getTransients(entity, true));\r
+ }\r
+ }\r
+ }\r
+\r
+ _createHbmXml();\r
+ _createOrmXml();\r
+ _createModelHintsXml();\r
+ _createSpringXml();\r
+ _createSpringClearService();\r
+\r
+ _createExceptions(exceptionList);\r
+\r
+ _createServiceClpMessageListener();\r
+ _createServiceClpSerializer(exceptionList);\r
+\r
+ _createJsonJs();\r
+\r
+ if (Validator.isNotNull(_remotingFileName)) {\r
+ _createRemotingXml();\r
+ }\r
+\r
+ _createSQLIndexes();\r
+ _createSQLTables();\r
+ _createSQLSequences();\r
+\r
+ _createProps();\r
+ _createSpringBaseXml();\r
+ _createSpringClusterXml();\r
+ _createSpringDynamicDataSourceXml();\r
+ _createSpringHibernateXml();\r
+ _createSpringInfrastructureXml();\r
+ _createSpringShardDataSourceXml();\r
+ }\r
+ }\r
+ catch (FileNotFoundException fnfe) {\r
+ System.out.println(fnfe.getMessage());\r
+ }\r
+ catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ public String getClassName(Type type) {\r
+ int dimensions = type.getDimensions();\r
+ String name = type.getValue();\r
+\r
+ if (dimensions > 0) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ for (int i = 0; i < dimensions; i++) {\r
+ sb.append("[");\r
+ }\r
+\r
+ if (name.equals("boolean")) {\r
+ return sb.append("Z").toString();\r
+ }\r
+ else if (name.equals("byte")) {\r
+ return sb.append("B").toString();\r
+ }\r
+ else if (name.equals("char")) {\r
+ return sb.append("C").toString();\r
+ }\r
+ else if (name.equals("double")) {\r
+ return sb.append("D").toString();\r
+ }\r
+ else if (name.equals("float")) {\r
+ return sb.append("F").toString();\r
+ }\r
+ else if (name.equals("int")) {\r
+ return sb.append("I").toString();\r
+ }\r
+ else if (name.equals("long")) {\r
+ return sb.append("J").toString();\r
+ }\r
+ else if (name.equals("short")) {\r
+ return sb.append("S").toString();\r
+ }\r
+ else {\r
+ return sb.append("L").append(name).append(";").toString();\r
+ }\r
+ }\r
+\r
+ return name;\r
+ }\r
+\r
+ public String getCreateMappingTableSQL(EntityMapping entityMapping)\r
+ throws IOException {\r
+\r
+ String createMappingTableSQL = _getCreateMappingTableSQL(entityMapping);\r
+\r
+ createMappingTableSQL = StringUtil.replace(\r
+ createMappingTableSQL, "\n", "");\r
+ createMappingTableSQL = StringUtil.replace(\r
+ createMappingTableSQL, "\t", "");\r
+ createMappingTableSQL = createMappingTableSQL.substring(\r
+ 0, createMappingTableSQL.length() - 1);\r
+\r
+ return createMappingTableSQL;\r
+ }\r
+\r
+ public String getCreateTableSQL(Entity entity) {\r
+ String createTableSQL = _getCreateTableSQL(entity);\r
+\r
+ createTableSQL = StringUtil.replace(createTableSQL, "\n", "");\r
+ createTableSQL = StringUtil.replace(createTableSQL, "\t", "");\r
+ createTableSQL = createTableSQL.substring(\r
+ 0, createTableSQL.length() - 1);\r
+\r
+ return createTableSQL;\r
+ }\r
+\r
+ public String getDimensions(int dims) {\r
+ String dimensions = "";\r
+\r
+ for (int i = 0; i < dims; i++) {\r
+ dimensions += "[]";\r
+ }\r
+\r
+ return dimensions;\r
+ }\r
+\r
+ public String getDimensions(String dims) {\r
+ return getDimensions(GetterUtil.getInteger(dims));\r
+ }\r
+\r
+ public Entity getEntity(String name) throws IOException {\r
+ Entity entity = _entityPool.get(name);\r
+\r
+ if (entity != null) {\r
+ return entity;\r
+ }\r
+\r
+ int pos = name.lastIndexOf(".");\r
+\r
+ if (pos == -1) {\r
+ pos = _ejbList.indexOf(new Entity(name));\r
+\r
+ if (pos == -1) {\r
+ throw new RuntimeException(\r
+ "Cannot find " + name + " in " +\r
+ ListUtil.toString(_ejbList, Entity.NAME_ACCESSOR));\r
+ }\r
+\r
+ entity = _ejbList.get(pos);\r
+\r
+ _entityPool.put(name, entity);\r
+\r
+ return entity;\r
+ }\r
+ else {\r
+ String refPackage = name.substring(0, pos);\r
+ String refEntity = name.substring(pos + 1);\r
+\r
+ if (refPackage.equals(_packagePath)) {\r
+ pos = _ejbList.indexOf(new Entity(refEntity));\r
+\r
+ if (pos == -1) {\r
+ throw new RuntimeException(\r
+ "Cannot find " + refEntity + " in " +\r
+ ListUtil.toString(_ejbList, Entity.NAME_ACCESSOR));\r
+ }\r
+\r
+ entity = _ejbList.get(pos);\r
+\r
+ _entityPool.put(name, entity);\r
+\r
+ return entity;\r
+ }\r
+\r
+ String refPackageDir = StringUtil.replace(refPackage, ".", "/");\r
+\r
+ String refFileName =\r
+ _implDir + "/" + refPackageDir + "/service.xml";\r
+\r
+ File refFile = new File(refFileName);\r
+\r
+ boolean useTempFile = false;\r
+\r
+ if (!refFile.exists()) {\r
+ refFileName = Time.getTimestamp();\r
+ refFile = new File(refFileName);\r
+\r
+ ClassLoader classLoader = getClass().getClassLoader();\r
+\r
+ FileUtil.write(\r
+ refFileName,\r
+ StringUtil.read(\r
+ classLoader, refPackageDir + "/service.xml"));\r
+\r
+ useTempFile = true;\r
+ }\r
+\r
+ ServiceBuilder serviceBuilder = new ServiceBuilder(\r
+ refFileName, _hbmFileName, _ormFileName, _modelHintsFileName,\r
+ _springFileName, _springBaseFileName, _springClusterFileName,\r
+ _springDynamicDataSourceFileName, _springHibernateFileName,\r
+ _springInfrastructureFileName, _springShardDataSourceFileName,\r
+ _apiDir, _implDir, _jsonFileName, _remotingFileName, _sqlDir,\r
+ _sqlFileName, _sqlIndexesFileName,\r
+ _sqlIndexesPropertiesFileName, _sqlSequencesFileName,\r
+ _autoNamespaceTables, _beanLocatorUtil, _propsUtil, _pluginName,\r
+ _targetEntityName, _testDir, false, _buildNumber,\r
+ _buildNumberIncrement);\r
+\r
+ entity = serviceBuilder.getEntity(refEntity);\r
+\r
+ entity.setPortalReference(useTempFile);\r
+\r
+ _entityPool.put(name, entity);\r
+\r
+ if (useTempFile) {\r
+ refFile.deleteOnExit();\r
+ }\r
+\r
+ return entity;\r
+ }\r
+ }\r
+\r
+ public Entity getEntityByGenericsName(String genericsName) {\r
+ try {\r
+ String name = genericsName;\r
+\r
+ if (name.startsWith("<")) {\r
+ name = name.substring(1, name.length() - 1);\r
+ }\r
+\r
+ name = StringUtil.replace(name, ".model.", ".");\r
+\r
+ return getEntity(name);\r
+ }\r
+ catch (Exception e) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public Entity getEntityByParameterTypeValue(String parameterTypeValue) {\r
+ try {\r
+ String name = parameterTypeValue;\r
+\r
+ name = StringUtil.replace(name, ".model.", ".");\r
+\r
+ return getEntity(name);\r
+ }\r
+ catch (Exception e) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public EntityMapping getEntityMapping(String mappingTable) {\r
+ return _entityMappings.get(mappingTable);\r
+ }\r
+\r
+ public String getGeneratorClass(String idType) {\r
+ if (Validator.isNull(idType)) {\r
+ idType = "assigned";\r
+ }\r
+\r
+ return idType;\r
+ }\r
+\r
+ public String getJavadocComment(JavaClass javaClass) {\r
+ return _formatComment(\r
+ javaClass.getComment(), javaClass.getTags(), StringPool.BLANK);\r
+ }\r
+\r
+ public String getJavadocComment(JavaMethod javaMethod) {\r
+ return _formatComment(\r
+ javaMethod.getComment(), javaMethod.getTags(), StringPool.TAB);\r
+ }\r
+\r
+ public String getListActualTypeArguments(Type type) {\r
+ if (type.getValue().equals("java.util.List")) {\r
+ Type[] types = type.getActualTypeArguments();\r
+\r
+ if (types != null) {\r
+ return getTypeGenericsName(types[0]);\r
+ }\r
+ }\r
+\r
+ return getTypeGenericsName(type);\r
+ }\r
+\r
+ public String getLiteralClass(Type type) {\r
+ StringBundler sb = new StringBundler(type.getDimensions() + 2);\r
+\r
+ sb.append(type.getValue());\r
+\r
+ for (int i = 0; i < type.getDimensions(); i++) {\r
+ sb.append("[]");\r
+ }\r
+\r
+ sb.append(".class");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ public List<EntityColumn> getMappingEntities(String mappingTable)\r
+ throws IOException {\r
+\r
+ List<EntityColumn> mappingEntitiesPKList =\r
+ new ArrayList<EntityColumn>();\r
+\r
+ EntityMapping entityMapping = _entityMappings.get(mappingTable);\r
+\r
+ for (int i = 0; i < 2; i++) {\r
+ Entity entity = getEntity(entityMapping.getEntity(i));\r
+\r
+ if (entity == null) {\r
+ return null;\r
+ }\r
+\r
+ mappingEntitiesPKList.addAll(entity.getPKList());\r
+ }\r
+\r
+ return mappingEntitiesPKList;\r
+ }\r
+\r
+ public String getNoSuchEntityException(Entity entity) {\r
+ String noSuchEntityException = entity.getName();\r
+\r
+ if (Validator.isNull(entity.getPortletShortName()) ||\r
+ (noSuchEntityException.startsWith(entity.getPortletShortName()) &&\r
+ !noSuchEntityException.equals(entity.getPortletShortName()))) {\r
+\r
+ noSuchEntityException = noSuchEntityException.substring(\r
+ entity.getPortletShortName().length());\r
+ }\r
+\r
+ noSuchEntityException = "NoSuch" + noSuchEntityException;\r
+\r
+ return noSuchEntityException;\r
+ }\r
+\r
+ public String getParameterType(JavaParameter parameter) {\r
+ Type returnType = parameter.getType();\r
+\r
+ return getTypeGenericsName(returnType);\r
+ }\r
+\r
+ public String getPrimitiveObj(String type) {\r
+ if (type.equals("boolean")) {\r
+ return "Boolean";\r
+ }\r
+ else if (type.equals("double")) {\r
+ return "Double";\r
+ }\r
+ else if (type.equals("float")) {\r
+ return "Float";\r
+ }\r
+ else if (type.equals("int")) {\r
+ return "Integer";\r
+ }\r
+ else if (type.equals("long")) {\r
+ return "Long";\r
+ }\r
+ else if (type.equals("short")) {\r
+ return "Short";\r
+ }\r
+ else {\r
+ return type;\r
+ }\r
+ }\r
+\r
+ public String getPrimitiveObjValue(String colType) {\r
+ if (colType.equals("Boolean")) {\r
+ return ".booleanValue()";\r
+ }\r
+ else if (colType.equals("Double")) {\r
+ return ".doubleValue()";\r
+ }\r
+ else if (colType.equals("Float")) {\r
+ return ".floatValue()";\r
+ }\r
+ else if (colType.equals("Integer")) {\r
+ return ".intValue()";\r
+ }\r
+ else if (colType.equals("Long")) {\r
+ return ".longValue()";\r
+ }\r
+ else if (colType.equals("Short")) {\r
+ return ".shortValue()";\r
+ }\r
+\r
+ return StringPool.BLANK;\r
+ }\r
+\r
+ public String getReturnType(JavaMethod method) {\r
+ Type returnType = method.getReturns();\r
+\r
+ return getTypeGenericsName(returnType);\r
+ }\r
+\r
+ public List<String> getServiceBaseExceptions(\r
+ List<JavaMethod> methods, String methodName, List<String> args,\r
+ List<String> exceptions) {\r
+\r
+ boolean foundMethod = false;\r
+\r
+ for (JavaMethod method : methods) {\r
+ JavaParameter[] parameters = method.getParameters();\r
+\r
+ if (method.getName().equals(methodName) &&\r
+ (parameters.length == args.size())) {\r
+\r
+ for (int i = 0; i < parameters.length; i++) {\r
+ JavaParameter parameter = parameters[i];\r
+\r
+ String arg = args.get(i);\r
+\r
+ if (getParameterType(parameter).equals(arg)) {\r
+ exceptions = ListUtil.copy(exceptions);\r
+\r
+ Type[] methodExceptions = method.getExceptions();\r
+\r
+ for (Type methodException : methodExceptions) {\r
+ String exception = methodException.getValue();\r
+\r
+ if (exception.equals(\r
+ PortalException.class.getName())) {\r
+\r
+ exception = "PortalException";\r
+ }\r
+\r
+ if (exception.equals(\r
+ SystemException.class.getName())) {\r
+\r
+ exception = "SystemException";\r
+ }\r
+\r
+ if (!exceptions.contains(exception)) {\r
+ exceptions.add(exception);\r
+ }\r
+ }\r
+\r
+ Collections.sort(exceptions);\r
+\r
+ foundMethod = true;\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (foundMethod) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!exceptions.isEmpty()) {\r
+ return exceptions;\r
+ }\r
+ else {\r
+ return Collections.emptyList();\r
+ }\r
+ }\r
+\r
+ public String getSqlType(String type) {\r
+ if (type.equals("boolean") || type.equals("Boolean")) {\r
+ return "BOOLEAN";\r
+ }\r
+ else if (type.equals("double") || type.equals("Double")) {\r
+ return "DOUBLE";\r
+ }\r
+ else if (type.equals("float") || type.equals("Float")) {\r
+ return "FLOAT";\r
+ }\r
+ else if (type.equals("int") || type.equals("Integer")) {\r
+ return "INTEGER";\r
+ }\r
+ else if (type.equals("long") || type.equals("Long")) {\r
+ return "BIGINT";\r
+ }\r
+ else if (type.equals("short") || type.equals("Short")) {\r
+ return "INTEGER";\r
+ }\r
+ else if (type.equals("Date")) {\r
+ return "TIMESTAMP";\r
+ }\r
+ else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public String getSqlType(String model, String field, String type) {\r
+ if (type.equals("boolean") || type.equals("Boolean")) {\r
+ return "BOOLEAN";\r
+ }\r
+ else if (type.equals("double") || type.equals("Double")) {\r
+ return "DOUBLE";\r
+ }\r
+ else if (type.equals("float") || type.equals("Float")) {\r
+ return "FLOAT";\r
+ }\r
+ else if (type.equals("int") || type.equals("Integer")) {\r
+ return "INTEGER";\r
+ }\r
+ else if (type.equals("long") || type.equals("Long")) {\r
+ return "BIGINT";\r
+ }\r
+ else if (type.equals("short") || type.equals("Short")) {\r
+ return "INTEGER";\r
+ }\r
+ else if (type.equals("Blob")) {\r
+ return "BLOB";\r
+ }\r
+ else if (type.equals("Date")) {\r
+ return "TIMESTAMP";\r
+ }\r
+ else if (type.equals("String")) {\r
+ Map<String, String> hints = ModelHintsUtil.getHints(model, field);\r
+\r
+ if (hints != null) {\r
+ int maxLength = GetterUtil.getInteger(hints.get("max-length"));\r
+\r
+ if (maxLength == 2000000) {\r
+ return "CLOB";\r
+ }\r
+ }\r
+\r
+ return "VARCHAR";\r
+ }\r
+ else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public String getTypeGenericsName(Type type) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append(type.getValue());\r
+\r
+ Type[] actualTypeArguments = type.getActualTypeArguments();\r
+\r
+ if (actualTypeArguments != null) {\r
+ sb.append(StringPool.LESS_THAN);\r
+\r
+ for (int i = 0; i < actualTypeArguments.length; i++) {\r
+ if (i > 0) {\r
+ sb.append(", ");\r
+ }\r
+\r
+ sb.append(getTypeGenericsName(actualTypeArguments[i]));\r
+ }\r
+\r
+ sb.append(StringPool.GREATER_THAN);\r
+ }\r
+\r
+ sb.append(getDimensions(type.getDimensions()));\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ public String getVariableName(JavaField field) {\r
+ String fieldName = field.getName();\r
+\r
+ if ((fieldName.length() > 0) && (fieldName.charAt(0) == '_')) {\r
+ fieldName = fieldName.substring(1);\r
+ }\r
+\r
+ return fieldName;\r
+ }\r
+\r
+ public boolean hasEntityByGenericsName(String genericsName) {\r
+ if (Validator.isNull(genericsName)) {\r
+ return false;\r
+ }\r
+\r
+ if (genericsName.indexOf(".model.") == -1) {\r
+ return false;\r
+ }\r
+\r
+ if (getEntityByGenericsName(genericsName) == null) {\r
+ return false;\r
+ }\r
+ else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public boolean hasEntityByParameterTypeValue(String parameterTypeValue) {\r
+ if (Validator.isNull(parameterTypeValue)) {\r
+ return false;\r
+ }\r
+\r
+ if (parameterTypeValue.indexOf(".model.") == -1) {\r
+ return false;\r
+ }\r
+\r
+ if (getEntityByParameterTypeValue(parameterTypeValue) == null) {\r
+ return false;\r
+ }\r
+ else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public boolean isBasePersistenceMethod(JavaMethod method) {\r
+ String methodName = method.getName();\r
+\r
+ if (methodName.equals("clearCache") ||\r
+ methodName.equals("findWithDynamicQuery")) {\r
+\r
+ return true;\r
+ }\r
+ else if (methodName.equals("findByPrimaryKey") ||\r
+ methodName.equals("fetchByPrimaryKey") ||\r
+ methodName.equals("remove")) {\r
+\r
+ JavaParameter[] parameters = method.getParameters();\r
+\r
+ if ((parameters.length == 1) &&\r
+ parameters[0].getName().equals("primaryKey")) {\r
+\r
+ return true;\r
+ }\r
+\r
+ if (methodName.equals("remove")) {\r
+ Type[] methodExceptions = method.getExceptions();\r
+\r
+ for (Type methodException : methodExceptions) {\r
+ String exception = methodException.getValue();\r
+\r
+ if (exception.contains("NoSuch")) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public boolean isCustomMethod(JavaMethod method) {\r
+ String methodName = method.getName();\r
+\r
+ if (methodName.equals("afterPropertiesSet") ||\r
+ methodName.equals("destroy") ||\r
+ methodName.equals("equals") ||\r
+ methodName.equals("getClass") ||\r
+ methodName.equals("hashCode") ||\r
+ methodName.equals("notify") ||\r
+ methodName.equals("notifyAll") ||\r
+ methodName.equals("toString") ||\r
+ methodName.equals("wait")) {\r
+\r
+ return false;\r
+ }\r
+ else if (methodName.equals("getPermissionChecker")) {\r
+ return false;\r
+ }\r
+ else if (methodName.equals("getUser") &&\r
+ (method.getParameters().length == 0)) {\r
+\r
+ return false;\r
+ }\r
+ else if (methodName.equals("getUserId") &&\r
+ (method.getParameters().length == 0)) {\r
+\r
+ return false;\r
+ }\r
+ else if (methodName.endsWith("Finder") &&\r
+ (methodName.startsWith("get") ||\r
+ methodName.startsWith("set"))) {\r
+\r
+ return false;\r
+ }\r
+ else if (methodName.endsWith("Persistence") &&\r
+ (methodName.startsWith("get") ||\r
+ methodName.startsWith("set"))) {\r
+\r
+ return false;\r
+ }\r
+ else if (methodName.endsWith("Service") &&\r
+ (methodName.startsWith("get") ||\r
+ methodName.startsWith("set"))) {\r
+\r
+ return false;\r
+ }\r
+ else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public boolean isDuplicateMethod(\r
+ JavaMethod method, Map<String, Object> tempMap) {\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append("isDuplicateMethod ");\r
+ sb.append(getTypeGenericsName(method.getReturns()));\r
+ sb.append(StringPool.SPACE);\r
+ sb.append(method.getName());\r
+ sb.append(StringPool.OPEN_PARENTHESIS);\r
+\r
+ JavaParameter[] parameters = method.getParameters();\r
+\r
+ for (int i = 0; i < parameters.length; i++) {\r
+ JavaParameter javaParameter = parameters[i];\r
+\r
+ sb.append(getTypeGenericsName(javaParameter.getType()));\r
+\r
+ if ((i + 1) != parameters.length) {\r
+ sb.append(StringPool.COMMA);\r
+ }\r
+ }\r
+\r
+ sb.append(StringPool.CLOSE_PARENTHESIS);\r
+\r
+ String key = sb.toString();\r
+\r
+ if (tempMap.put(key, key) != null) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public boolean isHBMCamelCasePropertyAccessor(String propertyName) {\r
+ if (propertyName.length() < 3) {\r
+ return false;\r
+ }\r
+\r
+ char[] chars = propertyName.toCharArray();\r
+\r
+ char c0 = chars[0];\r
+ char c1 = chars[1];\r
+ char c2 = chars[2];\r
+\r
+ if (Character.isLowerCase(c0) && Character.isUpperCase(c1) &&\r
+ Character.isLowerCase(c2)) {\r
+\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public boolean isReadOnlyMethod(\r
+ JavaMethod method, List<String> txRequiredList, String[] prefixes) {\r
+\r
+ String methodName = method.getName();\r
+\r
+ if (isTxRequiredMethod(method, txRequiredList)) {\r
+ return false;\r
+ }\r
+\r
+ for (String prefix : prefixes) {\r
+ if (methodName.startsWith(prefix)) {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public boolean isServiceReadOnlyMethod(\r
+ JavaMethod method, List<String> txRequiredList) {\r
+\r
+ return isReadOnlyMethod(\r
+ method, txRequiredList,\r
+ PropsValues.SERVICE_BUILDER_SERVICE_READ_ONLY_PREFIXES);\r
+ }\r
+\r
+ public boolean isSoapMethod(JavaMethod method) {\r
+ Type returnType = method.getReturns();\r
+\r
+ String returnTypeGenericsName = getTypeGenericsName(returnType);\r
+ String returnValueName = returnType.getValue();\r
+\r
+ if (returnTypeGenericsName.contains(\r
+ "com.liferay.portal.kernel.search.") ||\r
+ returnTypeGenericsName.contains("com.liferay.portal.model.Theme") ||\r
+ returnTypeGenericsName.contains(\r
+ "com.liferay.portlet.social.model.SocialActivityDefinition") ||\r
+ returnTypeGenericsName.equals("java.util.List<java.lang.Object>") ||\r
+ returnValueName.equals("com.liferay.portal.model.Lock") ||\r
+ returnValueName.equals(\r
+ "com.liferay.portlet.messageboards.model.MBMessageDisplay") ||\r
+ returnValueName.startsWith("java.io") ||\r
+ returnValueName.equals("java.util.Map") ||\r
+ returnValueName.equals("java.util.Properties") ||\r
+ returnValueName.startsWith("javax")) {\r
+\r
+ return false;\r
+ }\r
+\r
+ if (returnTypeGenericsName.contains(\r
+ "com.liferay.portal.kernel.repository.model.FileEntry") ||\r
+ returnTypeGenericsName.contains(\r
+ "com.liferay.portal.kernel.repository.model.Folder")) {\r
+ }\r
+ else if (returnTypeGenericsName.contains(\r
+ "com.liferay.portal.kernel.repository.")) {\r
+\r
+ return false;\r
+ }\r
+\r
+ JavaParameter[] parameters = method.getParameters();\r
+\r
+ for (JavaParameter javaParameter : parameters) {\r
+ Type type = javaParameter.getType();\r
+\r
+ String parameterTypeName = type.getValue() + _getDimensions(type);\r
+\r
+ if (parameterTypeName.equals(\r
+ "com.liferay.portal.kernel.util.UnicodeProperties") ||\r
+ parameterTypeName.equals(\r
+ "com.liferay.portal.theme.ThemeDisplay") ||\r
+ parameterTypeName.equals(\r
+ "com.liferay.portlet.PortletPreferencesImpl") ||\r
+ parameterTypeName.equals(\r
+ "com.liferay.portlet.dynamicdatamapping.storage.Fields") ||\r
+ parameterTypeName.startsWith("java.io") ||\r
+ //parameterTypeName.startsWith("java.util.List") ||\r
+ //parameterTypeName.startsWith("java.util.Locale") ||\r
+ (parameterTypeName.startsWith("java.util.Map") &&\r
+ !_isStringLocaleMap(javaParameter)) ||\r
+ parameterTypeName.startsWith("java.util.Properties") ||\r
+ parameterTypeName.startsWith("javax")) {\r
+\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ public boolean isTxRequiredMethod(\r
+ JavaMethod method, List<String> txRequiredList) {\r
+\r
+ if (txRequiredList == null) {\r
+ return false;\r
+ }\r
+\r
+ String methodName = method.getName();\r
+\r
+ for (String txRequired : txRequiredList) {\r
+ if (methodName.equals(txRequired)) {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private static String _getPackagePath(File file) {\r
+ String fileName = StringUtil.replace(file.toString(), "\\", "/");\r
+\r
+ int x = fileName.indexOf("src/");\r
+\r
+ if (x == -1) {\r
+ x = fileName.indexOf("test/");\r
+ }\r
+\r
+ int y = fileName.lastIndexOf("/");\r
+\r
+ fileName = fileName.substring(x + 4, y);\r
+\r
+ return StringUtil.replace(fileName, "/", ".");\r
+ }\r
+\r
+ private void _addElements(Element element, Map<String, Element> elements) {\r
+ for (Map.Entry<String, Element> entry : elements.entrySet()) {\r
+ Element childElement = entry.getValue();\r
+\r
+ element.add(childElement);\r
+ }\r
+ }\r
+\r
+ private void _createBlobModels(Entity entity) throws Exception {\r
+ List<EntityColumn> blobList = new ArrayList<EntityColumn>(\r
+ entity.getBlobList());\r
+\r
+ Iterator<EntityColumn> itr = blobList.iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ EntityColumn col = itr.next();\r
+\r
+ if (!col.isLazy()) {\r
+ itr.remove();\r
+ }\r
+ }\r
+\r
+ if (blobList.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ for (EntityColumn col : blobList) {\r
+ context.put("column", col);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplBlobModel, context);\r
+\r
+ // Write file\r
+\r
+ File blobModelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() +\r
+ col.getMethodName() + "BlobModel.java");\r
+\r
+ writeFile(blobModelFile, content, _author);\r
+ }\r
+ }\r
+\r
+ private void _createEJBPK(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplEjbPk, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/persistence/" +\r
+ entity.getPKClassName() + ".java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createExceptions(List<String> exceptions) throws Exception {\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (!_isTargetEntity(entity)) {\r
+ continue;\r
+ }\r
+\r
+ if (entity.hasColumns()) {\r
+ exceptions.add(getNoSuchEntityException(entity));\r
+ }\r
+ }\r
+\r
+ for (String exception : exceptions) {\r
+ File exceptionFile = new File(\r
+ _serviceOutputPath + "/" + exception + "Exception.java");\r
+\r
+ if (!exceptionFile.exists()) {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("exception", exception);\r
+\r
+ String content = _processTemplate(_tplException, context);\r
+\r
+ if (exception.startsWith("NoSuch")) {\r
+ content = StringUtil.replace(\r
+ content, "PortalException", "NoSuchModelException");\r
+ content = StringUtil.replace(\r
+ content, "kernel.exception.NoSuchModelException",\r
+ "NoSuchModelException");\r
+ }\r
+\r
+ content = StringUtil.replace(content, "\r\n", "\n");\r
+\r
+ FileUtil.write(exceptionFile, content);\r
+ }\r
+\r
+ if (exception.startsWith("NoSuch")) {\r
+ String content = FileUtil.read(exceptionFile);\r
+\r
+ if (!content.contains("NoSuchModelException")) {\r
+ content = StringUtil.replace(\r
+ content, "PortalException", "NoSuchModelException");\r
+ content = StringUtil.replace(\r
+ content, "kernel.exception.NoSuchModelException",\r
+ "NoSuchModelException");\r
+\r
+ FileUtil.write(exceptionFile, content);\r
+ }\r
+ }\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ exceptionFile = new File(\r
+ _outputPath + "/" + exception + "Exception.java");\r
+\r
+ if (exceptionFile.exists()) {\r
+ System.out.println("Relocating " + exceptionFile);\r
+\r
+ exceptionFile.delete();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createExtendedModel(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplExtendedModel, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() + ".java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ modelFile = new File(\r
+ _outputPath + "/model/" + entity.getName() + ".java");\r
+\r
+ if (modelFile.exists()) {\r
+ System.out.println("Relocating " + modelFile);\r
+\r
+ modelFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createExtendedModelBaseImpl(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplExtendedModelBaseImpl, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() + "BaseImpl.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createExtendedModelImpl(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplExtendedModelImpl, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+\r
+ if (modelFile.exists()) {\r
+ content = FileUtil.read(modelFile);\r
+\r
+ content = content.replaceAll(\r
+ "extends\\s+" + entity.getName() +\r
+ "ModelImpl\\s+implements\\s+" + entity.getName(),\r
+ "extends " + entity.getName() + "BaseImpl");\r
+\r
+ writeFileRaw(modelFile, content);\r
+ }\r
+ else {\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+ }\r
+\r
+ private void _createFinder(Entity entity) throws Exception {\r
+ if (!entity.hasFinderClass()) {\r
+ return;\r
+ }\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "FinderImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplFinder, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/persistence/" + entity.getName() +\r
+ "Finder.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "Finder.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createFinderUtil(Entity entity) throws Exception {\r
+ if (!entity.hasFinderClass()) {\r
+ return;\r
+ }\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "FinderImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplFinderUtil, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/persistence/" + entity.getName() +\r
+ "FinderUtil.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "FinderUtil.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createHbm(Entity entity) {\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "HBM.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+\r
+ private void _createHbmUtil(Entity entity) {\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "HBMUtil.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+\r
+ private void _createHbmXml() throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplHbmXml, context);\r
+\r
+ int lastImportStart = content.lastIndexOf("<import class=");\r
+ int lastImportEnd = content.indexOf("/>", lastImportStart) + 3;\r
+\r
+ String imports = content.substring(0, lastImportEnd);\r
+\r
+ content = content.substring(lastImportEnd + 1);\r
+\r
+ File xmlFile = new File(_hbmFileName);\r
+\r
+ if (!xmlFile.exists()) {\r
+ String xml =\r
+ "<?xml version=\"1.0\"?>\n" +\r
+ "<!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\" \"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\">\n" +\r
+ "\n" +\r
+ "<hibernate-mapping default-lazy=\"false\" auto-import=\"false\">\n" +\r
+ "</hibernate-mapping>";\r
+\r
+ FileUtil.write(xmlFile, xml);\r
+ }\r
+\r
+ String oldContent = FileUtil.read(xmlFile);\r
+ String newContent = _fixHbmXml(oldContent);\r
+\r
+ int firstImport = newContent.indexOf(\r
+ "<import class=\"" + _packagePath + ".model.");\r
+ int lastImport = newContent.lastIndexOf(\r
+ "<import class=\"" + _packagePath + ".model.");\r
+\r
+ if (firstImport == -1) {\r
+ int x = newContent.indexOf("<class");\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ newContent.substring(0, x) + imports +\r
+ newContent.substring(x);\r
+ }\r
+ else {\r
+ content = imports + content;\r
+ }\r
+ }\r
+ else {\r
+ firstImport = newContent.indexOf("<import", firstImport) - 1;\r
+ lastImport = newContent.indexOf("/>", lastImport) + 3;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstImport) + imports +\r
+ newContent.substring(lastImport);\r
+ }\r
+\r
+ int firstClass = newContent.indexOf(\r
+ "<class name=\"" + _packagePath + ".model.impl.");\r
+ int lastClass = newContent.lastIndexOf(\r
+ "<class name=\"" + _packagePath + ".model.impl.");\r
+\r
+ if (firstClass == -1) {\r
+ int x = newContent.indexOf("</hibernate-mapping>");\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ newContent.substring(0, x) + content +\r
+ newContent.substring(x);\r
+ }\r
+ }\r
+ else {\r
+ firstClass = newContent.lastIndexOf("<class", firstClass) - 1;\r
+ lastClass = newContent.indexOf("</class>", lastClass) + 9;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstClass) + content +\r
+ newContent.substring(lastClass);\r
+ }\r
+\r
+ newContent = _formatXml(newContent);\r
+\r
+ if (!oldContent.equals(newContent)) {\r
+ FileUtil.write(xmlFile, newContent);\r
+ }\r
+ }\r
+\r
+ private void _createJsonJs() throws Exception {\r
+ if (_packagePath.equals("com.liferay.counter")) {\r
+ return;\r
+ }\r
+\r
+ if (Validator.isNotNull(_pluginName)) {\r
+ boolean hasRemoteService = false;\r
+\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (entity.hasRemoteService()) {\r
+ hasRemoteService = true;\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!hasRemoteService) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ if (_ejbList.size() > 0) {\r
+ sb.append(_processTemplate(_tplJsonJs));\r
+ }\r
+\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (entity.hasRemoteService()) {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ "Service.java");\r
+\r
+ JavaMethod[] methods = _getMethods(javaClass);\r
+\r
+ Set<String> jsonMethods = new LinkedHashSet<String>();\r
+\r
+ for (JavaMethod method : methods) {\r
+ String methodName = method.getName();\r
+\r
+ if (methodName.equals("getBeanIdentifier") ||\r
+ methodName.equals("invokeMethod") ||\r
+ methodName.equals("setBeanIdentifier")) {\r
+\r
+ continue;\r
+ }\r
+\r
+ String returnValue = getReturnType(method);\r
+\r
+ boolean badJsonType = false;\r
+\r
+ for (JavaParameter parameter : method.getParameters()) {\r
+ String parameterType = getParameterType(parameter);\r
+\r
+ if (_badJsonTypes.contains(parameterType)) {\r
+ badJsonType = true;\r
+ }\r
+ }\r
+\r
+ if (method.isPublic() &&\r
+ !_badJsonTypes.contains(returnValue) && !badJsonType) {\r
+\r
+ jsonMethods.add(methodName);\r
+ }\r
+ }\r
+\r
+ if (jsonMethods.size() > 0) {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", jsonMethods);\r
+\r
+ sb.append("\n\n");\r
+ sb.append(_processTemplate(_tplJsonJsMethod, context));\r
+ }\r
+ }\r
+ }\r
+\r
+ File jsonFile = new File(_jsonFileName);\r
+\r
+ if (!jsonFile.exists()) {\r
+ FileUtil.write(jsonFile, "");\r
+ }\r
+\r
+ String oldContent = FileUtil.read(jsonFile);\r
+ String newContent = oldContent;\r
+\r
+ int oldBegin = oldContent.indexOf(\r
+ "Liferay.Service.register(\"Liferay.Service." + _portletShortName);\r
+\r
+ int oldEnd = oldContent.lastIndexOf(\r
+ "Liferay.Service." + _portletShortName);\r
+\r
+ oldEnd = oldContent.indexOf(");", oldEnd);\r
+\r
+ int newBegin = newContent.indexOf(\r
+ "Liferay.Service.register(\"Liferay.Service." + _portletShortName);\r
+\r
+ int newEnd = newContent.lastIndexOf(\r
+ "Liferay.Service." + _portletShortName);\r
+\r
+ newEnd = newContent.indexOf(");", newEnd);\r
+\r
+ if (newBegin == -1) {\r
+ newContent = oldContent + "\n\n" + sb.toString().trim();\r
+ }\r
+ else {\r
+ newContent =\r
+ newContent.substring(0, oldBegin) + sb.toString().trim() +\r
+ newContent.substring(oldEnd + 2);\r
+ }\r
+\r
+ newContent = newContent.trim();\r
+\r
+ if (!oldContent.equals(newContent)) {\r
+ FileUtil.write(jsonFile, newContent);\r
+ }\r
+ }\r
+\r
+ private void _createModel(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModel, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() + "Model.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ modelFile = new File(\r
+ _outputPath + "/model/" + entity.getName() + "Model.java");\r
+\r
+ if (modelFile.exists()) {\r
+ System.out.println("Relocating " + modelFile);\r
+\r
+ modelFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createModelCache(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("cacheFields", _getCacheFields(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelCache, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() +\r
+ "CacheModel.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createModelClp(Entity entity) throws Exception {\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+\r
+ Map<String, JavaMethod> methods = new HashMap<String, JavaMethod>();\r
+\r
+ for (JavaMethod method : javaClass.getMethods()) {\r
+ methods.put(method.getDeclarationSignature(false), method);\r
+ }\r
+\r
+ Type superClass = javaClass.getSuperClass();\r
+\r
+ String superClassValue = superClass.getValue();\r
+\r
+ while (!superClassValue.endsWith("BaseModelImpl")) {\r
+ int pos = superClassValue.lastIndexOf(StringPool.PERIOD);\r
+\r
+ if (pos > 0) {\r
+ superClassValue = superClassValue.substring(pos + 1);\r
+ }\r
+\r
+ javaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + superClassValue + ".java");\r
+\r
+ for (JavaMethod method : _getMethods(javaClass)) {\r
+ methods.remove(method.getDeclarationSignature(false));\r
+ }\r
+\r
+ superClass = javaClass.getSuperClass();\r
+ superClassValue = superClass.getValue();\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", methods.values());\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelClp, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() + "Clp.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createModelHintsXml() throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelHintsXml, context);\r
+\r
+ File xmlFile = new File(_modelHintsFileName);\r
+\r
+ if (!xmlFile.exists()) {\r
+ String xml =\r
+ "<?xml version=\"1.0\"?>\n" +\r
+ "\n" +\r
+ "<model-hints>\n" +\r
+ "</model-hints>";\r
+\r
+ FileUtil.write(xmlFile, xml);\r
+ }\r
+\r
+ String oldContent = FileUtil.read(xmlFile);\r
+ String newContent = oldContent;\r
+\r
+ int firstModel = newContent.indexOf(\r
+ "<model name=\"" + _packagePath + ".model.");\r
+ int lastModel = newContent.lastIndexOf(\r
+ "<model name=\"" + _packagePath + ".model.");\r
+\r
+ if (firstModel == -1) {\r
+ int x = newContent.indexOf("</model-hints>");\r
+\r
+ newContent =\r
+ newContent.substring(0, x) + content +\r
+ newContent.substring(x);\r
+ }\r
+ else {\r
+ firstModel = newContent.lastIndexOf("<model", firstModel) - 1;\r
+ lastModel = newContent.indexOf("</model>", lastModel) + 9;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstModel) + content +\r
+ newContent.substring(lastModel);\r
+ }\r
+\r
+ newContent = _formatXml(newContent);\r
+\r
+ if (!oldContent.equals(newContent)) {\r
+ FileUtil.write(xmlFile, newContent);\r
+ }\r
+ }\r
+\r
+ private void _createModelImpl(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("cacheFields", _getCacheFields(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelImpl, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() + "ModelImpl.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createModelSoap(Entity entity) throws Exception {\r
+ File modelFile = null;\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ modelFile = new File(\r
+ _outputPath + "/model/" + entity.getName() + "Soap.java");\r
+\r
+ if (modelFile.exists()) {\r
+ System.out.println("Relocating " + modelFile);\r
+\r
+ modelFile.delete();\r
+ }\r
+ }\r
+\r
+ modelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() + "Soap.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelSoap, context);\r
+\r
+ // Write file\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createModelWrapper(Entity entity) throws Exception {\r
+ JavaClass modelJavaClass = _getJavaClass(\r
+ _serviceOutputPath + "/model/" + entity.getName() + "Model.java");\r
+\r
+ Object[] methods = _getMethods(modelJavaClass);\r
+\r
+ JavaClass extendedModelBaseImplJavaClass = _getJavaClass(\r
+ _outputPath + "/model/impl/" + entity.getName() + "BaseImpl.java");\r
+\r
+ methods = ArrayUtil.append(\r
+ methods, _getMethods(extendedModelBaseImplJavaClass));\r
+\r
+ JavaClass extendedModelJavaClass = _getJavaClass(\r
+ _serviceOutputPath + "/model/" + entity.getName() + ".java");\r
+\r
+ methods = ArrayUtil.append(\r
+ methods, _getMethods(extendedModelJavaClass));\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", methods);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplModelWrapper, context);\r
+\r
+ // Write file\r
+\r
+ File modelFile = new File(\r
+ _serviceOutputPath + "/model/" + entity.getName() + "Wrapper.java");\r
+\r
+ writeFile(modelFile, content, _author);\r
+ }\r
+\r
+ private void _createOrmXml() throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplOrmXml, context);\r
+\r
+ String mappedClasses = "";\r
+\r
+ int lastMappedClassStart = content.lastIndexOf("<mapped-superclass");\r
+\r
+ if (lastMappedClassStart != -1) {\r
+ int lastMappedClassEnd = content.indexOf(\r
+ "</mapped-superclass>", lastMappedClassStart) + 20;\r
+\r
+ mappedClasses = content.substring(0, lastMappedClassEnd);\r
+\r
+ content = content.substring(lastMappedClassEnd + 1);\r
+ }\r
+\r
+ File xmlFile = new File(_ormFileName);\r
+\r
+ if (!xmlFile.exists()) {\r
+ String xml =\r
+ "<?xml version=\"1.0\"?>\n" +\r
+ "<entity-mappings version=\"1.0\" xmlns=\"http://java.sun.com/xml/ns/persistence/orm\"\n" +\r
+ "\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +\r
+ "\txsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd\"\n" +\r
+ ">\n" +\r
+ "<persistence-unit-metadata>\n" +\r
+ "\t<xml-mapping-metadata-complete />\n" +\r
+ "\t<persistence-unit-defaults>\n" +\r
+ "\t\t<access>PROPERTY</access>\n" +\r
+ "\t</persistence-unit-defaults>\n" +\r
+ "</persistence-unit-metadata>\n" +\r
+ "</entity-mappings>";\r
+\r
+ FileUtil.write(xmlFile, xml);\r
+ }\r
+\r
+ String oldContent = FileUtil.read(xmlFile);\r
+ String newContent = oldContent;\r
+\r
+ int firstMappedClass = newContent.indexOf(\r
+ "<mapped-superclass class=\"" + _packagePath + ".model.");\r
+ int lastMappedClass = newContent.lastIndexOf(\r
+ "<mapped-superclass class=\"" + _packagePath + ".model.");\r
+\r
+ if (firstMappedClass == -1) {\r
+ int x = newContent.indexOf("<entity class=");\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ newContent.substring(0, x) + mappedClasses +\r
+ newContent.substring(x);\r
+ }\r
+ else {\r
+ content = mappedClasses + content;\r
+ }\r
+ }\r
+ else {\r
+ firstMappedClass = newContent.indexOf(\r
+ "<mapped-superclass", firstMappedClass) - 1;\r
+ lastMappedClass = newContent.indexOf(\r
+ "</mapped-superclass>", lastMappedClass) + 20;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstMappedClass) + mappedClasses +\r
+ newContent.substring(lastMappedClass);\r
+ }\r
+\r
+ int firstEntity = newContent.indexOf(\r
+ "<entity class=\"" + _packagePath + ".model.impl.");\r
+ int lastEntity = newContent.lastIndexOf(\r
+ "<entity class=\"" + _packagePath + ".model.impl.");\r
+\r
+ if (firstEntity == -1) {\r
+ int x = newContent.indexOf("</entity-mappings>");\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ newContent.substring(0, x) + content +\r
+ newContent.substring(x);\r
+ }\r
+ }\r
+ else {\r
+ firstEntity = newContent.lastIndexOf("<entity", firstEntity) - 1;\r
+ lastEntity = newContent.indexOf("</entity>", lastEntity) + 9;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstEntity) + content +\r
+ newContent.substring(lastEntity);\r
+ }\r
+\r
+ newContent = _formatXml(newContent);\r
+\r
+ newContent = StringUtil.replace(\r
+ newContent,\r
+ new String[] {"<attributes></attributes>", "<attributes/>"},\r
+ new String[] {"<attributes />", "<attributes />"});\r
+\r
+ if (!oldContent.equals(newContent)) {\r
+ FileUtil.write(xmlFile, newContent);\r
+ }\r
+ }\r
+\r
+ private void _createPersistence(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "PersistenceImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplPersistence, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/persistence/" + entity.getName() +\r
+ "Persistence.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "Persistence.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createPersistenceImpl(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put(\r
+ "referenceList", _mergeReferenceList(entity.getReferenceList()));\r
+\r
+ // Content\r
+\r
+ Logger.selectLoggerLibrary(Logger.LIBRARY_NONE);\r
+\r
+ String content = _processTemplate(_tplPersistenceImpl, context);\r
+\r
+ Logger.selectLoggerLibrary(Logger.LIBRARY_AUTO);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "PersistenceImpl.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createPersistenceTest(Entity entity) throws Exception {\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplPersistenceTest, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _testOutputPath + "/service/persistence/" + entity.getName() +\r
+ "PersistenceTest.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createPersistenceUtil(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "PersistenceImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplPersistenceUtil, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/persistence/" + entity.getName() +\r
+ "Util.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "Util.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createPool(Entity entity) {\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/persistence/" + entity.getName() +\r
+ "Pool.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+\r
+ private void _createProps() throws Exception {\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ File propsFile = new File(_implDir + "/service.properties");\r
+\r
+ long buildNumber = 1;\r
+ long buildDate = System.currentTimeMillis();\r
+\r
+ if (propsFile.exists()) {\r
+ Properties properties = PropertiesUtil.load(\r
+ FileUtil.read(propsFile));\r
+ \r
+ if (!_buildNumberIncrement) {\r
+ buildDate = GetterUtil.getLong(\r
+ properties.getProperty("build.date"));\r
+ buildNumber = GetterUtil.getLong(\r
+ properties.getProperty("build.number"));\r
+ }\r
+ else {\r
+ buildNumber = GetterUtil.getLong(\r
+ properties.getProperty("build.number")) + 1;\r
+ } \r
+ }\r
+ \r
+ if (!_buildNumberIncrement && (buildNumber < _buildNumber)) {\r
+ buildNumber = _buildNumber;\r
+ buildDate = System.currentTimeMillis();\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("buildNumber", buildNumber);\r
+ context.put("currentTimeMillis", buildDate);\r
+ \r
+ String content = _processTemplate(_tplProps, context);\r
+\r
+ // Write file\r
+\r
+ FileUtil.write(propsFile, content, true);\r
+ \r
+ // Add service-portlet.properties properties in service.properties\r
+ \r
+ if(FileUtil.exists(_implDir + "/service-portlet.properties")){\r
+ String portletProps = FileUtil.read(_implDir + "/service-portlet.properties");\r
+ FileUtil.write(propsFile, portletProps, true, true);\r
+ }\r
+ }\r
+\r
+ private void _createRemotingXml() throws Exception {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ Document document = SAXReaderUtil.read(new File(_springFileName));\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ List<Element> beanElements = rootElement.elements("bean");\r
+\r
+ for (Element beanElement : beanElements) {\r
+ String beanId = beanElement.attributeValue("id");\r
+\r
+ if (beanId.endsWith("Service") &&\r
+ !beanId.endsWith("LocalService")) {\r
+\r
+ String entityName = beanId;\r
+\r
+ entityName = StringUtil.replaceLast(\r
+ entityName, ".service.", ".");\r
+\r
+ int pos = entityName.lastIndexOf("Service");\r
+\r
+ entityName = entityName.substring(0, pos);\r
+\r
+ Entity entity = getEntity(entityName);\r
+\r
+ String serviceName = beanId;\r
+\r
+ String serviceMapping = serviceName;\r
+\r
+ serviceMapping = StringUtil.replaceLast(\r
+ serviceMapping, ".service.", ".service.spring.");\r
+ serviceMapping = StringUtil.replace(\r
+ serviceMapping, StringPool.PERIOD, StringPool.UNDERLINE);\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("serviceName", serviceName);\r
+ context.put("serviceMapping", serviceMapping);\r
+\r
+ sb.append(_processTemplate(_tplRemotingXml, context));\r
+ }\r
+ }\r
+\r
+ File outputFile = new File(_remotingFileName);\r
+\r
+ if (!outputFile.exists()) {\r
+ return;\r
+ }\r
+\r
+ String content = FileUtil.read(outputFile);\r
+ String newContent = content;\r
+\r
+ int x = content.indexOf("<bean ");\r
+ int y = content.lastIndexOf("</bean>") + 8;\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ content.substring(0, x - 1) + sb.toString() +\r
+ content.substring(y);\r
+ }\r
+ else {\r
+ x = content.indexOf("</beans>");\r
+\r
+ if (x != -1) {\r
+ newContent =\r
+ content.substring(0, x) + sb.toString() +\r
+ content.substring(x);\r
+ }\r
+ else {\r
+ x = content.indexOf("<beans/>");\r
+ y = x + 8;\r
+\r
+ newContent =\r
+ content.substring(0, x) + "<beans>" + sb.toString() +\r
+ "</beans>" + content.substring(y);\r
+ }\r
+ }\r
+\r
+ newContent = _formatXml(newContent);\r
+\r
+ if (!content.equals(newContent)) {\r
+ FileUtil.write(outputFile, newContent);\r
+\r
+ System.out.println(outputFile.toString());\r
+ }\r
+ }\r
+\r
+ private void _createService(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceImpl.java");\r
+\r
+ JavaMethod[] methods = _getMethods(javaClass);\r
+\r
+ Type superClass = javaClass.getSuperClass();\r
+\r
+ String superClassValue = superClass.getValue();\r
+\r
+ if (superClassValue.endsWith(\r
+ entity.getName() + _getSessionTypeName(sessionType) +\r
+ "ServiceBaseImpl")) {\r
+\r
+ JavaClass parentJavaClass = _getJavaClass(\r
+ _outputPath + "/service/base/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceBaseImpl.java");\r
+\r
+ methods = ArrayUtil.append(\r
+ parentJavaClass.getMethods(), methods);\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", methods);\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplService, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "Service.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "Service.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createServiceBaseImpl(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ (sessionType != _SESSION_TYPE_REMOTE ? "Local" : "") +\r
+ "ServiceImpl.java");\r
+\r
+ JavaMethod[] methods = _getMethods(javaClass);\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", methods);\r
+ context.put("sessionTypeName",_getSessionTypeName(sessionType));\r
+ context.put(\r
+ "referenceList", _mergeReferenceList(entity.getReferenceList()));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceBaseImpl, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/base/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceBaseImpl.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createServiceClp(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "Service.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceClp, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceClp.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createServiceClpInvoker(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceImpl.java");\r
+\r
+ JavaMethod[] methods = _getMethods(javaClass);\r
+\r
+ Type superClass = javaClass.getSuperClass();\r
+\r
+ String superClassValue = superClass.getValue();\r
+\r
+ if (superClassValue.endsWith(\r
+ entity.getName() + _getSessionTypeName(sessionType) +\r
+ "ServiceBaseImpl")) {\r
+\r
+ JavaClass parentJavaClass = _getJavaClass(\r
+ _outputPath + "/service/base/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceBaseImpl.java");\r
+\r
+ methods = ArrayUtil.append(\r
+ parentJavaClass.getMethods(), methods);\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", methods);\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceClpInvoker, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/base/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceClpInvoker.java");\r
+\r
+ writeFile(ejbFile, content);\r
+ }\r
+\r
+ private void _createServiceClpMessageListener() throws Exception {\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(\r
+ _tplServiceClpMessageListener, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/messaging/ClpMessageListener.java");\r
+\r
+ writeFile(ejbFile, content);\r
+ }\r
+\r
+ private void _createServiceClpSerializer(List<String> exceptions)\r
+ throws Exception {\r
+\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+ context.put("exceptions", exceptions);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceClpSerializer, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/ClpSerializer.java");\r
+\r
+ writeFile(ejbFile, content);\r
+ }\r
+\r
+ private void _createServiceFactory(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceFactory.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+\r
+ ejbFile = new File(\r
+ _outputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceFactory.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+\r
+ private void _createServiceHttp(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ "ServiceImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+ context.put("hasHttpMethods", new Boolean(_hasHttpMethods(javaClass)));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceHttp, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/http/" + entity.getName() +\r
+ "ServiceHttp.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createServiceImpl(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceImpl, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceImpl.java");\r
+\r
+ if (!ejbFile.exists()) {\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+ }\r
+\r
+ private void _createServiceJson(Entity entity) throws Exception {\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/http/" + entity.getName() +\r
+ "ServiceJSON.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+\r
+ private void _createServiceJsonSerializer(Entity entity) throws Exception {\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/http/" + entity.getName() +\r
+ "JSONSerializer.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/http/" + entity.getName() +\r
+ "JSONSerializer.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Removing deprecated " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createServiceSoap(Entity entity) throws Exception {\r
+ JavaClass javaClass = _getJavaClass(\r
+ _outputPath + "/service/impl/" + entity.getName() +\r
+ "ServiceImpl.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceSoap, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/service/http/" + entity.getName() +\r
+ "ServiceSoap.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createServiceUtil(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "Service.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceUtil, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceUtil.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+\r
+ if (!_serviceOutputPath.equals(_outputPath)) {\r
+ ejbFile = new File(\r
+ _outputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceUtil.java");\r
+\r
+ if (ejbFile.exists()) {\r
+ System.out.println("Relocating " + ejbFile);\r
+\r
+ ejbFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void _createServiceWrapper(Entity entity, int sessionType)\r
+ throws Exception {\r
+\r
+ JavaClass javaClass = _getJavaClass(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "Service.java");\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entity", entity);\r
+ context.put("methods", _getMethods(javaClass));\r
+ context.put("sessionTypeName", _getSessionTypeName(sessionType));\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplServiceWrapper, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _serviceOutputPath + "/service/" + entity.getName() +\r
+ _getSessionTypeName(sessionType) + "ServiceWrapper.java");\r
+\r
+ writeFile(ejbFile, content, _author);\r
+ }\r
+\r
+ private void _createSpringBaseXml() throws Exception {\r
+ if (Validator.isNull(_springBaseFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringBaseXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springBaseFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+\r
+ if (Validator.isNotNull(_pluginName)) {\r
+ FileUtil.delete(\r
+ "docroot/WEB-INF/src/META-INF/data-source-spring.xml");\r
+ FileUtil.delete("docroot/WEB-INF/src/META-INF/misc-spring.xml");\r
+ }\r
+ }\r
+\r
+ private void _createSpringClusterXml() throws Exception {\r
+ if (Validator.isNull(_springClusterFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringClusterXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springClusterFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+ }\r
+\r
+ private void _createSpringDynamicDataSourceXml() throws Exception {\r
+ if (Validator.isNull(_springDynamicDataSourceFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringDynamicDataSourceXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springDynamicDataSourceFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+ }\r
+\r
+ private void _createSpringHibernateXml() throws Exception {\r
+ if (Validator.isNull(_springHibernateFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringHibernateXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springHibernateFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+ }\r
+\r
+ private void _createSpringInfrastructureXml() throws Exception {\r
+ if (Validator.isNull(_springInfrastructureFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringInfrastructureXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springInfrastructureFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+ }\r
+\r
+ private void _createSpringShardDataSourceXml() throws Exception {\r
+ if (Validator.isNull(_springShardDataSourceFileName)) {\r
+ return;\r
+ }\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringShardDataSourceXml);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(_springShardDataSourceFileName);\r
+\r
+ FileUtil.write(ejbFile, content, true);\r
+ }\r
+\r
+ private void _createSpringXml() throws Exception {\r
+ if (_packagePath.equals("com.liferay.counter")) {\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(_tplSpringXml, context);\r
+\r
+ File xmlFile = new File(_springFileName);\r
+\r
+ String xml =\r
+ "<?xml version=\"1.0\"?>\n" +\r
+ "\n" +\r
+ "<beans\n" +\r
+ "\tdefault-destroy-method=\"destroy\"\n" +\r
+ "\tdefault-init-method=\"afterPropertiesSet\"\n" +\r
+ "\txmlns=\"http://www.springframework.org/schema/beans\"\n" +\r
+ "\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +\r
+ "\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\"\n" +\r
+ ">\n" +\r
+ "</beans>";\r
+\r
+ if (!xmlFile.exists()) {\r
+ FileUtil.write(xmlFile, xml);\r
+ }\r
+\r
+ String oldContent = FileUtil.read(xmlFile);\r
+\r
+ if (Validator.isNotNull(_pluginName) &&\r
+ oldContent.contains("DOCTYPE beans PUBLIC")) {\r
+\r
+ oldContent = xml;\r
+ }\r
+\r
+ String newContent = _fixSpringXml(oldContent);\r
+\r
+ int x = oldContent.indexOf("<beans");\r
+ int y = oldContent.lastIndexOf("</beans>");\r
+\r
+ int firstSession = newContent.indexOf(\r
+ "<bean id=\"" + _packagePath + ".service.", x);\r
+\r
+ int lastSession = newContent.lastIndexOf(\r
+ "<bean id=\"" + _packagePath + ".service.", y);\r
+\r
+ if ((firstSession == -1) || (firstSession > y)) {\r
+ x = newContent.indexOf("</beans>");\r
+\r
+ newContent =\r
+ newContent.substring(0, x) + content + newContent.substring(x);\r
+ }\r
+ else {\r
+ firstSession = newContent.lastIndexOf("<bean", firstSession) - 1;\r
+\r
+ int tempLastSession = newContent.indexOf(\r
+ "<bean id=\"", lastSession + 1);\r
+\r
+ if (tempLastSession == -1) {\r
+ tempLastSession = newContent.indexOf("</beans>", lastSession);\r
+ }\r
+\r
+ lastSession = tempLastSession;\r
+\r
+ newContent =\r
+ newContent.substring(0, firstSession) + content +\r
+ newContent.substring(lastSession);\r
+ }\r
+\r
+ newContent = _formatXml(newContent);\r
+\r
+ if (!oldContent.equals(newContent)) {\r
+ FileUtil.write(xmlFile, newContent);\r
+ }\r
+ }\r
+\r
+ private void _createSpringClearService() throws Exception {\r
+ if (Validator.isNull(_pluginName)) {\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> context = _getContext();\r
+\r
+ context.put("entities", _ejbList);\r
+\r
+ // Content\r
+\r
+ String content = _processTemplate(\r
+ _tplSpringClearService, context);\r
+\r
+ // Write file\r
+\r
+ File ejbFile = new File(\r
+ _outputPath + "/hook/events/SpringClearServiceAction.java");\r
+\r
+ writeFile(ejbFile, content);\r
+ }\r
+ \r
+ private void _createSQLIndexes() throws IOException {\r
+ if (!FileUtil.exists(_sqlDir)) {\r
+ return;\r
+ }\r
+\r
+ // indexes.sql\r
+\r
+ File sqlFile = new File(_sqlDir + "/" + _sqlIndexesFileName);\r
+\r
+ if (!sqlFile.exists()) {\r
+ FileUtil.write(sqlFile, "");\r
+ }\r
+\r
+ Map<String, String> indexSQLs = new TreeMap<String, String>();\r
+\r
+ UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(\r
+ new FileReader(sqlFile));\r
+\r
+ while (true) {\r
+ String indexSQL = unsyncBufferedReader.readLine();\r
+\r
+ if (indexSQL == null) {\r
+ break;\r
+ }\r
+\r
+ if (Validator.isNotNull(indexSQL.trim())) {\r
+ int pos = indexSQL.indexOf(" on ");\r
+\r
+ String indexSpec = indexSQL.substring(pos + 4);\r
+\r
+ indexSQLs.put(indexSpec, indexSQL);\r
+ }\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ // indexes.properties\r
+\r
+ File propsFile = new File(\r
+ _sqlDir + "/" + _sqlIndexesPropertiesFileName);\r
+\r
+ if (!propsFile.exists()) {\r
+ FileUtil.write(propsFile, "");\r
+ }\r
+\r
+ Map<String, String> indexProps = new TreeMap<String, String>();\r
+\r
+ unsyncBufferedReader = new UnsyncBufferedReader(\r
+ new FileReader(propsFile));\r
+\r
+ while (true) {\r
+ String indexMapping = unsyncBufferedReader.readLine();\r
+\r
+ if (indexMapping == null) {\r
+ break;\r
+ }\r
+\r
+ if (Validator.isNotNull(indexMapping.trim())) {\r
+ String[] splitIndexMapping = indexMapping.split("\\=");\r
+\r
+ indexProps.put(splitIndexMapping[1], splitIndexMapping[0]);\r
+ }\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ // indexes.sql\r
+\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (!_isTargetEntity(entity)) {\r
+ continue;\r
+ }\r
+\r
+ if (!entity.isDefaultDataSource()) {\r
+ continue;\r
+ }\r
+\r
+ List<EntityFinder> finderList = entity.getFinderList();\r
+\r
+ for (int j = 0; j < finderList.size(); j++) {\r
+ EntityFinder finder = finderList.get(j);\r
+\r
+ if (finder.isDBIndex()) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append(entity.getTable() + " (");\r
+\r
+ List<EntityColumn> finderColsList = finder.getColumns();\r
+\r
+ for (int k = 0; k < finderColsList.size(); k++) {\r
+ EntityColumn col = finderColsList.get(k);\r
+\r
+ sb.append(col.getDBName());\r
+\r
+ if ((k + 1) != finderColsList.size()) {\r
+ sb.append(", ");\r
+ }\r
+ }\r
+\r
+ sb.append(");");\r
+\r
+ String indexSpec = sb.toString();\r
+\r
+ String indexHash = StringUtil.toHexString(\r
+ indexSpec.hashCode()).toUpperCase();\r
+\r
+ String indexName = "IX_" + indexHash;\r
+\r
+ sb.setIndex(0);\r
+\r
+ sb.append("create ");\r
+\r
+ if (finder.isUnique()) {\r
+ sb.append("unique ");\r
+ }\r
+\r
+ sb.append("index " + indexName + " on ");\r
+ sb.append(indexSpec);\r
+\r
+ indexSQLs.put(indexSpec, sb.toString());\r
+\r
+ String finderName =\r
+ entity.getTable() + StringPool.PERIOD +\r
+ finder.getName();\r
+\r
+ indexProps.put(finderName, indexName);\r
+ }\r
+ }\r
+ }\r
+\r
+ for (Map.Entry<String, EntityMapping> entry :\r
+ _entityMappings.entrySet()) {\r
+\r
+ EntityMapping entityMapping = entry.getValue();\r
+\r
+ _getCreateMappingTableIndex(entityMapping, indexSQLs, indexProps);\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ Iterator<String> itr = indexSQLs.values().iterator();\r
+\r
+ String prevEntityName = null;\r
+\r
+ while (itr.hasNext()) {\r
+ String indexSQL = itr.next();\r
+\r
+ int pos = indexSQL.indexOf(" on ");\r
+\r
+ String indexSQLSuffix = indexSQL.substring(pos + 4);\r
+\r
+ String entityName = indexSQLSuffix.split(" ")[0];\r
+\r
+ if ((prevEntityName != null) &&\r
+ !prevEntityName.equals(entityName)) {\r
+\r
+ sb.append("\n");\r
+ }\r
+\r
+ sb.append(indexSQL);\r
+\r
+ if (itr.hasNext()) {\r
+ sb.append("\n");\r
+ }\r
+\r
+ prevEntityName = entityName;\r
+ }\r
+\r
+ FileUtil.write(sqlFile, sb.toString(), true);\r
+\r
+ // indexes.properties\r
+\r
+ sb.setIndex(0);\r
+\r
+ itr = indexProps.keySet().iterator();\r
+\r
+ prevEntityName = null;\r
+\r
+ while (itr.hasNext()) {\r
+ String finderName = itr.next();\r
+\r
+ String indexName = indexProps.get(finderName);\r
+\r
+ String entityName = finderName.split("\\.")[0];\r
+\r
+ if ((prevEntityName != null) &&\r
+ !prevEntityName.equals(entityName)) {\r
+\r
+ sb.append("\n");\r
+ }\r
+\r
+ sb.append(indexName + StringPool.EQUAL + finderName);\r
+\r
+ if (itr.hasNext()) {\r
+ sb.append("\n");\r
+ }\r
+\r
+ prevEntityName = entityName;\r
+ }\r
+\r
+ FileUtil.write(propsFile, sb.toString(), true);\r
+ }\r
+\r
+ private void _createSQLMappingTables(\r
+ File sqlFile, String newCreateTableString,\r
+ EntityMapping entityMapping, boolean addMissingTables)\r
+ throws IOException {\r
+\r
+ if (!sqlFile.exists()) {\r
+ FileUtil.write(sqlFile, StringPool.BLANK);\r
+ }\r
+\r
+ String content = FileUtil.read(sqlFile);\r
+\r
+ int x = content.indexOf(\r
+ _SQL_CREATE_TABLE + entityMapping.getTable() + " (");\r
+ int y = content.indexOf(");", x);\r
+\r
+ if (x != -1) {\r
+ String oldCreateTableString = content.substring(x + 1, y);\r
+\r
+ if (!oldCreateTableString.equals(newCreateTableString)) {\r
+ content =\r
+ content.substring(0, x) + newCreateTableString +\r
+ content.substring(y + 2);\r
+\r
+ FileUtil.write(sqlFile, content);\r
+ }\r
+ }\r
+ else if (addMissingTables) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ UnsyncBufferedReader unsyncBufferedReader =\r
+ new UnsyncBufferedReader(new UnsyncStringReader(content));\r
+\r
+ String line = null;\r
+ boolean appendNewTable = true;\r
+\r
+ while ((line = unsyncBufferedReader.readLine()) != null) {\r
+ if (appendNewTable && line.startsWith(_SQL_CREATE_TABLE)) {\r
+ x = _SQL_CREATE_TABLE.length();\r
+ y = line.indexOf(" ", x);\r
+\r
+ String tableName = line.substring(x, y);\r
+\r
+ if (tableName.compareTo(entityMapping.getTable()) > 0) {\r
+ sb.append(newCreateTableString + "\n\n");\r
+\r
+ appendNewTable = false;\r
+ }\r
+ }\r
+\r
+ sb.append(line);\r
+ sb.append("\n");\r
+ }\r
+\r
+ if (appendNewTable) {\r
+ sb.append("\n" + newCreateTableString);\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ FileUtil.write(sqlFile, sb.toString(), true);\r
+ }\r
+ }\r
+\r
+ private void _createSQLSequences() throws IOException {\r
+ if (!FileUtil.exists(_sqlDir)) {\r
+ return;\r
+ }\r
+\r
+ File sqlFile = new File(_sqlDir + "/" + _sqlSequencesFileName);\r
+\r
+ if (!sqlFile.exists()) {\r
+ FileUtil.write(sqlFile, "");\r
+ }\r
+\r
+ Set<String> sequenceSQLs = new TreeSet<String>();\r
+\r
+ UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(\r
+ new FileReader(sqlFile));\r
+\r
+ while (true) {\r
+ String sequenceSQL = unsyncBufferedReader.readLine();\r
+\r
+ if (sequenceSQL == null) {\r
+ break;\r
+ }\r
+\r
+ if (Validator.isNotNull(sequenceSQL)) {\r
+ sequenceSQLs.add(sequenceSQL);\r
+ }\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (!_isTargetEntity(entity)) {\r
+ continue;\r
+ }\r
+\r
+ if (!entity.isDefaultDataSource()) {\r
+ continue;\r
+ }\r
+\r
+ List<EntityColumn> columnList = entity.getColumnList();\r
+\r
+ for (int j = 0; j < columnList.size(); j++) {\r
+ EntityColumn column = columnList.get(j);\r
+\r
+ if ("sequence".equals(column.getIdType())) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ String sequenceName = column.getIdParam();\r
+\r
+ if (sequenceName.length() > 30) {\r
+ sequenceName = sequenceName.substring(0, 30);\r
+ }\r
+\r
+ sb.append("create sequence " + sequenceName + ";");\r
+\r
+ String sequenceSQL = sb.toString();\r
+\r
+ if (!sequenceSQLs.contains(sequenceSQL)) {\r
+ sequenceSQLs.add(sequenceSQL);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ Iterator<String> itr = sequenceSQLs.iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ String sequenceSQL = itr.next();\r
+\r
+ sb.append(sequenceSQL);\r
+\r
+ if (itr.hasNext()) {\r
+ sb.append("\n");\r
+ }\r
+ }\r
+\r
+ FileUtil.write(sqlFile, sb.toString(), true);\r
+ }\r
+\r
+ private void _createSQLTables() throws IOException {\r
+ if (!FileUtil.exists(_sqlDir)) {\r
+ return;\r
+ }\r
+\r
+ File sqlFile = new File(_sqlDir + "/" + _sqlFileName);\r
+\r
+ if (!sqlFile.exists()) {\r
+ FileUtil.write(sqlFile, StringPool.BLANK);\r
+ }\r
+\r
+ for (int i = 0; i < _ejbList.size(); i++) {\r
+ Entity entity = _ejbList.get(i);\r
+\r
+ if (!_isTargetEntity(entity)) {\r
+ continue;\r
+ }\r
+\r
+ if (!entity.isDefaultDataSource()) {\r
+ continue;\r
+ }\r
+\r
+ String createTableSQL = _getCreateTableSQL(entity);\r
+\r
+ if (Validator.isNotNull(createTableSQL)) {\r
+ _createSQLTables(sqlFile, createTableSQL, entity, true);\r
+\r
+ _updateSQLFile(\r
+ "update-6.1.0-6.1.1.sql", createTableSQL, entity);\r
+ }\r
+ }\r
+\r
+ for (Map.Entry<String, EntityMapping> entry :\r
+ _entityMappings.entrySet()) {\r
+\r
+ EntityMapping entityMapping = entry.getValue();\r
+\r
+ String createMappingTableSQL = _getCreateMappingTableSQL(\r
+ entityMapping);\r
+\r
+ if (Validator.isNotNull(createMappingTableSQL)) {\r
+ _createSQLMappingTables(\r
+ sqlFile, createMappingTableSQL, entityMapping, true);\r
+ }\r
+ }\r
+\r
+ String content = FileUtil.read(sqlFile);\r
+\r
+ FileUtil.write(sqlFile, content.trim());\r
+ }\r
+\r
+ private void _createSQLTables(\r
+ File sqlFile, String newCreateTableString, Entity entity,\r
+ boolean addMissingTables)\r
+ throws IOException {\r
+\r
+ if (!sqlFile.exists()) {\r
+ FileUtil.write(sqlFile, StringPool.BLANK);\r
+ }\r
+\r
+ String content = FileUtil.read(sqlFile);\r
+\r
+ int x = content.indexOf(_SQL_CREATE_TABLE + entity.getTable() + " (");\r
+ int y = content.indexOf(");", x);\r
+\r
+ if (x != -1) {\r
+ String oldCreateTableString = content.substring(x + 1, y);\r
+\r
+ if (!oldCreateTableString.equals(newCreateTableString)) {\r
+ content =\r
+ content.substring(0, x) + newCreateTableString +\r
+ content.substring(y + 2);\r
+\r
+ FileUtil.write(sqlFile, content);\r
+ }\r
+ }\r
+ else if (addMissingTables) {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ UnsyncBufferedReader unsyncBufferedReader =\r
+ new UnsyncBufferedReader(new UnsyncStringReader(content));\r
+\r
+ String line = null;\r
+ boolean appendNewTable = true;\r
+\r
+ while ((line = unsyncBufferedReader.readLine()) != null) {\r
+ if (appendNewTable && line.startsWith(_SQL_CREATE_TABLE)) {\r
+ x = _SQL_CREATE_TABLE.length();\r
+ y = line.indexOf(" ", x);\r
+\r
+ String tableName = line.substring(x, y);\r
+\r
+ if (tableName.compareTo(entity.getTable()) > 0) {\r
+ sb.append(newCreateTableString + "\n\n");\r
+\r
+ appendNewTable = false;\r
+ }\r
+ }\r
+\r
+ sb.append(line);\r
+ sb.append("\n");\r
+ }\r
+\r
+ if (appendNewTable) {\r
+ sb.append("\n" + newCreateTableString);\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ FileUtil.write(sqlFile, sb.toString(), true);\r
+ }\r
+ }\r
+\r
+ private String _fixHbmXml(String content) throws IOException {\r
+ StringBundler sb = new StringBundler();\r
+\r
+ UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(\r
+ new UnsyncStringReader(content));\r
+\r
+ String line = null;\r
+\r
+ while ((line = unsyncBufferedReader.readLine()) != null) {\r
+ if (line.startsWith("\t<class name=\"")) {\r
+ line = StringUtil.replace(\r
+ line,\r
+ new String[] {\r
+ ".service.persistence.", "HBM\" table=\""\r
+ },\r
+ new String[] {\r
+ ".model.", "\" table=\""\r
+ });\r
+\r
+ if (!line.contains(".model.impl.") &&\r
+ !line.contains("BlobModel")) {\r
+\r
+ line = StringUtil.replace(\r
+ line,\r
+ new String[] {\r
+ ".model.", "\" table=\""\r
+ },\r
+ new String[] {\r
+ ".model.impl.", "Impl\" table=\""\r
+ });\r
+ }\r
+ }\r
+\r
+ sb.append(line);\r
+ sb.append('\n');\r
+ }\r
+\r
+ unsyncBufferedReader.close();\r
+\r
+ return sb.toString().trim();\r
+ }\r
+\r
+ private String _fixSpringXml(String content) {\r
+ return StringUtil.replace(content, ".service.spring.", ".service.");\r
+ }\r
+\r
+ private String _formatComment(\r
+ String comment, DocletTag[] tags, String indentation) {\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ if (Validator.isNull(comment) && (tags.length <= 0)) {\r
+ return sb.toString();\r
+ }\r
+\r
+ sb.append(indentation);\r
+ sb.append("/**\n");\r
+\r
+ if (Validator.isNotNull(comment)) {\r
+ comment = comment.replaceAll("(?m)^", indentation + " * ");\r
+\r
+ sb.append(comment);\r
+ sb.append("\n");\r
+\r
+ if (tags.length > 0) {\r
+ sb.append(indentation);\r
+ sb.append(" *\n");\r
+ }\r
+ }\r
+\r
+ for (DocletTag tag : tags) {\r
+ sb.append(indentation);\r
+ sb.append(" * @");\r
+ sb.append(tag.getName());\r
+ sb.append(" ");\r
+ sb.append(tag.getValue());\r
+ sb.append("\n");\r
+ }\r
+\r
+ sb.append(indentation);\r
+ sb.append(" */\n");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ private String _formatXml(String xml)\r
+ throws DocumentException, IOException {\r
+\r
+ String doctype = null;\r
+\r
+ int x = xml.indexOf("<!DOCTYPE");\r
+\r
+ if (x != -1) {\r
+ int y = xml.indexOf(">", x) + 1;\r
+\r
+ doctype = xml.substring(x, y);\r
+\r
+ xml = xml.substring(0, x) + "\n" + xml.substring(y);\r
+ }\r
+\r
+ xml = StringUtil.replace(xml, '\r', "");\r
+ xml = XMLFormatter.toString(xml);\r
+ xml = StringUtil.replace(xml, "\"/>", "\" />");\r
+\r
+ if (Validator.isNotNull(doctype)) {\r
+ x = xml.indexOf("?>") + 2;\r
+\r
+ xml = xml.substring(0, x) + "\n" + doctype + xml.substring(x);\r
+ }\r
+\r
+ return xml;\r
+ }\r
+\r
+ private JavaField[] _getCacheFields(JavaClass javaClass) {\r
+ if (javaClass == null) {\r
+ return new JavaField[0];\r
+ }\r
+\r
+ List<JavaField> javaFields = new ArrayList<JavaField>();\r
+\r
+ for (JavaField javaField : javaClass.getFields()) {\r
+ Annotation[] annotations = javaField.getAnnotations();\r
+\r
+ for (Annotation annotation : annotations) {\r
+ Type type = annotation.getType();\r
+\r
+ String className = type.getFullyQualifiedName();\r
+\r
+ if (className.equals(CacheField.class.getName())) {\r
+ javaFields.add(javaField);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return javaFields.toArray(new JavaField[javaFields.size()]);\r
+ }\r
+\r
+ private String _getContent(String fileName) throws Exception {\r
+ Document document = _getContentDocument(fileName);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ Element authorElement = null;\r
+ Element namespaceElement = null;\r
+ Map<String, Element> entityElements = new TreeMap<String, Element>();\r
+ Map<String, Element> exceptionElements = new TreeMap<String, Element>();\r
+\r
+ for (Element element : rootElement.elements()) {\r
+ String elementName = element.getName();\r
+\r
+ if (elementName.equals("author")) {\r
+ element.detach();\r
+\r
+ if (authorElement != null) {\r
+ throw new IllegalArgumentException(\r
+ "There can only be one author element");\r
+ }\r
+\r
+ authorElement = element;\r
+ }\r
+ else if (elementName.equals("namespace")) {\r
+ element.detach();\r
+\r
+ if (namespaceElement != null) {\r
+ throw new IllegalArgumentException(\r
+ "There can only be one namespace element");\r
+ }\r
+\r
+ namespaceElement = element;\r
+ }\r
+ else if (elementName.equals("entity")) {\r
+ element.detach();\r
+\r
+ String name = element.attributeValue("name");\r
+\r
+ entityElements.put(name.toLowerCase(), element);\r
+ }\r
+ else if (elementName.equals("exceptions")) {\r
+ element.detach();\r
+\r
+ for (Element exceptionElement : element.elements("exception")) {\r
+ exceptionElement.detach();\r
+\r
+ exceptionElements.put(\r
+ exceptionElement.getText(), exceptionElement);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (authorElement != null) {\r
+ rootElement.add(authorElement);\r
+ }\r
+\r
+ if (namespaceElement == null) {\r
+ throw new IllegalArgumentException(\r
+ "The namespace element is required");\r
+ }\r
+ else {\r
+ rootElement.add(namespaceElement);\r
+ }\r
+\r
+ _addElements(rootElement, entityElements);\r
+\r
+ if (!exceptionElements.isEmpty()) {\r
+ Element exceptionsElement = rootElement.addElement("exceptions");\r
+\r
+ _addElements(exceptionsElement, exceptionElements);\r
+ }\r
+\r
+ return document.asXML();\r
+ }\r
+\r
+ private Document _getContentDocument(String fileName) throws Exception {\r
+ String content = FileUtil.read(new File(fileName));\r
+\r
+ Document document = SAXReaderUtil.read(content);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ for (Element element : rootElement.elements()) {\r
+ String elementName = element.getName();\r
+\r
+ if (!elementName.equals("service-builder-import")) {\r
+ continue;\r
+ }\r
+\r
+ element.detach();\r
+\r
+ String dirName = fileName.substring(\r
+ 0, fileName.lastIndexOf(StringPool.SLASH) + 1);\r
+ String serviceBuilderImportFileName = element.attributeValue(\r
+ "file");\r
+\r
+ Document serviceBuilderImportDocument = _getContentDocument(\r
+ dirName + serviceBuilderImportFileName);\r
+\r
+ Element serviceBuilderImportRootElement =\r
+ serviceBuilderImportDocument.getRootElement();\r
+\r
+ for (Element serviceBuilderImportElement :\r
+ serviceBuilderImportRootElement.elements()) {\r
+\r
+ serviceBuilderImportElement.detach();\r
+\r
+ rootElement.add(serviceBuilderImportElement);\r
+ }\r
+ }\r
+\r
+ return document;\r
+ }\r
+\r
+ private Map<String, Object> _getContext() throws TemplateModelException {\r
+ BeansWrapper wrapper = BeansWrapper.getDefaultInstance();\r
+\r
+ TemplateHashModel staticModels = wrapper.getStaticModels();\r
+\r
+ Map<String, Object> context = new HashMap<String, Object>();\r
+\r
+ context.put("hbmFileName", _hbmFileName);\r
+ context.put("ormFileName", _ormFileName);\r
+ context.put("modelHintsFileName", _modelHintsFileName);\r
+ context.put("springFileName", _springFileName);\r
+ context.put("springBaseFileName", _springBaseFileName);\r
+ context.put("springHibernateFileName", _springHibernateFileName);\r
+ context.put(\r
+ "springInfrastructureFileName", _springInfrastructureFileName);\r
+ context.put("apiDir", _apiDir);\r
+ context.put("implDir", _implDir);\r
+ context.put("jsonFileName", _jsonFileName);\r
+ context.put("sqlDir", _sqlDir);\r
+ context.put("sqlFileName", _sqlFileName);\r
+ context.put("beanLocatorUtil", _beanLocatorUtil);\r
+ context.put("beanLocatorUtilShortName", _beanLocatorUtilShortName);\r
+ context.put("propsUtil", _propsUtil);\r
+ context.put("portletName", _portletName);\r
+ context.put("portletShortName", _portletShortName);\r
+ context.put("portletPackageName", _portletPackageName);\r
+ context.put("outputPath", _outputPath);\r
+ context.put("serviceOutputPath", _serviceOutputPath);\r
+ context.put("packagePath", _packagePath);\r
+ context.put("pluginName", _pluginName);\r
+ context.put("author", _author);\r
+ context.put("serviceBuilder", this);\r
+\r
+ context.put("arrayUtil", ArrayUtil_IW.getInstance());\r
+ context.put("modelHintsUtil", ModelHintsUtil.getModelHints());\r
+ context.put(\r
+ "resourceActionsUtil", ResourceActionsUtil.getResourceActions());\r
+ context.put("stringUtil", StringUtil_IW.getInstance());\r
+ context.put("system", staticModels.get("java.lang.System"));\r
+ context.put("tempMap", wrapper.wrap(new HashMap<String, Object>()));\r
+ context.put(\r
+ "textFormatter", staticModels.get(TextFormatter.class.getName()));\r
+ context.put("validator", Validator_IW.getInstance());\r
+\r
+ return context;\r
+ }\r
+\r
+ private void _getCreateMappingTableIndex(\r
+ EntityMapping entityMapping, Map<String, String> indexSQLs,\r
+ Map<String, String> indexProps)\r
+ throws IOException {\r
+\r
+ Entity[] entities = new Entity[2];\r
+\r
+ for (int i = 0; i < entities.length; i++) {\r
+ entities[i] = getEntity(entityMapping.getEntity(i));\r
+\r
+ if (entities[i] == null) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ for (Entity entity : entities) {\r
+ List<EntityColumn> pkList = entity.getPKList();\r
+\r
+ for (int j = 0; j < pkList.size(); j++) {\r
+ EntityColumn col = pkList.get(j);\r
+\r
+ String colDBName = col.getDBName();\r
+\r
+ String indexSpec =\r
+ entityMapping.getTable() + " (" + colDBName + ");";\r
+\r
+ String indexHash = StringUtil.toHexString(\r
+ indexSpec.hashCode()).toUpperCase();\r
+\r
+ String indexName = "IX_" + indexHash;\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append("create index ");\r
+ sb.append(indexName);\r
+ sb.append(" on ");\r
+ sb.append(indexSpec);\r
+\r
+ indexSQLs.put(indexSpec, sb.toString());\r
+\r
+ String finderName =\r
+ entityMapping.getTable() + StringPool.PERIOD + colDBName;\r
+\r
+ indexProps.put(finderName, indexName);\r
+ }\r
+ }\r
+ }\r
+\r
+ private String _getCreateMappingTableSQL(EntityMapping entityMapping)\r
+ throws IOException {\r
+\r
+ Entity[] entities = new Entity[2];\r
+\r
+ for (int i = 0; i < entities.length; i++) {\r
+ entities[i] = getEntity(entityMapping.getEntity(i));\r
+\r
+ if (entities[i] == null) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append(_SQL_CREATE_TABLE);\r
+ sb.append(entityMapping.getTable());\r
+ sb.append(" (\n");\r
+\r
+ for (Entity entity : entities) {\r
+ List<EntityColumn> pkList = entity.getPKList();\r
+\r
+ for (int i = 0; i < pkList.size(); i++) {\r
+ EntityColumn col = pkList.get(i);\r
+\r
+ String colName = col.getName();\r
+ String colType = col.getType();\r
+\r
+ sb.append("\t" + col.getDBName());\r
+ sb.append(" ");\r
+\r
+ if (colType.equalsIgnoreCase("boolean")) {\r
+ sb.append("BOOLEAN");\r
+ }\r
+ else if (colType.equalsIgnoreCase("double") ||\r
+ colType.equalsIgnoreCase("float")) {\r
+\r
+ sb.append("DOUBLE");\r
+ }\r
+ else if (colType.equals("int") ||\r
+ colType.equals("Integer") ||\r
+ colType.equalsIgnoreCase("short")) {\r
+\r
+ sb.append("INTEGER");\r
+ }\r
+ else if (colType.equalsIgnoreCase("long")) {\r
+ sb.append("LONG");\r
+ }\r
+ else if (colType.equals("String")) {\r
+ Map<String, String> hints = ModelHintsUtil.getHints(\r
+ _packagePath + ".model." + entity.getName(), colName);\r
+\r
+ int maxLength = 75;\r
+\r
+ if (hints != null) {\r
+ maxLength = GetterUtil.getInteger(\r
+ hints.get("max-length"), maxLength);\r
+ }\r
+\r
+ if (col.isLocalized()) {\r
+ maxLength = 4000;\r
+ }\r
+\r
+ if (maxLength < 4000) {\r
+ sb.append("VARCHAR(" + maxLength + ")");\r
+ }\r
+ else if (maxLength == 4000) {\r
+ sb.append("STRING");\r
+ }\r
+ else if (maxLength > 4000) {\r
+ sb.append("TEXT");\r
+ }\r
+ }\r
+ else if (colType.equals("Date")) {\r
+ sb.append("DATE");\r
+ }\r
+ else {\r
+ sb.append("invalid");\r
+ }\r
+\r
+ if (col.isPrimary()) {\r
+ sb.append(" not null");\r
+ }\r
+ else if (colType.equals("Date") || colType.equals("String")) {\r
+ sb.append(" null");\r
+ }\r
+\r
+ sb.append(",\n");\r
+ }\r
+ }\r
+\r
+ sb.append("\tprimary key (");\r
+\r
+ for (int i = 0; i < entities.length; i++) {\r
+ Entity entity = entities[i];\r
+\r
+ List<EntityColumn> pkList = entity.getPKList();\r
+\r
+ for (int j = 0; j < pkList.size(); j++) {\r
+ EntityColumn col = pkList.get(j);\r
+\r
+ String colDBName = col.getDBName();\r
+\r
+ if ((i != 0) || (j != 0)) {\r
+ sb.append(", ");\r
+ }\r
+\r
+ sb.append(colDBName);\r
+ }\r
+ }\r
+\r
+ sb.append(")\n");\r
+ sb.append(");");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ private String _getCreateTableSQL(Entity entity) {\r
+ List<EntityColumn> pkList = entity.getPKList();\r
+ List<EntityColumn> regularColList = entity.getRegularColList();\r
+\r
+ if (regularColList.size() == 0) {\r
+ return null;\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ sb.append(_SQL_CREATE_TABLE);\r
+ sb.append(entity.getTable());\r
+ sb.append(" (\n");\r
+\r
+ for (int i = 0; i < regularColList.size(); i++) {\r
+ EntityColumn col = regularColList.get(i);\r
+\r
+ String colName = col.getName();\r
+ String colType = col.getType();\r
+ String colIdType = col.getIdType();\r
+\r
+ sb.append("\t" + col.getDBName());\r
+ sb.append(" ");\r
+\r
+ if (colType.equalsIgnoreCase("boolean")) {\r
+ sb.append("BOOLEAN");\r
+ }\r
+ else if (colType.equalsIgnoreCase("double") ||\r
+ colType.equalsIgnoreCase("float")) {\r
+\r
+ sb.append("DOUBLE");\r
+ }\r
+ else if (colType.equals("int") ||\r
+ colType.equals("Integer") ||\r
+ colType.equalsIgnoreCase("short")) {\r
+\r
+ sb.append("INTEGER");\r
+ }\r
+ else if (colType.equalsIgnoreCase("long")) {\r
+ sb.append("LONG");\r
+ }\r
+ else if (colType.equals("Blob")) {\r
+ sb.append("BLOB");\r
+ }\r
+ else if (colType.equals("Date")) {\r
+ sb.append("DATE");\r
+ }\r
+ else if (colType.equals("String")) {\r
+ Map<String, String> hints = ModelHintsUtil.getHints(\r
+ _packagePath + ".model." + entity.getName(), colName);\r
+\r
+ int maxLength = 75;\r
+\r
+ if (hints != null) {\r
+ maxLength = GetterUtil.getInteger(\r
+ hints.get("max-length"), maxLength);\r
+ }\r
+\r
+ if (col.isLocalized()) {\r
+ maxLength = 4000;\r
+ }\r
+\r
+ if (maxLength < 4000) {\r
+ sb.append("VARCHAR(" + maxLength + ")");\r
+ }\r
+ else if (maxLength == 4000) {\r
+ sb.append("STRING");\r
+ }\r
+ else if (maxLength > 4000) {\r
+ sb.append("TEXT");\r
+ }\r
+ }\r
+ else {\r
+ sb.append("invalid");\r
+ }\r
+\r
+ if (col.isPrimary()) {\r
+ sb.append(" not null");\r
+\r
+ if (!entity.hasCompoundPK()) {\r
+ sb.append(" primary key");\r
+ }\r
+ }\r
+ else if (colType.equals("Date") || colType.equals("String")) {\r
+ sb.append(" null");\r
+ }\r
+\r
+ if (Validator.isNotNull(colIdType) &&\r
+ colIdType.equals("identity")) {\r
+\r
+ sb.append(" IDENTITY");\r
+ }\r
+\r
+ if (((i + 1) != regularColList.size()) ||\r
+ entity.hasCompoundPK()) {\r
+\r
+ sb.append(",");\r
+ }\r
+\r
+ sb.append("\n");\r
+ }\r
+\r
+ if (entity.hasCompoundPK()) {\r
+ sb.append("\tprimary key (");\r
+\r
+ for (int j = 0; j < pkList.size(); j++) {\r
+ EntityColumn pk = pkList.get(j);\r
+\r
+ sb.append(pk.getDBName());\r
+\r
+ if ((j + 1) != pkList.size()) {\r
+ sb.append(", ");\r
+ }\r
+ }\r
+\r
+ sb.append(")\n");\r
+ }\r
+\r
+ sb.append(");");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ private String _getDimensions(Type type) {\r
+ String dimensions = "";\r
+\r
+ for (int i = 0; i < type.getDimensions(); i++) {\r
+ dimensions += "[]";\r
+ }\r
+\r
+ return dimensions;\r
+ }\r
+\r
+ private JavaClass _getJavaClass(String fileName) throws IOException {\r
+ int pos = fileName.indexOf(_implDir + "/");\r
+\r
+ if (pos != -1) {\r
+ pos += _implDir.length();\r
+ }\r
+ else {\r
+ pos = fileName.indexOf(_apiDir + "/") + _apiDir.length();\r
+ }\r
+\r
+ String srcFile = fileName.substring(pos + 1);\r
+ String className = StringUtil.replace(\r
+ srcFile.substring(0, srcFile.length() - 5), "/", ".");\r
+\r
+ JavaClass javaClass = _javaClasses.get(className);\r
+\r
+ if (javaClass == null) {\r
+ ClassLibrary classLibrary = new ClassLibrary();\r
+\r
+ classLibrary.addClassLoader(getClass().getClassLoader());\r
+\r
+ JavaDocBuilder builder = new JavaDocBuilder(classLibrary);\r
+\r
+ File file = new File(fileName);\r
+\r
+ if (!file.exists()) {\r
+ return null;\r
+ }\r
+\r
+ builder.addSource(file);\r
+\r
+ javaClass = builder.getClassByName(className);\r
+\r
+ _javaClasses.put(className, javaClass);\r
+ }\r
+\r
+ return javaClass;\r
+ }\r
+\r
+ private JavaMethod[] _getMethods(JavaClass javaClass) {\r
+ return _getMethods(javaClass, false);\r
+ }\r
+\r
+ private JavaMethod[] _getMethods(\r
+ JavaClass javaClass, boolean superclasses) {\r
+\r
+ JavaMethod[] methods = javaClass.getMethods(superclasses);\r
+\r
+ for (JavaMethod method : methods) {\r
+ Arrays.sort(method.getExceptions());\r
+ }\r
+\r
+ return methods;\r
+ }\r
+\r
+ private String _getSessionTypeName(int sessionType) {\r
+ if (sessionType == _SESSION_TYPE_LOCAL) {\r
+ return "Local";\r
+ }\r
+ else {\r
+ return "";\r
+ }\r
+ }\r
+\r
+ private String _getTplProperty(String key, String defaultValue) {\r
+ return System.getProperty("service.tpl." + key, defaultValue);\r
+ }\r
+\r
+ private List<String> _getTransients(Entity entity, boolean parent)\r
+ throws Exception {\r
+\r
+ File modelFile = null;\r
+\r
+ if (parent) {\r
+ modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() +\r
+ "ModelImpl.java");\r
+ }\r
+ else {\r
+ modelFile = new File(\r
+ _outputPath + "/model/impl/" + entity.getName() + "Impl.java");\r
+ }\r
+\r
+ String content = FileUtil.read(modelFile);\r
+\r
+ Matcher matcher = _getterPattern.matcher(content);\r
+\r
+ Set<String> getters = new HashSet<String>();\r
+\r
+ while (!matcher.hitEnd()) {\r
+ boolean found = matcher.find();\r
+\r
+ if (found) {\r
+ String property = matcher.group();\r
+\r
+ if (property.indexOf("get") != -1) {\r
+ property = property.substring(\r
+ property.indexOf("get") + 3, property.length() - 1);\r
+ }\r
+ else {\r
+ property = property.substring(\r
+ property.indexOf("is") + 2, property.length() - 1);\r
+ }\r
+\r
+ if (!entity.hasColumn(property) &&\r
+ !entity.hasColumn(Introspector.decapitalize(property))) {\r
+\r
+ property = Introspector.decapitalize(property);\r
+\r
+ getters.add(property);\r
+ }\r
+ }\r
+ }\r
+\r
+ matcher = _setterPattern.matcher(content);\r
+\r
+ Set<String> setters = new HashSet<String>();\r
+\r
+ while (!matcher.hitEnd()) {\r
+ boolean found = matcher.find();\r
+\r
+ if (found) {\r
+ String property = matcher.group();\r
+\r
+ property = property.substring(\r
+ property.indexOf("set") + 3, property.length() - 1);\r
+\r
+ if (!entity.hasColumn(property) &&\r
+ !entity.hasColumn(Introspector.decapitalize(property))) {\r
+\r
+ property = Introspector.decapitalize(property);\r
+\r
+ setters.add(property);\r
+ }\r
+ }\r
+ }\r
+\r
+ getters.retainAll(setters);\r
+\r
+ List<String> transients = new ArrayList<String>(getters);\r
+\r
+ Collections.sort(transients);\r
+\r
+ return transients;\r
+ }\r
+\r
+ private boolean _hasHttpMethods(JavaClass javaClass) {\r
+ JavaMethod[] methods = _getMethods(javaClass);\r
+\r
+ for (JavaMethod javaMethod : methods) {\r
+ if (!javaMethod.isConstructor() && javaMethod.isPublic() &&\r
+ isCustomMethod(javaMethod)) {\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private boolean _isStringLocaleMap(JavaParameter javaParameter) {\r
+ Type type = javaParameter.getType();\r
+\r
+ Type[] actualArgumentTypes = type.getActualTypeArguments();\r
+\r
+ if (actualArgumentTypes.length != 2) {\r
+ return false;\r
+ }\r
+\r
+ if (!_isTypeValue(actualArgumentTypes[0], Locale.class.getName()) ||\r
+ !_isTypeValue(actualArgumentTypes[1], String.class.getName())) {\r
+\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ private boolean _isTargetEntity(Entity entity) {\r
+ if ((_targetEntityName == null) || _targetEntityName.startsWith("$")) {\r
+ return true;\r
+ }\r
+\r
+ return _targetEntityName.equals(entity.getName());\r
+ }\r
+\r
+ private boolean _isTypeValue(Type type, String value) {\r
+ return value.equals(type.getValue());\r
+ }\r
+\r
+ private List<Entity> _mergeReferenceList(List<Entity> referenceList) {\r
+ List<Entity> list = new ArrayList<Entity>(\r
+ _ejbList.size() + referenceList.size());\r
+\r
+ list.addAll(_ejbList);\r
+ list.addAll(referenceList);\r
+\r
+ return list;\r
+ }\r
+\r
+ private void _parseEntity(Element entityElement) throws Exception {\r
+ String ejbName = entityElement.attributeValue("name");\r
+ String humanName = entityElement.attributeValue("human-name");\r
+\r
+ String table = entityElement.attributeValue("table");\r
+\r
+ if (Validator.isNull(table)) {\r
+ table = ejbName;\r
+\r
+ if (_badTableNames.contains(ejbName)) {\r
+ table += StringPool.UNDERLINE;\r
+ }\r
+\r
+ if (_autoNamespaceTables) {\r
+ table = _portletShortName + StringPool.UNDERLINE + ejbName;\r
+ }\r
+ }\r
+\r
+ boolean uuid = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("uuid"));\r
+ boolean uuidAccessor = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("uuid-accessor"));\r
+ boolean localService = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("local-service"));\r
+ boolean remoteService = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("remote-service"), true);\r
+ String persistenceClass = GetterUtil.getString(\r
+ entityElement.attributeValue("persistence-class"),\r
+ _packagePath + ".service.persistence." + ejbName +\r
+ "PersistenceImpl");\r
+\r
+ String finderClass = "";\r
+\r
+ if (FileUtil.exists(\r
+ _outputPath + "/service/persistence/" + ejbName +\r
+ "FinderImpl.java")) {\r
+\r
+ finderClass =\r
+ _packagePath + ".service.persistence." + ejbName + "FinderImpl";\r
+ }\r
+\r
+ String dataSource = entityElement.attributeValue("data-source");\r
+ String sessionFactory = entityElement.attributeValue("session-factory");\r
+ String txManager = entityElement.attributeValue("tx-manager");\r
+ boolean cacheEnabled = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("cache-enabled"), true);\r
+ boolean jsonEnabled = GetterUtil.getBoolean(\r
+ entityElement.attributeValue("json-enabled"), remoteService);\r
+\r
+ List<EntityColumn> pkList = new ArrayList<EntityColumn>();\r
+ List<EntityColumn> regularColList = new ArrayList<EntityColumn>();\r
+ List<EntityColumn> blobList = new ArrayList<EntityColumn>();\r
+ List<EntityColumn> collectionList = new ArrayList<EntityColumn>();\r
+ List<EntityColumn> columnList = new ArrayList<EntityColumn>();\r
+\r
+ List<Element> columnElements = entityElement.elements("column");\r
+\r
+ boolean permissionedModel = false;\r
+\r
+ if (uuid) {\r
+ Element columnElement = SAXReaderUtil.createElement("column");\r
+\r
+ columnElement.addAttribute("name", "uuid");\r
+ columnElement.addAttribute("type", "String");\r
+\r
+ columnElements.add(0, columnElement);\r
+ }\r
+\r
+ for (Element columnElement : columnElements) {\r
+ String columnName = columnElement.attributeValue("name");\r
+\r
+ if (columnName.equals("resourceBlockId") &&\r
+ !ejbName.equals("ResourceBlock")) {\r
+\r
+ permissionedModel = true;\r
+ }\r
+\r
+ String columnDBName = columnElement.attributeValue("db-name");\r
+\r
+ if (Validator.isNull(columnDBName)) {\r
+ columnDBName = columnName;\r
+\r
+ if (_badColumnNames.contains(columnName)) {\r
+ columnDBName += StringPool.UNDERLINE;\r
+ }\r
+ }\r
+\r
+ String columnType = columnElement.attributeValue("type");\r
+ boolean primary = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("primary"));\r
+ boolean accessor = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("accessor"));\r
+ boolean filterPrimary = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("filter-primary"));\r
+ String collectionEntity = columnElement.attributeValue("entity");\r
+ String mappingKey = columnElement.attributeValue("mapping-key");\r
+\r
+ String mappingTable = columnElement.attributeValue("mapping-table");\r
+\r
+ if (Validator.isNotNull(mappingTable)) {\r
+ if (_badTableNames.contains(mappingTable)) {\r
+ mappingTable += StringPool.UNDERLINE;\r
+ }\r
+\r
+ if (_autoNamespaceTables) {\r
+ mappingTable =\r
+ _portletShortName + StringPool.UNDERLINE + mappingTable;\r
+ }\r
+ }\r
+\r
+ String idType = columnElement.attributeValue("id-type");\r
+ String idParam = columnElement.attributeValue("id-param");\r
+ boolean convertNull = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("convert-null"), true);\r
+ boolean lazy = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("lazy"), true);\r
+ boolean localized = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("localized"));\r
+ boolean colJsonEnabled = GetterUtil.getBoolean(\r
+ columnElement.attributeValue("json-enabled"), jsonEnabled);\r
+\r
+ EntityColumn col = new EntityColumn(\r
+ columnName, columnDBName, columnType, primary, accessor,\r
+ filterPrimary, collectionEntity, mappingKey, mappingTable,\r
+ idType, idParam, convertNull, lazy, localized, colJsonEnabled);\r
+\r
+ if (primary) {\r
+ pkList.add(col);\r
+ }\r
+\r
+ if (columnType.equals("Collection")) {\r
+ collectionList.add(col);\r
+ }\r
+ else {\r
+ regularColList.add(col);\r
+\r
+ if (columnType.equals("Blob")) {\r
+ blobList.add(col);\r
+ }\r
+ }\r
+\r
+ columnList.add(col);\r
+\r
+ if (Validator.isNotNull(collectionEntity) &&\r
+ Validator.isNotNull(mappingTable)) {\r
+\r
+ EntityMapping entityMapping = new EntityMapping(\r
+ mappingTable, ejbName, collectionEntity);\r
+\r
+ int ejbNameWeight = StringUtil.startsWithWeight(\r
+ mappingTable, ejbName);\r
+ int collectionEntityWeight = StringUtil.startsWithWeight(\r
+ mappingTable, collectionEntity);\r
+\r
+ if ((ejbNameWeight > collectionEntityWeight) ||\r
+ ((ejbNameWeight == collectionEntityWeight) &&\r
+ (ejbName.compareTo(collectionEntity) > 0))) {\r
+\r
+ _entityMappings.put(mappingTable, entityMapping);\r
+ }\r
+ }\r
+ }\r
+\r
+ EntityOrder order = null;\r
+\r
+ Element orderElement = entityElement.element("order");\r
+\r
+ if (orderElement != null) {\r
+ boolean asc = true;\r
+\r
+ if ((orderElement.attribute("by") != null) &&\r
+ orderElement.attributeValue("by").equals("desc")) {\r
+\r
+ asc = false;\r
+ }\r
+\r
+ List<EntityColumn> orderColsList = new ArrayList<EntityColumn>();\r
+\r
+ order = new EntityOrder(asc, orderColsList);\r
+\r
+ List<Element> orderColumnElements = orderElement.elements(\r
+ "order-column");\r
+\r
+ for (Element orderColElement : orderColumnElements) {\r
+ String orderColName = orderColElement.attributeValue("name");\r
+ boolean orderColCaseSensitive = GetterUtil.getBoolean(\r
+ orderColElement.attributeValue("case-sensitive"), true);\r
+\r
+ boolean orderColByAscending = asc;\r
+\r
+ String orderColBy = GetterUtil.getString(\r
+ orderColElement.attributeValue("order-by"));\r
+\r
+ if (orderColBy.equals("asc")) {\r
+ orderColByAscending = true;\r
+ }\r
+ else if (orderColBy.equals("desc")) {\r
+ orderColByAscending = false;\r
+ }\r
+\r
+ EntityColumn col = Entity.getColumn(orderColName, columnList);\r
+\r
+ col.setOrderColumn(true);\r
+\r
+ col = (EntityColumn)col.clone();\r
+\r
+ col.setCaseSensitive(orderColCaseSensitive);\r
+ col.setOrderByAscending(orderColByAscending);\r
+\r
+ orderColsList.add(col);\r
+ }\r
+ }\r
+\r
+ List<EntityFinder> finderList = new ArrayList<EntityFinder>();\r
+\r
+ List<Element> finderElements = entityElement.elements("finder");\r
+\r
+ if (uuid) {\r
+ Element finderElement = SAXReaderUtil.createElement("finder");\r
+\r
+ finderElement.addAttribute("name", "Uuid");\r
+ finderElement.addAttribute("return-type", "Collection");\r
+\r
+ Element finderColumnElement = finderElement.addElement(\r
+ "finder-column");\r
+\r
+ finderColumnElement.addAttribute("name", "uuid");\r
+\r
+ finderElements.add(0, finderElement);\r
+\r
+ if (columnList.contains(new EntityColumn("groupId"))) {\r
+ finderElement = SAXReaderUtil.createElement("finder");\r
+\r
+ finderElement.addAttribute("name", "UUID_G");\r
+ finderElement.addAttribute("return-type", ejbName);\r
+ finderElement.addAttribute("unique", "true");\r
+\r
+ finderColumnElement = finderElement.addElement("finder-column");\r
+\r
+ finderColumnElement.addAttribute("name", "uuid");\r
+\r
+ finderColumnElement = finderElement.addElement("finder-column");\r
+\r
+ finderColumnElement.addAttribute("name", "groupId");\r
+\r
+ finderElements.add(1, finderElement);\r
+ }\r
+ }\r
+\r
+ if (permissionedModel) {\r
+ Element finderElement = SAXReaderUtil.createElement("finder");\r
+\r
+ finderElement.addAttribute("name", "ResourceBlockId");\r
+ finderElement.addAttribute("return-type", "Collection");\r
+\r
+ Element finderColumnElement = finderElement.addElement(\r
+ "finder-column");\r
+\r
+ finderColumnElement.addAttribute("name", "resourceBlockId");\r
+\r
+ finderElements.add(0, finderElement);\r
+ }\r
+\r
+ String alias = TextFormatter.format(ejbName, TextFormatter.I);\r
+\r
+ if (_badAliasNames.contains(alias.toLowerCase())) {\r
+ alias += StringPool.UNDERLINE;\r
+ }\r
+\r
+ for (Element finderElement : finderElements) {\r
+ String finderName = finderElement.attributeValue("name");\r
+ String finderReturn = finderElement.attributeValue("return-type");\r
+ boolean finderUnique = GetterUtil.getBoolean(\r
+ finderElement.attributeValue("unique"));\r
+\r
+ String finderWhere = finderElement.attributeValue("where");\r
+\r
+ if (Validator.isNotNull(finderWhere)) {\r
+ for (EntityColumn column : columnList) {\r
+ String name = column.getName();\r
+\r
+ if (finderWhere.indexOf(name) != -1) {\r
+ finderWhere = finderWhere.replaceAll(\r
+ name, alias + "." + name);\r
+ }\r
+ }\r
+ }\r
+\r
+ boolean finderDBIndex = GetterUtil.getBoolean(\r
+ finderElement.attributeValue("db-index"), true);\r
+\r
+ List<EntityColumn> finderColsList = new ArrayList<EntityColumn>();\r
+\r
+ List<Element> finderColumnElements = finderElement.elements(\r
+ "finder-column");\r
+\r
+ for (Element finderColumnElement : finderColumnElements) {\r
+ String finderColName = finderColumnElement.attributeValue(\r
+ "name");\r
+ boolean finderColCaseSensitive = GetterUtil.getBoolean(\r
+ finderColumnElement.attributeValue("case-sensitive"), true);\r
+ String finderColComparator = GetterUtil.getString(\r
+ finderColumnElement.attributeValue("comparator"), "=");\r
+ String finderColArrayableOperator =\r
+ GetterUtil.getString(\r
+ finderColumnElement.attributeValue(\r
+ "arrayable-operator"));\r
+\r
+ EntityColumn col = Entity.getColumn(finderColName, columnList);\r
+\r
+ if (!col.isFinderPath()) {\r
+ col.setFinderPath(true);\r
+ }\r
+\r
+ col = (EntityColumn)col.clone();\r
+\r
+ col.setCaseSensitive(finderColCaseSensitive);\r
+ col.setComparator(finderColComparator);\r
+ col.setArrayableOperator(finderColArrayableOperator);\r
+\r
+ finderColsList.add(col);\r
+ }\r
+\r
+ finderList.add(\r
+ new EntityFinder(\r
+ finderName, finderReturn, finderUnique, finderWhere,\r
+ finderDBIndex, finderColsList));\r
+ }\r
+\r
+ List<Entity> referenceList = new ArrayList<Entity>();\r
+\r
+ if (_build) {\r
+ if (Validator.isNotNull(_pluginName)) {\r
+ for (String config : PropsValues.RESOURCE_ACTIONS_CONFIGS) {\r
+ File file = new File(_implDir + "/" + config);\r
+\r
+ if (file.exists()) {\r
+ InputStream inputStream = new FileInputStream(file);\r
+\r
+ ResourceActionsUtil.read(_pluginName, inputStream);\r
+ }\r
+ }\r
+ }\r
+\r
+ List<Element> referenceElements = entityElement.elements(\r
+ "reference");\r
+\r
+ Set<String> referenceSet = new TreeSet<String>();\r
+\r
+ for (Element referenceElement : referenceElements) {\r
+ String referencePackage = referenceElement.attributeValue(\r
+ "package-path");\r
+ String referenceEntity = referenceElement.attributeValue(\r
+ "entity");\r
+\r
+ referenceSet.add(referencePackage + "." + referenceEntity);\r
+ }\r
+\r
+ if (!_packagePath.equals("com.liferay.counter")) {\r
+ referenceSet.add("com.liferay.counter.Counter");\r
+ }\r
+\r
+ if (!_packagePath.equals("com.liferay.portal")) {\r
+ referenceSet.add("com.liferay.portal.Resource");\r
+ referenceSet.add("com.liferay.portal.User");\r
+ }\r
+\r
+ for (String referenceName : referenceSet) {\r
+ referenceList.add(getEntity(referenceName));\r
+ }\r
+ }\r
+\r
+ List<String> txRequiredList = new ArrayList<String>();\r
+\r
+ List<Element> txRequiredElements = entityElement.elements(\r
+ "tx-required");\r
+\r
+ for (Element txRequiredEl : txRequiredElements) {\r
+ String txRequired = txRequiredEl.getText();\r
+\r
+ txRequiredList.add(txRequired);\r
+ }\r
+\r
+ _ejbList.add(\r
+ new Entity(\r
+ _packagePath, _portletName, _portletShortName, ejbName,\r
+ humanName, table, alias, uuid, uuidAccessor, localService,\r
+ remoteService, persistenceClass, finderClass, dataSource,\r
+ sessionFactory, txManager, cacheEnabled, jsonEnabled, pkList,\r
+ regularColList, blobList, collectionList, columnList, order,\r
+ finderList, referenceList, txRequiredList));\r
+ }\r
+\r
+ private String _processTemplate(String name) throws Exception {\r
+ return _processTemplate(name, _getContext());\r
+ }\r
+\r
+ private String _processTemplate(String name, Map<String, Object> context)\r
+ throws Exception {\r
+\r
+ return StringUtil.strip(FreeMarkerUtil.process(name, context), '\r');\r
+ }\r
+\r
+ private Set<String> _readLines(String fileName) throws Exception {\r
+ ClassLoader classLoader = getClass().getClassLoader();\r
+\r
+ Set<String> lines = new HashSet<String>();\r
+\r
+ StringUtil.readLines(classLoader.getResourceAsStream(fileName), lines);\r
+\r
+ return lines;\r
+ }\r
+\r
+ private void _updateSQLFile(\r
+ String sqlFileName, String createTableSQL, Entity entity)\r
+ throws IOException {\r
+\r
+ File updateSQLFile = new File(_sqlDir + "/" + sqlFileName);\r
+\r
+ if (updateSQLFile.exists()) {\r
+ _createSQLTables(updateSQLFile, createTableSQL, entity, false);\r
+ }\r
+ }\r
+\r
+ private static final int _SESSION_TYPE_LOCAL = 1;\r
+\r
+ private static final int _SESSION_TYPE_REMOTE = 0;\r
+\r
+ private static final String _SQL_CREATE_TABLE = "create table ";\r
+\r
+ private static final String _TPL_ROOT =\r
+ "com/liferay/portal/tools/servicebuilder/dependencies/";\r
+\r
+ private static Pattern _getterPattern = Pattern.compile(\r
+ "public .* get.*" + Pattern.quote("(") + "|public boolean is.*" +\r
+ Pattern.quote("("));\r
+\r
+ private static Pattern _setterPattern = Pattern.compile(\r
+ "public void set.*" + Pattern.quote("("));\r
+\r
+ private String _apiDir;\r
+ private String _author;\r
+ private boolean _autoNamespaceTables;\r
+ private Set<String> _badAliasNames;\r
+ private Set<String> _badColumnNames;\r
+ private Set<String> _badJsonTypes;\r
+ private Set<String> _badTableNames;\r
+ private String _beanLocatorUtil;\r
+ private String _beanLocatorUtilShortName;\r
+ private boolean _build;\r
+ private long _buildNumber;\r
+ private boolean _buildNumberIncrement;\r
+ private List<Entity> _ejbList;\r
+ private Map<String, EntityMapping> _entityMappings;\r
+ private Map<String, Entity> _entityPool = new HashMap<String, Entity>();\r
+ private String _hbmFileName;\r
+ private String _implDir;\r
+ private Map<String, JavaClass> _javaClasses =\r
+ new HashMap<String, JavaClass>();\r
+ private String _jsonFileName;\r
+ private String _modelHintsFileName;\r
+ private String _ormFileName;\r
+ private String _outputPath;\r
+ private String _packagePath;\r
+ private String _pluginName;\r
+ private String _portletName = StringPool.BLANK;\r
+ private String _portletPackageName = StringPool.BLANK;\r
+ private String _portletShortName = StringPool.BLANK;\r
+ private String _propsUtil;\r
+ private String _remotingFileName;\r
+ private String _serviceOutputPath;\r
+ private String _springBaseFileName;\r
+ private String _springClusterFileName;\r
+ private String _springDynamicDataSourceFileName;\r
+ private String _springFileName;\r
+ private String _springHibernateFileName;\r
+ private String _springInfrastructureFileName;\r
+ private String _springShardDataSourceFileName;\r
+ private String _sqlDir;\r
+ private String _sqlFileName;\r
+ private String _sqlIndexesFileName;\r
+ private String _sqlIndexesPropertiesFileName;\r
+ private String _sqlSequencesFileName;\r
+ private String _targetEntityName;\r
+ private String _testDir;\r
+ private String _testOutputPath;\r
+ private String _tplBadAliasNames = _TPL_ROOT + "bad_alias_names.txt";\r
+ private String _tplBadColumnNames = _TPL_ROOT + "bad_column_names.txt";\r
+ private String _tplBadJsonTypes = _TPL_ROOT + "bad_json_types.txt";\r
+ private String _tplBadTableNames = _TPL_ROOT + "bad_table_names.txt";\r
+ private String _tplBlobModel = _TPL_ROOT + "blob_model.ftl";\r
+ private String _tplEjbPk = _TPL_ROOT + "ejb_pk.ftl";\r
+ private String _tplException = _TPL_ROOT + "exception.ftl";\r
+ private String _tplExtendedModel = _TPL_ROOT + "extended_model.ftl";\r
+ private String _tplExtendedModelBaseImpl =\r
+ _TPL_ROOT + "extended_model_base_impl.ftl";\r
+ private String _tplExtendedModelImpl =\r
+ _TPL_ROOT + "extended_model_impl.ftl";\r
+ private String _tplFinder = _TPL_ROOT + "finder.ftl";\r
+ private String _tplFinderUtil = _TPL_ROOT + "finder_util.ftl";\r
+ private String _tplHbmXml = _TPL_ROOT + "hbm_xml.ftl";\r
+ private String _tplJsonJs = _TPL_ROOT + "json_js.ftl";\r
+ private String _tplJsonJsMethod = _TPL_ROOT + "json_js_method.ftl";\r
+ private String _tplModel = _TPL_ROOT + "model.ftl";\r
+ private String _tplModelCache = _TPL_ROOT + "model_cache.ftl";\r
+ private String _tplModelClp = _TPL_ROOT + "model_clp.ftl";\r
+ private String _tplModelHintsXml = _TPL_ROOT + "model_hints_xml.ftl";\r
+ private String _tplModelImpl = _TPL_ROOT + "model_impl.ftl";\r
+ private String _tplModelSoap = _TPL_ROOT + "model_soap.ftl";\r
+ private String _tplModelWrapper = _TPL_ROOT + "model_wrapper.ftl";\r
+ private String _tplOrmXml = _TPL_ROOT + "orm_xml.ftl";\r
+ private String _tplPersistence = _TPL_ROOT + "persistence.ftl";\r
+ private String _tplPersistenceImpl = _TPL_ROOT + "persistence_impl.ftl";\r
+ private String _tplPersistenceTest = _TPL_ROOT + "persistence_test.ftl";\r
+ private String _tplPersistenceUtil = _TPL_ROOT + "persistence_util.ftl";\r
+ private String _tplProps = _TPL_ROOT + "props.ftl";\r
+ private String _tplRemotingXml = _TPL_ROOT + "remoting_xml.ftl";\r
+ private String _tplService = _TPL_ROOT + "service.ftl";\r
+ private String _tplServiceBaseImpl = _TPL_ROOT + "service_base_impl.ftl";\r
+ private String _tplServiceClp = _TPL_ROOT + "service_clp.ftl";\r
+ private String _tplServiceClpInvoker =\r
+ _TPL_ROOT + "service_clp_invoker.ftl";\r
+ private String _tplServiceClpMessageListener =\r
+ _TPL_ROOT + "service_clp_message_listener.ftl";\r
+ private String _tplServiceClpSerializer =\r
+ _TPL_ROOT + "service_clp_serializer.ftl";\r
+ private String _tplServiceHttp = _TPL_ROOT + "service_http.ftl";\r
+ private String _tplServiceImpl = _TPL_ROOT + "service_impl.ftl";\r
+ private String _tplServiceSoap = _TPL_ROOT + "service_soap.ftl";\r
+ private String _tplServiceUtil = _TPL_ROOT + "service_util.ftl";\r
+ private String _tplServiceWrapper = _TPL_ROOT + "service_wrapper.ftl";\r
+ private String _tplSpringBaseXml = _TPL_ROOT + "spring_base_xml.ftl";\r
+ private String _tplSpringClusterXml = _TPL_ROOT + "spring_cluster_xml.ftl";\r
+ private String _tplSpringDynamicDataSourceXml =\r
+ _TPL_ROOT + "spring_dynamic_data_source_xml.ftl";\r
+ private String _tplSpringHibernateXml =\r
+ _TPL_ROOT + "spring_hibernate_xml.ftl";\r
+ private String _tplSpringInfrastructureXml =\r
+ _TPL_ROOT + "spring_infrastructure_xml.ftl";\r
+ private String _tplSpringShardDataSourceXml =\r
+ _TPL_ROOT + "spring_shard_data_source_xml.ftl";\r
+ private String _tplSpringXml = _TPL_ROOT + "spring_xml.ftl";\r
+ private String _tplSpringClearService = _TPL_ROOT + "spring_clear_service.ftl";\r
+\r
+}
\ No newline at end of file