001
014
015 package com.liferay.portal.convert.database;
016
017 import com.liferay.portal.convert.DatabaseConverter;
018 import com.liferay.portal.convert.util.ModelMigrator;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.servlet.ServletContextPool;
022 import com.liferay.portal.kernel.util.ClassLoaderUtil;
023 import com.liferay.portal.model.BaseModel;
024 import com.liferay.portal.model.ModelHintsUtil;
025
026 import java.util.ArrayList;
027 import java.util.List;
028
029 import javax.servlet.ServletContext;
030
031 import javax.sql.DataSource;
032
033
036 public class PortalDatabaseConverter implements DatabaseConverter {
037
038 @Override
039 public void convert(DataSource dataSource) throws Exception {
040 _modelMigrator.migrate(dataSource, getModelClassesName("*"));
041 }
042
043 public void setModelMigrator(ModelMigrator modelMigrator) {
044 _modelMigrator = modelMigrator;
045 }
046
047 protected Class<? extends BaseModel<?>> getImplClass(String implClassName) {
048 try {
049 ClassLoader classLoader = ClassLoaderUtil.getPortalClassLoader();
050
051 return (Class<? extends BaseModel<?>>)classLoader.loadClass(
052 implClassName);
053 }
054 catch (Exception e) {
055 if (_log.isDebugEnabled()) {
056 _log.debug(e, e);
057 }
058 }
059
060
061
062 for (String servletContextName : ServletContextPool.keySet()) {
063 try {
064 ServletContext servletContext = ServletContextPool.get(
065 servletContextName);
066
067 ClassLoader classLoader = servletContext.getClassLoader();
068
069 return (Class<? extends BaseModel<?>>)classLoader.loadClass(
070 implClassName);
071 }
072 catch (Exception e) {
073 if (_log.isDebugEnabled()) {
074 _log.debug(e, e);
075 }
076 }
077 }
078
079 return null;
080 }
081
082 protected List<Class<? extends BaseModel<?>>> getModelClassesName(
083 String regex) {
084
085 List<String> modelNames = ModelHintsUtil.getModels();
086
087 List<Class<? extends BaseModel<?>>> implClassesNames =
088 new ArrayList<>();
089
090 for (String modelName : modelNames) {
091 if (!modelName.contains(".model.")) {
092 continue;
093 }
094
095 String implClassName = modelName.replaceFirst(
096 "(\\.model\\.)(\\p{Upper}.*)", "$1impl.$2Impl");
097
098 if (implClassName.matches(regex)) {
099 Class<? extends BaseModel<?>> implClass = getImplClass(
100 implClassName);
101
102 if (implClass != null) {
103 implClassesNames.add(implClass);
104 }
105 }
106 }
107
108 return implClassesNames;
109 }
110
111 private static final Log _log = LogFactoryUtil.getLog(
112 PortalDatabaseConverter.class);
113
114 private ModelMigrator _modelMigrator;
115
116 }