आप Apache Commons Configuration पैकेज में सुविधाओं में से कुछ का उपयोग कर सकते: यहाँ कुछ इसके लिए :-)
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
public class PropertiesVerifier
{
private final Map<String, PropertyInfo> optionalInfo;
private final Map<String, PropertyInfo> requiredInfo;
{
optionalInfo = new HashMap<String, PropertyInfo>();
requiredInfo = new HashMap<String, PropertyInfo>();
}
public PropertiesVerifier(final PropertyInfo[] infos)
{
for(final PropertyInfo info : infos)
{
final Map<String, PropertyInfo> infoMap;
if(info.isRequired())
{
infoMap = requiredInfo;
}
else
{
infoMap = optionalInfo;
}
infoMap.put(info.getName(), info);
}
}
public void verifyProperties(final Properties properties)
{
for(final Entry<Object, Object> property : properties.entrySet())
{
final String key;
final String value;
key = (String)property.getKey();
value = (String)property.getValue();
if(!(isValid(key, value)))
{
throw new IllegalArgumentException(value + " is not valid for: " + key);
}
}
}
public boolean isRequired(final String key)
{
return (requiredInfo.get(key) != null);
}
public boolean isOptional(final String key)
{
return (optionalInfo.get(key) != null);
}
public boolean isKnown(final String key)
{
return (isRequired(key) || isOptional(key));
}
public Class getType(final String key)
{
final PropertyInfo info;
info = getPropertyInfoFor(key);
return (info.getType());
}
public boolean isValid(final String key,
final String value)
{
final PropertyInfo info;
info = getPropertyInfoFor(key);
return (info.verify(value));
}
private PropertyInfo getPropertyInfoFor(final String key)
{
PropertyInfo info;
info = requiredInfo.get(key);
if(info == null)
{
info = optionalInfo.get(key);
if(info == null)
{
// should be a better exception maybe... depends on how you
// want to deal with it
throw new IllegalArgumentException(key + "
is not a valid property name");
}
}
return (info);
}
protected final static class PropertyInfo
{
private final String name;
private final boolean required;
private final Class clazz;
private final Verifier verifier;
protected PropertyInfo(final String nm,
final boolean mandatory,
final Class c)
{
this(nm, mandatory, c, getDefaultVerifier(c));
}
protected PropertyInfo(final String nm,
final boolean mandatory,
final Class c,
final Verifier v)
{
// check for null
name = nm;
required = mandatory;
clazz = c;
verifier = v;
}
@Override
public int hashCode()
{
return (getName().hashCode());
}
@Override
public boolean equals(final Object o)
{
final boolean retVal;
if(o instanceof PropertyInfo)
{
final PropertyInfo other;
other = (PropertyInfo)o;
retVal = getName().equals(other.getName());
}
else
{
retVal = false;
}
return (retVal);
}
public boolean verify(final String value)
{
return (verifier.verify(value));
}
public String getName()
{
return (name);
}
public boolean isRequired()
{
return (required);
}
public Class getType()
{
return (clazz);
}
}
private static Verifier getDefaultVerifier(final Class clazz)
{
final Verifier verifier;
if(clazz.equals(Boolean.class))
{
// shoudl use a singleton to save space...
verifier = new BooleanVerifier();
}
else
{
throw new IllegalArgumentException("Unknown property type: " +
clazz.getCanonicalName());
}
return (verifier);
}
public static interface Verifier
{
boolean verify(final String value);
}
public static class BooleanVerifier
implements Verifier
{
public boolean verify(final String value)
{
final boolean retVal;
if(value.equalsIgnoreCase("true") ||
value.equalsIgnoreCase("false"))
{
retVal = true;
}
else
{
retVal = false;
}
return (retVal);
}
}
}
एक शुरुआत और एक साधारण परीक्षण कम से कम है। यह कम से कम आपके गुणों के लिए प्रकार का उपयोग प्रदान करता है।
परंपरागत जावा गुण फ़ाइल में केवल सम्मेलन हैं। मैंने देखा है कि कुछ प्रदान करना शामिल है, जैसे आपने कहा, एक उदाहरण गुण फ़ाइल। एक और सभी गुणों के साथ डिफ़ॉल्ट विन्यास प्रदान करना है, लेकिन टिप्पणी की।
यदि आप वास्तव में कुछ की आवश्यकता चाहते हैं, तो शायद आप एक गुण फ़ाइल की तलाश नहीं कर रहे हैं। आप एक एक्सएमएल कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं और डेटाटाइप और आवश्यकताओं के साथ एक स्कीमा निर्दिष्ट कर सकते हैं। आप जावा में स्कीमा को संकलित करने के लिए जैक्सबी का उपयोग कर सकते हैं और इसे इस तरह पढ़ सकते हैं। सत्यापन के साथ आप सुनिश्चित कर सकते हैं कि आवश्यक गुण हैं।
जब आप अपना आवेदन निष्पादित करते हैं तो सबसे अच्छा आप उम्मीद कर सकते हैं, यह फ़ाइल में गुणों को पढ़ता है, पार्स करता है और मान्य करता है। अगर आपको पूरी तरह से संपत्तियों का पालन करना पड़ा और एक्सएमएल नहीं जाना चाहता था, लेकिन इस पार्सिंग की आवश्यकता थी। आपके पास एक द्वितीयक गुण फ़ाइल हो सकती है जिसमें प्रत्येक प्रॉपर्टी को सूचीबद्ध किया जा सके, जिसमें इसका प्रकार हो, और चाहे वह आवश्यक हो। इसके बाद आपको एक प्रॉपर्टी फ़ाइल सत्यापनकर्ता लिखना होगा जो एक फ़ाइल में सत्यापन के साथ-साथ सत्यापन स्कीमा-जैसी गुण फ़ाइल को सत्यापित करेगा।
#list of required properties
required=prop1,prop2,prop3
#all properties and their types
prop1.type=Integer
prop2.type=String
मैंने अपाचे कॉन्फ़िगरेशन पैकेज के सभी को नहीं देखा है, लेकिन उनके पास अक्सर इस तरह की उपयोगी उपयोगिताएं होती हैं। मुझे आश्चर्य नहीं होगा अगर आपको वहां कुछ मिल सकता है जो इसे सरल बना देगा।
ने कोड को शामिल करने के लिए अपना उत्तर अपडेट किया है जो आपको उस पर शुरू करना चाहिए। – TofuBeer
वाह, मुझे बस इसके लिए "लोकप्रिय प्रश्न" बैज मिला, केवल 3 अपवॉट्स के साथ ... विषम ... मैं अभी भी इसके लिए एक संतोषजनक समाधान कर रहा हूं। – andersoj