Skip to content

Commit bb236ec

Browse files
author
Suszyński Krzysztof
committed
Merge branch 'release/1.0.1'
2 parents a9b8ea3 + 45c65a0 commit bb236ec

19 files changed

Lines changed: 306 additions & 69 deletions

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>pl.wavesoftware.utils</groupId>
66
<artifactId>stringify-object</artifactId>
7-
<version>1.0.0</version>
7+
<version>1.0.1</version>
88
<packaging>jar</packaging>
99

1010
<name>Stringify Object for Java</name>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package pl.wavesoftware.utils.stringify.configuration;
22

3-
import java.lang.reflect.Field;
3+
import pl.wavesoftware.utils.stringify.lang.Predicate;
44

55
/**
66
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
77
* @since 27.04.18
88
*/
9-
public final class AlwaysTruePredicate implements Predicate<Field> {
9+
public final class AlwaysTruePredicate implements Predicate<InspectionPoint> {
1010
@Override
11-
public boolean test(Field field) {
11+
public boolean test(InspectionPoint inspectionPoint) {
1212
return true;
1313
}
1414
}

src/main/java/pl/wavesoftware/utils/stringify/configuration/DoNotInspect.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package pl.wavesoftware.utils.stringify.configuration;
22

3+
import pl.wavesoftware.utils.stringify.lang.Predicate;
4+
35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
57
import java.lang.annotation.RetentionPolicy;
68
import java.lang.annotation.Target;
7-
import java.lang.reflect.Field;
89

910
/**
1011
* When running in {@link Mode#PROMISCUOUS} this annotation can be used to exclude a
@@ -22,5 +23,5 @@
2223
*
2324
* @return a class of predicate to be used to determine if field should not be inspected
2425
*/
25-
Class<? extends Predicate<Field>> conditionally() default AlwaysTruePredicate.class;
26+
Class<? extends Predicate<InspectionPoint>> conditionally() default AlwaysTruePredicate.class;
2627
}

src/main/java/pl/wavesoftware/utils/stringify/configuration/Inspect.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package pl.wavesoftware.utils.stringify.configuration;
22

3+
import pl.wavesoftware.utils.stringify.lang.Predicate;
4+
35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
57
import java.lang.annotation.RetentionPolicy;
68
import java.lang.annotation.Target;
7-
import java.lang.reflect.Field;
89

910
/**
1011
* If {@link Mode} is set to {@link Mode#QUIET} (by default), this annotation
@@ -24,5 +25,5 @@
2425
*
2526
* @return a class of predicate to be used to determine if field should be inspected
2627
*/
27-
Class<? extends Predicate<Field>> conditionally() default AlwaysTruePredicate.class;
28+
Class<? extends Predicate<InspectionPoint>> conditionally() default AlwaysTruePredicate.class;
2829
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package pl.wavesoftware.utils.stringify.configuration;
2+
3+
import pl.wavesoftware.utils.stringify.lang.Supplier;
4+
5+
import java.lang.reflect.Field;
6+
7+
/**
8+
* This interface represents a inspection point in some object.
9+
*
10+
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
11+
* @since 30.04.18
12+
*/
13+
public interface InspectionPoint {
14+
/**
15+
* Get field representation of inspection point
16+
* @return a field
17+
*/
18+
Field getField();
19+
20+
/**
21+
* Get object that contains this inspection point
22+
* @return an object
23+
*/
24+
Object getContainingObject();
25+
26+
/**
27+
* Get a field value supplier
28+
*
29+
* @return a supplier of a field value
30+
*/
31+
Supplier<Object> getValueSupplier();
32+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package pl.wavesoftware.utils.stringify.impl;
22

3-
import java.lang.reflect.Field;
3+
import pl.wavesoftware.utils.stringify.configuration.InspectionPoint;
44

55
/**
66
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
77
* @since 27.04.18
88
*/
99
interface InspectFieldPredicate {
10-
boolean shouldInspect(Field field);
10+
boolean shouldInspect(InspectionPoint inspectionPoint);
1111
}

src/main/java/pl/wavesoftware/utils/stringify/impl/InspectingFieldFactory.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package pl.wavesoftware.utils.stringify.impl;
22

33
import lombok.RequiredArgsConstructor;
4+
import pl.wavesoftware.utils.stringify.configuration.BeanFactory;
45
import pl.wavesoftware.utils.stringify.configuration.DisplayNull;
6+
import pl.wavesoftware.utils.stringify.configuration.InspectionPoint;
57
import pl.wavesoftware.utils.stringify.configuration.Mode;
6-
import pl.wavesoftware.utils.stringify.configuration.BeanFactory;
7-
8-
import java.lang.reflect.Field;
98

109
/**
1110
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
@@ -15,9 +14,9 @@
1514
final class InspectingFieldFactory {
1615
private final Mode mode;
1716

18-
InspectingField create(Field field,
17+
InspectingField create(InspectionPoint inspectionPoint,
1918
BeanFactory beanFactory) {
20-
return new InspectingFieldImpl(field, createPredicate(beanFactory));
19+
return new InspectingFieldImpl(inspectionPoint, createPredicate(beanFactory));
2120
}
2221

2322
private InspectFieldPredicate createPredicate(BeanFactory beanFactory) {
@@ -30,21 +29,23 @@ private InspectFieldPredicate createPredicate(BeanFactory beanFactory) {
3029

3130
@RequiredArgsConstructor
3231
private class InspectingFieldImpl implements InspectingField {
33-
private final Field field;
32+
private final InspectionPoint inspectionPoint;
3433
private final InspectFieldPredicate predicate;
3534

3635
@Override
3736
public boolean shouldInspect() {
38-
return technically() && predicate.shouldInspect(field);
37+
return technically() && predicate.shouldInspect(inspectionPoint);
3938
}
4039

4140
private boolean technically() {
42-
return !field.isEnumConstant() && !field.isSynthetic();
41+
return !inspectionPoint.getField().isEnumConstant()
42+
&& !inspectionPoint.getField().isSynthetic();
4343
}
4444

4545
@Override
4646
public boolean showNull() {
47-
DisplayNull displayNull = field.getAnnotation(DisplayNull.class);
47+
DisplayNull displayNull = inspectionPoint.getField()
48+
.getAnnotation(DisplayNull.class);
4849
if (displayNull != null) {
4950
return displayNull.value();
5051
} else {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package pl.wavesoftware.utils.stringify.impl;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
import pl.wavesoftware.eid.utils.EidPreconditions;
6+
import pl.wavesoftware.utils.stringify.configuration.InspectionPoint;
7+
import pl.wavesoftware.utils.stringify.lang.Supplier;
8+
9+
import javax.annotation.Nonnull;
10+
import java.lang.reflect.Field;
11+
12+
import static pl.wavesoftware.eid.utils.EidPreconditions.tryToExecute;
13+
14+
/**
15+
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
16+
* @since 30.04.18
17+
*/
18+
@Getter
19+
@RequiredArgsConstructor
20+
final class InspectionPointImpl implements InspectionPoint {
21+
private final Field field;
22+
private final Object containingObject;
23+
24+
@Override
25+
public Supplier<Object> getValueSupplier() {
26+
return new Supplier<Object>() {
27+
@Override
28+
public Object get() {
29+
try (final FieldAccessiblier accessiblier = new FieldAccessiblier(getField())) {
30+
return tryToExecute(new EidPreconditions.UnsafeSupplier<Object>() {
31+
@Override
32+
@Nonnull
33+
public Object get() throws IllegalAccessException {
34+
return accessiblier
35+
.getField()
36+
.get(getContainingObject());
37+
}
38+
}, "20180430:113514");
39+
}
40+
}
41+
};
42+
}
43+
44+
private static final class FieldAccessiblier implements AutoCloseable {
45+
@Getter
46+
private final Field field;
47+
private final boolean accessible;
48+
49+
private FieldAccessiblier(Field field) {
50+
this.field = field;
51+
this.accessible = ensureAccessible(field);
52+
}
53+
54+
@Override
55+
public void close() {
56+
if (!accessible) {
57+
field.setAccessible(false);
58+
}
59+
}
60+
61+
private static boolean ensureAccessible(Field field) {
62+
boolean ret = field.isAccessible();
63+
if (!ret) {
64+
field.setAccessible(true);
65+
}
66+
return ret;
67+
}
68+
}
69+
}

src/main/java/pl/wavesoftware/utils/stringify/impl/PromiscuousInspectFieldPredicate.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
import lombok.AccessLevel;
44
import lombok.RequiredArgsConstructor;
55
import pl.wavesoftware.utils.stringify.configuration.AlwaysTruePredicate;
6+
import pl.wavesoftware.utils.stringify.configuration.BeanFactory;
67
import pl.wavesoftware.utils.stringify.configuration.DoNotInspect;
78
import pl.wavesoftware.utils.stringify.configuration.Inspect;
8-
import pl.wavesoftware.utils.stringify.configuration.Predicate;
9-
import pl.wavesoftware.utils.stringify.configuration.BeanFactory;
10-
11-
import java.lang.reflect.Field;
9+
import pl.wavesoftware.utils.stringify.configuration.InspectionPoint;
10+
import pl.wavesoftware.utils.stringify.lang.Predicate;
1211

1312
/**
1413
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
@@ -19,28 +18,30 @@ final class PromiscuousInspectFieldPredicate implements InspectFieldPredicate {
1918
private final BeanFactory beanFactory;
2019

2120
@Override
22-
public boolean shouldInspect(Field field) {
23-
DoNotInspect doNotInspect = field.getAnnotation(DoNotInspect.class);
21+
public boolean shouldInspect(InspectionPoint inspectionPoint) {
22+
DoNotInspect doNotInspect = inspectionPoint.getField()
23+
.getAnnotation(DoNotInspect.class);
2424
if (doNotInspect != null) {
25-
return shouldInspect(field, doNotInspect);
25+
return shouldInspect(inspectionPoint, doNotInspect);
2626
} else {
27-
Inspect inspect = field.getAnnotation(Inspect.class);
27+
Inspect inspect = inspectionPoint.getField()
28+
.getAnnotation(Inspect.class);
2829
if (inspect != null && inspect.conditionally() != AlwaysTruePredicate.class) {
29-
Predicate<Field> predicate = beanFactory.create(inspect.conditionally());
30-
return predicate.test(field);
30+
Predicate<InspectionPoint> predicate = beanFactory.create(inspect.conditionally());
31+
return predicate.test(inspectionPoint);
3132
} else {
3233
return true;
3334
}
3435
}
3536
}
3637

37-
private boolean shouldInspect(Field field, DoNotInspect doNotInspect) {
38-
Class<? extends Predicate<Field>> predicateClass = doNotInspect.conditionally();
38+
private boolean shouldInspect(InspectionPoint inspectionPoint, DoNotInspect doNotInspect) {
39+
Class<? extends Predicate<InspectionPoint>> predicateClass = doNotInspect.conditionally();
3940
if (predicateClass == AlwaysTruePredicate.class) {
4041
return false;
4142
} else {
42-
Predicate<Field> predicate = beanFactory.create(predicateClass);
43-
return !predicate.test(field);
43+
Predicate<InspectionPoint> predicate = beanFactory.create(predicateClass);
44+
return !predicate.test(inspectionPoint);
4445
}
4546
}
4647
}

src/main/java/pl/wavesoftware/utils/stringify/impl/QuietInspectFieldPredicate.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
import lombok.AccessLevel;
44
import lombok.RequiredArgsConstructor;
55
import pl.wavesoftware.utils.stringify.configuration.AlwaysTruePredicate;
6-
import pl.wavesoftware.utils.stringify.configuration.Inspect;
7-
import pl.wavesoftware.utils.stringify.configuration.Predicate;
86
import pl.wavesoftware.utils.stringify.configuration.BeanFactory;
9-
10-
import java.lang.reflect.Field;
7+
import pl.wavesoftware.utils.stringify.configuration.Inspect;
8+
import pl.wavesoftware.utils.stringify.configuration.InspectionPoint;
9+
import pl.wavesoftware.utils.stringify.lang.Predicate;
1110

1211
/**
1312
* @author <a href="mailto:krzysztof.suszynski@coi.gov.pl">Krzysztof Suszynski</a>
@@ -18,22 +17,23 @@ final class QuietInspectFieldPredicate implements InspectFieldPredicate {
1817
private final BeanFactory beanFactory;
1918

2019
@Override
21-
public boolean shouldInspect(Field field) {
22-
Inspect inspect = field.getAnnotation(Inspect.class);
20+
public boolean shouldInspect(InspectionPoint inspectionPoint) {
21+
Inspect inspect = inspectionPoint.getField()
22+
.getAnnotation(Inspect.class);
2323
if (inspect != null) {
24-
return shouldInspect(field, inspect);
24+
return shouldInspect(inspectionPoint, inspect);
2525
} else {
2626
return false;
2727
}
2828
}
2929

30-
private boolean shouldInspect(Field field, Inspect inspect) {
31-
Class<? extends Predicate<Field>> predicateClass = inspect.conditionally();
30+
private boolean shouldInspect(InspectionPoint inspectionPoint, Inspect inspect) {
31+
Class<? extends Predicate<InspectionPoint>> predicateClass = inspect.conditionally();
3232
if (predicateClass == AlwaysTruePredicate.class) {
3333
return true;
3434
} else {
35-
Predicate<Field> predicate = beanFactory.create(predicateClass);
36-
return predicate.test(field);
35+
Predicate<InspectionPoint> predicate = beanFactory.create(predicateClass);
36+
return predicate.test(inspectionPoint);
3737
}
3838
}
3939
}

0 commit comments

Comments
 (0)