| /******************************************************************************* |
| * Copyright (c) 2010-2014 SAP AG and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.skalli.commands; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.List; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.eclipse.osgi.framework.console.CommandInterpreter; |
| import org.eclipse.skalli.commons.UUIDUtils; |
| import org.eclipse.skalli.services.Services; |
| import org.eclipse.skalli.services.persistence.PersistenceService; |
| import org.eclipse.skalli.services.persistence.StorageService; |
| import org.osgi.framework.Constants; |
| |
| public class StorageCommand { |
| public static void copy(String sourceType, String destType, String category, CommandInterpreter intr) { |
| StorageService source = null; |
| StorageService destination = null; |
| |
| try { |
| source = getStorageService(sourceType); |
| destination = getStorageService(destType); |
| } catch (IllegalStateException e) { |
| intr.println("ERROR: more than one'" + StorageService.class.getSimpleName() + "' found."); |
| intr.printStackTrace(e); |
| return; |
| } |
| |
| if (source == null) { |
| intr.println("ERROR: no '" + StorageService.class.getSimpleName() + "' found with type '" + sourceType |
| + "'"); |
| return; |
| } |
| |
| if (destination == null) { |
| intr.println("ERROR: no '" + StorageService.class.getSimpleName() + "' found with type '" + destType + "'"); |
| return; |
| } |
| |
| copy(source, destination, category, intr); |
| |
| // ensure that the persistence service attached to the destination storage |
| // refreshes all caches and reloads the entities |
| Services.getRequiredService(PersistenceService.class).refreshAll(); |
| } |
| |
| static void copy(StorageService source, StorageService destination, String category, CommandInterpreter intr) { |
| List<String> keys; |
| try { |
| keys = source.keys(category); |
| } catch (IOException e) { |
| intr.printStackTrace(e); |
| return; |
| } |
| if (keys == null || keys.size() == 0) { |
| intr.println("No data for category '" + category + "' found. Nothing to copy."); |
| return; |
| } |
| |
| int copiedRecords = 0; |
| StringBuffer noUUIDKeys = new StringBuffer(); |
| for (String key : keys) { |
| InputStream blob = null; |
| try { |
| blob = source.read(category, key); |
| // only copy records with valid uuids, expect for customization (these are "normal" strings!) |
| if (UUIDUtils.isUUID(key) || "customization".equalsIgnoreCase(category)) { |
| destination.write(category, key, blob); |
| copiedRecords++; |
| if ((copiedRecords % 10) == 0) { |
| intr.println(copiedRecords + " data copied for category '" + category + "'."); |
| } |
| } else { |
| noUUIDKeys.append("'"); |
| noUUIDKeys.append(key); |
| noUUIDKeys.append("';"); |
| } |
| } catch (IOException e) { |
| intr.printStackTrace(e); |
| } finally { |
| IOUtils.closeQuietly(blob); |
| } |
| } |
| |
| intr.println(copiedRecords + " data records of category '" + category |
| + "' successfully copied from source with " |
| + keys.size() + " records."); |
| if (copiedRecords != keys.size()) { |
| intr.println("Warning: could not copy " + (keys.size() - copiedRecords) + " record(s). This are: " |
| + noUUIDKeys); |
| } |
| } |
| |
| /** |
| * @param sourceType |
| * @return |
| */ |
| private static StorageService getStorageService(String type) { |
| String filter = "(&(" + Constants.OBJECTCLASS + "=" + StorageService.class.getName() + ")(storageService.type=" + type + "))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| StorageService service = Services.getService(StorageService.class, filter); |
| return service; |
| } |
| } |