001/*
002 * Copyright (c) 2016-2017 Chris K Wensel <chris@wensel.net>. All Rights Reserved.
003 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
004 *
005 * Project and contact information: http://www.cascading.org/
006 *
007 * This file is part of the Cascading project.
008 *
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *     http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 */
021
022package cascading.tuple.hadoop;
023
024import java.lang.annotation.ElementType;
025import java.lang.annotation.Retention;
026import java.lang.annotation.RetentionPolicy;
027import java.lang.annotation.Target;
028
029/**
030 * Annotation SerializationToken enables {@link cascading.tuple.io.TupleInputStream} and {@link cascading.tuple.io.TupleOutputStream}
031 * to substitute Integer values for a class name when writing out nested objects inside a {@link cascading.tuple.Tuple}.
032 * <p>
033 * To use, add this annotation to any custom Hadoop {@link org.apache.hadoop.io.serializer.Serialization} implementation.
034 * <p>
035 * For example:<br>
036 * <pre>
037 * &#64;SerializationToken(tokens={222, 223}, classNames = {"example.PersonObject", "example.SiteObject"})
038 * public class MySerialization implements org.apache.hadoop.io.serializer.Serialization
039 * {
040 * public MySerialization()
041 * {
042 * ...
043 * }
044 * ...
045 * }
046 * </pre>
047 * <p>
048 * The SerializationToken annotation allows for multiple token to className mappings, since a Serialization implementation may
049 * {@link org.apache.hadoop.io.serializer.Serialization#accept(Class)} more than one class.
050 * <p>
051 * Note that the token integer value must be 128 or greater to save room for internal types.
052 *
053 * @see cascading.tuple.io.TupleInputStream
054 * @see cascading.tuple.io.TupleOutputStream
055 * @see TupleSerialization
056 */
057@Retention(RetentionPolicy.RUNTIME)
058@Target(ElementType.TYPE)
059public @interface SerializationToken
060  {
061  int[] tokens();
062
063  String[] classNames();
064  }