diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2014-04-01 18:14:22 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2014-04-01 18:23:46 -0400 |
commit | 6bc45fd509a55b0b003a4e004335ac2d3e91377d (patch) | |
tree | ffbc824eeb23ebac693ca7c2035b852b39212515 /sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java | |
download | sangria-6bc45fd509a55b0b003a4e004335ac2d3e91377d.tar.xz |
Add sangria-core module.
Diffstat (limited to 'sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java')
-rw-r--r-- | sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java b/sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java new file mode 100644 index 0000000..bfdfe6b --- /dev/null +++ b/sangria-core/src/main/java/com/tavianator/sangria/core/UniqueAnnotations.java @@ -0,0 +1,97 @@ +/********************************************************************* + * Sangria * + * Copyright (C) 2014 Tavian Barnes <tavianator@tavianator.com> * + * * + * This library is free software. It comes without any warranty, to * + * the extent permitted by applicable law. You can redistribute it * + * and/or modify it under the terms of the Do What The Fuck You Want * + * To Public License, Version 2, as published by Sam Hocevar. See * + * the COPYING file or http://www.wtfpl.net/ for more details. * + *********************************************************************/ + +package com.tavianator.sangria.core; + +import java.lang.annotation.Annotation; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.concurrent.atomic.AtomicLong; +import javax.inject.Qualifier; + +import com.google.common.annotations.VisibleForTesting; + +/** + * Re-implementation of Guice's internal UniqueAnnotations utility. + * + * @author Tavian Barnes (tavianator@tavianator.com) + * @version 1.0 + * @since 1.0 + */ +public class UniqueAnnotations { + private static final AtomicLong SEQUENCE = new AtomicLong(); + + private UniqueAnnotations() { + // Not for instantiating + } + + @Retention(RetentionPolicy.RUNTIME) + @Qualifier + @VisibleForTesting + @interface UniqueAnnotation { + long value(); + } + + /** + * Actual implementation of {@link UniqueAnnotation}. + */ + @SuppressWarnings("ClassExplicitlyAnnotation") + private static class UniqueAnnotationImpl implements UniqueAnnotation { + private final long value; + + UniqueAnnotationImpl(long value) { + this.value = value; + } + + @Override + public long value() { + return value; + } + + public Class<? extends Annotation> annotationType() { + return UniqueAnnotation.class; + } + + @Override + public String toString() { + return "@" + UniqueAnnotation.class.getName() + "(value=" + value + ")"; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else if (!(obj instanceof UniqueAnnotation)) { + return false; + } + + UniqueAnnotation other = (UniqueAnnotation)obj; + return value == other.value(); + } + + @Override + public int hashCode() { + return (127*"value".hashCode()) ^ Long.valueOf(value).hashCode(); + } + } + + /** + * @return An {@link Annotation} that will be unequal to every other annotation. + */ + public static Annotation create() { + return create(SEQUENCE.getAndIncrement()); + } + + @VisibleForTesting + static Annotation create(long value) { + return new UniqueAnnotationImpl(value); + } +} |