webForumDet fria alternativet

ResourceBundle-funderingar

1 svar · 292 visningar · startad av andreascarlsson

andreascarlssonMedlem sedan feb. 2003211 inlägg
#1

Hej allihop,

Jag funderar på att skriva en ResourceBundle-klass. Den som följer med Java API:et är ju inte så fullmatad med finesser direkt... :)

Jag hade nämligen tänkt lägga till funktionalitet för att kunna använda nycklar i värdena. Detta kanske låter lite konstigt, men jag ska visa.

Properties-fil som den ser ut idag (delar av den iaf.):

# Sökvägen till applikationens root
path.root	=	/home/app/public_html/

# Sökvägen till användarnas kataloger
path.users	=	/home/app/public_html/users/

# Sökvägen till xmlfilerna
path.users.xml	=	/home/app/public_html/users/xml/

Properties-fil som jag vill att den skall kunna användas, med nycklar i värdena (för mindre redundans):

# Sökvägen till applikationens root
path.root	=	/home/app/public_html/

# Sökvägen till användarnas kataloger
path.users	=	[path.root]/users/

# Sökvägen till användarnas xmlfiler (i användarkatalogen)
path.users.xml	=	[path.users]/xml

Fördelen med detta är ju att man bara behöver ändra på några få ställen i Properties-filen, den dag man skall migrera systemet, etc. Risken för att någon anger fel värde någonstans, minskar ju också drastiskt.

Men hur kan man implementera detta på ett smart sätt? Så här ser min väääldigt enkla klass ut idag:

public class SystemProperties
{
   // Förhindrar instansiering av denna klass.
   private SystemProperties() {}

   public static String get(String p_key)
   {
      ResourceBundle rb = ResourceBundle.getBundle("system");

      try{
         return rb.getString(p_key).trim();
      } catch(Exception e) {// Felhantering}
   }
}

Antar att man får skriva någon slags rekursiv funktion? Men bör man göra det med en statisk metod. Eller har det ingen betydelse? Någon som har lite tips, eller pseudokod på lager?

andreascarlssonMedlem sedan feb. 2003211 inlägg
#2

Löste det själv, m.h.a. rekursion och lite regexp:ar. Verkar fungerar väldigt bra faktiskt... :)

Jag postar koden iallafall, om det skulle vara någon annan som stöter på liknande problem.

public static String get(String p_key)
{
	ResourceBundle rb = ResourceBundle.getBundle("system");

	if(p_key == null || p_key.length() == 0)
		return "";

	try
	{
		String value = rb.getString(p_key);

		if(value != null)
			value = value.trim();

		// Leta efter nycklar
		Pattern p = Pattern.compile("(\\<)+([a-z0-9\\.])+(\\>)+");
		Matcher m = p.matcher(value);

		// Ersätt nycklarna med faktiska värden
		while (m.find())
			value = value.replaceAll(m.group(), get(m.group().replaceAll("[\\<\\>]", "")));

		return value;

	} catch(Exception e) {// Felhantering}
}

Koden klarar av att läsa in värden från följande fil, utan problem:

# Sökvägen till applikationens root
path.root	=	/home/app/public_html/

# Sökvägen till "/home/app/public_html/users"
path.users	=	<path.root>users/

# Sökvägen till "/home/app/public_html/users/xml"
path.users.xml	=	<path.users>xml

# Sökvägen till "/home/app/public_html/FooBar"
path.system	=	<path.root><systemname>

# Namn på systemet 
systemname	=	FooBar

# Copyright-tjafs
copyright	=	Tjänsten <systemname> är copyrightskyddad. Tillstånd kan ges av <systemname>.
Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb