/*
 * Copyright 2017 The Mifos Initiative.
 *
 * Licensed 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 io.mifos.deposit.service.internal.mapper;

import io.mifos.deposit.api.v1.definition.domain.Action;
import io.mifos.deposit.service.internal.repository.ActionEntity;

public class ActionMapper {

  private ActionMapper() {
    super();
  }

  public static Action map(final ActionEntity actionEntity) {
    final Action action = new Action();
    action.setIdentifier(actionEntity.getIdentifier());
    action.setName(actionEntity.getName());
    action.setDescription(actionEntity.getDescription());
    action.setTransactionType(actionEntity.getTransactionType());

    return action;
  }

  public static ActionEntity map(final Action action) {
    final ActionEntity actionEntity = new ActionEntity();
    actionEntity.setIdentifier(action.getIdentifier());
    actionEntity.setName(action.getName());
    actionEntity.setDescription(action.getDescription());
    actionEntity.setTransactionType(action.getTransactionType());

    return actionEntity;
  }
}
