|
1 |
| package com.agical.rmock.extension.cglib; |
|
2 |
| |
|
3 |
| import java.util.HashMap; |
|
4 |
| import java.util.HashSet; |
|
5 |
| import java.util.Map; |
|
6 |
| import java.util.Set; |
|
7 |
| |
|
8 |
| import net.sf.cglib.core.NamingPolicy; |
|
9 |
| import net.sf.cglib.core.Predicate; |
|
10 |
| |
|
11 |
| import com.agical.rmock.core.util.StringUtils; |
|
12 |
| |
|
13 |
| public class RMockNamingPolicy implements NamingPolicy { |
|
14 |
| private static Map IDENTIFIER_GENERATORS; |
|
15 |
| private static Map cachedNames = new HashMap(); |
|
16 |
| private static Set usedNames = new HashSet(); |
|
17 |
| static { |
|
18 |
1
| IDENTIFIER_GENERATORS = new HashMap();
|
|
19 |
1
| IDENTIFIER_GENERATORS.put(RMockNamingPolicy.MOCK, new IdentifierGenerator() {
|
|
20 |
62
| public String generateIdentifier(String identifier) {
|
|
21 |
62
| String string = StringUtils.capitalize(identifier)+"Mock";
|
|
22 |
62
| return string;
|
|
23 |
| } |
|
24 |
| }); |
|
25 |
1
| IDENTIFIER_GENERATORS.put(RMockNamingPolicy.INTERCEPTED, new IdentifierGenerator() {
|
|
26 |
32
| public String generateIdentifier(String identifier) {
|
|
27 |
32
| String string = "Intercepted"+StringUtils.capitalize(identifier);
|
|
28 |
32
| return string;
|
|
29 |
| } |
|
30 |
| }); |
|
31 |
| |
|
32 |
1
| IDENTIFIER_GENERATORS.put(RMockNamingPolicy.FAKED_AND_INTERCEPTED, new IdentifierGenerator() {
|
|
33 |
2
| public String generateIdentifier(String identifier) {
|
|
34 |
2
| String string = "InterceptedFaked"+StringUtils.capitalize(identifier);
|
|
35 |
2
| return string;
|
|
36 |
| } |
|
37 |
| }); |
|
38 |
| } |
|
39 |
| |
|
40 |
| public static final String MOCK = "M"; |
|
41 |
| public static final String INTERCEPTED = "I"; |
|
42 |
| public static final String FAKED_AND_INTERCEPTED = "FI"; |
|
43 |
| private final String type; |
|
44 |
| private final String identifier; |
|
45 |
| |
|
46 |
785
| public RMockNamingPolicy(String identifier, String type) {
|
|
47 |
785
| this.identifier = identifier;
|
|
48 |
785
| this.type = type;
|
|
49 |
| |
|
50 |
| } |
|
51 |
| |
|
52 |
| |
|
53 |
| |
|
54 |
| |
|
55 |
| |
|
56 |
| |
|
57 |
| |
|
58 |
| |
|
59 |
| |
|
60 |
| |
|
61 |
| |
|
62 |
| |
|
63 |
| |
|
64 |
| |
|
65 |
96
| public String getClassName(String prefix, String source, Object key, Predicate names) {
|
|
66 |
96
| String attempt;
|
|
67 |
96
| String base;
|
|
68 |
96
| synchronized (cachedNames) {
|
|
69 |
| |
|
70 |
96
| String pkg = getPackage(prefix);
|
|
71 |
| |
|
72 |
96
| StringBuffer sb = new StringBuffer();
|
|
73 |
96
| prefix = createBaseName(pkg);
|
|
74 |
96
| sb.append(
|
|
75 |
96
| (prefix != null) ?
|
|
76 |
| ( |
|
77 |
96
| prefix.startsWith("java") ?
|
|
78 |
| "$" + prefix : prefix |
|
79 |
| ) |
|
80 |
| : "com.agical.rmock.empty.Object" |
|
81 |
| ); |
|
82 |
96
| base = sb.toString();
|
|
83 |
96
| attempt = base;
|
|
84 |
96
| int index = 2;
|
|
85 |
96
| while (usedNames.contains(attempt) || names.evaluate(attempt)) {
|
|
86 |
73
| attempt = base + "_" + index++;
|
|
87 |
| } |
|
88 |
96
| cachedNames.put(key, attempt);
|
|
89 |
| } |
|
90 |
96
| usedNames.add(attempt);
|
|
91 |
96
| return attempt;
|
|
92 |
| } |
|
93 |
| |
|
94 |
96
| private String createBaseName(String pkg) {
|
|
95 |
96
| String baseName = pkg+((IdentifierGenerator)IDENTIFIER_GENERATORS.get(type)).generateIdentifier(identifier);
|
|
96 |
96
| return baseName.replace(' ', '_');
|
|
97 |
| } |
|
98 |
| |
|
99 |
96
| private String getPackage(String prefix) {
|
|
100 |
96
| String pkg = "";
|
|
101 |
96
| int dotIndex = prefix.lastIndexOf('.');
|
|
102 |
96
| if (dotIndex != -1) {
|
|
103 |
96
| pkg = prefix.substring(0, dotIndex+1);
|
|
104 |
96
| if (pkg.startsWith("java")) {
|
|
105 |
9
| pkg = "rmock."+pkg;
|
|
106 |
| } |
|
107 |
| } |
|
108 |
96
| return pkg;
|
|
109 |
| } |
|
110 |
| |
|
111 |
| } |
|
112 |
| |
|
113 |
| interface IdentifierGenerator { |
|
114 |
| String generateIdentifier(String identifier); |
|
115 |
| } |