aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/util/NameTransformer.java
blob: b19096837865b71c2672ef527424617ca665c229 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.fasterxml.jackson.databind.util;

/**
 * Helper class used to encapsulate details of name mangling, transforming
 * of names using different strategies (prefixes, suffixes).
 * Default implementation is "no-operation" (aka identity transformation).
 */
public abstract class NameTransformer
{
    /**
     * Singleton "no-operation" transformer which simply returns given
     * name as is. Used commonly as placeholder or marker.
     */
    public final static NameTransformer NOP = new NopTransformer();
    
    protected final static class NopTransformer
        extends NameTransformer
        implements java.io.Serializable
    {
        private static final long serialVersionUID = 1L;

        @Override
        public String transform(String name) {
            return name;
        }
        @Override
        public String reverse(String transformed) {
            // identity transformation is always reversible:
            return transformed;
        }
    }

    protected NameTransformer() { }
    
    /**
     * Factory method for constructing a simple transformer based on
     * prefix and/or suffix.
     */
    public static NameTransformer simpleTransformer(final String prefix, final String suffix)
    {
        boolean hasPrefix = (prefix != null) && (prefix.length() > 0);
        boolean hasSuffix = (suffix != null) && (suffix.length() > 0);

        if (hasPrefix) {
            if (hasSuffix) {
                return new NameTransformer() {
                    @Override
                    public String transform(String name) { return prefix + name + suffix; }
                    @Override
                    public String reverse(String transformed) {
                        if (transformed.startsWith(prefix)) {
                            String str = transformed.substring(prefix.length());
                            if (str.endsWith(suffix)) {
                                return str.substring(0, str.length() - suffix.length());
                            }
                        }
                        return null;
                    }
                    @Override
                    public String toString() { return "[PreAndSuffixTransformer('"+prefix+"','"+suffix+"')]"; }
                };
            }
            return new NameTransformer() {
                @Override
                public String transform(String name) { return prefix + name; }
                @Override
                public String reverse(String transformed) {
                    if (transformed.startsWith(prefix)) {
                        return transformed.substring(prefix.length());
                    }
                    return null;
                }
                @Override
                public String toString() { return "[PrefixTransformer('"+prefix+"')]"; }
            };
        }
        if (hasSuffix) {
            return new NameTransformer() {
                @Override
                public String transform(String name) { return name + suffix; }
                @Override
                public String reverse(String transformed) {
                    if (transformed.endsWith(suffix)) {
                        return transformed.substring(0, transformed.length() - suffix.length());
                    }
                    return null;
                }
                @Override
                public String toString() { return "[SuffixTransformer('"+suffix+"')]"; }
            };
        }
        return NOP;
    }

    /**
     * Method that constructs transformer that applies given transformers
     * as a sequence; essentially combines separate transform operations
     * into one logical transformation.
     */
    public static NameTransformer chainedTransformer(NameTransformer t1, NameTransformer t2) {
        return new Chained(t1, t2);
    }
    
    /**
     * Method called when (forward) transformation is needed.
     */
    public abstract String transform(String name);

    /**
     * Method called when reversal of transformation is needed; should return
     * null if this is not possible, that is, given name cannot have been
     * result of calling {@link #transform} of this object.
     */
    public abstract String reverse(String transformed);

    public static class Chained extends NameTransformer
        implements java.io.Serializable
    {
        private static final long serialVersionUID = 1L;

        protected final NameTransformer _t1, _t2;
        
        public Chained(NameTransformer t1, NameTransformer t2) {
            _t1 = t1;
            _t2 = t2;
        }

        @Override
        public String transform(String name) {
            return _t1.transform(_t2.transform(name));
        }

        @Override
        public String reverse(String transformed) {
            transformed = _t1.reverse(transformed);
            if (transformed != null) {
                transformed = _t2.reverse(transformed);
            }
            return transformed;
        }

        @Override
        public String toString() { return "[ChainedTransformer("+_t1+", "+_t2+")]"; }
    }
}