/**
 * 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.server.controller.internal;

import org.apache.ambari.server.controller.spi.SortRequest;
import org.apache.ambari.server.controller.spi.SortRequestProperty;
import java.util.ArrayList;
import java.util.List;

public class SortRequestImpl implements SortRequest {
  List<SortRequestProperty> properties;

  public SortRequestImpl(List<SortRequestProperty> properties) {
    this.properties = properties;
  }

  @Override
  public List<SortRequestProperty> getProperties() {
    return properties;
  }

  @Override
  public List<String> getPropertyIds() {
    List<String> propertyIds = new ArrayList<String>();
    for (SortRequestProperty property : properties) {
      propertyIds.add(property.getPropertyId());
    }
    return propertyIds;
  }

  @Override
  public String toString() {
    return "SortRequestImpl{" +
      "properties=" + properties +
      '}';
  }
}
