|
24 | 24 |
|
25 | 25 | package hudson.slaves;
|
26 | 26 |
|
27 |
| -import jenkins.model.Jenkins; |
28 | 27 | import hudson.Functions;
|
29 | 28 | import hudson.model.Computer;
|
30 | 29 | import hudson.model.User;
|
|
33 | 32 | import org.kohsuke.stapler.export.ExportedBean;
|
34 | 33 | import org.kohsuke.stapler.export.Exported;
|
35 | 34 |
|
| 35 | +import javax.annotation.CheckForNull; |
36 | 36 | import javax.annotation.Nonnull;
|
| 37 | +import java.io.ObjectStreamException; |
| 38 | +import java.util.Collections; |
37 | 39 | import java.util.Date;
|
38 | 40 |
|
39 | 41 | /**
|
@@ -128,21 +130,49 @@ public String toString() {
|
128 | 130 |
|
129 | 131 | /**
|
130 | 132 | * Taken offline by user.
|
| 133 | + * |
131 | 134 | * @since 1.551
|
132 | 135 | */
|
133 | 136 | public static class UserCause extends SimpleOfflineCause {
|
134 |
| - private final User user; |
135 |
| - |
136 |
| - public UserCause(User user, String message) { |
137 |
| - super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy( |
138 |
| - user!=null ? user.getId() : Jenkins.ANONYMOUS.getName(), |
| 137 | + @Deprecated |
| 138 | + private transient User user; |
| 139 | + // null when unknown |
| 140 | + private /*final*/ @CheckForNull String userId; |
| 141 | + |
| 142 | + public UserCause(@CheckForNull User user, @CheckForNull String message) { |
| 143 | + this( |
| 144 | + user != null ? user.getId() : null, |
139 | 145 | message != null ? " : " + message : ""
|
140 |
| - )); |
141 |
| - this.user = user; |
| 146 | + ); |
| 147 | + } |
| 148 | + |
| 149 | + private UserCause(String userId, String message) { |
| 150 | + super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy(userId, message)); |
| 151 | + this.userId = userId; |
142 | 152 | }
|
143 | 153 |
|
144 | 154 | public User getUser() {
|
145 |
| - return user; |
| 155 | + return userId == null |
| 156 | + ? User.getUnknown() |
| 157 | + : User.getById(userId, true) |
| 158 | + ; |
| 159 | + } |
| 160 | + |
| 161 | + // Storing the User in a filed was a mistake, switch to userId |
| 162 | + @SuppressWarnings("deprecation") |
| 163 | + private Object readResolve() throws ObjectStreamException { |
| 164 | + if (user != null) { |
| 165 | + String id = user.getId(); |
| 166 | + if (id != null) { |
| 167 | + userId = id; |
| 168 | + } else { |
| 169 | + // The user field is not properly deserialized so id may be missing. Look the user up by fullname |
| 170 | + User user = User.get(this.user.getFullName(), true, Collections.emptyMap()); |
| 171 | + userId = user.getId(); |
| 172 | + } |
| 173 | + this.user = null; |
| 174 | + } |
| 175 | + return this; |
146 | 176 | }
|
147 | 177 | }
|
148 | 178 |
|
|
0 commit comments