]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.application/src/org/simantics/application/arguments/Arguments.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.application / src / org / simantics / application / arguments / Arguments.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.application.arguments;
13
14 import java.util.Arrays;
15 import java.util.ListIterator;
16 import java.util.Map;
17 import java.util.TreeMap;
18
19 import org.simantics.application.arguments.IArgument;
20 import org.simantics.application.arguments.IArgumentFactory;
21
22 public class Arguments implements IArguments {
23
24     private Map<String, IArgument<?>> args = new TreeMap<String, IArgument<?>>();
25
26     /* (non-Javadoc)
27      * @see org.simantics.application.arguments.IArguments#put(org.simantics.application.arguments.IArgument)
28      */
29     public void put(IArgument<?> arg) {
30         args.put(arg.getArgument(), arg);
31     }
32
33     /* (non-Javadoc)
34      * @see org.simantics.application.arguments.IArguments#putAll(org.simantics.application.arguments.IArguments)
35      */
36     @Override
37     public void putAll(IArguments args) {
38         for (IArgument<?> arg : args.toArray()) {
39             put(arg);
40         }
41     }
42
43     @SuppressWarnings("unchecked")
44     public <T> IArgument<T> remove(IArgumentFactory<T> key) {
45         return (IArgument<T>) args.remove(key.getArgument());
46     }
47
48     /* (non-Javadoc)
49      * @see org.simantics.application.arguments.IArguments#contains(org.simantics.application.arguments.IArgumentFactory)
50      */
51     public <T> boolean contains(IArgumentFactory<T> key) {
52         return args.containsKey(key.getArgument());
53     }
54
55     /* (non-Javadoc)
56      * @see org.simantics.application.arguments.IArguments#get(org.simantics.application.arguments.IArgumentFactory)
57      */
58     @SuppressWarnings("unchecked")
59     public <T> T get(IArgumentFactory<T> key) {
60         IArgument<T> a = (IArgument<T>) args.get(key.getArgument());
61         return a == null ? null : a.getValue();
62     }
63
64     @SuppressWarnings("unchecked")
65     @Override
66     public <T> T get(IArgumentFactory<T> key, T defaultValue) {
67         IArgument<T> a = (IArgument<T>) args.get(key.getArgument());
68         return a == null ? defaultValue : a.getValue();
69     }
70
71     /* (non-Javadoc)
72      * @see org.simantics.application.arguments.IArguments#toArray()
73      */
74     public IArgument<?>[] toArray() {
75         int size = args.size();
76         return args.values().toArray(new IArgument<?>[size]);
77     }
78
79     /**
80      * @param args
81      * @param parsedArguments
82      * @return
83      */
84     public static IArguments parse(String[] args, IArgumentFactory<?>... parsedArguments) {
85         ListIterator<String> iter = Arrays.asList(args).listIterator();
86         IArguments result = new Arguments();
87         while (iter.hasNext()) {
88             String arg = iter.next();
89
90             IArgument<?> ret = null;
91             for (IArgumentFactory<?> factory : parsedArguments) {
92                 try {
93                     if ((ret = factory.parse(arg, iter)) != null)
94                         break;
95                 } catch (IllegalArgumentException e) {
96                     // Argument matched, but the argument value was invalid.
97                     // TODO: react to this.
98                 }
99             }
100             if (ret != null)
101                 result.put(ret);
102         }
103         
104         return result;
105     }
106
107 }