View Javadoc

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   * Utility class for structuring names as initials then surname.
13   * 
14   * @author ojd20
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 }