/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.workbench.editors.impl; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Map; import javax.xml.crypto.NoSuchMechanismException; import org.carrot2.workbench.editors.AttributeEditorInfo; /** * An attribute editor for objects whose classes declare a conversion-from-string * (<tt>valueOf(String)</tt>) method. */ public class ClassWithValueOfEditor extends StringEditor { private Method valueOf; @Override protected AttributeEditorInfo init(Map<String, Object> defaultValues) { Class<?> clazz = super.descriptor.type; if (clazz == null) throw new IllegalArgumentException("Attribute's class must exist: " + super.getAttributeKey()); try { Method valueOf = clazz.getDeclaredMethod("valueOf", String.class); if (!Modifier.isStatic(valueOf.getModifiers())) throw new NoSuchMethodException(); if (!Modifier.isPublic(valueOf.getModifiers())) throw new NoSuchMechanismException(); this.valueOf = valueOf; } catch (NoSuchMethodException e) { throw new IllegalArgumentException("Attribute's class must have a public static valueOf method: " + super.getAttributeKey() + ", class: " + clazz.getName()); } return super.init(defaultValues); } @Override protected boolean isValid(String newValue) { try { valueOf.invoke(null, newValue); } catch (Exception e) { return false; } return true; } }