summaryrefslogtreecommitdiff
path: root/ant/ant14/com/vladium/emma/ant/GenericCfg.java
diff options
context:
space:
mode:
Diffstat (limited to 'ant/ant14/com/vladium/emma/ant/GenericCfg.java')
-rw-r--r--ant/ant14/com/vladium/emma/ant/GenericCfg.java150
1 files changed, 150 insertions, 0 deletions
diff --git a/ant/ant14/com/vladium/emma/ant/GenericCfg.java b/ant/ant14/com/vladium/emma/ant/GenericCfg.java
new file mode 100644
index 0000000..02ebae6
--- /dev/null
+++ b/ant/ant14/com/vladium/emma/ant/GenericCfg.java
@@ -0,0 +1,150 @@
+/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under
+ * the terms of the Common Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * $Id: GenericCfg.java,v 1.1.1.1.2.1 2004/07/08 10:52:10 vlad_r Exp $
+ */
+package com.vladium.emma.ant;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+import com.vladium.emma.EMMAProperties;
+import com.vladium.util.IProperties;
+import com.vladium.util.Property;
+
+// ----------------------------------------------------------------------------
+/**
+ * GenericCfg is a simple container for 'generic' properties, i.e., properties
+ * that are set via generic 'properties=<file>' attribute and <property>
+ * nested elements. This class makes no decision about relative priorities for
+ * propertie set in an external file or via nested elements, leaving this up
+ * to the parent.
+ *
+ * @author Vlad Roubtsov, (C) 2003
+ */
+public
+class GenericCfg
+{
+ // public: ................................................................
+
+
+ public GenericCfg (final Task task)
+ {
+ if (task == null) throw new IllegalArgumentException ("null input: task");
+
+ m_task = task;
+ m_genericPropertyElements = new ArrayList ();
+ }
+
+
+ // .properties file attribute [actual file I/O done lazily by getFileSettings()]:
+
+ public void setProperties (final File file)
+ {
+ m_settingsFile = file; // actual file I/O is done in getFileSettings()
+ }
+
+ // generic property element:
+
+ public PropertyElement createProperty ()
+ {
+ m_genericSettings = null;
+
+ final PropertyElement property = new PropertyElement ();
+ m_genericPropertyElements.add (property);
+
+ return property;
+ }
+
+ // ACCESSORS:
+
+ public IProperties getFileSettings ()
+ {
+ IProperties fileSettings = m_fileSettings;
+ if ((fileSettings == null) && (m_settingsFile != null))
+ {
+ try
+ {
+ fileSettings = EMMAProperties.wrap (Property.getPropertiesFromFile (m_settingsFile));
+ }
+ catch (IOException ioe)
+ {
+ throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName ()
+ + ": property file [" + m_settingsFile.getAbsolutePath () + "] could not be read" , ioe, m_task.getLocation ()).fillInStackTrace ();
+ }
+
+ m_fileSettings = fileSettings;
+
+ return fileSettings;
+ }
+
+ return fileSettings;
+ }
+
+ public IProperties getGenericSettings ()
+ {
+ IProperties genericSettings = m_genericSettings;
+ if (genericSettings == null)
+ {
+ genericSettings = EMMAProperties.wrap (new Properties ());
+
+ for (Iterator i = m_genericPropertyElements.iterator (); i.hasNext (); )
+ {
+ final PropertyElement property = (PropertyElement) i.next ();
+
+ final String name = property.getName ();
+ String value = property.getValue ();
+ if (value == null) value = "";
+
+ if (name != null)
+ {
+ // [assertion: name != null, value != null]
+
+ final String currentValue = genericSettings.getProperty (name);
+ if ((currentValue != null) && ! value.equals (currentValue))
+ {
+ throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName ()
+ + ": conflicting settings for property [" + name + "]: [" + value + "]" , m_task.getLocation ()).fillInStackTrace ();
+ }
+ else
+ {
+ genericSettings.setProperty (name, value);
+ }
+ }
+ }
+
+ m_genericSettings = genericSettings;
+
+ return genericSettings;
+ }
+
+ return genericSettings;
+ }
+
+ // protected: .............................................................
+
+ // package: ...............................................................
+
+ // private: ...............................................................
+
+
+ private final Task m_task;
+
+ private final List /* PropertyElement */ m_genericPropertyElements; // never null
+ private File m_settingsFile; // can be null
+
+ private transient IProperties m_fileSettings; // can be null
+ private transient IProperties m_genericSettings; // can be null
+
+} // end of class
+// ---------------------------------------------------------------------------- \ No newline at end of file