/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ambari.view.phonelist; import org.apache.ambari.view.*; import org.apache.ambari.view.migration.EntityConverter; import org.apache.ambari.view.migration.ViewDataMigrationContext; import org.apache.ambari.view.migration.ViewDataMigrationException; import org.apache.ambari.view.migration.ViewDataMigrator; import org.springframework.beans.BeanUtils; import javax.inject.Inject; import java.util.Map; /** * Class responsible for migration from previous version (phone-list-view example) */ public class DataMigrator implements ViewDataMigrator { /** * The view context of target migration instance. */ @Inject private ViewContext viewContext; /** * The migration context. */ @Inject private ViewDataMigrationContext migrationContext; /** * Called by the framework before migration. * Supports only migration from version 1.0.0, so we cancel migration * if the origin version is not 0. * * @return true if migration started against the instance with data version "0" */ @Override public boolean beforeMigration() { return migrationContext.getOriginDataVersion() == 0; } /** * Called by the framework after migration. */ @Override public void afterMigration() { } /** * Migrate a single persistence entity. * * @param originEntityClass class object of origin (migration source) instance * @param currentEntityClass class object of current (migration target) instance */ @Override public void migrateEntity(Class originEntityClass, Class currentEntityClass) throws ViewDataMigrationException { if (currentEntityClass == PhoneUser.class) { migrationContext.copyAllObjects(originEntityClass, currentEntityClass, new PhoneUserConverter()); } else { migrationContext.copyAllObjects(originEntityClass, currentEntityClass); } } /** * Migrate instance data by adding surname. */ @Override public void migrateInstanceData() { for (Map.Entry<String, Map<String, String>> userData : migrationContext.getOriginInstanceDataByUser().entrySet()) { for (Map.Entry<String, String> entry : userData.getValue().entrySet()) { String newValue = String.format("<no surname>;%s", entry.getValue()); migrationContext.putCurrentInstanceData(userData.getKey(), entry.getKey(), newValue); } } } /** * The entity converter class responsible of converting PhoneUser data. */ private static class PhoneUserConverter implements EntityConverter { /** * Adds surname to the new version of PhoneData. If original user name * contained several words, last word is used as surname. * * @param orig a single origin entity object. * @param dest an empty object of current persistence entity class. */ @Override public void convert(Object orig, Object dest) { PhoneUser destPhone = (PhoneUser) dest; BeanUtils.copyProperties(orig, dest); if (destPhone.getName() == null) { destPhone.setSurname("<no surname>"); } else { String[] parts = destPhone.getName().split(" "); if (parts.length > 1) { destPhone.setSurname(parts[parts.length - 1]); } else { destPhone.setSurname("<no surname>"); } } } } }