001/* -*- mode: Java; c-basic-offset: 2; indent-tabs-mode: nil; coding: utf-8-unix -*- 002 * 003 * Copyright © 2018 microBean. 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 014 * implied. See the License for the specific language governing 015 * permissions and limitations under the License. 016 */ 017package org.microbean.kubernetes.controller.cdi.annotation; 018 019import java.lang.annotation.Documented; 020import java.lang.annotation.ElementType; 021import java.lang.annotation.Retention; 022import java.lang.annotation.RetentionPolicy; 023import java.lang.annotation.Target; 024 025import javax.inject.Qualifier; 026 027import javax.enterprise.util.AnnotationLiteral; 028 029/** 030 * A {@link Qualifier} that can be used only on an observer method's 031 * <a 032 * href="http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#observer_method_event_parameter">event 033 * parameter</a> that is also annotated with an annotation annotated 034 * with {@link KubernetesEventSelector}, thus indicating that the 035 * observer method is interested in being notified of the 036 * <em>addition</em> of certain Kubernetes resources. 037 * 038 * @author <a href="https://about.me/lairdnelson" 039 * target="_parent">Laird Nelson</a> 040 * 041 * @see KubernetesEventSelector 042 */ 043@Documented 044@Qualifier 045@Retention(value = RetentionPolicy.RUNTIME) 046@Target({ ElementType.PARAMETER }) 047public @interface Added { 048 049 /** 050 * Whether the observer method should be notified in the case of 051 * <em>synchronization events</em>. 052 * 053 * @return true if the observer method should be notified in the case of 054 * <em>synchronization events</em>, {@code false} otherwise 055 */ 056 boolean synchronization() default false; 057 058 059 /* 060 * Inner and nested classes. 061 */ 062 063 064 /** 065 * An {@link AnnotationLiteral} that implements {@link Added}. 066 * 067 * @author <a href="https://about.me/lairdnelson" 068 * target="_parent">Laird Nelson</a> 069 */ 070 public static final class Literal extends AnnotationLiteral<Added> implements Added { 071 072 073 /* 074 * Static fields. 075 */ 076 077 078 private static final long serialVersionUID = 1L; 079 080 private static final Added WITH_SYNCHRONIZATION = new Literal(true); 081 082 private static final Added WITHOUT_SYNCHRONIZATION = new Literal(false); 083 084 085 /* 086 * Instance fields. 087 */ 088 089 090 private final boolean synchronization; 091 092 093 /* 094 * Constructors. 095 */ 096 097 098 private Literal(final boolean synchronization) { 099 super(); 100 this.synchronization = synchronization; 101 } 102 103 104 /* 105 * Instance methods. 106 */ 107 108 109 /** 110 * Whether the observer method should be notified in the case of 111 * <em>synchronization events</em>. 112 * 113 * @return true if the observer method should be notified in the case of 114 * <em>synchronization events</em>, {@code false} otherwise 115 */ 116 @Override 117 public final boolean synchronization() { 118 return this.synchronization; 119 } 120 121 122 /* 123 * Static methods. 124 */ 125 126 127 /** 128 * Returns an {@link Added} instance whose {@link 129 * #synchronization() synchronization} element is {@code true}. 130 * 131 * <p>This method never returns {@code null}.</p> 132 * 133 * @return a non-{@code null} {@link Added} 134 */ 135 public static Added withSynchronization() { 136 return WITH_SYNCHRONIZATION; 137 } 138 139 /** 140 * Returns an {@link Added} instance whose {@link 141 * #synchronization() synchronization} element is {@code false}. 142 * 143 * <p>This method never returns {@code null}.</p> 144 * 145 * @return a non-{@code null} {@link Added} 146 */ 147 public static Added withoutSynchronization() { 148 return WITHOUT_SYNCHRONIZATION; 149 } 150 151 } 152 153}