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

net.digitalid.utility.freezable.annotations.Frozen Maven / Gradle / Ivy

The newest version!
package net.digitalid.utility.freezable.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.annotation.Nonnull;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;

import net.digitalid.utility.annotations.method.Pure;
import net.digitalid.utility.annotations.ownership.NonCaptured;
import net.digitalid.utility.annotations.parameter.Modified;
import net.digitalid.utility.freezable.ReadOnlyInterface;
import net.digitalid.utility.functional.iterables.FiniteIterable;
import net.digitalid.utility.processing.utility.TypeImporter;
import net.digitalid.utility.validation.annotations.meta.ValueValidator;
import net.digitalid.utility.validation.annotations.type.Stateless;
import net.digitalid.utility.validation.contract.Contract;
import net.digitalid.utility.validation.validator.ValueAnnotationValidator;

/**
 * This annotation indicates that a freezable object is {@link ReadOnlyInterface#isFrozen() frozen}.
 * 
 * @see NonFrozen
 * @see ReadOnlyInterface
 */
@Documented
@Target({ElementType.TYPE_USE, ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
@ValueValidator(Frozen.Validator.class)
public @interface Frozen {
    
    /* -------------------------------------------------- Validator -------------------------------------------------- */
    
    /**
     * This class checks the use of and generates the contract for the surrounding annotation.
     */
    @Stateless
    public static class Validator implements ValueAnnotationValidator {
        
        private static final @Nonnull FiniteIterable<@Nonnull Class> targetTypes = FiniteIterable.of(ReadOnlyInterface.class);
        
        @Pure
        @Override
        public @Nonnull FiniteIterable<@Nonnull Class> getTargetTypes() {
            return targetTypes;
        }
        
        @Pure
        @Override
        public @Nonnull Contract generateContract(@Nonnull Element element, @Nonnull AnnotationMirror annotationMirror, @NonCaptured @Modified @Nonnull TypeImporter typeImporter) {
            return Contract.with("# == null || #.isFrozen()", "The # has to be null or frozen.", element);
        }
        
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy