package org.eclipse.stem.internal.data.geography.specifications;

/*******************************************************************************
 * 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 org.eclipse.stem.core.graph.NodeLabel;
import org.eclipse.stem.definitions.labels.AreaLabel;
import org.eclipse.stem.definitions.labels.LabelsFactory;
import org.eclipse.stem.definitions.labels.impl.AreaLabelImpl;
import org.eclipse.stem.definitions.nodes.impl.RegionImpl;
import org.eclipse.stem.geography.names.ISOKey;
import org.eclipse.stem.internal.data.geography.propertydata.AreaPropertyData;
import org.eclipse.stem.internal.data.propertydata.PropertyData;

/**
 * This class represents a {@link Graph} containing {@link AreaLabel}s of
 * {@link Node}s specific to a country.
 */
public class CountryAreaLabelPropertyFileSpecification extends
		CountryLabelPropertyFileSpecification {

	/**
	 * This is the name used to identify "area" labels.
	 */
	public final static String AREA_LABEL_NAME = "area"; //$NON-NLS-1$

	/**
	 * Constructor
	 */
	public CountryAreaLabelPropertyFileSpecification() {
		super(AREA_LABEL_NAME);
	} // CountryAreaLabelPropertyFileSpecification

	@Override
	protected PropertyData createPropertyDataInstanceFromProperty(
			final String dataPropertyKey, final String propertyValue) {
		return new AreaPropertyData(new ISOKey(dataPropertyKey), propertyValue);
	} // createDataSetData

	@Override
	protected NodeLabel createLabel(final AdminLevel adminLevel,
			final ISOKey isoKey, final PropertyData graphData) {

		final AreaPropertyData areaData = (AreaPropertyData) graphData;
		final String nodeISOKey = areaData.getISOKey().toString();

		final AreaLabel retValue = LabelsFactory.eINSTANCE.createAreaLabel();
		retValue.setURI(AreaLabelImpl.createAreaLabelURI(adminLevel.intValue(),
				isoKey.toString(), nodeISOKey));
		retValue.setURIOfIdentifiableToBeLabeled(RegionImpl
				.createRegionNodeURI(nodeISOKey));
		retValue.getCurrentAreaValue().setArea(
				Double.parseDouble(areaData.getArea()));

		return retValue;
	} // createAreaLabel

} // CountryAreaLabelPropertyFileSpecification