1 package uk.ac.cam.spectra.spectrasub;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.regex.Matcher;
7 import java.util.regex.Pattern;
8
9 import org.apache.log4j.Logger;
10
11
12
13
14
15
16
17 public class Name implements Serializable {
18
19 private static final long serialVersionUID = 2283316454092607535L;
20
21 private static final Logger LOG = Logger.getLogger(Name.class);
22
23 private static final Pattern NAME_PATTERN = Pattern
24 .compile("(((\\w\\.)*)?\\s+)?(.*)");
25
26 private String initials = "";
27
28 private String surname = "";
29
30 public boolean isBlank() {
31 return (initials == null ? "" : initials).trim().length() == 0
32 && (surname == null ? "" : surname).trim().length() == 0;
33 }
34
35 public String getInitials() {
36 return initials;
37 }
38
39 public void setInitials(String i) {
40 this.initials = (i == null) ? "" : i.trim();
41 }
42
43 public String getSurname() {
44 return surname;
45 }
46
47 public void setSurname(String surname) {
48 this.surname = surname;
49 }
50
51 public static Name decode(String nm) {
52 Name n = new Name();
53 Matcher m = NAME_PATTERN.matcher(nm);
54 if (!m.matches()) {
55 LOG.warn("Probably coding error in Name parsing. Could not match "
56 + nm + " as a Name");
57 n.setSurname(nm);
58 } else {
59 n.setInitials(m.group(2));
60 n.setSurname(m.group(m.groupCount()));
61 }
62 return n;
63 }
64
65 public static String encode(Name n) {
66 StringBuilder sb = new StringBuilder();
67 if (!"".equals(n.getInitials())) {
68 sb.append(n.getInitials()).append(" ");
69 }
70 sb.append(n.getSurname());
71 return sb.toString();
72 }
73
74 public String toString() {
75 return Name.encode(this);
76 }
77
78 public static boolean isEmpty(List<Name> names) {
79 if (names == null) {
80 return true;
81 }
82 if (names.isEmpty()) {
83 return true;
84 }
85 for (Name n : names) {
86 if (!n.isBlank()) {
87 return false;
88 }
89 }
90 return true;
91 }
92
93 public static List<Name> trim(List<Name> names) {
94 List<Name> toRemove = new ArrayList<Name>();
95 for (Name n : names) {
96 if (n.isBlank()) {
97 toRemove.add(n);
98 }
99 }
100 names.removeAll(toRemove);
101 return names;
102 }
103
104 @Override
105 public int hashCode() {
106 final int PRIME = 31;
107 int result = 1;
108 result = PRIME * result
109 + ((initials == null) ? 0 : initials.hashCode());
110 result = PRIME * result + ((surname == null) ? 0 : surname.hashCode());
111 return result;
112 }
113
114 @Override
115 public boolean equals(Object obj) {
116 if (this == obj)
117 return true;
118 if (obj == null)
119 return false;
120 if (getClass() != obj.getClass())
121 return false;
122 final Name other = (Name) obj;
123 if (initials == null) {
124 if (other.initials != null)
125 return false;
126 } else if (!initials.equals(other.initials))
127 return false;
128 if (surname == null) {
129 if (other.surname != null)
130 return false;
131 } else if (!surname.equals(other.surname))
132 return false;
133 return true;
134 }
135
136 }