Skip to content

Commit

Permalink
Add ConcreteTypeProperty (#1134)
Browse files Browse the repository at this point in the history
  • Loading branch information
seongahjo authored Dec 30, 2024
1 parent b28ddd7 commit 72a35f4
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 134 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,9 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.annotation.Nullable;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

Expand Down Expand Up @@ -77,39 +73,7 @@ public Annotation[] getDeclaredAnnotations() {
}
};

return new Property() {
@Override
public Type getType() {
return genericAnnotatedType.getType();
}

@Override
public AnnotatedType getAnnotatedType() {
return genericAnnotatedType;
}

@Nullable
@Override
public String getName() {
return property.getName();
}

@Override
public List<Annotation> getAnnotations() {
return Arrays.asList(genericAnnotatedType.getAnnotations());
}

@Override
public <A extends Annotation> Optional<A> getAnnotation(Class<A> annotationClass) {
return Optional.ofNullable(genericAnnotatedType.getAnnotation(annotationClass));
}

@Nullable
@Override
public Object getValue(Object instance) {
return property.getValue(instance);
}
};
return new ConcreteTypeProperty(genericAnnotatedType, property);
})
.collect(Collectors.toList());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* Fixture Monkey
*
* Copyright (c) 2021-present NAVER Corp.
*
* Licensed 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 com.navercorp.fixturemonkey.api.property;

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import javax.annotation.Nullable;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

/**
* A {@link Property} implementation representing a concrete type,
* where the concrete type may be different from the {@code abstractTypeProperty}.
* <p>
* The {@code abstractTypeProperty} is a property of the abstract type that actually resides in the metadata of a class.
* The {@code concreteAnnotatedType} is the annotated type of the concrete type that is resolved as the actual type.
*/
@API(since = "1.1.7", status = Status.EXPERIMENTAL)
public final class ConcreteTypeProperty implements Property {
private final AnnotatedType concreteAnnotatedType;
private final Property abstractTypeProperty;
private final List<Annotation> annotations;

public ConcreteTypeProperty(AnnotatedType concreteAnnotatedType, Property abstractTypeProperty) {
this.concreteAnnotatedType = concreteAnnotatedType;
this.abstractTypeProperty = abstractTypeProperty;
this.annotations = Collections.emptyList();
}

public ConcreteTypeProperty(
AnnotatedType concreteAnnotatedType,
Property abstractTypeProperty,
List<Annotation> annotations
) {
this.concreteAnnotatedType = concreteAnnotatedType;
this.abstractTypeProperty = abstractTypeProperty;
this.annotations = annotations;
}

@Override
public Type getType() {
return concreteAnnotatedType.getType();
}

@Override
public AnnotatedType getAnnotatedType() {
return concreteAnnotatedType;
}

@Nullable
@Override
public String getName() {
return abstractTypeProperty.getName();
}

@Override
public List<Annotation> getAnnotations() {
List<Annotation> concatAnnotations = new ArrayList<>(this.annotations);
concatAnnotations.addAll(Arrays.asList(concreteAnnotatedType.getAnnotations()));
concatAnnotations.addAll(abstractTypeProperty.getAnnotations());
return Collections.unmodifiableList(concatAnnotations);
}

@Nullable
@Override
public Object getValue(Object instance) {
return abstractTypeProperty.getValue(instance);
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
ConcreteTypeProperty that = (ConcreteTypeProperty)obj;
return Objects.equals(concreteAnnotatedType.getType(), that.concreteAnnotatedType.getType())
&& Objects.equals(abstractTypeProperty, that.abstractTypeProperty)
&& Objects.equals(annotations, that.annotations);
}

@Override
public int hashCode() {
return Objects.hash(concreteAnnotatedType.getType(), abstractTypeProperty, annotations);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,9 @@

import static com.navercorp.fixturemonkey.api.type.Types.generateAnnotatedTypeWithoutAnnotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Nullable;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

Expand All @@ -42,34 +37,10 @@ public InterfaceCandidateConcretePropertyResolver(List<Class<? extends T>> imple
@Override
public List<Property> resolve(Property property) {
return implementations.stream()
.map(implementation -> new Property() {
@Override
public Type getType() {
return implementation;
}

@Override
public AnnotatedType getAnnotatedType() {
return generateAnnotatedTypeWithoutAnnotation(implementation);
}

@Nullable
@Override
public String getName() {
return property.getName();
}

@Override
public List<Annotation> getAnnotations() {
return property.getAnnotations();
}

@Nullable
@Override
public Object getValue(Object instance) {
return property.getValue(instance);
}
})
.map(implementation -> new ConcreteTypeProperty(
generateAnnotatedTypeWithoutAnnotation(implementation),
property
))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,18 @@

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

import com.navercorp.fixturemonkey.api.property.CandidateConcretePropertyResolver;
import com.navercorp.fixturemonkey.api.property.ConcreteTypeProperty;
import com.navercorp.fixturemonkey.api.property.ContainerElementProperty;
import com.navercorp.fixturemonkey.api.property.Property;
import com.navercorp.fixturemonkey.api.type.Types;
Expand All @@ -61,35 +59,7 @@ public List<Property> resolve(Property property) {
List<Annotation> annotations = new ArrayList<>(property.getAnnotations());
annotations.add(jsonTypeInfo);

Property actualProperty = new Property() {
@Override
public Type getType() {
return type;
}

@Override
public AnnotatedType getAnnotatedType() {
return annotatedType;
}

@Nullable
@Override
public String getName() {
return property.getName();
}

@Override
public List<Annotation> getAnnotations() {
return Collections.unmodifiableList(annotations);
}

@Nullable
@Override
public Object getValue(Object instance) {
return property.getValue(instance);
}
};

Property actualProperty = new ConcreteTypeProperty(annotatedType, property, annotations);
return Collections.singletonList(actualProperty);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,18 @@

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

import com.navercorp.fixturemonkey.api.property.CandidateConcretePropertyResolver;
import com.navercorp.fixturemonkey.api.property.ConcreteTypeProperty;
import com.navercorp.fixturemonkey.api.property.Property;
import com.navercorp.fixturemonkey.api.type.Types;

Expand All @@ -58,35 +56,7 @@ public List<Property> resolve(Property property) {
List<Annotation> annotations = new ArrayList<>(property.getAnnotations());
annotations.add(jsonTypeInfo);

Property actualProperty = new Property() {
@Override
public Type getType() {
return type;
}

@Override
public AnnotatedType getAnnotatedType() {
return annotatedType;
}

@Nullable
@Override
public String getName() {
return property.getName();
}

@Override
public List<Annotation> getAnnotations() {
return Collections.unmodifiableList(annotations);
}

@Nullable
@Override
public Object getValue(Object instance) {
return property.getValue(instance);
}
};

Property actualProperty = new ConcreteTypeProperty(annotatedType, property, annotations);
return Collections.singletonList(actualProperty);
}
}

0 comments on commit 72a35f4

Please sign in to comment.