protected Optional parseNode()

in core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/content/ContentLoaderHandler.java [168:251]


    protected Optional<Node> parseNode(final NodeDescription<?> nodeDesc, final Attributes atts) {
        String id = null;
        Map<String, Object> props = new HashMap<>();
        for (int i = 0; i < atts.getLength(); i++) {
            String originalName = atts.getQName(i);
            String originalValue = atts.getValue(i);

            if ("id".equalsIgnoreCase(originalName)) {
                id = originalValue;
                props.put("id", originalValue);
            } else {
                String name = nodeDesc.getGraphProperties().stream().
                        map(GraphPropertyDescription::getPropertyName).
                        filter(propertyName -> propertyName.equalsIgnoreCase(originalName)).
                        findFirst().orElseGet(() -> originalName.startsWith("plainAttrs.") ? originalName : null);
                if (name == null) {
                    LOG.error("Property {} not matching for {}", originalName, nodeDesc.getPrimaryLabel());
                    continue;
                }

                Class<?> type = nodeDesc.getGraphProperties().stream().
                        filter(prop -> prop.getPropertyName().equalsIgnoreCase(name)).
                        findFirst().map(GraphPropertyDescription::getActualType).
                        orElseGet(() -> {
                            if (!name.startsWith("plainAttrs.")) {
                                LOG.warn("No type found for property {}#{}", nodeDesc.getPrimaryLabel(), name);
                            }
                            return String.class;
                        });

                String value = paramSubstitutor.replace(atts.getValue(i));
                if (value == null) {
                    LOG.warn("Variable ${} could not be resolved", atts.getValue(i));
                    value = atts.getValue(i);
                }
                value = StringEscapeUtils.unescapeXml(value);

                if (int.class.isAssignableFrom(type) || Integer.class.isAssignableFrom(type)) {
                    try {
                        props.put(name, Integer.valueOf(value));
                    } catch (NumberFormatException e) {
                        LOG.error("Unparsable Integer '{}'", value);
                    }
                } else if (long.class.isAssignableFrom(type) || Long.class.isAssignableFrom(type)) {
                    try {
                        props.put(name, Long.valueOf(value));
                    } catch (NumberFormatException e) {
                        LOG.error("Unparsable Long '{}'", value);
                    }
                } else if (float.class.isAssignableFrom(type) || Float.class.isAssignableFrom(type)) {
                    try {
                        props.put(name, Float.valueOf(value));
                    } catch (NumberFormatException e) {
                        LOG.error("Unparsable Float '{}'", value);
                    }
                } else if (double.class.isAssignableFrom(type) || Double.class.isAssignableFrom(type)) {
                    try {
                        props.put(name, Double.valueOf(value));
                    } catch (NumberFormatException e) {
                        LOG.error("Unparsable Double '{}'", value);
                    }
                } else if (Date.class.isAssignableFrom(type) || OffsetDateTime.class.isAssignableFrom(type)) {
                    try {
                        props.put(name, FormatUtils.parseDate(value));
                    } catch (DateTimeParseException e) {
                        LOG.error("Unparsable Date '{}'", value);
                    }
                } else if (boolean.class.isAssignableFrom(type) || Boolean.class.isAssignableFrom(type)) {
                    props.put(name, "1".equals(value) ? Boolean.TRUE : Boolean.FALSE);
                } else if (byte[].class.isAssignableFrom(type)) {
                    try {
                        props.put(name, DatatypeConverter.parseHexBinary(value));
                    } catch (IllegalArgumentException e) {
                        LOG.warn("Error decoding hex string to specify a blob parameter", e);
                    }
                }
                if (!props.containsKey(name)) {
                    props.put(name, value);
                }
            }
        }

        return id == null ? Optional.empty() : Optional.of(new Node(id, props));
    }