001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.reef.webserver;
020
021import org.apache.avro.io.DatumWriter;
022import org.apache.avro.io.EncoderFactory;
023import org.apache.avro.io.JsonEncoder;
024import org.apache.avro.specific.SpecificDatumWriter;
025import org.apache.reef.driver.evaluator.EvaluatorDescriptor;
026
027import javax.inject.Inject;
028import java.io.ByteArrayOutputStream;
029import java.io.IOException;
030import java.util.ArrayList;
031import java.util.Date;
032import java.util.List;
033import java.util.Map;
034
035/**
036 * Serializer for Evaluator list.
037 * It is the default implementation for interface EvaluatorListSerializer.
038 */
039public class AvroEvaluatorListSerializer implements EvaluatorListSerializer {
040
041  @Inject
042  AvroEvaluatorListSerializer() {
043  }
044
045  /**
046   * Build AvroEvaluatorList object.
047   */
048  @Override
049  public AvroEvaluatorList toAvro(
050      final Map<String, EvaluatorDescriptor> evaluatorMap,
051      final int totalEvaluators, final String startTime) {
052
053    final List<AvroEvaluatorEntry> evaluatorEntities = new ArrayList<>();
054
055    for (final Map.Entry<String, EvaluatorDescriptor> entry : evaluatorMap.entrySet()) {
056      final EvaluatorDescriptor descriptor = entry.getValue();
057      evaluatorEntities.add(AvroEvaluatorEntry.newBuilder()
058              .setId(entry.getKey())
059              .setName(descriptor.getNodeDescriptor().getName())
060              .build());
061    }
062
063    return AvroEvaluatorList.newBuilder()
064        .setEvaluators(evaluatorEntities)
065        .setTotal(totalEvaluators)
066        .setStartTime(startTime != null ? startTime : new Date().toString())
067        .build();
068  }
069
070  /**
071   * Convert AvroEvaluatorList to JSON string.
072   */
073  @Override
074  public String toString(final AvroEvaluatorList avroEvaluatorList) {
075    final DatumWriter<AvroEvaluatorList> evaluatorWriter = new SpecificDatumWriter<>(AvroEvaluatorList.class);
076    try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
077      final JsonEncoder encoder = EncoderFactory.get().jsonEncoder(avroEvaluatorList.getSchema(), out);
078      evaluatorWriter.write(avroEvaluatorList, encoder);
079      encoder.flush();
080      return out.toString(AvroHttpSerializer.JSON_CHARSET);
081    } catch (final IOException e) {
082      throw new RuntimeException(e);
083    }
084  }
085}