1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: GenericCfg.java,v 1.1.1.1.2.1 2004/07/08 10:52:10 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.ant;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.File;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.ArrayList;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Properties;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport org.apache.tools.ant.BuildException;
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport org.apache.tools.ant.Task;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMAProperties;
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IProperties;
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Property;
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * GenericCfg is a simple container for 'generic' properties, i.e., properties
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * that are set via generic 'properties=<file>' attribute and <property>
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * nested elements. This class makes no decision about relative priorities for
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * propertie set in an external file or via nested elements, leaving this up
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * to the parent.
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectclass GenericCfg
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public GenericCfg (final Task task)
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (task == null) throw new IllegalArgumentException ("null input: task");
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_task = task;
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_genericPropertyElements = new ArrayList ();
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // .properties file attribute [actual file I/O done lazily by getFileSettings()]:
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void setProperties (final File file)
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_settingsFile = file; // actual file I/O is done in getFileSettings()
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // generic property element:
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public PropertyElement createProperty ()
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_genericSettings = null;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final PropertyElement property = new PropertyElement ();
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_genericPropertyElements.add (property);
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return property;
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // ACCESSORS:
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IProperties getFileSettings ()
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        IProperties fileSettings = m_fileSettings;
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((fileSettings == null) && (m_settingsFile != null))
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            try
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                fileSettings = EMMAProperties.wrap (Property.getPropertiesFromFile (m_settingsFile));
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            catch (IOException ioe)
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName ()
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    + ": property file [" + m_settingsFile.getAbsolutePath () + "] could not be read" , ioe, m_task.getLocation ()).fillInStackTrace ();
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_fileSettings = fileSettings;
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return fileSettings;
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return fileSettings;
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IProperties getGenericSettings ()
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        IProperties genericSettings = m_genericSettings;
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (genericSettings == null)
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            genericSettings = EMMAProperties.wrap (new Properties ());
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (Iterator i = m_genericPropertyElements.iterator (); i.hasNext (); )
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final PropertyElement property = (PropertyElement) i.next ();
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String name = property.getName ();
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                String value = property.getValue ();
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (value == null) value = "";
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (name != null)
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // [assertion: name != null, value != null]
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final String currentValue = genericSettings.getProperty (name);
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if ((currentValue != null) && ! value.equals (currentValue))
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName ()
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            + ": conflicting settings for property [" + name + "]: [" + value + "]" , m_task.getLocation ()).fillInStackTrace ();
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        genericSettings.setProperty (name, value);
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_genericSettings = genericSettings;
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return genericSettings;
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return genericSettings;
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final Task m_task;
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final List /* PropertyElement */ m_genericPropertyElements; // never null
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private File m_settingsFile; // can be null
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private transient IProperties m_fileSettings; // can be null
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private transient IProperties m_genericSettings; // can be null
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------