package maiolum.util;

import java.util.Properties;

public class PropertyExpander {
		
	protected Properties expandPairs = new Properties();
	
	public PropertyExpander() {
		//empty constructor
	}
	
	public PropertyExpander(Properties expandPairs) {
		this.expandPairs = expandPairs;
	}
	
	public String expandParameter(String param) {
		return expandParameter(param, this.expandPairs);
	}
	
	public static String expandParameter(String param, Properties p) {
		String START_TOKEN = "${";
		String END_TOKEN = "}";
		
		int stpos = -1;
		int etpos = -1;
		StringBuffer sb = new StringBuffer();
		do {
			//get positions of start- and end token
			stpos = param.indexOf(START_TOKEN);
			etpos = param.indexOf(END_TOKEN);
			
			if((stpos != -1) && (etpos != -1)) {
				//create StringBuffer which will contain expanded parameter
				sb = new StringBuffer();
				//read chars and write them to StringBuffer until START_TOKEN is found
				for(int i=0; i<stpos; i++) {
					sb.append(param.charAt(i));
				}
				//now, retrieve property name
				StringBuffer varname = new StringBuffer();
				for(int i=stpos + START_TOKEN.length(); i<etpos; i++) {
					varname.append(param.charAt(i));
				}
				//get property value by retrieved property name
				String varValue = p.getProperty(varname.toString());
				if(varValue == null) {//effectively return null and make cleanup
					param = null;
					break;
				} else {
					//append to StringBuffer property value
					sb.append(p.getProperty(varname.toString()));
				}
				varname = null;
				
				//read and put into StringBuffer remaining chars after END_TOKEN
				for(int i=etpos + END_TOKEN.length() - 1 + 1; i<param.length(); i++) {
					sb.append(param.charAt(i));
				}
				//convert StringBuffer to String for next round of expanding
				param = sb.toString();
				//reset StringBuffer
				sb.setLength(0);
			} else {
				break;
			}
		} while(true);
		sb = null;
		return param;
	}
	
	/**
	 * @return Returns the expandPairs.
	 */
	public Properties getExpandPairs() {
		return expandPairs;
	}
	/**
	 * @param expandPairs The expandPairs to set.
	 */
	public void setExpandPairs(Properties expandPairs) {
		this.expandPairs = expandPairs;
	}
	
	public static void main(String[] args) {
		Properties p = new Properties();
		p.put("ContextPath", "C:\\");
		p.put("LangFileName", "languages.xml");
		p.put("maiolum.kore", "D:\\system-jadro\\core");
		
		String s = "${ContextPath}\\WEB-INF\\${LangFileName}\\nothing";
		String epar = PropertyExpander.expandParameter(s, p);
		
		System.out.println(epar);
		
		s = "${maiolum.kore}\\WEB-INF\\${LangFileName}\\nothing";
		s = PropertyExpander.expandParameter(s, p);
		System.out.println(s);
	}
	
}