Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #8789

Re: Substitute value in HashMap at runtime

From mike <mikaelpetterson@hotmail.com>
Newsgroups comp.lang.java.programmer
Subject Re: Substitute value in HashMap at runtime
Date 2011-10-14 06:36 -0700
Organization http://groups.google.com
Message-ID <81f7a1f0-6e18-48ce-871e-abd0df16badf@q4g2000yqh.googlegroups.com> (permalink)
References <70a582b4-956b-4145-9cb8-ba8fbaf751f5@b10g2000vbc.googlegroups.com> <c2bb16de-3ffc-4701-9aa0-1f8f5451908a@f11g2000yqf.googlegroups.com> <98951.924.1318525966990.JavaMail.geo-discussion-forums@prds34>

Show all headers | View raw


On Oct 13, 7:12 pm, Lew <lewbl...@gmail.com> wrote:
> Robert Klemme wrote:
> > mike wrote:
> >> If I create a HashMap with something like:
>
> >> static Map<String,String> map = new
> >> HashMap<String,String>("variable",MyPreferences.getVariableValue());
>
> >> If I do it like this I guess that MyPreferences.getVariableValue()
> >> will not be substituted but be the "plain" string.
>
> >> How can I make my MyPreferences.getVariableValue() be evaluated at
> >> runtime? Any example?
>
> > One possible way is to change your Map to Map<String,
> > Callable<String>> and invoke call() at runtime.
>
> >http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Cal...
>
> > Of course you then need to provide a proper implementation. :-)
>
> > Btw, does your Map contain more entries?  If not, it's completely
> > superfluous.
>
> > If you define the Map as static you also need to be aware of
> > concurrency issues if your application will ever access this from
> > multiple threads.
>
> It doesn't even have to be multiple threads.  Multiple instances in the same thread can clobber a static structure if careless.  They just take turns messing each other up.
>
> --
> Lew

Hi,

I put together a more complete example ( however it is not so small).
Here is the class ( see below).
The map will contain more values. Maybe I can do it final since it
will not change when values are loaded.

I will use the output from runtime value of
test.TextHelp.getCurrentActivity().

When I run the code below I get:

java.lang.NoSuchMethodException: test.TextHelp.getCurrentActivity()()
	at java.lang.Class.getMethod(Class.java:1581)
	at test.TextHelp.getValue(TextHelp.java:70)
	at test.TextHelp.replace(TextHelp.java:47)
	at test.TextHelp.main(TextHelp.java:21)

Any ideas?

I am using java 1.5 and cannot go with 1.6 yet.

Thanks for all your comments.

//mike

package test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class TextHelp {

	public String getCurrentActivity(){
		return "my activity name";
	}

	public static void main (String [] args){
		TextHelp th = new TextHelp();
		System.out.println("Output before is: act-{stream}");
		String runtimeText = TextHelp.replace("act-{stream}");
		System.out.println("Output after is: "+runtimeText);
	}

	private static Map<String, String> replacements = new HashMap<String,
String>();

	static{
		replacements.put("{stream}","test.TextHelp:getCurrentActivity()");
	}

	public static String replace(final String msg) {

		if (msg == null || "".equals(msg) || replacements == null
				|| replacements.isEmpty()) {
			return msg;
		}
		StringBuilder regexBuilder = new StringBuilder();
		Iterator<String> it = replacements.keySet().iterator();
		regexBuilder.append(Pattern.quote(it.next()));
		while (it.hasNext()) {
			regexBuilder.append('|').append(Pattern.quote(it.next()));
		}
		Matcher matcher =
Pattern.compile(regexBuilder.toString()).matcher(msg);
		StringBuffer out = new StringBuffer(msg.length() + (msg.length() /
10));
		while (matcher.find()) {
			String toBeSubstituted = replacements.get(matcher.group());
			String replacement = getValue(toBeSubstituted);
			matcher.appendReplacement(out, replacement);
			//matcher.appendReplacement(out,
replacements.get(matcher.group()));
		}
		matcher.appendTail(out);
		System.out.println("OUT "+out);
		return out.toString();
	}



	public static String getValue(String expression) {

		String[] parts = expression.split(":");

		// Obtain the Class instance
		String result = "";
		try {
			// Obtain the Class
			// Obtain the Class instance
			Class cls = Class.forName(parts[0]);

			// Get the method
			Method method = cls.getMethod(parts[1],null);

			// Create the object that we want to invoke the methods on
			TextHelp provider = (TextHelp) cls
					.newInstance();
			// Call the method. Since none of them takes arguments we just
			// pass an empty array as second parameter.
			result = (String)method.invoke(provider, new Object[0]);

		} catch (IllegalArgumentException ex) {
			ex.printStackTrace();

		} catch (InvocationTargetException ex) {
			ex.printStackTrace();

		} catch (IllegalAccessException ex) {
			ex.printStackTrace();

		} catch (ClassNotFoundException ex) {
			ex.printStackTrace();

		} catch (SecurityException ex) {
			ex.printStackTrace();

		} catch (NoSuchMethodException ex) {
			ex.printStackTrace();
		} catch (InstantiationException ex) {
			ex.printStackTrace();
		}
		System.out.println("Result " + ": " + result);
		return result;
	}
}

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-13 05:18 -0700
  Re: Substitute value in HashMap at runtime Lew <lewbloch@gmail.com> - 2011-10-13 05:53 -0700
  Re: Substitute value in HashMap at runtime Robert Klemme <shortcutter@googlemail.com> - 2011-10-13 06:44 -0700
    Re: Substitute value in HashMap at runtime Lew <lewbloch@gmail.com> - 2011-10-13 10:12 -0700
      Re: Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-14 06:36 -0700
        Re: Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-14 06:54 -0700
          Re: Substitute value in HashMap at runtime markspace <-@.> - 2011-10-14 08:13 -0700
  Re: Substitute value in HashMap at runtime Roedy Green <see_website@mindprod.com.invalid> - 2011-10-14 09:40 -0700

csiph-web