internal MapFileWriterTask(MapWriterConfiguration configuration)
        {
            this.configuration = configuration;

            Properties properties = new Properties();

            try
            {
                properties.load(typeof(MapFileWriterTask).ClassLoader.getResourceAsStream("default.properties"));
                configuration.WriterVersion = Constants.CREATOR_NAME + "-" + properties.getProperty(Constants.PROPERTY_NAME_WRITER_VERSION);
                // If multilingual map then set newer map file version
                bool multilingual = configuration.PreferredLanguages != null && configuration.PreferredLanguages.size() > 1;
                configuration.FileSpecificationVersion = int.Parse(properties.getProperty(multilingual ? Constants.PROPERTY_NAME_FILE_SPECIFICATION_VERSION_MAX : Constants.PROPERTY_NAME_FILE_SPECIFICATION_VERSION_MIN));

                LOGGER.info("mapfile-writer version: " + configuration.WriterVersion);
                LOGGER.info("mapfile format specification version: " + configuration.FileSpecificationVersion);
            }
            catch (IOException e)
            {
                throw new Exception("could not find default properties", e);
            }
            catch (System.FormatException e)
            {
                throw new Exception("map file specification version is not an integer", e);
            }

            // CREATE DATASTORE IF BBOX IS DEFINED
            if (this.configuration.BboxConfiguration != null)
            {
                if ("ram".Equals(configuration.DataProcessorType, StringComparison.CurrentCultureIgnoreCase))
                {
                    this.tileBasedGeoObjectStore = RAMTileBasedDataProcessor.newInstance(configuration);
                }
                else
                {
                    this.tileBasedGeoObjectStore = HDTileBasedDataProcessor.newInstance(configuration);
                }
            }
        }
        public override void process(EntityContainer entityContainer)
        {
            Entity entity = entityContainer.Entity;

            switch (entity.Type)
            {
            case Bound:
                Bound bound = (Bound)entity;
                if (this.configuration.BboxConfiguration == null)
                {
                    BoundingBox bbox = new BoundingBox(bound.Bottom, bound.Left, bound.Top, bound.Right);
                    this.configuration.BboxConfiguration = bbox;
                    this.configuration.validate();
                    if ("ram".Equals(this.configuration.DataProcessorType))
                    {
                        this.tileBasedGeoObjectStore = RAMTileBasedDataProcessor.newInstance(this.configuration);
                    }
                    else
                    {
                        this.tileBasedGeoObjectStore = HDTileBasedDataProcessor.newInstance(this.configuration);
                    }
                }
                LOGGER.info("start reading data...");
                break;

            // *******************************************************
            // ****************** NODE PROCESSING*********************
            // *******************************************************
            case Node:

                if (this.tileBasedGeoObjectStore == null)
                {
                    LOGGER.severe("No valid bounding box found in input data.\n" + "Please provide valid bounding box via command " + "line parameter 'bbox=minLat,minLon,maxLat,maxLon'.\n" + "Tile based data store not initialized. Aborting...");
                    throw new System.InvalidOperationException("tile based data store not initialized, missing bounding " + "box information in input data");
                }
                this.tileBasedGeoObjectStore.addNode((Node)entity);
                // hint to GC
                entity = null;
                this.amountOfNodesProcessed++;
                break;

            // *******************************************************
            // ******************* WAY PROCESSING*********************
            // *******************************************************
            case Way:
                this.tileBasedGeoObjectStore.addWay((Way)entity);
                entity = null;
                this.amountOfWaysProcessed++;
                break;

            // *******************************************************
            // ****************** RELATION PROCESSING*********************
            // *******************************************************
            case Relation:
                Relation currentRelation = (Relation)entity;
                this.tileBasedGeoObjectStore.addRelation(currentRelation);
                this.amountOfRelationsProcessed++;
                entity = null;
                break;
            }
        }