use of com.github.davidmoten.odata.client.internal.ChangedFields in project odata-client by davidmoten.
the class Serializer method serializeChangesOnly.
public <T extends ODataEntityType> String serializeChangesOnly(T entity, boolean prettyPrint) {
try {
ObjectMapper m = MAPPER_INCLUDE_NULLS;
final String s;
if (prettyPrint) {
s = m.writerWithDefaultPrettyPrinter().writeValueAsString(entity);
} else {
s = m.writeValueAsString(entity);
}
JsonNode tree = m.readTree(s);
ObjectNode o = (ObjectNode) tree;
ChangedFields cf = entity.getChangedFields();
List<String> list = new ArrayList<>();
Iterator<String> it = o.fieldNames();
while (it.hasNext()) {
String name = it.next();
if (!cf.contains(name) && !name.equals("@odata.type")) {
list.add(name);
}
}
o.remove(list);
return o.toString();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
use of com.github.davidmoten.odata.client.internal.ChangedFields in project odata-client by davidmoten.
the class Generator method writeEntity.
private void writeEntity(TEntityType entityType, Map<String, List<Action>> typeActions, Map<String, List<Function>> typeFunctions) {
EntityType t = new EntityType(entityType, names);
t.getDirectoryEntity().mkdirs();
String simpleClassName = t.getSimpleClassName();
Imports imports = new Imports(t.getFullClassNameEntity());
Indent indent = new Indent();
StringWriter w = new StringWriter();
try (PrintWriter p = new PrintWriter(w)) {
p.format("package %s;\n\n", t.getPackage());
p.format(IMPORTSHERE);
t.printJavadoc(p, indent);
printPropertyOrder(imports, p, t.getProperties());
printJsonIncludesNonNull(indent, imports, p);
p.format("public class %s%s implements %s {\n", simpleClassName, t.getExtendsClause(imports), imports.add(ODataEntityType.class));
indent.right();
if (!t.hasBaseType()) {
addContextPathInjectableField(imports, indent, p);
addUnmappedFieldsField(imports, indent, p);
addChangedFieldsField(imports, indent, p);
}
p.format("\n%s@%s\n", indent, imports.add(Override.class));
p.format("%spublic String odataTypeName() {\n", indent);
p.format("%sreturn \"%s\";\n", indent.right(), t.getFullType());
p.format("%s}\n", indent.left());
// add other fields
printPropertyFields(imports, indent, p, t.getProperties(), t.hasBaseType());
// write constructor
writeNoArgsConstructor(simpleClassName, indent, p, t.hasBaseType());
writeBuilder(t, simpleClassName, imports, indent, p);
p.format("\n%s@%s\n", indent, imports.add(Override.class));
p.format("%s@%s\n", indent, imports.add(JsonIgnore.class));
p.format("%spublic %s getChangedFields() {\n", indent, imports.add(ChangedFields.class));
p.format("%sreturn changedFields;\n", indent.right());
p.format("%s}\n", indent.left());
String nullCheck = //
fieldNames(t).stream().map(//
f -> f + " != null").collect(Collectors.joining(" && "));
if (!nullCheck.isEmpty()) {
nullCheck = " && " + nullCheck;
}
p.format("\n%s@%s\n", indent, imports.add(Override.class));
p.format("%spublic void postInject(boolean addKeysToContextPath) {\n", indent);
p.format("%sif (addKeysToContextPath%s) {\n", indent.right(), nullCheck);
p.format("%scontextPath = contextPath.clearQueries()%s;\n", indent.right(), getAddKeys(t, imports));
p.format("%s}\n", indent.left());
p.format("%s}\n", indent.left());
Set<String> methodNames = new HashSet<>();
// write property getter and setters
printPropertyGetterAndSetters(t, imports, indent, p, simpleClassName, t.getFullType(), t.getProperties(), true, methodNames);
addInheritedPropertyNames(t, methodNames);
printNavigationPropertyGetters(t, imports, indent, p, t.getNavigationProperties(), methodNames);
addUnmappedFieldsSetterAndGetter(imports, indent, p, methodNames);
if (t.hasStream()) {
p.format("\n%s/**\n", indent);
p.format("%s * If suitable metadata found a StreamProvider is returned otherwise returns\n", indent);
p.format("%s * {@code Optional.empty()}. Normally for a stream to be available this entity\n", indent);
p.format("%s * needs to have been hydrated with full metadata. Consider calling the builder\n", indent);
p.format("%s * method {@code .metadataFull()} when getting this instance (either directly or\n", indent);
p.format("%s * as part of a collection).\n", indent);
p.format("%s *\n", indent);
p.format("%s * @return StreamProvider if suitable metadata found otherwise returns\n", indent);
p.format("%s * {@code Optional.empty()}\n", indent);
p.format("%s */\n", indent);
p.format("%s@%s\n", indent, imports.add(JsonIgnore.class));
p.format("%spublic %s<%s> getStream() {\n", indent, imports.add(Optional.class), imports.add(StreamProvider.class));
p.format("%sreturn %s.createStream(contextPath, this);\n", indent.right(), imports.add(RequestHelper.class));
p.format("%s}\n", indent.left());
}
// write Patched class
writePatchAndPutMethods(t, simpleClassName, imports, indent, p);
writeCopyMethod(t, simpleClassName, imports, indent, p, true);
writeBoundActionMethods(t, typeActions, imports, indent, p, methodNames);
writeBoundFunctionMethods(t, typeFunctions, imports, indent, p, methodNames);
// write toString
writeToString(t, simpleClassName, imports, indent, p);
p.format("%s}\n", indent.left());
writeToFile(imports, w, t.getClassFile());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Aggregations