Skip to content

Commit 8c044f2

Browse files
dmealingclaude
andcommitted
Fix getMetaDataClass() methods and complete builder-first architecture implementation
Revert getMetaDataClass() methods to original hardcoded class returns with proper @SuppressWarnings annotations to restore factory and search pattern functionality while eliminating type safety warnings. Complete builder-first architecture by converting fluent methods to void returns and updating tests accordingly. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 0d166d7 commit 8c044f2

20 files changed

Lines changed: 469 additions & 148 deletions

metadata/src/main/java/com/draagon/meta/MetaData.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
import java.io.Serializable;
1717
import java.lang.ref.WeakReference;
1818
import java.lang.reflect.InvocationTargetException;
19-
import java.time.Duration;
20-
import java.time.Instant;
2119
import java.util.*;
2220
import java.util.function.Predicate;
2321
import java.util.stream.Stream;
@@ -50,7 +48,6 @@ public class MetaData implements Cloneable, Serializable {
5048
// Type system integration
5149
private volatile MetaDataTypeDefinition typeDefinition;
5250

53-
private MetaData overloadedMetaData = null;
5451
private MetaData superData = null;
5552

5653
// TODO: Is this meant to be a weak reference for MetaDataLoader only...?
@@ -420,6 +417,7 @@ public Class loadClass( String name, boolean throwError ) throws ClassNotFoundEx
420417
* Get the Base Class for the MetaData
421418
* @return Class The Java class for the metadata
422419
*/
420+
@SuppressWarnings("unchecked")
423421
public <T extends MetaData> Class<T> getMetaDataClass() {
424422
return (Class<T>) MetaData.class;
425423
}
@@ -515,20 +513,16 @@ public boolean hasSuperData() {
515513
/**
516514
* Sets an attribute of the MetaClass
517515
*/
518-
@SuppressWarnings("unchecked")
519-
public <T extends MetaData> T addMetaAttr(MetaAttribute attr) {
516+
public void addMetaAttr(MetaAttribute attr) {
520517
addChild(attr);
521-
return (T) this;
522518
}
523519

524520
/**
525-
* Sets an attribute of the MetaClass and returns this MetaData (type-safe version)
521+
* Sets an attribute of the MetaClass (type-safe version)
526522
* @param attr The attribute to add
527-
* @return This MetaData instance for method chaining
528523
*/
529-
public MetaData addMetaAttrSafe(MetaAttribute attr) {
524+
public void addMetaAttrSafe(MetaAttribute attr) {
530525
addChild(attr);
531-
return this;
532526
}
533527

534528
/**
@@ -637,20 +631,16 @@ public boolean hasChild(String name, Class<? extends MetaData> c) {
637631
* Adds a child MetaData object of the specified class type. If no class
638632
* type is set, then a child of the same type is not checked against.
639633
*/
640-
@SuppressWarnings("unchecked")
641-
public <T extends MetaData> T addChild(MetaData data) throws InvalidMetaDataException {
634+
public void addChild(MetaData data) throws InvalidMetaDataException {
642635
addChild(data, true);
643-
return (T) this;
644636
}
645637

646638
/**
647-
* Adds a child MetaData object and returns this MetaData (type-safe version)
639+
* Adds a child MetaData object (type-safe version)
648640
* @param data The child MetaData to add
649-
* @return This MetaData instance for method chaining
650641
*/
651-
public MetaData addChildSafe(MetaData data) throws InvalidMetaDataException {
642+
public void addChildSafe(MetaData data) throws InvalidMetaDataException {
652643
addChild(data, true);
653-
return this;
654644
}
655645

656646
/**
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.draagon.meta;
2+
3+
import com.draagon.meta.attr.MetaAttribute;
4+
5+
/**
6+
* Builder for MetaData objects providing fluent API for construction and configuration.
7+
* Uses the self-typing pattern to ensure proper return types in inheritance hierarchies.
8+
*
9+
* @param <SELF> The concrete builder type for method chaining
10+
* @param <TARGET> The target MetaData type being built
11+
*/
12+
public class MetaDataBuilder<SELF extends MetaDataBuilder<SELF, TARGET>, TARGET extends MetaData> {
13+
14+
protected final TARGET target;
15+
16+
/**
17+
* Constructor taking the target MetaData object to build
18+
* @param target The MetaData object to configure
19+
*/
20+
public MetaDataBuilder(TARGET target) {
21+
this.target = target;
22+
}
23+
24+
/**
25+
* Self-typing pattern method for fluent API
26+
* @return This builder instance with correct type
27+
*/
28+
@SuppressWarnings("unchecked")
29+
protected final SELF self() {
30+
return (SELF) this;
31+
}
32+
33+
/**
34+
* Add a MetaAttribute to the target (fluent version of addMetaAttrSafe)
35+
* @param attr The attribute to add
36+
* @return This builder for method chaining
37+
*/
38+
public SELF addMetaAttr(MetaAttribute attr) {
39+
target.addMetaAttrSafe(attr);
40+
return self();
41+
}
42+
43+
/**
44+
* Add a child MetaData object (fluent version of addChildSafe)
45+
* @param child The child MetaData to add
46+
* @return This builder for method chaining
47+
*/
48+
public SELF addChild(MetaData child) throws InvalidMetaDataException {
49+
target.addChildSafe(child);
50+
return self();
51+
}
52+
53+
54+
/**
55+
* Build and return the configured MetaData object
56+
* @return The configured MetaData instance
57+
*/
58+
public TARGET build() {
59+
return target;
60+
}
61+
}

metadata/src/main/java/com/draagon/meta/attr/MetaAttribute.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@
22

33
import com.draagon.meta.*;
44
import com.draagon.meta.util.DataConverter;
5-
import com.draagon.meta.validation.ValidationChain;
6-
import com.draagon.meta.validation.Validator;
75
import org.slf4j.Logger;
86
import org.slf4j.LoggerFactory;
97

10-
import java.time.Duration;
11-
import java.time.Instant;
128
import java.util.Objects;
139
import java.util.Optional;
1410

@@ -41,8 +37,9 @@ public MetaAttribute(String subtype, String name, DataTypes dataType ) {
4137
* Gets the primary MetaAttribute class
4238
*/
4339
@Override
40+
@SuppressWarnings("unchecked")
4441
public Class<MetaAttribute> getMetaDataClass() {
45-
return MetaAttribute.class;
42+
return (Class<MetaAttribute>) MetaAttribute.class;
4643
}
4744

4845
/**
@@ -148,7 +145,6 @@ public String getValueAsString() {
148145
*/
149146
@Override
150147
public void setValueAsObject(Object value) {
151-
Instant start = Instant.now();
152148
T oldValue = this.value;
153149

154150
try {

metadata/src/main/java/com/draagon/meta/field/MetaField.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,9 @@ public MetaField(String subtype, String name, DataTypes dataType) {
6969
* Gets the primary MetaData class
7070
*/
7171
@Override
72+
@SuppressWarnings("unchecked")
7273
public final Class<MetaField> getMetaDataClass() {
73-
return MetaField.class;
74+
return (Class<MetaField>) MetaField.class;
7475
}
7576

7677
/**
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.draagon.meta.field;
2+
3+
import com.draagon.meta.MetaData;
4+
import com.draagon.meta.MetaDataBuilder;
5+
import com.draagon.meta.InvalidMetaDataException;
6+
import com.draagon.meta.attr.MetaAttribute;
7+
8+
/**
9+
* Builder for MetaField instances providing fluent API for construction and configuration.
10+
* Extends MetaDataBuilder to inherit base functionality while adding MetaField-specific operations.
11+
*
12+
* @param <SELF> The concrete builder type for method chaining
13+
* @param <TARGET> The target MetaField type being built
14+
*/
15+
public class MetaFieldBuilder<SELF extends MetaFieldBuilder<SELF, TARGET>, TARGET extends MetaField>
16+
extends MetaDataBuilder<SELF, TARGET> {
17+
18+
/**
19+
* Constructor taking the target MetaField to build
20+
* @param target The MetaField to configure
21+
*/
22+
public MetaFieldBuilder(TARGET target) {
23+
super(target);
24+
}
25+
26+
/**
27+
* Add a MetaAttribute to the MetaField (fluent version)
28+
* @param attr The attribute to add
29+
* @return This builder for method chaining
30+
*/
31+
@Override
32+
public SELF addMetaAttr(MetaAttribute attr) {
33+
target.addMetaAttrSafe(attr);
34+
return self();
35+
}
36+
37+
/**
38+
* Add a child MetaData object to the MetaField (fluent version)
39+
* @param child The child MetaData to add
40+
* @return This builder for method chaining
41+
*/
42+
@Override
43+
public SELF addChild(MetaData child) throws InvalidMetaDataException {
44+
target.addChildSafe(child);
45+
return self();
46+
}
47+
48+
/**
49+
* Create an overloaded copy and return a new builder for it
50+
* @return A new builder wrapping the overloaded MetaField
51+
*/
52+
@SuppressWarnings("unchecked")
53+
public SELF overload() {
54+
TARGET overloaded = (TARGET) target.overload();
55+
try {
56+
return (SELF) this.getClass()
57+
.getConstructor(target.getClass())
58+
.newInstance(overloaded);
59+
} catch (Exception e) {
60+
throw new RuntimeException("Failed to create builder for overloaded field", e);
61+
}
62+
}
63+
}

metadata/src/main/java/com/draagon/meta/field/ObjectArrayField.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
* @version 1.0
1919
* @author Doug Mealing
2020
*/
21-
@SuppressWarnings("serial")
2221
public class ObjectArrayField extends ArrayField<Object,List<Object>> {
2322

2423
public final static String SUBTYPE_OBJECT_ARRAY = "objectArray";

metadata/src/main/java/com/draagon/meta/loader/MetaDataLoader.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ public boolean isRegistered() {
212212
/**
213213
* Gets the primary MetaData class
214214
*/
215-
public final Class<? extends MetaData> getMetaDataClass() {
216-
return MetaDataLoader.class;
215+
@SuppressWarnings("unchecked")
216+
public final <T extends MetaData> Class<T> getMetaDataClass() {
217+
return (Class<T>) MetaDataLoader.class;
217218
}
218219

219220
/** Wrap the MetaDataLoader */
@@ -224,8 +225,8 @@ public MetaDataLoader overload() {
224225
/**
225226
* Sets an attribute on the MetaClass
226227
*/
227-
public MetaDataLoader addMetaAttr(MetaAttribute attr) {
228-
return addChild(attr);
228+
public void addMetaAttr(MetaAttribute attr) {
229+
addChild(attr);
229230
}
230231

231232
/**
@@ -433,9 +434,9 @@ public Class<?> loadClass(String className ) throws ClassNotFoundException {
433434
* Adds the child MetaData
434435
*/
435436
@Override
436-
public MetaDataLoader addChild(MetaData mc) {
437+
public void addChild(MetaData mc) {
437438
checkState();
438-
return super.addChild(mc);
439+
super.addChild(mc);
439440
}
440441

441442
/**

metadata/src/main/java/com/draagon/meta/loader/model/MetaModelBuilder.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@ public class MetaModelBuilder {
1616
public static MetaData buildDefaultMetaDataModels() {
1717

1818
// METADATA ROOT
19-
MetaObject metadata = PojoMetaObject.create(MetaModel.OBJECT_NAME)
20-
.addChild(StringAttribute.create(MetaObject.ATTR_OBJECT, MetaModelPojo.class.getName()))
21-
.addChild(buildStringField(MetaModel.FIELD_PACKAGE,true))
22-
.addChild(buildStringField(MetaModel.FIELD_SUPER,true))
23-
.addChild(buildStringField(MetaModel.FIELD_TYPE,true)
24-
)
25-
.addChild(buildStringField(MetaModel.FIELD_SUBTYPE,true)
26-
)
27-
.addChild(buildStringField(MetaModel.FIELD_NAME,true))
28-
.addChild(buildValueField(MetaModel.FIELD_VALUE))
29-
.addChild(ObjectArrayField.create(MetaModel.FIELD_CHILDREN)
30-
.addChild(StringAttribute.create(MetaObject.ATTR_OBJECT_REF, MetaModel.OBJECT_NAME)));
19+
MetaObject metadata = PojoMetaObject.create(MetaModel.OBJECT_NAME);
20+
metadata.addChild(StringAttribute.create(MetaObject.ATTR_OBJECT, MetaModelPojo.class.getName()));
21+
metadata.addChild(buildStringField(MetaModel.FIELD_PACKAGE,true));
22+
metadata.addChild(buildStringField(MetaModel.FIELD_SUPER,true));
23+
metadata.addChild(buildStringField(MetaModel.FIELD_TYPE,true));
24+
metadata.addChild(buildStringField(MetaModel.FIELD_SUBTYPE,true));
25+
metadata.addChild(buildStringField(MetaModel.FIELD_NAME,true));
26+
metadata.addChild(buildValueField(MetaModel.FIELD_VALUE));
27+
28+
ObjectArrayField childrenField = ObjectArrayField.create(MetaModel.FIELD_CHILDREN);
29+
childrenField.addChild(StringAttribute.create(MetaObject.ATTR_OBJECT_REF, MetaModel.OBJECT_NAME));
30+
metadata.addChild(childrenField);
3131

3232
return metadata;
3333
}

0 commit comments

Comments
 (0)