	/**
 	*
	 */
	public class Upload_dataset_file_xhtml extends HttpServlet
	{
		[…]
							kiwa.addDatasetGenealogyFile(dataset, originFile, controls, locale);

		
							
	public void addDatasetGenealogyFile(final Dataset dataset, final LoadedFile originFile, final List<ControlType> controls, final Locale locale) throws Exception
	{
		logger.debug("originFile.data size=" + originFile.data().length);

		//
		removeDatasetOriginFile(dataset);

		//
		this.kidarep.addDatasetGenealogyFile(dataset, originFile, controls, locale);
		this.storer.storeKidarepFile(dataset.getOriginFile().id(), originFile.data());
		this.storer.store(dataset);

		//
		rebuildGenealogyStatisticsByThread(dataset, dataset.getOriginFile());
							

public void rebuildGenealogyStatisticsByThread(final Dataset dataset, final DatasetFile datasetFile) throws Exception
	{
		if ((dataset != null) && (datasetFile != null))
		{
			Thread thread = new Thread()
			{
				/**
				 * 
				 */
				@Override
				public void run()
				{
					Chronometer chrono = new Chronometer();
					try
					{
						//
						datasetFile.statistics().clear();
						datasetFile.statistics().add(StatisticTag.COMPUTING_BEGIN_DATETIME.name(), DateTime.now().toString());

						//
						LoadedFile loadedFile = getLoadedFile(datasetFile);
						final Net net = loadNet(loadedFile);

						int width = Stag.GENEALOGY_GRAPHIC_WIDTH;
						int height = Stag.GENEALOGY_GRAPHIC_HEIGHT;

						// Build basics statistics.
						{
							chrono.step();
							datasetFile.statistics().addAll(Stag.buildControlStatistics(net));
							datasetFile.statistics().add(StatisticTag.COMPUTING_CONTROLS_TIME.name(), chrono.step().partialInterval() / 1000);
							datasetFile.statistics().addAll(Stag.buildBasicStatistics(net));
							datasetFile.statistics().add(StatisticTag.COMPUTING_BASICS_TIME.name(), chrono.step().partialInterval() / 1000);
							datasetFile.statistics().attributeDescriptors().addAll(Stag.buildAttributeDescriptorStatistics(net));
							datasetFile.statistics().add(StatisticTag.COMPUTING_ATTRIBUTES_TIME.name(), chrono.step().partialInterval() / 1000);
						}

						// Build geography statistics.
						{
							datasetFile.statistics().addAll(Stag.buildGeographyStatistics(net));
							datasetFile.statistics().add(StatisticTag.COMPUTING_GEOGRAPHY_TIME.name(), chrono.step().runningInterval() / 1000);

							Kiwa.this.storer().store(dataset);
						}

						// Build circuit statistics.
						{
							datasetFile.statistics().addAll(Stag.buildCircuitStatistics(net));
							datasetFile.statistics().add(StatisticTag.COMPUTING_CIRCUITS_TIME.name(), chrono.step().partialInterval() / 1000);

							if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
							{
								Kiwa.this.storer().store(dataset);
							}
						}

						// 3
						{
							LoadedFile graphicFile = Stag.buildGraphicComponents(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(3, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_COMPONENTS_TIME.name(), chrono.step().partialInterval() / 1000);
								// No dataset store.
							}
						}

						// 4
						{
							LoadedFile graphicFile = Stag.buildGraphicCompleteness(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(4, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_COMPLETENESS_TIME.name(), chrono.step().partialInterval() / 1000);
								// No dataset store.
							}
						}

						// 5
						{
							LoadedFile graphicFile = Stag.buildGraphicSibsetDistribution(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(5, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_SIBSETDISTRIBUTION_TIME.name(), chrono.step().partialInterval() / 1000);
								Kiwa.this.storer().store(dataset);
							}
						}

						// 8
						{
							LoadedFile graphicFile = Stag.buildGraphicConsanguinePairs(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(8, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_CONSANGUINEPAIRS_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 1
						{
							LoadedFile graphicFile = Stag.buildGraphicBiasWeights(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(1, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_BIASWEIGHTS_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 2
						{
							LoadedFile graphicFile = Stag.buildGraphicBiasNetWeights(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(2, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_BIASNETWEIGHTS_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 9
						{
							LoadedFile graphicFile = Stag.buildGraphicGenders(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(9, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_GENDERS_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 10
						{
							LoadedFile graphicFile = Stag.buildGraphicPEDG2(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(10, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_PEDG2_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 11
						{
							LoadedFile graphicFile = Stag.buildGraphicPEDG3(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(11, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_PEDG3_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 12
						{
							LoadedFile graphicFile = Stag.buildGraphicUnionStatus(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(12, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_UNIONSTATUS_TIME.name(), chrono.step().partialInterval() / 1000);

								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 6
						{
							LoadedFile graphicFile = Stag.buildGraphicFirstCousinMarriages(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(6, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_FIRSTCOUSINMARRIAGES_TIME.name(), chrono.step().partialInterval() / 1000);
								if (chrono.interval() > STATISTICS_COMPUTING_MAXDELAY)
								{
									Kiwa.this.storer().store(dataset);
								}
							}
						}

						// 7
						{
							LoadedFile graphicFile = Stag.buildGraphicAncestorChains(net, width, height);
							if (graphicFile != null)
							{
								LoadedFileHeader header = new LoadedFileHeader(Kiwa.instance().kidarep().nextFileId(), graphicFile.header());
								Kiwa.this.storer.storeKidarepFile(header.id(), graphicFile.data());
								datasetFile.statistics().graphics().addToPosition(7, header);
								datasetFile.statistics().add(StatisticTag.COMPUTING_GRAPHIC_ANCESTORCHAINS_TIME.name(), chrono.step().partialInterval() / 1000);
								// No dataset store.
							}
						}

						datasetFile.statistics().add(StatisticTag.GRAPHICS_COUNT.name(), datasetFile.statistics().graphics().size());
						datasetFile.statistics().add(StatisticTag.COMPUTING_TIME.name(), chrono.step().interval() / 1000);
						datasetFile.statistics().add(StatisticTag.COMPUTING_END_DATETIME.name(), DateTime.now().toString());

						Kiwa.this.storer().store(dataset);
					}
					catch (Exception exception)
					{
						logger.debug("Error in thread.", exception);
					}
					finally
					{
						logger.debug("THREAD OVER [{}][{}][{}s].", Thread.currentThread().getId(), Thread.currentThread().getName(), chrono.step().interval() / 1000);
					}
				}
			};
			logger.debug("starting thread [{}][{}]", thread.getId(), thread.getName());
			thread.start();
			thread.join(STATISTICS_COMPUTING_MAXDELAY);
			if (thread.isAlive())
			{
				logger.debug("LET THE COMPUTING THREAD RUNNING…");
			}
		}
	}
