content: /**
   * 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 jakarta.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>");
          }
        }
  
      }
  
    }
  }
  