repository restructure

git-svn-id: http://dev.eclipse.org/svnroot/technology/org.eclipse.stem/trunk/data@2194 92a21009-5b66-0410-b83a-dc787c41c6e9
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath b/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore b/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore
new file mode 100644
index 0000000..9c595a6
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore
@@ -0,0 +1 @@
+temp
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.project b/population/org.eclipse.stem.internal.data.geography.population.human.models/.project
new file mode 100644
index 0000000..744c012
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.stem.internal.data.geography.population.human.models</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs b/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a812aa
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,21 @@
+#Tue Sep 01 17:01:23 EDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.doc.comment.support=disabled
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF b/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..727cca1
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: STEM Internal Population Models
+Bundle-SymbolicName: org.eclipse.stem.internal.data.geography.population.human.models
+Bundle-Version: 1.2.0
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.stem.core,
+ org.eclipse.stem.definitions,
+ org.eclipse.stem.data.geography,
+ org.eclipse.stem.data.geography.models,
+ org.eclipse.stem.internal.data,
+ org.eclipse.stem.internal.data.geography,
+ org.eclipse.stem.internal.data.geography.models,
+ org.eclipse.stem.data.geography.population.human,
+ org.eclipse.stem.data.geography.population.human.models
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: Eclipse.org
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties b/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java
new file mode 100644
index 0000000..a1f7163
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java
@@ -0,0 +1,229 @@
+// PopulationModelGenerator.java
+package org.eclipse.stem.internal.data.geography.population.human.models;
+
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.stem.core.Constants;
+import org.eclipse.stem.data.geography.ISOKey;
+import org.eclipse.stem.internal.data.ModelGenerator;
+import org.eclipse.stem.internal.data.PluginFileGenerator;
+import org.eclipse.stem.internal.data.generatedplugin.DublinCore;
+import org.eclipse.stem.internal.data.generatedplugin.Extension;
+import org.eclipse.stem.internal.data.generatedplugin.GeneratedpluginFactory;
+import org.eclipse.stem.internal.data.generatedplugin.Plugin;
+import org.eclipse.stem.internal.data.generatedplugin.StemCategory;
+import org.eclipse.stem.internal.data.geography.models.GeographyModelGenerator;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevel;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevelSet;
+import org.eclipse.stem.internal.data.geography.specifications.CountryGraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.ModelSpecification;
+
+/**
+ * This class is responsible for generating population models.
+ */
+public class PopulationModelGenerator extends GeographyModelGenerator {
+	/**
+	 * @param args
+	 *            the URI of the generated geography plugin.xml file
+	 */
+	public static void main(final String[] args) {
+		// Is the plugin file specified?
+		if (args.length == 0) {
+			// Yes
+			System.err.println("Missing specification of the plugin file"); //$NON-NLS-1$
+		} // if
+		else {
+
+			final String GENERATED_FILES_PATH = args[0];
+			final String sourceGeographicModelProjecName = args[1];
+			final String sourcePopulationProjectName = args[2];
+
+			final String GENERATED_MODELS_PATH = GENERATED_FILES_PATH
+					+ File.separator + "resources" + File.separator + "data"; //$NON-NLS-1$ //$NON-NLS-2$
+
+			final File geographicModelPluginfile = new File(
+					".."	+ File.separator + sourceGeographicModelProjecName + File.separator + PluginFileGenerator.PLUGIN_XML_FILE_NAME); //$NON-NLS-1$
+			final URI geographicModelPluginFileURI = URI
+					.createFileURI(geographicModelPluginfile.getAbsolutePath());
+
+			final File populationPluginfile = new File(
+					".."	+ File.separator + sourcePopulationProjectName + File.separator + PluginFileGenerator.PLUGIN_XML_FILE_NAME); //$NON-NLS-1$
+			final URI populationPluginFileURI = URI
+					.createFileURI(populationPluginfile.getAbsolutePath());
+
+			final PopulationModelGenerator pmg = new PopulationModelGenerator();
+			final Map<ISOKey, List<PopulationModelSpecification>> modelSpecifications = pmg
+					.processFiles(geographicModelPluginFileURI,
+							populationPluginFileURI);
+
+			for (final ISOKey isoKey : sortISOKeys(modelSpecifications)) {
+				// Now serialize the Identifiables
+				for (final ModelSpecification gms : modelSpecifications
+						.get(isoKey)) {
+					try {
+						gms.serialize(GENERATED_MODELS_PATH);
+					} catch (final IOException e) {
+						e.printStackTrace();
+					}
+				} // for
+			} // for isoKey
+
+			// Create the instance of plugin.xml that we'll serialize later
+			final Plugin pluginxml = GeneratedpluginFactory.eINSTANCE
+					.createPlugin();
+			final Extension extension = GeneratedpluginFactory.eINSTANCE
+					.createExtension();
+
+			// Add the "model" extension point
+			extension.setPoint(Constants.ID_MODEL_EXTENSION_POINT);
+
+			// Add the categories to the extension
+//			addCatagoriesToExtension(extension);
+
+			pluginxml.getExtensionelement().add(extension);
+
+			// Now add the dublin core entries to the plugin.xml file for
+			// each of the models
+			for (final ISOKey isoKey : sortISOKeys(modelSpecifications)) {
+				final StemCategory countryCategory = GeneratedpluginFactory.eINSTANCE
+						.createStemCategory();
+				final String COUNTRY_CATAGORY_STRING = ID_MODEL_GEOGRAPHY_POLITICAL_COUNTRIES_CATEGORY
+						+ "." + isoKey.toString().toLowerCase(); //$NON-NLS-1$
+				countryCategory.setId(COUNTRY_CATAGORY_STRING);
+				countryCategory.setName(isoKey.toString());
+				countryCategory
+						.setParentId(ID_MODEL_GEOGRAPHY_POLITICAL_COUNTRIES_CATEGORY);
+//				extension.getCategories().add(countryCategory);
+				for (final ModelSpecification gms : modelSpecifications
+						.get(isoKey)) {
+					final DublinCore dc = GeneratedpluginFactory.eINSTANCE
+							.createDublinCore();
+					dc.setCategoryId(COUNTRY_CATAGORY_STRING);
+					extension.getDublinCores().add(
+							populateGeneratedDC(dc, gms.getDublinCore()));
+				} // for 
+			} // for isoKey
+
+			final URI TEMP_PLUGINXML_URI = URI
+					.createFileURI(GENERATED_FILES_PATH + File.separator
+							+ PluginFileGenerator.PLUGIN_XML_FILE_NAME);
+
+			// Serialize the plugin.xml file.
+			ModelGenerator.writePluginxml(pluginxml, TEMP_PLUGINXML_URI);
+
+			// Create the plugin.properties file
+			createPluginPropertties(GENERATED_FILES_PATH);
+
+		} // else
+	} // main
+
+	protected Map<ISOKey, List<PopulationModelSpecification>> processFiles(
+			URI geographicModelPluginFileUri, URI populationPluginFileUri) {
+		final Map<ISOKey, List<PopulationModelSpecification>> retValue = new HashMap<ISOKey, List<PopulationModelSpecification>>();
+
+		// Get the contents of the geography model plug.xml file
+		final Plugin geographyModelsPlugin = getPluginxml(geographicModelPluginFileUri);
+
+		final Plugin populationGraphsPlugin = getPluginxml(populationPluginFileUri);
+
+		final HashMap<ISOKey, Map<AdminLevelSet, DublinCore>> modelMap = new HashMap<ISOKey, Map<AdminLevelSet, DublinCore>>();
+		final Map<ISOKey, Map<AdminLevel, DublinCore>> populationMap = new HashMap<ISOKey, Map<AdminLevel, DublinCore>>();
+
+		for (Extension extension : geographyModelsPlugin.getExtensionelement()) {
+			for (DublinCore dc : extension.getDublinCores()) {
+				final Map<ISOKey, AdminLevelSet> isoKeyAdminLevelSetMap = CountryGraphPropertyFileSpecification
+						.parseDublinCoreCoverageString(dc.getCoverage());
+				final AdminLevelSet adminLevelSet = (AdminLevelSet) isoKeyAdminLevelSetMap
+						.values().toArray()[0];
+				final ISOKey isoKey = (ISOKey) isoKeyAdminLevelSetMap.keySet()
+						.toArray()[0];
+
+				Map<AdminLevelSet, DublinCore> temp = modelMap.get(isoKey);
+				if (temp == null) {
+					temp = new HashMap<AdminLevelSet, DublinCore>();
+					modelMap.put(isoKey, temp);
+				}
+				temp.put(adminLevelSet, dc);
+			} // for
+		} // for Geography Models
+
+		// for (ISOKey isoKey : sortISOKeys(modelMap)) {
+		// for (AdminLevel adminLevel : modelMap.get(isoKey).keySet() ) {
+		// System.out.println( isoKey + " " + adminLevel + " " +
+		// modelMap.get(isoKey).get(adminLevel).getIdentifier());
+		// }
+		// }
+
+		for (Extension extension : populationGraphsPlugin.getExtensionelement()) {
+			for (DublinCore dc : extension.getDublinCores()) {
+				final Map<ISOKey, AdminLevelSet> isoKeyAdminLevelSetMap = CountryGraphPropertyFileSpecification
+						.parseDublinCoreCoverageString(dc.getCoverage());
+				final AdminLevelSet adminLevelSet = (AdminLevelSet) isoKeyAdminLevelSetMap
+						.values().toArray()[0];
+				final AdminLevel maxAdminLevel = adminLevelSet
+						.getMaxAdminLevel();
+				final ISOKey isoKey = (ISOKey) isoKeyAdminLevelSetMap.keySet()
+						.toArray()[0];
+
+				Map<AdminLevel, DublinCore> temp = populationMap.get(isoKey);
+				if (temp == null) {
+					temp = new HashMap<AdminLevel, DublinCore>();
+					populationMap.put(isoKey, temp);
+				}
+				temp.put(maxAdminLevel, dc);
+			}
+		} // for Population Graphs
+
+		// for (ISOKey isoKey : sortISOKeys(populuationMap)) {
+		// for (AdminLevel adminLevel : populuationMap.get(isoKey).keySet() ) {
+		// System.out.println( isoKey + " " + adminLevel + " " +
+		// populuationMap.get(isoKey).get(adminLevel).getIdentifier());
+		// }
+		// }
+
+		for (ISOKey isoKey : sortISOKeys(modelMap)) {
+			final List<PopulationModelSpecification> gmsList = new ArrayList<PopulationModelSpecification>();
+
+			final Map<AdminLevelSet, DublinCore> adminSetDCMap = modelMap
+					.get(isoKey);
+			for (AdminLevelSet adminLevelSet : adminSetDCMap.keySet()) {
+				final AdminLevel maxAdminLevel = adminLevelSet
+						.getMaxAdminLevel();
+
+				final DublinCore countryGeographicModelDC = adminSetDCMap
+						.get(adminLevelSet);
+
+				final Map<AdminLevel, DublinCore> adminDCMap = populationMap
+						.get(isoKey);
+				DublinCore populationGraphDC = adminDCMap.get(maxAdminLevel);
+				final PopulationModelSpecification temp = new PopulationModelSpecification(
+						isoKey, adminLevelSet, countryGeographicModelDC,
+						populationGraphDC);
+
+				gmsList.add(temp);
+			} // for adminLevel
+			retValue.put(isoKey, gmsList);
+		} // for each isoKey
+
+		return retValue;
+	} // processFiles
+
+} // PopulationModelGenerator
\ No newline at end of file
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java
new file mode 100644
index 0000000..b09c40c
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java
@@ -0,0 +1,223 @@
+// PopulationModelSpecification.java
+package org.eclipse.stem.internal.data.geography.population.human.models;
+
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+import org.eclipse.stem.core.Utility;
+import org.eclipse.stem.core.graph.Graph;
+import org.eclipse.stem.core.model.Model;
+import org.eclipse.stem.core.model.ModelPackage;
+import org.eclipse.stem.data.geography.ISOKey;
+import org.eclipse.stem.definitions.labels.LabelsPackage;
+import org.eclipse.stem.internal.data.generatedplugin.DublinCore;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevelSet;
+import org.eclipse.stem.internal.data.geography.specifications.CountryGraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.GraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.ModelSpecification;
+
+/**
+ * This class represents a {@link ModelSpecification} for a Population model.
+ */
+public class PopulationModelSpecification extends ModelSpecification implements
+		Comparable<PopulationModelSpecification> {
+
+	/**
+	 * This is referenced to cause the {@link ModelPackage} to register itself
+	 * as a package.
+	 */
+	@SuppressWarnings("unused")
+	private final ModelPackage modelPackage = ModelPackage.eINSTANCE;
+	@SuppressWarnings("unused")
+	private final LabelsPackage labelsPackage = LabelsPackage.eINSTANCE;
+
+	private final ISOKey isoKey;
+	private final AdminLevelSet adminLevelSet;
+	private final DublinCore countryGeographicModelDC;
+	private final DublinCore populationGraphDC;
+
+	static {
+		// This sets up the mapping between the "platform" URI's and the
+		// projects in the file system.
+
+		// CWD is the current working directory
+		final String CWD = System.getProperty("user.dir"); //$NON-NLS-1$
+		// WORKSPACE is the directory of the parent workspace
+		final String WORKSPACE = CWD.substring(0, CWD
+				.lastIndexOf(File.separator));
+
+		// The path to the generated geography data project
+		final String GEOGRAPHY_MODELS_PROJECT_ROOT = WORKSPACE
+				+ File.separator
+				+ org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID
+				+ File.separator;
+
+		// The path to the generated population data project
+		final String HUMAN_POPULATION_GRAPHS_PROJECT_ROOT = WORKSPACE
+				+ File.separator
+				+ org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID
+				+ File.separator;
+
+		final Map<String, URI> platformResourceMap = EcorePlugin
+				.getPlatformResourceMap();
+
+		// Register the mapping between the project id and the absolute path to
+		// the project in the file system. This will be found later when
+		// deserializing when the platform URI is mapped.
+		platformResourceMap.put(
+				org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID,
+				URI.createFileURI(GEOGRAPHY_MODELS_PROJECT_ROOT));
+
+		platformResourceMap
+				.put(
+						org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID,
+						URI.createFileURI(HUMAN_POPULATION_GRAPHS_PROJECT_ROOT));
+	} // static
+
+	/**
+	 * @param isoKey
+	 *            the {@link ISOKey} of the country the population model is for.
+	 * @param adminLevelSet
+	 *            the administration levels covered in the model
+	 * @param countryGeographicModelDC
+	 * @param populationGraphDC
+	 */
+	public PopulationModelSpecification(ISOKey isoKey,
+			AdminLevelSet adminLevelSet, DublinCore countryGeographicModelDC,
+			DublinCore populationGraphDC) {
+		this.isoKey = isoKey;
+		this.adminLevelSet = adminLevelSet;
+		this.countryGeographicModelDC = countryGeographicModelDC;
+		this.populationGraphDC = populationGraphDC;
+	} // PopulationModelSpecification
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.ModelSpecification#createIdentifiableInstance()
+	 */
+	@Override
+	protected Model createIdentifiableInstance() {
+		final Model retValue = super.createIdentifiableInstance();
+		// The generated Graphs etc., all have dublin core that references
+		// them as plugins. This is as it should be when STEM is running,
+		// but right now we're running stand-alone and want to access the
+		// plugins as projects (they aren't plugged into our running version
+		// of Eclipse). Substitute "resource" for "plugin" in the URI's we
+		// use and all will be well.
+
+		retValue
+				.getModels()
+				.add(
+						(Model) Utility
+								.getIdentifiable(getIdentifiableProjectURI(countryGeographicModelDC)));
+
+		retValue
+				.getGraphs()
+				.add(
+						(Graph) Utility
+								.getIdentifiable(getIdentifiableProjectURI(populationGraphDC)));
+
+		return retValue;
+	} // createIdentifiableInstance
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getRelativeSerializationPath()
+	 */
+	@Override
+	protected String getRelativeSerializationPath() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append(CountryGraphPropertyFileSpecification.COUNTRY_DIR);
+		sb.append(File.separatorChar);
+		sb.append(getISOKey().toString());
+		return sb.toString();
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getSerializationFileNameRoot()
+	 */
+	@Override
+	protected String getSerializationFileNameRoot() {
+		final StringBuilder sb = new StringBuilder(getISOKey().toString());
+		sb.append("_"); //$NON-NLS-1$
+		sb.append(adminLevelSet.toString());
+		sb.append("_population"); //$NON-NLS-1$
+		return sb.toString();
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTargetPluginId()
+	 */
+	@Override
+	protected String getTargetPluginId() {
+		return org.eclipse.stem.data.geography.population.human.models.Activator.PLUGIN_ID;
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTitleDescriptor()
+	 */
+	@Override
+	protected String getTitleDescriptor() {
+		final StringBuilder sb = new StringBuilder(isoKey.toString());
+		sb.append(" Human Population"); //$NON-NLS-1$
+		sb
+				.append(adminLevelSet.getNumAdminLevels() > 1 ? " (Levels: " : " (Level: "); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append(adminLevelSet.toString(",")); //$NON-NLS-1$
+		sb.append(")"); //$NON-NLS-1$
+		return sb.toString();
+	} // getTitleDescriptor
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreCoverage()
+	 */
+	@Override
+	protected String createDubinCoreCoverage() {
+		return countryGeographicModelDC.getCoverage();
+	} // createDubinCoreCoverage
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreSubject()
+	 */
+	@Override
+	protected String createDubinCoreSubject() {
+		return GraphPropertyFileSpecification.createDublinCoreSubjectString(
+				ModelPackage.Literals.MODEL.getName(), "population"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @return the isoKey
+	 */
+	public ISOKey getISOKey() {
+		return isoKey;
+	}
+
+	public int compareTo(PopulationModelSpecification pms) {
+		return adminLevelSet.getNumAdminLevels() > pms.adminLevelSet
+				.getNumAdminLevels() ? 1 : -1;
+
+	} // compareTo
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append(isoKey);
+		sb.append(":"); //$NON-NLS-1$
+		sb.append(adminLevelSet.toString());
+		return sb.toString();
+	} // toString
+
+} // PopulationModelSpecification
\ No newline at end of file
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml b/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml
new file mode 100644
index 0000000..c7a69bd
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0"?>
+<!-- ====================================================================== 
+     ANT script to build org.eclispe.ohf.stem.geography project 
+     and the initial set of STEM scenarios.  
+     This must be run after installing the STEM workspace and after changes
+     to code generated by EMF models.
+                                                                    
+     ====================================================================== -->
+<project name="STEM Internal Human Population Models" default="update_all">
+	<description>
+     Use the properties files to populate the org.eclipse.stem.data.geography.population.human.models plugin
+    </description>
+
+	<!-- P r o j e c t  S p e c i f i c a t i o n s -->
+
+	<!-- The name of the project -->
+	<property name="project.name" value="stem" />
+
+	
+	<!-- Are we running headless? -->
+	<condition property="runningHeadless" >
+		<isset property="buildDirectory" />
+	</condition>
+	
+	<!-- The buildDirectory property is set in a headless build -->
+	<condition property="pluginRootDirectory" value="${buildDirectory}/plugins" else="..">
+		<isset property="runningHeadless" />
+	</condition>
+
+	<!-- The baseLocation property is the location of the eclipse home installation -->
+	<!-- It is used to find eclipse plugins                                         -->
+	<!-- It is set in a headless build, but not one started manually from Eclipse   -->
+	<condition property="baseLocation" value="${eclipse.pdebuild.home}../..">
+		<not>
+			<isset property="runningHeadless" />
+		</not>
+	</condition>
+
+	<!-- This is the location of the class files of the built plug-ins     -->
+	<!-- If this is a manual build started from Eclipse then the directory -->
+	<!-- is "bin", if its a headless build then the directory is "@dot"    -->
+	<!-- The property baseLocation is set in a headless build              -->
+	<condition property="targetBin" value="@dot" else="bin">
+		<isset property="runningHeadless" />
+	</condition>
+	
+	
+	<!-- The prefix for fully qualified names -->
+	<property name="ID_ROOT" value="org.eclipse.stem" />
+
+	<!-- The name of the plugin that contains the plugin.xml file to scan -->
+	<property name="scan.plugin" value="${ID_ROOT}.data.geography.models" />
+	
+	<!-- The name of the plugin that contains the plugin.xml file to scan -->
+	<property name="population.plugin" value="${ID_ROOT}.data.geography.population.human" />
+	
+	<!-- The name of the source plugin (i.e., the one that contains this file -->
+	<property name="source.plugin" value="${ID_ROOT}.internal.data.geography.population.human.models" />
+
+	<!-- The name of the target plugin -->
+	<property name="target.plugin" value="${ID_ROOT}.data.geography.population.human.models" />
+
+	<!-- The path to the root directory of the source plugin -->
+	<property name="path.sourceplugin" location="${pluginRootDirectory}/${source.plugin}" />
+
+	<!-- The path to the root directory of the plugin that will be augmented with generated content -->
+	<property name="path.targetplugin" location="${pluginRootDirectory}/${target.plugin}" />
+
+	<!-- The path to the root directory of the resource files -->
+	<property name="path.resource.files" value="${path.sourceplugin}/resources/data/country" />
+
+	<!-- The path to the root directory of the plugin that will be augmented with generated content-->
+	<property name="path.generated.files" value="${path.sourceplugin}/temp" />
+
+	<!-- The path to the root directory of geography source code -->
+	<property name="path.geography.src" value="${path.targetplugin}/src/org/eclipse/stem/data/geography/population/human/models" />
+
+	<!-- The name of the plugin.xml file that will be augmented with generated content-->
+	<property name="file.target.pluginxml" value="${path.targetplugin}/plugin.xml" />
+
+	<!-- The name of the plugin.properties file that will be augmented with generated content-->
+	<property name="file.target.pluginproperties" value="${path.targetplugin}/plugin.properties" />
+
+	<!-- The name of the plugin.xml file that that is the aggregation of the generated content-->
+	<property name="file.util.pluginxml" value="${path.generated.files}/plugin.xml" />
+
+	<!-- The name of the plugin.properties file that that is the aggregation of the generated content-->
+	<property name="file.util.pluginproperties" value="${path.generated.files}/plugin.properties" />
+
+    <!-- The name of the plugin.xml file that that is the aggregation of the generated content-->
+    <property name="file.target.pluginproperties" value="${path.generated.files}/plugin.properties" />
+
+	<!-- The class path to use -->
+	<path id="classpath.runtime"> 
+		<pathelement location="${path.sourceplugin}/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.core/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.definitions/${targetBin}" />
+	    <pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data.geography/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data.geography.models/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.data.geography/${targetBin}" />
+		<fileset dir="${baseLocation}/plugins/">
+			<include name="*emf*.jar" />
+		</fileset>
+		<fileset dir="${pluginRootDirectory}/${ID_ROOT}.internal.data/lib/">
+			<include name="*emf*.jar" />
+		</fileset>
+	</path>
+
+	<target name="update_all" depends="update_geography" />
+
+	<!-- Update the geography plugin with the latest definitions -->
+	<target name="update_geography" depends="update_population_models, update_population_plugin_xml, update_population_plugin_properties" />
+
+	<target name="update_population_plugin_xml" depends="create_candidates">
+		<copy tofile="${file.target.pluginxml}" file="${file.util.pluginxml}" overwrite="true" />
+	</target>
+
+	<target name="update_population_plugin_properties" depends="create_candidates">
+		<copy tofile="${file.target.pluginproperties}" file="${file.util.pluginproperties}" overwrite="true" />
+	</target>
+
+	<!-- Update the graph files in the geography plugin -->
+	<target name="update_population_models" depends="create_candidates">
+		<copy todir="${path.targetplugin}/resources/data/" overwrite="true">
+			<fileset dir="${path.generated.files}/resources/data">
+				<include name="**/*.model" />
+			</fileset>
+		</copy>
+	</target>
+	
+	<!-- Create the model files for countries and the plugin.xml and plugin.properties fragments -->
+	<target name="create_candidates" depends="clean">
+		<!-- There is a problem here with specifying fork="true"  maxmemory="768m".  It causes an IOException on some machines -->
+		<java classname="${ID_ROOT}.internal.data.geography.population.human.models.PopulationModelGenerator" fork="true" maxmemory="1024m">
+			<classpath refid="classpath.runtime" />
+			<arg value="${path.generated.files}" />
+			<arg value="${scan.plugin}" />
+			<arg value="${population.plugin}" />
+			<jvmarg value="-Xms1024m"/>
+			<jvmarg value="-Xmx1024m"/>
+		</java>
+	</target>
+
+	<!-- clean out the .../temp/data directories -->
+	<!-- clean out the target directories -->
+	<target name="clean" depends="create_generated_files_dir">
+		<delete includeEmptyDirs="true" quiet="true">
+			<fileset dir="${path.generated.files}/">
+				<include name="**/*" />
+			</fileset>
+			<fileset dir="${path.targetplugin}/resources/data/">
+				<include name="country/**/*" />
+			</fileset>
+		</delete>
+	</target>
+
+	<target name="create_generated_files_dir">
+		<mkdir dir="${path.generated.files}/resources/data"/>		
+	</target>
+</project>