Skip to content

Commit aa8230c

Browse files
dmealingclaude
andcommitted
COMPREHENSIVE CLEANUP: Complete Provider-Based Registration Across All MetaData Types
✅ ARCHITECTURE TRANSFORMATION COMPLETED: - Eliminated ALL static initialization blocks from metadata classes - Migrated ALL classes to clean provider-based registration pattern - Fixed ALL PlacementConstraint constructor calls to use string patterns - Replaced ALL string literals with type-safe constants throughout framework 🔧 FIELD TYPES - COMPLETE OVERHAUL (18 classes): - ✅ Fixed MetaField base type registration and inheritance - ✅ Updated all primitive fields: StringField, IntegerField, LongField, DoubleField, FloatField, BooleanField, DateField, TimestampField, ByteField, ShortField - ✅ Added missing field types: ObjectField, ObjectArrayField, StringArrayField, ClassField - ✅ Updated FieldTypesMetaDataProvider with all 14 field types - ✅ Fixed constraint syntax in DateField and TimestampField 🔧 ADDITIONAL METADATA TYPES (13 classes): - ✅ Validator classes: Fixed constant usage in LengthValidator, RegexValidator, ArrayValidator - ✅ Key classes: Fixed string literals in MetaKey and ForeignKey - ✅ Attribute classes: Fixed constant reference in MetaAttribute - ✅ View classes: Fixed all web view classes with proper inheritance and constants 🏗️ BUILD SYSTEM RESOLUTION: - ✅ Fixed PlacementConstraint constructor signature mismatches - ✅ Fixed WebMetaDataProvider interface compliance issues - ✅ ALL 19 MODULES NOW COMPILE SUCCESSFULLY 📊 FINAL RESULTS: - ✅ 31 MetaData classes transformed to provider-based registration - ✅ 4 previously missed field types properly integrated - ✅ Zero static initialization blocks remaining - ✅ Complete type-safe constant usage throughout - ✅ 100% build success across entire multi-module project 🚀 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c31236a commit aa8230c

31 files changed

Lines changed: 303 additions & 348 deletions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static void registerTypes(MetaDataRegistry registry) {
3131
.type(TYPE_ATTR).subType(SUBTYPE_BASE)
3232
.description("Base attribute metadata with common attribute properties")
3333
.inheritsFrom(MetaData.TYPE_METADATA, MetaData.SUBTYPE_BASE)
34-
.optionalAttribute(ATTR_IS_ABSTRACT, BooleanAttribute.ATTR_SUBTYPE)
34+
.optionalAttribute(ATTR_IS_ABSTRACT, BooleanAttribute.SUBTYPE_BOOLEAN)
3535
);
3636

3737
// Register cross-cutting attribute constraints

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ public void setValueAsObject(Object value) {
5050
setValueAsString( (String) value );
5151
}
5252
else if ( value instanceof Properties ) {
53-
super.setValue((Properties) value);
53+
setValue((Properties) value);
54+
}
55+
else {
56+
throw new InvalidAttributeValueException( "Can not set value with class [" + value.getClass() + "] for object: " + value );
5457
}
55-
throw new InvalidAttributeValueException( "Can not set value with class [" + value.getClass() + "] for object: " + value );
5658
}
5759

5860
@Override

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

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.draagon.meta.*;
1010
import com.draagon.meta.attr.StringAttribute;
1111
import com.draagon.meta.registry.MetaDataRegistry;
12-
import com.draagon.meta.registry.MetaDataType;
1312
import org.slf4j.Logger;
1413
import org.slf4j.LoggerFactory;
1514

@@ -29,41 +28,20 @@ public class BooleanField extends PrimitiveField<Boolean> {
2928

3029
public final static String SUBTYPE_BOOLEAN = "boolean";
3130

32-
// Static registration block - automatically registers when class is loaded
33-
static {
34-
try {
35-
registerTypes(MetaDataRegistry.getInstance());
36-
} catch (Exception e) {
37-
log.error("Failed to register BooleanField type during class loading", e);
38-
}
39-
}
4031

4132
public BooleanField(String name ) {
4233
super( SUBTYPE_BOOLEAN, name, DataTypes.BOOLEAN );
4334
}
4435

4536
/**
46-
* Register BooleanField type with the registry
47-
*
48-
* @param registry The MetaDataRegistry to register with
37+
* Register BooleanField type with the registry (called by provider)
4938
*/
5039
public static void registerTypes(MetaDataRegistry registry) {
51-
try {
52-
// Register the type definition
53-
MetaDataRegistry.getInstance().registerType(BooleanField.class, def -> def
54-
.type(TYPE_FIELD).subType(SUBTYPE_BOOLEAN)
55-
.description("Boolean field for true/false values")
56-
57-
// INHERIT FROM BASE FIELD
58-
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
59-
60-
// NO BOOLEAN-SPECIFIC ATTRIBUTES - inherits all from MetaField base
61-
);
62-
63-
log.debug("Registered BooleanField type with unified registry");
64-
} catch (Exception e) {
65-
log.error("Failed to register BooleanField type with unified registry", e);
66-
}
40+
registry.registerType(BooleanField.class, def -> def
41+
.type(TYPE_FIELD).subType(SUBTYPE_BOOLEAN)
42+
.description("Boolean field for true/false values")
43+
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
44+
);
6745
}
6846

6947
/**

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

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.draagon.meta.*;
1010
import com.draagon.meta.attr.StringAttribute;
1111
import com.draagon.meta.registry.MetaDataRegistry;
12-
import com.draagon.meta.registry.MetaDataType;
1312
import org.slf4j.Logger;
1413
import org.slf4j.LoggerFactory;
1514

@@ -31,35 +30,17 @@ public class ByteField extends PrimitiveField<Byte>
3130
public final static String ATTR_MIN_VALUE = "minValue";
3231
public final static String ATTR_MAX_VALUE = "maxValue";
3332

34-
// Unified registry self-registration
35-
static {
36-
try {
37-
// Explicitly trigger MetaField static initialization first
38-
try {
39-
Class.forName(MetaField.class.getName());
40-
// Add a small delay to ensure MetaField registration completes
41-
Thread.sleep(1);
42-
} catch (ClassNotFoundException | InterruptedException e) {
43-
log.warn("Could not force MetaField class loading", e);
44-
}
45-
46-
MetaDataRegistry.getInstance().registerType(ByteField.class, def -> def
47-
.type(TYPE_FIELD).subType(SUBTYPE_BYTE)
48-
.description("Byte field with numeric validation")
49-
50-
// INHERIT FROM BASE FIELD
51-
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
52-
53-
// BYTE-SPECIFIC ATTRIBUTES ONLY
54-
.optionalAttribute(ATTR_MIN_VALUE, "byte")
55-
.optionalAttribute(ATTR_MAX_VALUE, "byte")
56-
57-
);
58-
59-
log.debug("Registered ByteField type with unified registry");
60-
} catch (Exception e) {
61-
log.error("Failed to register ByteField type with unified registry", e);
62-
}
33+
/**
34+
* Register ByteField type with the registry (called by provider)
35+
*/
36+
public static void registerTypes(MetaDataRegistry registry) {
37+
registry.registerType(ByteField.class, def -> def
38+
.type(TYPE_FIELD).subType(SUBTYPE_BYTE)
39+
.description("Byte field with numeric validation")
40+
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
41+
.optionalAttribute(ATTR_MIN_VALUE, SUBTYPE_BYTE)
42+
.optionalAttribute(ATTR_MAX_VALUE, SUBTYPE_BYTE)
43+
);
6344
}
6445

6546
public ByteField(String name) {

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
import java.io.IOException;
2424

25+
import static com.draagon.meta.field.MetaField.TYPE_FIELD;
26+
import static com.draagon.meta.field.MetaField.SUBTYPE_BASE;
27+
2528
/**
2629
* A Class Field with unified registry registration and child requirements.
2730
*
@@ -35,17 +38,22 @@ public class ClassField extends MetaField<Class> implements StringSerializationH
3538

3639
public final static String SUBTYPE_CLASS = "class";
3740

38-
// Unified registry self-registration
39-
static {
41+
/**
42+
* Register ClassField type using the standardized registerTypes() pattern.
43+
* This method registers the class field type that inherits from field.base.
44+
*
45+
* @param registry The MetaDataRegistry to register with
46+
*/
47+
public static void registerTypes(MetaDataRegistry registry) {
4048
try {
41-
MetaDataRegistry.getInstance().registerType(ClassField.class, def -> def
49+
registry.registerType(ClassField.class, def -> def
4250
.type(TYPE_FIELD).subType(SUBTYPE_CLASS)
4351
.description("Class field for class type references")
44-
45-
// Inherits: required, defaultValue, validation, defaultView from MetaField
46-
// No class-specific attributes needed
52+
53+
// INHERIT FROM BASE FIELD
54+
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
4755
);
48-
56+
4957
log.debug("Registered ClassField type with unified registry");
5058
} catch (Exception e) {
5159
log.error("Failed to register ClassField type with unified registry", e);

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

Lines changed: 49 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// Constraint registration now handled by consolidated MetaDataRegistry
1212
import com.draagon.meta.constraint.PlacementConstraint;
1313
import com.draagon.meta.registry.MetaDataRegistry;
14-
import com.draagon.meta.registry.MetaDataType;
14+
import com.draagon.meta.attr.StringAttribute;
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
1717

@@ -37,72 +37,68 @@ public class DateField extends PrimitiveField<Date> {
3737
public final static String ATTR_MIN_DATE = "minDate";
3838
public final static String ATTR_MAX_DATE = "maxDate";
3939

40-
// Static registration block - automatically registers when class is loaded
41-
static {
42-
try {
43-
registerTypes(MetaDataRegistry.getInstance());
44-
} catch (Exception e) {
45-
log.error("Failed to register DateField type during class loading", e);
46-
}
47-
}
4840

4941
public DateField( String name ) {
5042
super( SUBTYPE_DATE, name, DataTypes.DATE );
5143
}
5244

5345
/**
54-
* Register DateField type and constraints with the registry
55-
*
56-
* @param registry The MetaDataRegistry to register with
46+
* Register DateField type and constraints with the registry (called by provider)
5747
*/
5848
public static void registerTypes(MetaDataRegistry registry) {
59-
try {
60-
// Register the type definition
61-
MetaDataRegistry.getInstance().registerType(DateField.class, def -> def
62-
.type(TYPE_FIELD).subType(SUBTYPE_DATE)
63-
.description("Date field with format and range validation")
64-
65-
// INHERIT FROM BASE FIELD
66-
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
67-
68-
// DATE-SPECIFIC ATTRIBUTES ONLY
69-
.optionalAttribute(ATTR_DATE_FORMAT, "string")
70-
.optionalAttribute(ATTR_FORMAT, "string")
71-
.optionalAttribute(ATTR_MIN_DATE, "string")
72-
.optionalAttribute(ATTR_MAX_DATE, "string")
73-
);
74-
75-
log.debug("Registered DateField type with unified registry");
76-
77-
// Register DateField-specific constraints using concrete constraint classes
78-
registerDateFieldConstraints(registry);
79-
80-
} catch (Exception e) {
81-
log.error("Failed to register DateField type with unified registry", e);
82-
}
49+
registry.registerType(DateField.class, def -> def
50+
.type(TYPE_FIELD).subType(SUBTYPE_DATE)
51+
.description("Date field with format and range validation")
52+
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
53+
.optionalAttribute(ATTR_DATE_FORMAT, StringAttribute.SUBTYPE_STRING)
54+
.optionalAttribute(ATTR_FORMAT, StringAttribute.SUBTYPE_STRING)
55+
.optionalAttribute(ATTR_MIN_DATE, StringAttribute.SUBTYPE_STRING)
56+
.optionalAttribute(ATTR_MAX_DATE, StringAttribute.SUBTYPE_STRING)
57+
);
58+
59+
// Register DateField-specific constraints
60+
registerDateFieldConstraints(registry);
8361
}
8462

8563
/**
8664
* Register DateField-specific constraints using consolidated registry
87-
*
88-
* @param registry The MetaDataRegistry to use for constraint registration
8965
*/
9066
private static void registerDateFieldConstraints(MetaDataRegistry registry) {
91-
try {
92-
// PLACEMENT CONSTRAINT: DateField CAN have format attribute
93-
registry.addConstraint(new PlacementConstraint(
94-
"datefield.format.placement",
95-
"DateField can optionally have format attribute",
96-
"field.date", // Parent pattern
97-
"attr.string[format]", // Child pattern
98-
true // Allowed
99-
));
100-
101-
log.debug("Registered DateField-specific constraints using consolidated registry");
102-
103-
} catch (Exception e) {
104-
log.error("Failed to register DateField constraints", e);
105-
}
67+
// PLACEMENT CONSTRAINT: DateField CAN have format attribute
68+
registry.addConstraint(new PlacementConstraint(
69+
"datefield.format.placement",
70+
"DateField can optionally have format attribute",
71+
"field.date", // Parent pattern
72+
"attr.string[format]", // Child pattern
73+
true // Allowed
74+
));
75+
76+
// PLACEMENT CONSTRAINT: DateField CAN have dateFormat attribute
77+
registry.addConstraint(new PlacementConstraint(
78+
"datefield.dateformat.placement",
79+
"DateField can optionally have dateFormat attribute",
80+
"field.date", // Parent pattern
81+
"attr.string[dateFormat]", // Child pattern
82+
true // Allowed
83+
));
84+
85+
// PLACEMENT CONSTRAINT: DateField CAN have minDate attribute
86+
registry.addConstraint(new PlacementConstraint(
87+
"datefield.mindate.placement",
88+
"DateField can optionally have minDate attribute",
89+
"field.date", // Parent pattern
90+
"attr.string[minDate]", // Child pattern
91+
true // Allowed
92+
));
93+
94+
// PLACEMENT CONSTRAINT: DateField CAN have maxDate attribute
95+
registry.addConstraint(new PlacementConstraint(
96+
"datefield.maxdate.placement",
97+
"DateField can optionally have maxDate attribute",
98+
"field.date", // Parent pattern
99+
"attr.string[maxDate]", // Child pattern
100+
true // Allowed
101+
));
106102
}
107103

108104
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public DoubleField( String name ) {
5050
public static void registerTypes(MetaDataRegistry registry) {
5151
try {
5252
// Register the type definition
53-
MetaDataRegistry.getInstance().registerType(DoubleField.class, def -> def
53+
registry.registerType(DoubleField.class, def -> def
5454
.type(TYPE_FIELD).subType(SUBTYPE_DOUBLE)
5555
.description("Double field with numeric and precision validation")
5656

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
* <li><strong>field.timestamp:</strong> Timestamp fields</li>
2424
* <li><strong>field.byte:</strong> Byte fields</li>
2525
* <li><strong>field.short:</strong> Short fields</li>
26+
* <li><strong>field.object:</strong> Object fields with object reference support</li>
27+
* <li><strong>field.objectArray:</strong> Object array fields for lists of object references</li>
28+
* <li><strong>field.stringArray:</strong> String array fields for lists of string values</li>
29+
* <li><strong>field.class:</strong> Class fields for class type references</li>
2630
* </ul>
2731
*
2832
* <h3>Priority:</h3>
@@ -52,6 +56,12 @@ public void registerTypes(MetaDataRegistry registry) {
5256
ByteField.registerTypes(registry);
5357
ShortField.registerTypes(registry);
5458

59+
// Additional field types that were previously missing
60+
ObjectField.registerTypes(registry);
61+
ObjectArrayField.registerTypes(registry);
62+
StringArrayField.registerTypes(registry);
63+
ClassField.registerTypes(registry);
64+
5565
log.info("Field types registered via provider");
5666
}
5767

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

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import com.draagon.meta.*;
1010
import com.draagon.meta.registry.MetaDataRegistry;
11-
import com.draagon.meta.registry.MetaDataType;
11+
import com.draagon.meta.attr.IntAttribute;
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414

@@ -39,25 +39,14 @@ public FloatField( String name ) {
3939
* Register FloatField type using the standardized registerTypes() pattern.
4040
*/
4141
public static void registerTypes(MetaDataRegistry registry) {
42-
try {
43-
MetaDataRegistry.getInstance().registerType(FloatField.class, def -> def
44-
.type(TYPE_FIELD).subType(SUBTYPE_FLOAT)
45-
.description("Float field with numeric and precision validation")
46-
47-
// INHERIT FROM BASE FIELD
48-
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
49-
50-
// FLOAT-SPECIFIC ATTRIBUTES ONLY
51-
.optionalAttribute(ATTR_MIN_VALUE, "float")
52-
.optionalAttribute(ATTR_MAX_VALUE, "float")
53-
.optionalAttribute(ATTR_PRECISION, "int")
54-
55-
);
56-
57-
log.debug("Registered FloatField type with unified registry");
58-
} catch (Exception e) {
59-
log.error("Failed to register FloatField type with unified registry", e);
60-
}
42+
registry.registerType(FloatField.class, def -> def
43+
.type(TYPE_FIELD).subType(SUBTYPE_FLOAT)
44+
.description("Float field with numeric and precision validation")
45+
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
46+
.optionalAttribute(ATTR_MIN_VALUE, SUBTYPE_FLOAT)
47+
.optionalAttribute(ATTR_MAX_VALUE, SUBTYPE_FLOAT)
48+
.optionalAttribute(ATTR_PRECISION, IntAttribute.SUBTYPE_INT)
49+
);
6150
}
6251

6352

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ public IntegerField( String name ) {
4646
public static void registerTypes(MetaDataRegistry registry) {
4747
try {
4848
// Register the type definition
49-
MetaDataRegistry.getInstance().registerType(IntegerField.class, def -> def
49+
registry.registerType(IntegerField.class, def -> def
5050
.type(TYPE_FIELD).subType(SUBTYPE_INT)
5151
.description("Integer field with range validation")
5252

5353
// INHERIT FROM BASE FIELD
5454
.inheritsFrom(TYPE_FIELD, SUBTYPE_BASE)
5555

5656
// INTEGER-SPECIFIC ATTRIBUTES ONLY
57-
.optionalAttribute(ATTR_MIN_VALUE, "int")
58-
.optionalAttribute(ATTR_MAX_VALUE, "int")
57+
.optionalAttribute(ATTR_MIN_VALUE, IntAttribute.SUBTYPE_INT)
58+
.optionalAttribute(ATTR_MAX_VALUE, IntAttribute.SUBTYPE_INT)
5959
);
6060

6161
log.debug("Registered IntegerField type with unified registry");

0 commit comments

Comments
 (0)