diff --git a/src/main/java/com/openpojo/random/generator/security/CredentialsRandomGenerator.java b/src/main/java/com/openpojo/random/generator/security/CredentialsRandomGenerator.java index 7690fe0b..1241c57f 100644 --- a/src/main/java/com/openpojo/random/generator/security/CredentialsRandomGenerator.java +++ b/src/main/java/com/openpojo/random/generator/security/CredentialsRandomGenerator.java @@ -18,28 +18,27 @@ package com.openpojo.random.generator.security; -import java.util.Arrays; -import java.util.Collection; - -import com.openpojo.random.RandomFactory; import com.openpojo.random.RandomGenerator; -import sun.security.krb5.Credentials; -import sun.security.krb5.EncryptionKey; -import sun.security.krb5.PrincipalName; -import sun.security.krb5.internal.HostAddresses; -import sun.security.krb5.internal.KerberosTime; -import sun.security.krb5.internal.Ticket; -import sun.security.krb5.internal.TicketFlags; +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.construct.InstanceFactory; + +import java.util.*; + +import static com.openpojo.random.RandomFactory.getRandomValue; +import static com.openpojo.reflection.impl.PojoClassFactory.getPojoClass; +import static com.openpojo.reflection.java.load.ClassUtil.loadClass; /** * @author oshoukry */ public class CredentialsRandomGenerator implements RandomGenerator { - private static final Class[] TYPES = new Class[] { Credentials.class }; + private static final String TYPE = "sun.security.krb5.Credentials"; private static final CredentialsRandomGenerator INSTANCE = new CredentialsRandomGenerator(); + private final Class credentialsClass; private CredentialsRandomGenerator() { + credentialsClass = loadClass(TYPE); } public static RandomGenerator getInstance() { @@ -47,26 +46,30 @@ public static RandomGenerator getInstance() { } public Collection> getTypes() { - return Arrays.asList(TYPES); + List> supported = new ArrayList>(); + if (credentialsClass != null) + supported.add(credentialsClass); + return supported; } public Object doGenerate(Class type) { - Ticket var1 = RandomFactory.getRandomValue(Ticket.class); + Object var1 = getRandomValue(loadClass("sun.security.krb5.internal.Ticket")); - PrincipalName var2 = RandomFactory.getRandomValue(PrincipalName.class); - PrincipalName var3 = RandomFactory.getRandomValue(PrincipalName.class); + Object var2 = getRandomValue(loadClass("sun.security.krb5.PrincipalName")); + Object var3 = getRandomValue(loadClass("sun.security.krb5.PrincipalName")); - EncryptionKey var4 = RandomFactory.getRandomValue(EncryptionKey.class); + Object var4 = getRandomValue(loadClass("sun.security.krb5.EncryptionKey")); - TicketFlags var5 = RandomFactory.getRandomValue(TicketFlags.class); + Object var5 = getRandomValue(loadClass("sun.security.krb5.internal.TicketFlags")); - KerberosTime var6 = RandomFactory.getRandomValue(KerberosTime.class); - KerberosTime var7 = RandomFactory.getRandomValue(KerberosTime.class); - KerberosTime var8 = RandomFactory.getRandomValue(KerberosTime.class); - KerberosTime var9 = RandomFactory.getRandomValue(KerberosTime.class); + Object var6 = getRandomValue(loadClass("sun.security.krb5.internal.KerberosTime")); + Object var7 = getRandomValue(loadClass("sun.security.krb5.internal.KerberosTime")); + Object var8 = getRandomValue(loadClass("sun.security.krb5.internal.KerberosTime")); + Object var9 = getRandomValue(loadClass("sun.security.krb5.internal.KerberosTime")); - HostAddresses var10 = RandomFactory.getRandomValue(HostAddresses.class); + Object var10 = getRandomValue(loadClass("sun.security.krb5.internal.HostAddresses")); - return new Credentials(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); + PojoClass pojoClass = getPojoClass(credentialsClass); + return InstanceFactory.getInstance(pojoClass, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); } } \ No newline at end of file diff --git a/src/main/java/com/openpojo/random/generator/security/EncryptionKeyRandomGenerator.java b/src/main/java/com/openpojo/random/generator/security/EncryptionKeyRandomGenerator.java index 74a8393e..c02c87fa 100644 --- a/src/main/java/com/openpojo/random/generator/security/EncryptionKeyRandomGenerator.java +++ b/src/main/java/com/openpojo/random/generator/security/EncryptionKeyRandomGenerator.java @@ -18,21 +18,28 @@ package com.openpojo.random.generator.security; -import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.ArrayList; import com.openpojo.random.RandomFactory; import com.openpojo.random.RandomGenerator; -import sun.security.krb5.EncryptionKey; +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.construct.InstanceFactory; +import com.openpojo.reflection.impl.PojoClassFactory; + +import static com.openpojo.reflection.java.load.ClassUtil.loadClass; /** * @author oshoukry */ public class EncryptionKeyRandomGenerator implements RandomGenerator { - private static final Class[] TYPES = new Class[] { EncryptionKey.class }; - private static final RandomGenerator INSTANCE = new EncryptionKeyRandomGenerator(); + private static final String TYPE = "sun.security.krb5.EncryptionKey"; + private final Class encryptionKeyClass; + private static final EncryptionKeyRandomGenerator INSTANCE = new EncryptionKeyRandomGenerator(); private EncryptionKeyRandomGenerator() { + encryptionKeyClass = loadClass(TYPE); } public static RandomGenerator getInstance() { @@ -40,11 +47,14 @@ public static RandomGenerator getInstance() { } public Collection> getTypes() { - return Arrays.asList(TYPES); + List> supported = new ArrayList>(); + if (encryptionKeyClass != null) + supported.add(encryptionKeyClass); + return supported; } public Object doGenerate(Class type) { - //noinspection ConstantConditions - return new EncryptionKey(RandomFactory.getRandomValue(byte[].class), RandomFactory.getRandomValue(Integer.class), null); + PojoClass pojoClass = PojoClassFactory.getPojoClass(encryptionKeyClass); + return InstanceFactory.getInstance(pojoClass, RandomFactory.getRandomValue(byte[].class), RandomFactory.getRandomValue(Integer.class), null); } } \ No newline at end of file diff --git a/src/main/java/com/openpojo/random/generator/security/KerberosTimeRandomGenerator.java b/src/main/java/com/openpojo/random/generator/security/KerberosTimeRandomGenerator.java index f4d0b695..cce3899d 100644 --- a/src/main/java/com/openpojo/random/generator/security/KerberosTimeRandomGenerator.java +++ b/src/main/java/com/openpojo/random/generator/security/KerberosTimeRandomGenerator.java @@ -18,21 +18,27 @@ package com.openpojo.random.generator.security; -import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.ArrayList; import com.openpojo.random.RandomFactory; import com.openpojo.random.RandomGenerator; -import sun.security.krb5.internal.KerberosTime; +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.construct.InstanceFactory; +import com.openpojo.reflection.impl.PojoClassFactory; +import com.openpojo.reflection.java.load.ClassUtil; /** * @author oshoukry */ public class KerberosTimeRandomGenerator implements RandomGenerator { - private static final Class[] TYPES = new Class[] { KerberosTime.class }; + private static final String TYPE = "sun.security.krb5.internal.KerberosTime"; + private final Class kerberosTimeClass; private static final KerberosTimeRandomGenerator INSTANCE = new KerberosTimeRandomGenerator(); private KerberosTimeRandomGenerator() { + kerberosTimeClass = ClassUtil.loadClass(TYPE); } public static RandomGenerator getInstance() { @@ -40,10 +46,14 @@ public static RandomGenerator getInstance() { } public Collection> getTypes() { - return Arrays.asList(TYPES); + List> supported = new ArrayList>(); + if (kerberosTimeClass != null) + supported.add(kerberosTimeClass); + return supported; } public Object doGenerate(Class type) { - return new KerberosTime(RandomFactory.getRandomValue(long.class)); + PojoClass pojoClass = PojoClassFactory.getPojoClass(kerberosTimeClass); + return InstanceFactory.getInstance(pojoClass, RandomFactory.getRandomValue(long.class)); } } diff --git a/src/main/java/com/openpojo/random/generator/security/PrincipalNameRandomGenerator.java b/src/main/java/com/openpojo/random/generator/security/PrincipalNameRandomGenerator.java index d83af08d..c619ba28 100644 --- a/src/main/java/com/openpojo/random/generator/security/PrincipalNameRandomGenerator.java +++ b/src/main/java/com/openpojo/random/generator/security/PrincipalNameRandomGenerator.java @@ -18,23 +18,29 @@ package com.openpojo.random.generator.security; -import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.ArrayList; import com.openpojo.random.RandomFactory; import com.openpojo.random.RandomGenerator; import com.openpojo.random.exception.RandomGeneratorException; -import sun.security.krb5.PrincipalName; +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.construct.InstanceFactory; +import com.openpojo.reflection.impl.PojoClassFactory; +import com.openpojo.reflection.java.load.ClassUtil; /** * @author oshoukry */ public class PrincipalNameRandomGenerator implements RandomGenerator { - private static final Class[] TYPES = new Class[] { PrincipalName.class }; + private static final String TYPE = "sun.security.krb5.PrincipalName"; + private final Class principalNameClass; private static final PrincipalNameRandomGenerator INSTANCE = new PrincipalNameRandomGenerator(); private PrincipalNameRandomGenerator() { + principalNameClass = ClassUtil.loadClass(TYPE); } public static RandomGenerator getInstance() { @@ -42,16 +48,18 @@ public static RandomGenerator getInstance() { } public Collection> getTypes() { - return Arrays.asList(TYPES); + List> supported = new ArrayList>(); + if (principalNameClass != null) + supported.add(principalNameClass); + return supported; } public Object doGenerate(Class type) { try { - //noinspection ConstantConditions - return new PrincipalName(getPrincipleParsableString() - ); + PojoClass pojoClass = PojoClassFactory.getPojoClass(principalNameClass); + return InstanceFactory.getInstance(pojoClass, getPrincipleParsableString()); } catch (Exception e) { - throw RandomGeneratorException.getInstance("Failed to generate " + TYPES[0].getName() + " instance.", e); + throw RandomGeneratorException.getInstance("Failed to generate " + TYPE + " instance.", e); } } diff --git a/src/test/java/com/openpojo/issues/issue84/ClassWithCredentials.java b/src/test/java/com/openpojo/issues/issue84/ClassWithCredentials.java deleted file mode 100644 index 5b6377d6..00000000 --- a/src/test/java/com/openpojo/issues/issue84/ClassWithCredentials.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2018 Osman Shoukry - * - * Licensed 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 com.openpojo.issues.issue84; - -import sun.security.krb5.Credentials; - -/** - * @author oshoukry - */ -final class ClassWithCredentials { - - private Credentials credentials; - - @SuppressWarnings("unused") - public Object getCredentials() { - return this.credentials; - } - - @SuppressWarnings("unused") - public void setCredentials(Credentials credentials) { - this.credentials = credentials; - } -} diff --git a/src/test/java/com/openpojo/issues/issue84/ClassWithCredentialsDumper.java b/src/test/java/com/openpojo/issues/issue84/ClassWithCredentialsDumper.java new file mode 100644 index 00000000..653da9e7 --- /dev/null +++ b/src/test/java/com/openpojo/issues/issue84/ClassWithCredentialsDumper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2010-2018 Osman Shoukry + * + * Licensed 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 com.openpojo.issues.issue84; + +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; + +import static org.objectweb.asm.Opcodes.*; +//@formatter:off +/** + * Creates this class: + *{@code + * package com.openpojo.issues.issue84; + * import sun.security.krb5.Credentials; + * + * public class ClassWithCredentials { + * private Credentials credentials; + * public Credentials getCredentials() { + * return this.credentials; + * } + * + * public void setCredentials(Credentials credentials) { + * this.credentials = credentials; + * } + * } + * + * @author oshoukry + */ + //@formatter:on +final class ClassWithCredentialsDumper { + + private final static String CLASS_PACKAGE = "com/openpojo/issues/issue84/ClassWithCredentials"; + private static final String SUN_SECURITY_KRB_5_CREDENTIALS = "sun/security/krb5/Credentials"; + + static byte[] dump() { + + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(52, ACC_FINAL + ACC_SUPER, CLASS_PACKAGE, null, "java/lang/Object", null); + + { + fv = cw.visitField(ACC_PRIVATE, "credentials", "L" + SUN_SECURITY_KRB_5_CREDENTIALS + ";", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(0, "", "()V", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "getCredentials", "()L" + SUN_SECURITY_KRB_5_CREDENTIALS + ";", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, CLASS_PACKAGE, "credentials", "L" + SUN_SECURITY_KRB_5_CREDENTIALS + ";"); + mv.visitInsn(ARETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "setCredentials", "(L" + SUN_SECURITY_KRB_5_CREDENTIALS + ";)V", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitFieldInsn(PUTFIELD, CLASS_PACKAGE, "credentials", "L" + SUN_SECURITY_KRB_5_CREDENTIALS + ";"); + mv.visitInsn(RETURN); + mv.visitMaxs(2, 2); + mv.visitEnd(); + } + cw.visitEnd(); + + return cw.toByteArray(); + } +} diff --git a/src/test/java/com/openpojo/issues/issue84/IssueTest.java b/src/test/java/com/openpojo/issues/issue84/IssueTest.java index 8db88828..1ed4619f 100644 --- a/src/test/java/com/openpojo/issues/issue84/IssueTest.java +++ b/src/test/java/com/openpojo/issues/issue84/IssueTest.java @@ -21,23 +21,39 @@ import com.openpojo.random.RandomFactory; import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.impl.PojoClassFactory; +import com.openpojo.reflection.java.bytecode.asm.SimpleClassLoader; +import com.openpojo.reflection.java.load.ClassUtil; import com.openpojo.validation.Validator; import com.openpojo.validation.ValidatorBuilder; import com.openpojo.validation.test.impl.GetterTester; import com.openpojo.validation.test.impl.SetterTester; import org.hamcrest.CoreMatchers; import org.junit.Assert; +import org.junit.Assume; +import org.junit.Before; import org.junit.Test; -import sun.security.krb5.Credentials; /** * @author oshoukry */ public class IssueTest { + private Class classWithCredentialsDumperClass; + private Class credentialsClass; + + @Before + public void setup() throws Exception { + credentialsClass = ClassUtil.loadClass("sun.security.krb5.Credentials"); + Assume.assumeTrue(credentialsClass != null); + classWithCredentialsDumperClass = getClassWithCredentialsDumperClass(); + } + + private Class getClassWithCredentialsDumperClass() throws Exception { + return new SimpleClassLoader().loadThisClass(ClassWithCredentialsDumper.dump(), "com.openpojo.issues.issue84.ClassWithCredentials"); + } @Test public void end2endTest() { - PojoClass pojoClass = PojoClassFactory.getPojoClass(ClassWithCredentials.class); + PojoClass pojoClass = PojoClassFactory.getPojoClass(classWithCredentialsDumperClass); Validator validator = ValidatorBuilder.create() .with(new GetterTester()) .with(new SetterTester()) @@ -47,7 +63,8 @@ public void end2endTest() { @Test public void canGenerateCredentials() { - Credentials credentials = RandomFactory.getRandomValue(Credentials.class); + Object credentials = RandomFactory.getRandomValue(credentialsClass); Assert.assertThat(credentials, CoreMatchers.notNullValue()); } + } \ No newline at end of file diff --git a/src/test/java/com/openpojo/random/generator/AbstractGeneratorTest.java b/src/test/java/com/openpojo/random/generator/AbstractGeneratorTest.java index e1aa8b8e..169703b5 100644 --- a/src/test/java/com/openpojo/random/generator/AbstractGeneratorTest.java +++ b/src/test/java/com/openpojo/random/generator/AbstractGeneratorTest.java @@ -28,6 +28,7 @@ import com.openpojo.reflection.java.load.ClassUtil; import org.junit.Assert; import org.junit.Assume; +import org.junit.Before; import org.junit.Test; /** @@ -41,6 +42,11 @@ public abstract class AbstractGeneratorTest { protected abstract RandomGenerator getRandomGenerator(); + @Before + public void before() { + Assume.assumeTrue(getTypeName() != null); + } + @Test public void singlePrivateConstructor() { List constructors = getPojoClass().getPojoConstructors(); diff --git a/src/test/java/com/openpojo/random/generator/security/CredentialsRandomGeneratorTest.java b/src/test/java/com/openpojo/random/generator/security/CredentialsRandomGeneratorTest.java index 3009ed17..a8a4c5e5 100644 --- a/src/test/java/com/openpojo/random/generator/security/CredentialsRandomGeneratorTest.java +++ b/src/test/java/com/openpojo/random/generator/security/CredentialsRandomGeneratorTest.java @@ -22,7 +22,7 @@ import com.openpojo.random.generator.AbstractGeneratorTest; import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.impl.PojoClassFactory; -import sun.security.krb5.Credentials; +import com.openpojo.reflection.java.load.ClassUtil; /** * @author oshoukry @@ -34,7 +34,10 @@ protected PojoClass getPojoClass() { } protected String getTypeName() { - return Credentials.class.getName(); + Class credentialsClass = ClassUtil.loadClass("sun.security.krb5.Credentials"); + if (credentialsClass != null) + return credentialsClass.getName(); + return null; } protected RandomGenerator getRandomGenerator() { diff --git a/src/test/java/com/openpojo/random/generator/security/EncryptionKeyRandomGeneratorTest.java b/src/test/java/com/openpojo/random/generator/security/EncryptionKeyRandomGeneratorTest.java index cb17716b..82c429b2 100644 --- a/src/test/java/com/openpojo/random/generator/security/EncryptionKeyRandomGeneratorTest.java +++ b/src/test/java/com/openpojo/random/generator/security/EncryptionKeyRandomGeneratorTest.java @@ -22,7 +22,7 @@ import com.openpojo.random.generator.AbstractGeneratorTest; import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.impl.PojoClassFactory; -import sun.security.krb5.EncryptionKey; +import com.openpojo.reflection.java.load.ClassUtil; /** * @author oshoukry @@ -34,7 +34,10 @@ protected PojoClass getPojoClass() { } protected String getTypeName() { - return EncryptionKey.class.getName(); + Class encryptionKeyClass = ClassUtil.loadClass("sun.security.krb5.EncryptionKey"); + if (encryptionKeyClass != null) + return encryptionKeyClass.getName(); + return null; } protected RandomGenerator getRandomGenerator() { diff --git a/src/test/java/com/openpojo/random/generator/security/KerberosTimeRandomGeneratorTest.java b/src/test/java/com/openpojo/random/generator/security/KerberosTimeRandomGeneratorTest.java index b941ace7..53570152 100644 --- a/src/test/java/com/openpojo/random/generator/security/KerberosTimeRandomGeneratorTest.java +++ b/src/test/java/com/openpojo/random/generator/security/KerberosTimeRandomGeneratorTest.java @@ -22,7 +22,7 @@ import com.openpojo.random.generator.AbstractGeneratorTest; import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.impl.PojoClassFactory; -import sun.security.krb5.internal.KerberosTime; +import com.openpojo.reflection.java.load.ClassUtil; /** * @author oshoukry @@ -34,7 +34,10 @@ protected PojoClass getPojoClass() { } protected String getTypeName() { - return KerberosTime.class.getName(); + Class kerberosTimeClass = ClassUtil.loadClass("sun.security.krb5.internal.KerberosTime"); + if (kerberosTimeClass != null) + return kerberosTimeClass.getName(); + return null; } protected RandomGenerator getRandomGenerator() { diff --git a/src/test/java/com/openpojo/random/generator/security/PrincipalNameRandomGeneratorTest.java b/src/test/java/com/openpojo/random/generator/security/PrincipalNameRandomGeneratorTest.java index dc3f739e..f2c7bc85 100644 --- a/src/test/java/com/openpojo/random/generator/security/PrincipalNameRandomGeneratorTest.java +++ b/src/test/java/com/openpojo/random/generator/security/PrincipalNameRandomGeneratorTest.java @@ -26,10 +26,10 @@ import com.openpojo.random.service.RandomGeneratorService; import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.impl.PojoClassFactory; +import com.openpojo.reflection.java.load.ClassUtil; import com.openpojo.registry.ServiceRegistrar; import org.junit.Assert; import org.junit.Test; -import sun.security.krb5.PrincipalName; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; @@ -44,7 +44,10 @@ protected PojoClass getPojoClass() { } protected String getTypeName() { - return PrincipalName.class.getName(); + Class principalNameClass = ClassUtil.loadClass("sun.security.krb5.PrincipalName"); + if (principalNameClass != null) + return principalNameClass.getName(); + return null; } protected RandomGenerator getRandomGenerator() {