/* * Copyright 2001-2013 Stephen Colebourne * * 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.joda.beans.ui.form; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.util.Objects; /** * A factory allowing the real UI component to be created. * For example, this might return a Swing-based factory. */ @SuppressWarnings("rawtypes") public final class DefaultUIComponentFactory extends UIComponentFactory { /** * The {@code UIComponent} class to instantiate. */ private final Constructor constructor; /** * Obtains an instance for a type. * * @param type the type to instantiate, not null * @return the factory, not null */ public static UIComponentFactory of(Class<?> type) { Objects.requireNonNull(type, "type"); return new DefaultUIComponentFactory(type); } /** * Creates an instance. */ private DefaultUIComponentFactory(Class<?> type) { if (type.isInterface() || Modifier.isAbstract(type.getModifiers())) { throw new IllegalArgumentException("Type is not instantiable: " + type.getName()); } Constructor cons; try { cons = type.getDeclaredConstructor(MetaUIComponent.class); } catch (ReflectiveOperationException ex) { throw new IllegalArgumentException(ex); } if (Modifier.isPublic(cons.getModifiers()) == false) { throw new IllegalArgumentException("Constructor is not public: " + cons); } this.constructor = cons; } //------------------------------------------------------------------------- /** * Creates the UI component. * * @param <T> the UI component type * @param metaComponent the meta-component, not null * @return the UI component, not null */ @SuppressWarnings("unchecked") @Override public <T> UIComponent<T> createComponent(MetaUIComponent metaComponent) { try { return (UIComponent<T>) constructor.newInstance(metaComponent); } catch (ReflectiveOperationException ex) { throw new IllegalArgumentException(ex); } } //------------------------------------------------------------------------- @Override public String toString() { return constructor.toString(); } }