001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
041     * @author Alexander Chow
042     */
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    }