001
014
015 package com.liferay.portal.convert;
016
017 import com.liferay.portal.image.DatabaseHook;
018 import com.liferay.portal.image.HookFactory;
019 import com.liferay.portal.kernel.cache.CacheRegistryUtil;
020 import com.liferay.portal.kernel.dao.db.DB;
021 import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
022 import com.liferay.portal.kernel.image.Hook;
023 import com.liferay.portal.kernel.log.Log;
024 import com.liferay.portal.kernel.log.LogFactoryUtil;
025 import com.liferay.portal.kernel.search.Indexer;
026 import com.liferay.portal.kernel.util.FileUtil;
027 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
028 import com.liferay.portal.kernel.util.PropsKeys;
029 import com.liferay.portal.kernel.util.StringBundler;
030 import com.liferay.portal.kernel.util.StringPool;
031 import com.liferay.portal.model.Image;
032 import com.liferay.portal.service.ImageLocalServiceUtil;
033 import com.liferay.portal.util.MaintenanceUtil;
034 import com.liferay.portal.util.PropsValues;
035
036 import java.io.InputStream;
037
038 import java.util.List;
039
040
043 public class ConvertImageGallery extends ConvertProcess {
044
045 public String getDescription() {
046 return "migrate-images-from-one-repository-to-another";
047 }
048
049 public String getParameterDescription() {
050 return "please-select-a-new-repository-hook";
051 }
052
053 public String[] getParameterNames() {
054 StringBundler sb = new StringBundler(_HOOKS.length * 2 + 2);
055
056 sb.append(PropsKeys.IMAGE_HOOK_IMPL);
057 sb.append(StringPool.EQUAL);
058
059 for (String hook : _HOOKS) {
060 if (!hook.equals(PropsValues.IMAGE_HOOK_IMPL)) {
061 sb.append(hook);
062 sb.append(StringPool.SEMICOLON);
063 }
064 }
065
066 return new String[] {sb.toString()};
067 }
068
069 public boolean isEnabled() {
070 return true;
071 }
072
073 protected void doConvert() throws Exception {
074 boolean cacheRegistryActive = CacheRegistryUtil.isActive();
075
076 try {
077 CacheRegistryUtil.setActive(false);
078
079 _sourceHook = HookFactory.getInstance();
080
081 String[] values = getParameterValues();
082
083 String targetHookClassName = values[0];
084
085 ClassLoader classLoader = PortalClassLoaderUtil.getClassLoader();
086
087 _targetHook = (Hook)classLoader.loadClass(
088 targetHookClassName).newInstance();
089
090 migrateImages();
091
092 HookFactory.setInstance(_targetHook);
093
094 MaintenanceUtil.appendStatus(
095 "Please set " + PropsKeys.IMAGE_HOOK_IMPL +
096 " in your portal-ext.properties to use " +
097 targetHookClassName);
098
099 if (_sourceHook instanceof DatabaseHook) {
100 DB db = DBFactoryUtil.getDB();
101
102 db.runSQL("update Image set text_ = \"\"");
103 }
104
105 PropsValues.IMAGE_HOOK_IMPL = targetHookClassName;
106 }
107 finally {
108 CacheRegistryUtil.setActive(cacheRegistryActive);
109 }
110 }
111
112 protected void migrateImage(Image image) throws Exception {
113 try {
114 InputStream is = _sourceHook.getImageAsStream(image);
115
116 byte[] bytes = FileUtil.getBytes(is);
117
118 _targetHook.updateImage(image, image.getType(), bytes);
119
120 if (_targetHook instanceof DatabaseHook) {
121 ImageLocalServiceUtil.updateImage(image, false);
122 }
123 }
124 catch (Exception e) {
125 _log.error("Migration failed for " + image.getImageId(), e);
126 }
127 }
128
129 protected void migrateImages() throws Exception {
130 int count = ImageLocalServiceUtil.getImagesCount();
131 int pages = count / Indexer.DEFAULT_INTERVAL;
132
133 MaintenanceUtil.appendStatus("Migrating " + count + " images");
134
135 for (int i = 0; i <= pages; i++) {
136 int start = (i * Indexer.DEFAULT_INTERVAL);
137 int end = start + Indexer.DEFAULT_INTERVAL;
138
139 List<Image> images = ImageLocalServiceUtil.getImages(start, end);
140
141 for (Image image : images) {
142 migrateImage(image);
143 }
144 }
145 }
146
147 private static final String[] _HOOKS = new String[] {
148 "com.liferay.portal.image.DatabaseHook",
149 "com.liferay.portal.image.DLHook",
150 "com.liferay.portal.image.FileSystemHook"
151 };
152
153 private static Log _log = LogFactoryUtil.getLog(ConvertImageGallery.class);
154
155 private Hook _sourceHook;
156 private Hook _targetHook;
157
158 }