/** * * Copyright 2018-2019 Florian Schmaus * * 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 org.igniterealtime.smack.inttest; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; public class XmppConnectionDescriptor> { private final Class connectionClass; private final Class connectionConfigurationClass; private final Constructor connectionConstructor; private final Method builderMethod; public XmppConnectionDescriptor(Class connectionClass, Class connectionConfigurationClass) throws ClassNotFoundException, NoSuchMethodException, SecurityException { this.connectionClass = connectionClass; this.connectionConfigurationClass = connectionConfigurationClass; this.connectionConstructor = getConstructor(connectionClass, connectionConfigurationClass); this.builderMethod = getBuilderMethod(connectionConfigurationClass); } public C construct(Configuration sinttestConfiguration) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { return construct(sinttestConfiguration, Collections.emptyList()); } public C construct(Configuration sinttestConfiguration, ConnectionConfigurationBuilderApplier... customConnectionConfigurationAppliers) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { List customConnectionConfigurationAppliersList = new ArrayList( Arrays.asList(customConnectionConfigurationAppliers)); return construct(sinttestConfiguration, customConnectionConfigurationAppliersList); } public C construct(Configuration sinttestConfiguration, Collection customConnectionConfigurationAppliers) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { CCB connectionConfigurationBuilder = getNewBuilder(); for (ConnectionConfigurationBuilderApplier customConnectionConfigurationApplier : customConnectionConfigurationAppliers) { customConnectionConfigurationApplier.applyConfigurationTo(connectionConfigurationBuilder); } sinttestConfiguration.configurationApplier.applyConfigurationTo(connectionConfigurationBuilder); ConnectionConfiguration connectionConfiguration = connectionConfigurationBuilder.build(); CC concreteConnectionConfiguration = connectionConfigurationClass.cast(connectionConfiguration); return connectionConstructor.newInstance(concreteConnectionConfiguration); } @SuppressWarnings("unchecked") public CCB getNewBuilder() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { return (CCB) builderMethod.invoke(null); } public Class getConnectionClass() { return connectionClass; } private static Constructor getConstructor(Class connectionClass, Class connectionConfigurationClass) throws NoSuchMethodException, SecurityException { return connectionClass.getConstructor(connectionConfigurationClass); } private static Method getBuilderMethod(Class connectionConfigurationClass) throws NoSuchMethodException, SecurityException { Method builderMethod = connectionConfigurationClass.getMethod("builder"); if (!Modifier.isStatic(builderMethod.getModifiers())) { throw new IllegalArgumentException(); } Class returnType = builderMethod.getReturnType(); if (!ConnectionConfiguration.Builder.class.isAssignableFrom(returnType)) { throw new IllegalArgumentException(); } return builderMethod; } }