| /** |
| * 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.avro.reflect; |
| |
| import static org.junit.Assert.*; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.math.BigInteger; |
| import java.nio.ByteBuffer; |
| import java.nio.channels.FileChannel; |
| import java.security.MessageDigest; |
| import java.security.NoSuchAlgorithmException; |
| import java.util.Iterator; |
| |
| import org.apache.avro.AvroTestUtil; |
| import org.apache.avro.Schema; |
| import org.apache.avro.file.DataFileReader; |
| import org.apache.avro.file.DataFileWriter; |
| import org.apache.avro.file.FileReader; |
| import org.apache.avro.file.SeekableByteArrayInput; |
| import org.apache.avro.io.DatumWriter; |
| import org.apache.avro.reflect.ReflectData; |
| import org.apache.avro.reflect.ReflectDatumReader; |
| import org.apache.avro.reflect.ReflectDatumWriter; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class TestByteBuffer { |
| static class X{ |
| String name = ""; |
| ByteBuffer content; |
| } |
| File content; |
| |
| @Before public void before() throws IOException{ |
| File tmpdir = AvroTestUtil.tempDirectory(getClass(), "content"); |
| content = new File(tmpdir,"test-content"); |
| FileOutputStream out = new FileOutputStream(content); |
| for(int i=0;i<100000;i++){ |
| out.write("hello world\n".getBytes()); |
| } |
| out.close(); |
| } |
| |
| @Test public void test() throws Exception{ |
| Schema schema = ReflectData.get().getSchema(X.class); |
| ByteArrayOutputStream bout = new ByteArrayOutputStream(); |
| writeOneXAsAvro(schema, bout); |
| X record = readOneXFromAvro(schema, bout); |
| |
| String expected = getmd5(content); |
| String actual = getmd5(record.content); |
| assertEquals("md5 for result differed from input",expected,actual); |
| } |
| |
| private X readOneXFromAvro(Schema schema, ByteArrayOutputStream bout) |
| throws IOException { |
| SeekableByteArrayInput input = new SeekableByteArrayInput(bout.toByteArray()); |
| ReflectDatumReader<X> datumReader = new ReflectDatumReader<X>(schema); |
| FileReader<X> reader = DataFileReader.openReader(input, datumReader); |
| Iterator<X> it = reader.iterator(); |
| assertTrue("missing first record",it.hasNext()); |
| X record = it.next(); |
| assertFalse("should be no more records - only wrote one out",it.hasNext()); |
| return record; |
| } |
| |
| private void writeOneXAsAvro(Schema schema, ByteArrayOutputStream bout) |
| throws IOException, FileNotFoundException { |
| DatumWriter<X> datumWriter = new ReflectDatumWriter<X>(schema); |
| DataFileWriter<X> writer = new DataFileWriter<X>(datumWriter); |
| writer.create(schema, bout); |
| X x = new X(); |
| x.name = "xxx"; |
| FileInputStream fis = new FileInputStream(content); |
| try{ |
| FileChannel channel = fis.getChannel(); |
| try{ |
| long contentLength = content.length(); |
| //set the content to be a file channel. |
| ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, contentLength); |
| x.content = buffer; |
| writer.append(x); |
| }finally{ |
| channel.close(); |
| } |
| }finally{ |
| fis.close(); |
| } |
| writer.flush(); |
| writer.close(); |
| } |
| |
| private String getmd5(File file) throws Exception{ |
| FileInputStream fis = new FileInputStream(content); |
| try{ |
| FileChannel channel = fis.getChannel(); |
| try{ |
| long contentLength = content.length(); |
| ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, contentLength); |
| return getmd5(buffer); |
| }finally{ |
| channel.close(); |
| } |
| }finally{ |
| fis.close(); |
| } |
| } |
| |
| String getmd5(ByteBuffer buffer) throws NoSuchAlgorithmException{ |
| MessageDigest mdEnc = MessageDigest.getInstance("MD5"); |
| mdEnc.reset(); |
| mdEnc.update(buffer); |
| return new BigInteger(1, mdEnc.digest()).toString(16); |
| } |
| } |