@Override public Model getModel(String key) { return models.get(key); }
public ModelManifest getManifest(final String modelType) { return manifests.get(modelType); }
protected <M extends Model> ModelSerializer<M> getSerializer(final String type) { ModelSerializer serializer = serializers.get(type); if (serializer == null) { serializer = getDefaultSerializer(type); } return serializer; }
protected <M extends Model> M deserialize(final String cls, final CharIterator model) { return deserialize((Class<M>)typeNameToClass.get(cls), model); }
public ModelField getOrMakeField(final String field) { assert field.length() > 0 : "Cannot have a field named \"\""; ModelField f = fields.get(field); if (f == null) { f = new ModelField(field); fields.put(field, f); } return f; }
@Override public Model child(final String propName) { Object existing = map.get(propName); assert existing == null || existing instanceof Model : "You requested a child model with property name "+propName+", but an object of type " +existing.getClass()+" already existed in this location: "+existing; if (existing == null){ final AbstractModel child = createNew();//ensures subclasses can control child classes. child.parent = this; existing = child; map.put(propName, existing); } return (Model) existing; }
@Override @SuppressWarnings("unchecked") public <T> T getProperty(final String key) { final Object val = map.get(key); if (val == null) { final Class<?> type = getPropertyType(key); return (T) getPrimitiveValue(type); } return (T) val; }
@Override @SuppressWarnings("unchecked") public <T> T getProperty(final String key, final T dflt) { Object val = map.get(key); if (val == null) { val = dflt; } if (val == null) { final Class<?> type = getPropertyType(key); return (T) getPrimitiveValue(type); } else { return (T) val; } }
public static Object getPrimitiveValue(final Class<?> type) { if (defaultValues.isEmpty()) { defaultValues.put(boolean.class.getName(), false); defaultValues.put(byte.class.getName(), (byte)0); defaultValues.put(short.class.getName(), (short)0); defaultValues.put(char.class.getName(), '\0'); defaultValues.put(int.class.getName(), 0); defaultValues.put(long.class.getName(), 0L); defaultValues.put(float.class.getName(), 0f); defaultValues.put(double.class.getName(), 0.); } return defaultValues.get(type.getName()); }
/** * This implementation is EXTREMELY INEFFICIENT, and should only be used for unit tests; * this object should not be treated as a map key, but if you absolutely must, you should * consider using a mapping structure that allows you to provide a more efficient equality check. */ @Override public boolean equals(final Object obj) { if (obj instanceof ModelModule) { final ModelModule other = (ModelModule) obj; if (manifests.size() != other.manifests.size()) { return false; } if (!Objects.equals(moduleName, other.moduleName)) { return false; } if (!Objects.equals(getUuid(), other.getUuid())) { return false; } for (final Entry<String, ModelManifest> entry : manifests.entries()) { final ModelManifest compare = other.manifests.get(entry.getKey()); if (!Objects.equals(compare, entry.getValue())) { return false; } } return true; } return false; }
@Override public <M extends Model> M deserialize(final ModelManifest manifest, final CharIterator model) { if (model == null) { return null; } final Class<M> cls = (Class<M>) typeNameToClass.get(manifest.getType()); final ModelDeserializationContext context = new ModelDeserializationContext(create(cls), model, this, manifest); context.setClientToServer(isClientToServer()); final ModelSerializer<M> serializer = getSerializer(manifest.getType()); return serializer.modelFromString(model, context); }
@Override public String serializeString(final String s) { // Null handling remains the same if (s == null) { return super.serializeInt(-1); } Integer position = strings.get(s); if (position == null) { position = strings.size(); strings.put(s, position); out.append(super.serializeString(s)); size.clear(); size.append(serializeInt(position+1)); } return super.serializeInt(position); } @Override