/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * 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 * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.application.arguments; import java.util.ListIterator; /** * @author Tuukka Lehtonen * * @param */ public interface IArgumentFactory { String getArgument(); IArgument parse(String arg, ListIterator tail); abstract class ArgumentFactory implements IArgumentFactory { String arg; protected IArgumentValidator validator; public ArgumentFactory(String arg) { this(arg, null); } public ArgumentFactory(String arg, IArgumentValidator validator) { this.arg = arg; this.validator = validator; } public String getArgument() { return arg; } protected IArgumentValidator getValidator() { return validator; } } abstract class Argument implements IArgument { String key; public Argument(String key) { assert key != null; this.key = key; } @Override public String getArgument() { return key; } public abstract T getValue(); @Override public String toString() { return "(" + getValue().getClass().getSimpleName() + ") " + getValue().toString(); } } class BooleanArgument extends Argument { Boolean value; public BooleanArgument(String key, Boolean value) { super(key); this.value = value; } public Boolean getValue() { return value; } }; class StringArgument extends Argument { String value; public StringArgument(String key, String value) { super(key); this.value = value; } public String getValue() { return value; } }; class IntegerArgument extends Argument { Integer value; public IntegerArgument(String key, Integer value) { super(key); this.value = value; } public Integer getValue() { return value; } }; class LongArgument extends Argument { Long value; public LongArgument(String key, Long value) { super(key); this.value = value; } public Long getValue() { return value; } }; class StringArgumentFactory extends ArgumentFactory { public StringArgumentFactory(String key) { super(key); } public StringArgumentFactory(String key, IArgumentValidator validator) { super(key, validator); } @Override public IArgument parse(String key, ListIterator tail) { if (getArgument().equalsIgnoreCase(key)) { if (tail.hasNext()) { String next = tail.next(); IArgumentValidator validator = getValidator(); if(validator != null) { String valid = validator.isValid(next); if (valid != null) { tail.previous(); throw new IllegalArgumentException(valid); } } return new StringArgument(getArgument(), next); } } return null; } } class IntegerArgumentFactory extends ArgumentFactory { private Integer lowLimit; private Integer highLimit; public IntegerArgumentFactory(String key) { this(key, null, null); } public IntegerArgumentFactory(String key, Integer lowLimit, Integer highLimit) { super(key); this.lowLimit = lowLimit; this.highLimit = highLimit; } @Override public IArgument parse(String key, ListIterator tail) { if (getArgument().equalsIgnoreCase(key)) { if (tail.hasNext()) { try { Integer l = Integer.valueOf(tail.next()); if (lowLimit != null && lowLimit > l) throw new IllegalArgumentException("value is less than low limit, " + l + " < " + lowLimit); if (highLimit != null && highLimit < l) throw new IllegalArgumentException("value is greater than high limit, " + l + " > " + highLimit); return new IntegerArgument(getArgument(), l); } catch (NumberFormatException e) { throw new IllegalArgumentException(e); } } } return null; } } class LongArgumentFactory extends ArgumentFactory { public LongArgumentFactory(String key) { super(key); } @Override public IArgument parse(String key, ListIterator tail) { if (getArgument().equalsIgnoreCase(key)) { if (tail.hasNext()) { try { Long l = Long.valueOf(tail.next()); return new LongArgument(getArgument(), l); } catch (NumberFormatException e) { throw new IllegalArgumentException(e); } } } return null; } } class NoValueArgumentFactory extends ArgumentFactory { public NoValueArgumentFactory(String key) { super(key); } @Override public IArgument parse(String key, ListIterator tail) { if (getArgument().equalsIgnoreCase(key)) { return new BooleanArgument(getArgument(), Boolean.TRUE); } return null; } } }