Author: markt
Date: Tue Dec 16 13:55:53 2014
New Revision: 1645953
URL: http://svn.apache.org/r1645953
Log:
Make GenericPrincipal Serializable.
Added:
tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java
(with props)
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java (with
props)
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java
(with props)
Modified:
tomcat/trunk/java/org/apache/catalina/realm/GenericPrincipal.java
Modified: tomcat/trunk/java/org/apache/catalina/realm/GenericPrincipal.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/GenericPrincipal.java?rev=1645953&r1=1645952&r2=1645953&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/realm/GenericPrincipal.java (original)
+++ tomcat/trunk/java/org/apache/catalina/realm/GenericPrincipal.java Tue Dec
16 13:55:53 2014
@@ -16,6 +16,7 @@
*/
package org.apache.catalina.realm;
+import java.io.Serializable;
import java.security.Principal;
import java.util.Arrays;
import java.util.List;
@@ -31,7 +32,10 @@ import org.ietf.jgss.GSSCredential;
*
* @author Craig R. McClanahan
*/
-public class GenericPrincipal implements TomcatPrincipal {
+public class GenericPrincipal implements TomcatPrincipal, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
// ----------------------------------------------------------- Constructors
@@ -239,4 +243,36 @@ public class GenericPrincipal implements
loginContext.logout();
}
}
+
+
+ // -----------------------------------------------------------
Serialization
+
+ private Object writeReplace() {
+ return new SerializablePrincipal(name, password, roles, userPrincipal);
+ }
+
+ private static class SerializablePrincipal implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private final String name;
+ private final String password;
+ private final String[] roles;
+ private final Principal principal;
+
+ public SerializablePrincipal(String name, String password, String[]
roles,
+ Principal principal) {
+ this.name = name;
+ this.password = password;
+ this.roles = roles;
+ if (principal instanceof Serializable) {
+ this.principal = principal;
+ } else {
+ this.principal = null;
+ }
+ }
+
+ private Object readResolve() {
+ return new GenericPrincipal(name, password, Arrays.asList(roles),
principal);
+ }
+ }
}
Added: tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java?rev=1645953&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java
(added)
+++ tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java Tue
Dec 16 13:55:53 2014
@@ -0,0 +1,89 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.catalina.realm;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestGenericPrincipal {
+
+ private static final String USER = "user";
+ private static final String PASSWORD = "pwd";
+ private static final List<String> ROLES = Collections.unmodifiableList(
+ Arrays.asList(new String[] { "ROLE1", "ROLE2" }));
+ private static final TesterPrincipal PRINCIPAL = new
TesterPrincipal("Principal");
+ private static final TesterPrincipalNonSerializable
PRINCIPAL_NON_SERIALIZABLE =
+ new TesterPrincipalNonSerializable("PrincipalNonSerializable");
+
+ @Test
+ public void testSerialize01() throws ClassNotFoundException, IOException {
+ GenericPrincipal gpIn = new GenericPrincipal(USER, PASSWORD, ROLES);
+ doTest(gpIn);
+ }
+
+ @Test
+ public void testSerialize02() throws ClassNotFoundException, IOException {
+ GenericPrincipal gpIn = new GenericPrincipal(USER, PASSWORD, ROLES,
PRINCIPAL);
+ doTest(gpIn);
+ }
+
+ @Test
+ public void testSerialize03() throws ClassNotFoundException, IOException {
+ GenericPrincipal gpIn = new GenericPrincipal(USER, PASSWORD, ROLES,
PRINCIPAL_NON_SERIALIZABLE);
+ doTest(gpIn);
+ }
+
+ private void doTest(GenericPrincipal gpIn)
+ throws ClassNotFoundException, IOException {
+ GenericPrincipal gpOut = serializeAndDeserialize(gpIn);
+
+ Assert.assertNull(gpOut.getGssCredential());
+ Assert.assertEquals(gpIn.getName(), gpOut.getName());
+ Assert.assertEquals(gpIn.getPassword(), gpOut.getPassword());
+ Assert.assertArrayEquals(gpIn.getRoles(), gpOut.getRoles());
+ if (gpIn == gpIn.getUserPrincipal()) {
+ Assert.assertEquals(gpOut, gpOut.getUserPrincipal());
+ } else if (gpIn.getUserPrincipal() instanceof Serializable) {
+ Assert.assertEquals(gpIn.getUserPrincipal(),
gpOut.getUserPrincipal());
+ } else {
+ Assert.assertEquals(gpOut, gpOut.getUserPrincipal());
+ }
+ }
+
+ private GenericPrincipal serializeAndDeserialize(GenericPrincipal gpIn)
+ throws IOException, ClassNotFoundException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(gpIn);
+
+ byte[] data = bos.toByteArray();
+
+ ByteArrayInputStream bis = new ByteArrayInputStream(data);
+ ObjectInputStream ois = new ObjectInputStream(bis);
+ return (GenericPrincipal) ois.readObject();
+ }
+}
Propchange:
tomcat/trunk/test/org/apache/catalina/realm/TestGenericPrincipal.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java?rev=1645953&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java (added)
+++ tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java Tue Dec 16
13:55:53 2014
@@ -0,0 +1,66 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.catalina.realm;
+
+import java.io.Serializable;
+import java.security.Principal;
+
+public class TesterPrincipal implements Principal, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String name;
+
+ public TesterPrincipal(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TesterPrincipal other = (TesterPrincipal) obj;
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+}
Propchange: tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipal.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java?rev=1645953&view=auto
==============================================================================
---
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java
(added)
+++
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java
Tue Dec 16 13:55:53 2014
@@ -0,0 +1,63 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.catalina.realm;
+
+import java.security.Principal;
+
+public class TesterPrincipalNonSerializable implements Principal {
+
+ private final String name;
+
+ public TesterPrincipalNonSerializable(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TesterPrincipalNonSerializable other =
(TesterPrincipalNonSerializable) obj;
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+}
Propchange:
tomcat/trunk/test/org/apache/catalina/realm/TesterPrincipalNonSerializable.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]