// Path: src/main/java/pl/jalokim/propertiestojson/object/ObjectJsonType.java
// public class ObjectJsonType extends AbstractJsonType implements MergableObject<ObjectJsonType> {
// 
//     @SuppressWarnings("PMD.UseConcurrentHashMap")
//     private final Map<String, AbstractJsonType> fields = new LinkedHashMap<>();
// 
//     public void addField(final String field, final AbstractJsonType object, PathMetadata currentPathMetaData) {
//         if (object instanceof SkipJsonField) {
//             return;
//         }
// 
//         AbstractJsonType oldFieldValue = fields.get(field);
//         if (oldFieldValue == null) {
//             fields.put(field, object);
//         } else {
//             if (oldFieldValue instanceof MergableObject && object instanceof MergableObject) {
//                 mergeObjectIfPossible(oldFieldValue, object, currentPathMetaData);
//             } else {
//                 throw new CannotOverrideFieldException(currentPathMetaData.getCurrentFullPath(),
//                     oldFieldValue,
//                     currentPathMetaData.getOriginalPropertyKey());
//             }
//         }
//     }
// 
//     public boolean containsField(String field) {
//         return fields.containsKey(field);
//     }
// 
//     public AbstractJsonType getField(String field) {
//         return fields.get(field);
//     }
// 
//     public ArrayJsonType getJsonArray(String field) {
//         return (ArrayJsonType) fields.get(field);
//     }
// 
//     @Override
//     public String toStringJson() {
//         StringBuilder result = new StringBuilder().append(JSON_OBJECT_START);
//         int index = 0;
//         int lastIndex = getLastIndex(fields.keySet());
//         for (Map.Entry<String, AbstractJsonType> entry : fields.entrySet()) {
//             AbstractJsonType object = entry.getValue();
//             String lastSign = index == lastIndex ? EMPTY_STRING : NEW_LINE_SIGN;
//             result.append(StringToJsonStringWrapper.wrap(entry.getKey()))
//                 .append(':')
//                 .append(object.toStringJson())
//                 .append(lastSign);
//             index++;
//         }
//         result.append(JSON_OBJECT_END);
//         return result.toString();
//     }
// 
//     @Override
//     public void merge(ObjectJsonType mergeWith, PathMetadata currentPathMetadata) {
//         for (String fieldName : mergeWith.fields.keySet()) {
//             addField(fieldName, mergeWith.getField(fieldName), currentPathMetadata);
//         }
//     }
// }
// 
// Path: src/main/java/pl/jalokim/propertiestojson/path/PathMetadata.java
// @Data
// public class PathMetadata {
// 
//     private static final String NUMBER_PATTERN = "([1-9]\\d*)|0";
//     public static final String INDEXES_PATTERN = "\\s*(\\[\\s*((" + NUMBER_PATTERN + ")|\\*)\\s*]\\s*)+";
// 
//     private static final String WORD_PATTERN = "(.)*";
// 
//     private final String originalPropertyKey;
//     private PathMetadata parent;
//     private String fieldName;
//     private String originalFieldName;
//     private PathMetadata child;
//     private PropertyArrayHelper propertyArrayHelper;
//     private Object rawValue;
//     private AbstractJsonType jsonValue;
// 
//     public boolean isLeaf() {
//         return child == null;
//     }
// 
//     public boolean isRoot() {
//         return parent == null;
//     }
// 
//     public String getCurrentFullPath() {
//         return parent == null ? originalFieldName : parent.getCurrentFullPath() + NORMAL_DOT + originalFieldName;
//     }
// 
//     public PathMetadata getLeaf() {
//         PathMetadata current = this;
//         while (current.getChild() != null) {
//             current = current.getChild();
//         }
//         return current;
//     }
// 
//     public void setFieldName(String fieldName) {
//         this.fieldName = fieldName;
//         if (fieldName.matches(WORD_PATTERN + INDEXES_PATTERN)) {
//             propertyArrayHelper = new PropertyArrayHelper(fieldName);
//             this.fieldName = propertyArrayHelper.getArrayFieldName();
//         }
//     }
// 
//     public void setRawValue(Object rawValue) {
//         if (!isLeaf()) {
//             throw new NotLeafValueException("Cannot set value for not leaf: " + getCurrentFullPath());
//         }
//         this.rawValue = rawValue;
//     }
// 
//     public String getOriginalPropertyKey() {
//         return originalPropertyKey;
//     }
// 
//     public PathMetadata getRoot() {
//         PathMetadata current = this;
//         while (current.getParent() != null) {
//             current = current.getParent();
//         }
//         return current;
//     }
// 
//     public String getCurrentFullPathWithoutIndexes() {
//         String parentFullPath = isRoot() ? EMPTY_STRING : getParent().getCurrentFullPath() + NORMAL_DOT;
//         return parentFullPath + getFieldName();
//     }
// 
//     public AbstractJsonType getJsonValue() {
//         return jsonValue;
//     }
// 
//     public void setJsonValue(AbstractJsonType jsonValue) {
//         if (!isLeaf()) {
//             throw new NotLeafValueException("Cannot set value for not leaf: " + getCurrentFullPath());
//         }
//         this.jsonValue = jsonValue;
//     }
// 
//     @Override
//     public String toString() {
//         return "field='" + fieldName + '\''
//             + ", rawValue=" + rawValue
//             + ", fullPath='" + getCurrentFullPath() + '}';
//     }
// 
//     public boolean isArrayField() {
//         return propertyArrayHelper != null;
//     }
// }


import java.util.Map;
import pl.jalokim.propertiestojson.object.ObjectJsonType;
import pl.jalokim.propertiestojson.path.PathMetadata;
package pl.jalokim.propertiestojson.resolvers.transfer;


public class DataForResolve {

    private final Map<String, Object> properties;
    private final String propertyKey;
    private final ObjectJsonType currentObjectJsonType;
// Path: src/main/java/pl/jalokim/propertiestojson/object/ObjectJsonType.java
// public class ObjectJsonType extends AbstractJsonType implements MergableObject<ObjectJsonType> {
// 
//     @SuppressWarnings("PMD.UseConcurrentHashMap")
//     private final Map<String, AbstractJsonType> fields = new LinkedHashMap<>();
// 
//     public void addField(final String field, final AbstractJsonType object, PathMetadata currentPathMetaData) {
//         if (object instanceof SkipJsonField) {
//             return;
//         }
// 
//         AbstractJsonType oldFieldValue = fields.get(field);
//         if (oldFieldValue == null) {
//             fields.put(field, object);
//         } else {
//             if (oldFieldValue instanceof MergableObject && object instanceof MergableObject) {
//                 mergeObjectIfPossible(oldFieldValue, object, currentPathMetaData);
//             } else {
//                 throw new CannotOverrideFieldException(currentPathMetaData.getCurrentFullPath(),
//                     oldFieldValue,
//                     currentPathMetaData.getOriginalPropertyKey());
//             }
//         }
//     }
// 
//     public boolean containsField(String field) {
//         return fields.containsKey(field);
//     }
// 
//     public AbstractJsonType getField(String field) {
//         return fields.get(field);
//     }
// 
//     public ArrayJsonType getJsonArray(String field) {
//         return (ArrayJsonType) fields.get(field);
//     }
// 
//     @Override
//     public String toStringJson() {
//         StringBuilder result = new StringBuilder().append(JSON_OBJECT_START);
//         int index = 0;
//         int lastIndex = getLastIndex(fields.keySet());
//         for (Map.Entry<String, AbstractJsonType> entry : fields.entrySet()) {
//             AbstractJsonType object = entry.getValue();
//             String lastSign = index == lastIndex ? EMPTY_STRING : NEW_LINE_SIGN;
//             result.append(StringToJsonStringWrapper.wrap(entry.getKey()))
//                 .append(':')
//                 .append(object.toStringJson())
//                 .append(lastSign);
//             index++;
//         }
//         result.append(JSON_OBJECT_END);
//         return result.toString();
//     }
// 
//     @Override
//     public void merge(ObjectJsonType mergeWith, PathMetadata currentPathMetadata) {
//         for (String fieldName : mergeWith.fields.keySet()) {
//             addField(fieldName, mergeWith.getField(fieldName), currentPathMetadata);
//         }
//     }
// }
// 
// Path: src/main/java/pl/jalokim/propertiestojson/path/PathMetadata.java
// @Data
// public class PathMetadata {
// 
//     private static final String NUMBER_PATTERN = "([1-9]\\d*)|0";
//     public static final String INDEXES_PATTERN = "\\s*(\\[\\s*((" + NUMBER_PATTERN + ")|\\*)\\s*]\\s*)+";
// 
//     private static final String WORD_PATTERN = "(.)*";
// 
//     private final String originalPropertyKey;
//     private PathMetadata parent;
//     private String fieldName;
//     private String originalFieldName;
//     private PathMetadata child;
//     private PropertyArrayHelper propertyArrayHelper;
//     private Object rawValue;
//     private AbstractJsonType jsonValue;
// 
//     public boolean isLeaf() {
//         return child == null;
//     }
// 
//     public boolean isRoot() {
//         return parent == null;
//     }
// 
//     public String getCurrentFullPath() {
//         return parent == null ? originalFieldName : parent.getCurrentFullPath() + NORMAL_DOT + originalFieldName;
//     }
// 
//     public PathMetadata getLeaf() {
//         PathMetadata current = this;
//         while (current.getChild() != null) {
//             current = current.getChild();
//         }
//         return current;
//     }
// 
//     public void setFieldName(String fieldName) {
//         this.fieldName = fieldName;
//         if (fieldName.matches(WORD_PATTERN + INDEXES_PATTERN)) {
//             propertyArrayHelper = new PropertyArrayHelper(fieldName);
//             this.fieldName = propertyArrayHelper.getArrayFieldName();
//         }
//     }
// 
//     public void setRawValue(Object rawValue) {
//         if (!isLeaf()) {
//             throw new NotLeafValueException("Cannot set value for not leaf: " + getCurrentFullPath());
//         }
//         this.rawValue = rawValue;
//     }
// 
//     public String getOriginalPropertyKey() {
//         return originalPropertyKey;
//     }
// 
//     public PathMetadata getRoot() {
//         PathMetadata current = this;
//         while (current.getParent() != null) {
//             current = current.getParent();
//         }
//         return current;
//     }
// 
//     public String getCurrentFullPathWithoutIndexes() {
//         String parentFullPath = isRoot() ? EMPTY_STRING : getParent().getCurrentFullPath() + NORMAL_DOT;
//         return parentFullPath + getFieldName();
//     }
// 
//     public AbstractJsonType getJsonValue() {
//         return jsonValue;
//     }
// 
//     public void setJsonValue(AbstractJsonType jsonValue) {
//         if (!isLeaf()) {
//             throw new NotLeafValueException("Cannot set value for not leaf: " + getCurrentFullPath());
//         }
//         this.jsonValue = jsonValue;
//     }
// 
//     @Override
//     public String toString() {
//         return "field='" + fieldName + '\''
//             + ", rawValue=" + rawValue
//             + ", fullPath='" + getCurrentFullPath() + '}';
//     }
// 
//     public boolean isArrayField() {
//         return propertyArrayHelper != null;
//     }
// }


// Path: src/main/java/pl/jalokim/propertiestojson/resolvers/transfer/DataForResolve.java
import java.util.Map;
import pl.jalokim.propertiestojson.object.ObjectJsonType;
import pl.jalokim.propertiestojson.path.PathMetadata;

package pl.jalokim.propertiestojson.resolvers.transfer;


public class DataForResolve {

    private final Map<String, Object> properties;
    private final String propertyKey;
    private final ObjectJsonType currentObjectJsonType;
    private final PathMetadata currentPathMetaData;