/** * Copyright (c) 2014-2017 by the respective copyright holders. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.smarthome.core.types; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; /** * This is a helper class that helps parsing a string into an Eclipse SmartHome type (state or command). * * @author Kai Kreuzer - Initial contribution and API * */ public final class TypeParser { /** * No instances allowed. */ private TypeParser() { } private static final String CORE_LIBRARY_PACKAGE = "org.eclipse.smarthome.core.library.types."; /** * Parses a string into a type. * * @param typeName name of the type, for example StringType. * @param input input string to parse. * @return Parsed type or null, if the type couldn't be parsed. */ public static Type parseType(String typeName, String input) { try { Class<?> stateClass = Class.forName(CORE_LIBRARY_PACKAGE + typeName); Method valueOfMethod = stateClass.getMethod("valueOf", String.class); return (Type) valueOfMethod.invoke(stateClass, input); } catch (ClassNotFoundException e) { } catch (NoSuchMethodException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } return null; } /** * <p> * Determines a state from a string. Possible state types are passed as a parameter. Note that the order matters * here; the first type that accepts the string as a valid value, will be used for the state. * </p> * <p> * Example: The type list is OnOffType.class,StringType.class. The string "ON" is now accepted by the OnOffType and * thus OnOffType.ON will be returned (and not a StringType with value "ON"). * </p> * * @param types possible types of the state to consider * @param s the string to parse * @return the corresponding State instance or <code>null</code> */ public static State parseState(List<Class<? extends State>> types, String s) { for (Class<? extends Type> type : types) { try { Method valueOf = type.getMethod("valueOf", String.class); State state = (State) valueOf.invoke(type, s); if (state != null) { return state; } } catch (NoSuchMethodException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } } return null; } /** * <p> * Determines a command from a string. Possible command types are passed as a parameter. Note that the order matters * here; the first type that accepts the string as a valid value, will be used for the command. * </p> * <p> * Example: The type list is OnOffType.class,StringType.class. The string "ON" is now accepted by the OnOffType and * thus OnOffType.ON will be returned (and not a StringType with value "ON"). * </p> * * @param types possible types of the command to consider * @param s the string to parse * @return the corresponding Command instance or <code>null</code> */ public static Command parseCommand(List<Class<? extends Command>> types, String s) { for (Class<? extends Command> type : types) { try { Method valueOf = type.getMethod("valueOf", String.class); Command value = (Command) valueOf.invoke(type, s); if (value != null) { return value; } } catch (NoSuchMethodException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } } return null; } }