All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.microsoft.reef.io.storage.FramingTupleSerializer Maven / Gradle / Ivy

There is a newer version: 0.9
Show newest version
/**
 * Copyright (C) 2013 Microsoft Corporation
 *
 * 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 com.microsoft.reef.io.storage;

import com.microsoft.reef.exception.evaluator.ServiceException;
import com.microsoft.reef.exception.evaluator.StorageException;
import com.microsoft.reef.io.Accumulable;
import com.microsoft.reef.io.Accumulator;
import com.microsoft.reef.io.Tuple;
import com.microsoft.reef.io.serialization.Serializer;

import java.io.IOException;
import java.io.OutputStream;

public class FramingTupleSerializer implements
    Serializer, OutputStream> {

  private final Serializer keySerializer;
  private final Serializer valSerializer;

  public FramingTupleSerializer(
      final Serializer keySerializer,
      final Serializer valSerializer) {
    this.keySerializer = keySerializer;
    this.valSerializer = valSerializer;
  }
      
  @Override
  public Accumulable> create(final OutputStream os) {
    final FramingOutputStream faos = new FramingOutputStream(os);
      
    return new Accumulable>() {

      @Override
      public Accumulator> accumulator() throws ServiceException {

        final Accumulator keyAccumulator = keySerializer.create(faos)
            .accumulator();
        final Accumulator valAccumulator = valSerializer.create(faos)
            .accumulator();
        return new Accumulator>() {
          boolean first = true;
          @Override
          public void add(Tuple datum) throws ServiceException {
            if(!first) {
                faos.nextFrame();
            }
            first = false;
            keyAccumulator.add(datum.getKey());
            faos.nextFrame();
            valAccumulator.add(datum.getValue());
          }

          @Override
          public void close() throws ServiceException {
            try {
              keyAccumulator.close();
              valAccumulator.close();
              faos.close();
            } catch (IOException e) {
              throw new StorageException(e);
            }
          }
        };
      }
    };
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy