commit 94284c9aeaf3c3bf43833514879532c18e35b6a9
Author: Marc NICOLAS <marc.nicolas@ias.u-psud.fr>
Date:   Fri Sep 4 14:51:15 2015 +0200

    ajout du dev sur le protocol TAP

diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/representation/DatabaseRequestIasModel.java b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/DatabaseRequestIasModel.java
new file mode 100644
index 0000000..a799df1
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/DatabaseRequestIasModel.java
@@ -0,0 +1,64 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.ias.sitools.vo.representation;
+
+import fr.cnes.sitools.astro.representation.DatabaseRequestModel;
+import fr.cnes.sitools.common.exception.SitoolsException;
+import fr.cnes.sitools.dataset.converter.business.ConverterChained;
+import fr.cnes.sitools.dataset.database.DatabaseRequest;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author marc
+ */
+public class DatabaseRequestIasModel extends  DatabaseRequestModel {
+    
+    /**
+   * Logger.
+   */
+    private static final Logger LOG = Logger.getLogger(DatabaseRequestIasModel.class.getName());
+   /**
+     * DB Result set.
+     */
+    private DatabaseRequest request;
+    /**
+     * SITools2 converters.
+     */
+    private ConverterChained converterChained;
+    /**
+     * Number of rows.
+     */
+    private transient int sizeValue;
+
+    /**
+     * Empty constructor.
+     */
+    protected DatabaseRequestIasModel() {
+        setSize(0);
+    }
+
+    public DatabaseRequestIasModel(DatabaseRequest rsVal, ConverterChained converterChainedVal) {
+        super(rsVal, converterChainedVal);
+        int countRowRequest = rsVal.getCount();
+        setSize(countRowRequest);
+
+        // we need to close the connection here
+        // otherwise the connection will not be free.
+        if (this.size() == 0) {
+            try {
+                this.request.close();
+            } catch (SitoolsException ex) {
+                LOG.log(Level.SEVERE, null, ex);
+            }
+        }
+    }
+    
+    
+    
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/representation/VOTableRepresentation.java b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/VOTableRepresentation.java
new file mode 100644
index 0000000..578b435
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/VOTableRepresentation.java
@@ -0,0 +1,191 @@
+ /*******************************************************************************
+ * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
+ *
+ * This file is part of SITools2.
+ *
+ * SITools2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SITools2 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
+ ******************************************************************************/
+package fr.ias.sitools.vo.representation;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.restlet.data.LocalReference;
+import org.restlet.data.MediaType;
+import org.restlet.ext.freemarker.TemplateRepresentation;
+import org.restlet.representation.OutputRepresentation;
+import org.restlet.representation.Representation;
+import org.restlet.resource.ClientResource;
+
+/**
+ * Creates a VOTable representation with a template and a data model. The data model is the following :
+ * <pre>
+ * root
+ *    |__ description
+ *    |__ infos
+ *    |      |__ id
+ *    |      |__ name (required)
+ *    |      |__ valueAttribute (required)
+ *    |      |__ xtype
+ *    |      |__ ref
+ *    |      |__ unit
+ *    |      |__ ucd
+ *    |      |__ utype
+ *    |      |__ value
+ *    |__ params (List)
+ *    |      |__ param
+ *    |           |__ id
+ *    |           |__ unit
+ *    |           |__ datatype (required)
+ *    |           |__ precision
+ *    |           |__ width
+ *    |           |__ xtype
+ *    |           |__ ref
+ *    |           |__ name (required)
+ *    |           |__ ucd
+ *    |           |__ utype
+ *    |           |__ arraysize
+ *    |           |__ value (required)
+ *    |           |__ DESCRIPTION
+ *    |           |__ VALUES
+ *    |                 |__ id
+ *    |                 |__ type
+ *    |                 |__ null
+ *    |                 |__ ref
+ *    |                 |__ OPTION (List)
+ *    |                        |__ option
+ *    |                               |__ name
+ *    |                               |__ value (required)
+ *    |__ fields (List)
+ *    |      |__ field
+ *    |           |__ DESCRIPTION
+ *    |           |__ id
+ *    |           |__ name (required)
+ *    |           |__ ucd
+ *    |           |__ utype
+ *    |           |__ ref
+ *    |           |__ datatype (required)
+ *    |           |__ width
+ *    |           |__ precision
+ *    |           |__ unit
+ *    |           |__ type
+ *    |           |__ xtype
+ *    |           |__ arraysize
+ *    |__ rows (List) (required)
+ *    |     |__ row (required)
+ *    |
+ *    |__ sqlColAlias (List) (required)
+ *    |      |__ sqlcol (required)
+ *    |__ mappingColAliasConceptSql (Hash) (optional)
+ *    |__ siaCut (boolean, optional)
+ *    |__ nrows (optional)
+ *    |__ mapPartFileCutUrl (Hash) (optional)
+ *    |__ primaryKey (optional)
+ *    |__ queryParams (POS,SIZE,...)
+ *    |__ queryInfos (Query status)
+ *
+ * </pre> Provide a VOTable representation by streaming based on Freemarker To have a dataModel by streaming, dataModel for rows element
+ * must use the DatabaseRequestModel adapter
+ *
+ * @author Jean-Christophe Malapert <jean-christophe.malapert@cnes.fr>
+ */
+public class VOTableRepresentation extends OutputRepresentation {
+
+  /**
+   * Logger.
+   */
+  private static final Logger LOG = Logger.getLogger(VOTableRepresentation.class.getName());
+  /**
+   * Default template file = votable.ftl.
+   */
+  public static final String DEFAULT_TEMPLATE = "votable.ftl";
+  /**
+   * Data model that contains the information to represent.
+   */
+  private Map dataModel;
+  /**
+   * Template file.
+   */
+  private String ftl;
+
+  /**
+   * Creates a VOTableRepresentation based on a dataModel and a templateFile.
+   *
+   * @param dataModelVal DataModel
+   * @param ftlVal template File
+   */
+  public VOTableRepresentation(final Map dataModelVal, final String ftlVal) {
+    super(MediaType.TEXT_XML);
+    setDataModel(dataModelVal);
+    setFtl(ftlVal);
+  }
+  /**
+   * Creates a GeoJson representation with the default template (<code>DEFAULT_TEMPLATE</code>).
+   *
+   * @param dataModelVal the data model
+   */
+  public VOTableRepresentation(final Map dataModelVal) {
+    this(dataModelVal, DEFAULT_TEMPLATE);
+  }
+  /**
+   * Writes the representation.
+   *
+   * @param outputStream output stream
+   * @throws IOException Exception
+   */
+  @Override
+  public final void write(final OutputStream outputStream) throws IOException {
+    final Representation metadataFtl = new ClientResource(LocalReference.createClapReference(getClass().getPackage()) + "/"
+            + getFtl()).get();       
+    final TemplateRepresentation tpl = new TemplateRepresentation(metadataFtl, getDataModel(), getMediaType());    
+    LOG.log(Level.FINEST, getFtl(), tpl);
+    outputStream.write(tpl.getText().getBytes());
+    outputStream.flush();
+  }
+
+
+    /**
+     * Returns the data model.
+     * @return the dataModel
+     */
+    protected final Map getDataModel() {
+        return dataModel;
+    }
+
+    /**
+     * Sets the data model.
+     * @param dataModelVal the dataModel to set
+     */
+    protected final void setDataModel(final Map dataModelVal) {
+        this.dataModel = dataModelVal;
+    }
+
+    /**
+     * Returns the template filename.
+     * @return the ftl
+     */
+    protected final String getFtl() {
+        return ftl;
+    }
+
+    /**
+     * Sets the template filename.
+     * @param ftlVal the ftl to set
+     */
+    protected final void setFtl(final String ftlVal) {
+        this.ftl = ftlVal;
+    }
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/representation/votable.ftl b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/votable.ftl
new file mode 100644
index 0000000..f2d7390
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/representation/votable.ftl
@@ -0,0 +1,78 @@
+<?xml version="1.0" ?>
+<VOTABLE version="1.2" xmlns="http://www.ivoa.net/xml/VOTable/v1.2">
+    <RESOURCE type="results">
+    <#if description?exists><DESCRIPTION>${description}</DESCRIPTION></#if>
+    <#if queryInfos?exists>
+        <#list queryInfos as queryInfo>
+            <INFO<#if queryInfo.id?exists> ID="${queryInfo.id}"</#if> name="${queryInfo.name}" value="${queryInfo.valueAttribute}"<#if queryInfo.xtype?exists> xtype="${queryInfo.xtype}"</#if><#if queryInfo.unit?exists> unit="${queryInfo.unit}"</#if><#if queryInfo.ucd?exists> ucd="${queryInfo.ucd}"</#if><#if queryInfo.utype?exists> utype="${queryInfo.utype}"</#if> />
+        </#list>
+    </#if>
+    <#if queryParams?exists>
+        <#list queryParams as queryParam>
+            <PARAM<#if queryParam.id?exists> ID="${queryParam.id}"</#if> name="${queryParam.name}" datatype="${queryParam.datatype.value()}" <#if queryParam.xtype?exists> xtype="${queryParam.xtype}"</#if><#if queryParam.unit?exists> unit="${queryParam.unit}"</#if><#if queryParam.ucd?exists> ucd="${queryParam.ucd}"</#if><#if queryParam.utype?exists> utype="${queryParam.utype}"</#if> value="${queryParam.value}"/>
+        </#list>
+    </#if>
+    <#if infos?exists>
+        <#list infos as info>
+            <INFO<#if info.id?exists> ID="${info.id}"</#if> name="${info.name}" value="${info.valueAttribute}"<#if info.xtype?exists> xtype="${info.xtype}"</#if><#if info.ref?exists> ref="${info.ref}"</#if><#if info.unit?exists> unit="${info.unit}"</#if><#if info.ucd?exists> ucd="${info.ucd}"</#if><#if info.utype?exists> utype="${info.utype}"</#if> />
+        </#list>
+    </#if>
+    <#if params?exists>
+        <#list params as param>
+            <#if param.DESCRIPTION?exists>
+                <PARAM<#if param.id?exists> ID="${param.id}"</#if> name="${param.name}" <#if param.unit?exists> unit="${param.unit}"</#if> datatype="${param.datatype.value()}"<#if param.precision?exists> precision="${param.precision}"</#if><#if param.width?exists> ID="${param.width}"</#if><#if param.xtype?exists> xtype="${param.xtype}"</#if><#if param.ref?exists> ref="${param.ref}"</#if><#if param.ucd?exists> ucd="${param.ucd}"</#if><#if param.utype?exists> utype="${param.utype}"</#if><#if param.arraysize?exists> arraysize="${param.arraysize}"</#if> value="${param.value}">
+                    <DESCRIPTION>
+                    <#list param.DESCRIPTION.content as description>
+                        ${description}
+                    </#list>
+                    </DESCRIPTION>
+                <#if param.VALUES?exists>
+                    <VALUES<#if param.VALUES.id?exists> ID="${param.VALUES.id}"</#if><#if param.VALUES.type?exists> type="${param.VALUES.type}"</#if><#if param.VALUES.null?exists> null="${param.VALUES.null}"</#if><#if param.VALUES.ref?exists> ref="${param.VALUES.ref}"</#if>>
+                    <#if param.VALUES.OPTION?exists>
+                    <#list param.VALUES.OPTION as option>
+                        <OPTION<#if option.name?exists> name="${option.name}"</#if> value="${option.value}"/>
+                    </#list>
+                    </#if>
+                    </VALUES>
+                </#if>
+                </PARAM>
+            <#else>
+                <PARAM<#if param.id?exists> ID="${param.id}"</#if> name="${param.name}" <#if param.unit?exists> unit="${param.unit}"</#if> datatype="${param.datatype.value()}"<#if param.precision?exists> precision="${param.precision}"</#if><#if param.width?exists> ID="${param.width}"</#if><#if param.xtype?exists> xtype="${param.xtype}"</#if><#if param.ref?exists> ref="${param.ref}"</#if><#if param.ucd?exists> ucd="${param.ucd}"</#if><#if param.utype?exists> utype="${param.utype}"</#if><#if param.arraysize?exists> arraysize="${param.arraysize}"</#if> value="${param.value}"/>
+            </#if>
+        </#list>
+    </#if>
+    <#if fields?exists>
+        <#list fields as field> 
+            <#if field.DESCRIPTION?exists>
+                <FIELD<#if field.id?exists> ID="${field.id}</#if> name="${field.name}"<#if field.ucd?exists> ucd="${field.ucd}"</#if><#if field.utype?exists> utype="${field.utype}"</#if><#if field.ref?exists> ref="${field.ref}"</#if><#if field.datatype?exists> datatype="${field.datatype.value()}"</#if><#if field.width?exists> width="${field.width}"</#if><#if field.precision?exists> precision="${field.precision}"</#if><#if field.unit?exists> unit="${field.unit}"</#if><#if field.type?exists> type="${field.type}"</#if><#if field.xtype?exists> xtype="${field.xtype}"</#if><#if field.arraysize?exists> arraysize="${field.arraysize}"</#if>>
+                    <DESCRIPTION>
+                    <#list field.DESCRIPTION.content as description>
+                        ${description}
+                    </#list>
+                    </DESCRIPTION>
+                </FIELD>
+            <#else>
+                <FIELD<#if field.id?exists> ID="${field.id}</#if> name="${field.name}"<#if field.ucd?exists> ucd="${field.ucd}"</#if><#if field.utype?exists> utype="${field.utype}"</#if><#if field.ref?exists> ref="${field.ref}"</#if><#if field.datatype?exists> datatype="${field.datatype.value()}"</#if><#if field.width?exists> width="${field.width}"</#if><#if field.precision?exists> precision="${field.precision}"</#if><#if field.unit?exists> unit="${field.unit}"</#if><#if field.type?exists> type="${field.type}"</#if><#if field.xtype?exists> xtype="${field.xtype}"</#if><#if field.arraysize?exists> arraysize="${field.arraysize}"</#if> />
+            </#if>
+        </#list>
+    </#if>
+    <#if rows?exists>
+    <#if nrows != 0>
+    <TABLE<#if nrows?exists> nrows="${nrows}"</#if>>
+    <DATA>
+        <TABLEDATA>
+        <#list rows as row>
+        <TR>
+            <#list sqlColAlias as sqlcol>
+            <#if row["${sqlcol}"] == "null"><TD> <#if sqlcol?exists> header : ${sqlcol}</#if></TD><#else><TD>${row["${sqlcol}"]}</TD></#if>
+            </#list>
+        </TR>
+        </#list>
+        </TABLEDATA>
+    </DATA>
+    </TABLE>
+    </#if>
+    </#if>
+    
+    </RESOURCE>
+</VOTABLE>
\ No newline at end of file
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/DataModelInterface.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/DataModelInterface.java
new file mode 100644
index 0000000..d46bb42
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/DataModelInterface.java
@@ -0,0 +1,36 @@
+ /*******************************************************************************
+ * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
+ *
+ * This file is part of SITools2.
+ *
+ * SITools2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SITools2 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
+ ******************************************************************************/
+package fr.ias.sitools.vo.tap;
+
+import java.util.Map;
+
+/**
+ * Provides an interface to get the data model.
+ *
+ * @author Jean-Christophe Malapert
+ */
+public interface DataModelInterface {
+
+  /**
+   * Returns the data model.
+   *
+   * @return data model
+   */
+  Map getDataModel();
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolAsynchronousResponse.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolAsynchronousResponse.java
new file mode 100644
index 0000000..a4b663d
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolAsynchronousResponse.java
@@ -0,0 +1,81 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.ias.sitools.vo.tap;
+
+import fr.cnes.sitools.extensions.astro.application.uws.common.Util;
+import fr.cnes.sitools.extensions.astro.application.uws.jobmanager.AbstractJobTask;
+import fr.cnes.sitools.xml.uws.v1.Job;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.datatype.DatatypeConfigurationException;
+import net.ivoa.xml.uws.v1.ErrorSummary;
+import net.ivoa.xml.uws.v1.ErrorType;
+import net.ivoa.xml.uws.v1.ExecutionPhase;
+import org.restlet.engine.Engine;
+
+/**
+ *
+ * @author marc
+ */
+public class TableAccessProtocolAsynchronousResponse extends AbstractJobTask {
+
+    final TableAccessProtocolInputParameters inputParams;
+    
+    public TableAccessProtocolAsynchronousResponse(final TableAccessProtocolInputParameters inputParameters) {
+        this.inputParams = inputParameters;
+    }
+    
+    @Override
+    public void run() {
+        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, "***************** JE SUIS DANS LE RUN !!!");
+        try {
+            setBlinker(Thread.currentThread());
+            setStartTime(Util.convertIntoXMLGregorian(new Date()));
+            setPhase(ExecutionPhase.EXECUTING);
+            final List<String> filenameList = createJob();
+            //createResults(filenameList);
+            setEndTime(Util.convertIntoXMLGregorian(new Date()));
+            setPhase(ExecutionPhase.COMPLETED);
+        } catch (DatatypeConfigurationException ex) {
+            Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, null, ex);
+            final ErrorSummary errorSumm = new ErrorSummary();
+            errorSumm.setMessage(ex.getMessage());
+            errorSumm.setType(ErrorType.FATAL);
+            errorSumm.setHasDetail(true);
+            setError(errorSumm);
+            setPhase(ExecutionPhase.ERROR);
+        } catch (Error error) {
+            Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, null, error);
+            final ErrorSummary errorSumm = new ErrorSummary();
+            errorSumm.setMessage(error.getMessage());
+            errorSumm.setType(ErrorType.FATAL);
+            errorSumm.setHasDetail(true);
+            setError(errorSumm);
+            setPhase(ExecutionPhase.ERROR);
+        }
+    }
+
+    private List<String> createJob(){
+        List<String> a = new ArrayList<String>();
+        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++");
+        
+        final String query = this.inputParams.getQuery();
+        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++ QUERY : "+query);
+        //final String format = String.valueOf(getParameterValue(TableAccessProtocolLibrary.FORMAT));
+        //final String lang = String.valueOf(getParameterValue(TableAccessProtocolLibrary.LANG));
+        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++ getJobInfo "+getJobInfo().toString());
+        return a;
+    }
+    
+    @Override
+    public Job getCapabilities() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolDataModelInterface.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolDataModelInterface.java
new file mode 100644
index 0000000..50be249
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolDataModelInterface.java
@@ -0,0 +1,34 @@
+ /*******************************************************************************
+ * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
+ *
+ * This file is part of SITools2.
+ *
+ * SITools2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SITools2 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
+ ******************************************************************************/
+package fr.ias.sitools.vo.tap;
+import java.util.Map;
+
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author marc
+ */
+interface TableAccessProtocolDataModelInterface {
+     Map getDataModel();
+}
\ No newline at end of file
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolException.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolException.java
new file mode 100644
index 0000000..e2ee53f
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolException.java
@@ -0,0 +1,19 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.ias.sitools.vo.tap;
+
+import fr.cnes.sitools.common.exception.SitoolsException;
+
+/**
+ * @author marc
+ */
+public class TableAccessProtocolException extends SitoolsException {
+
+    public TableAccessProtocolException(String message) {
+        super(message);
+    }
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolInputParameters.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolInputParameters.java
new file mode 100644
index 0000000..03ec4f7
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolInputParameters.java
@@ -0,0 +1,179 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.ias.sitools.vo.tap;
+
+import fr.cnes.sitools.dataset.DataSetApplication;
+import fr.cnes.sitools.plugins.resources.model.ResourceModel;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import net.ivoa.xml.votable.v1.Info;
+import org.restlet.Context;
+import org.restlet.Request;
+
+/**
+ *
+ * @author marc
+ */
+public class TableAccessProtocolInputParameters implements DataModelInterface {
+     
+    /**
+    * Data model that stores the metadata response of the service.
+    */
+    private final transient Map dataModel = new HashMap();
+    /**
+    * Request.
+    */
+    private final transient Request request;
+    /**
+    * Context.
+    */
+    private final transient Context context;
+    /**
+    * Application where this resources is linked.
+    */
+    private final transient DataSetApplication datasetApp;
+    /**
+    * Configuration parameters of this resource.
+    */
+    private final transient ResourceModel resourceModel;
+
+    private final String query;
+    private final String format;
+   
+    
+    /**
+    * Constructs the objet that returns the metadata of the service.
+    * @param datasetAppVal application
+    * @param requestVal request
+    * @param contextVal context
+    * @param resourceModelVal configuration parameters
+    */
+    public TableAccessProtocolInputParameters(final DataSetApplication datasetAppVal, final Request requestVal, final Context contextVal, final ResourceModel resourceModelVal) {
+        this.request = requestVal;
+        this.context = contextVal;
+        this.datasetApp = datasetAppVal;
+        this.resourceModel = resourceModelVal;
+        final String requestType = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.REQUEST);
+        final String langRequest = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.LANG);
+        final String phase = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.PHASE);
+        this.query = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.QUERY);
+        this.format = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.FORMAT);
+        //if(langRequestTableAccessProtocolLibrary.langSupported.)
+        //fillMetadataFormat();
+    }
+    
+   /**
+   * Fills metadata response.
+   */
+  private void fillMetadataFormat() {
+      
+    this.dataModel.put("description", this.resourceModel.getParameterByName(TableAccessProtocolLibrary.DESCRIPTION).getValue());
+
+    final Info info = new Info();
+    info.setName("QUERY_STATUS");
+    info.setValueAttribute("OK");
+    final List<Info> listInfos = new ArrayList<Info>();
+    listInfos.add(info);
+    this.dataModel.put("infos", listInfos);
+   
+    /* ON EN N'A PAS BESOIN
+    final List<Param> listParam = new ArrayList<Param>();
+    Param param = new Param();
+    param.setName("INPUT:POS");
+    param.setValue("0,0");
+    param.setDatatype(DataType.DOUBLE);
+    AnyTEXT anyText = new AnyTEXT();
+    anyText.getContent().add("Search Position in the form ra,dec where ra and dec are given in decimal degrees in the ICRS coordinate system.");
+    param.setDESCRIPTION(anyText);
+    listParam.add(param);
+
+    param = new Param();
+    param.setName("INPUT:SIZE");
+    param.setValue("0.05");
+    param.setDatatype(DataType.DOUBLE);
+    anyText = new AnyTEXT();
+    anyText.getContent().add("Size of search region in the RA and Dec directions.");
+    param.setDESCRIPTION(anyText);
+    listParam.add(param);
+
+    param = new Param();
+    param.setName("INPUT:FORMAT");
+    param.setValue(TableAccessProtocolLibrary.ParamStandardFormat.ALL.name());
+    param.setDatatype(DataType.CHAR);
+    param.setArraysize("*");
+    AnyTEXT anyText = new AnyTEXT();
+    anyText.getContent().add("Requested format of result.");
+    param.setDESCRIPTION(anyText);
+    
+
+    //TODO : le faire pour chaque format
+    listParam.add(param);
+ ON EN N'A PAS BESOIN    
+    param = new Param();
+    param.setName("INPUT:INTERSECT");
+    param.setValue(this.resourceModel.getParameterByName(TableAccessProtocolLibrary.INTERSECT).getValue());
+    param.setDatatype(DataType.CHAR);
+    anyText = new AnyTEXT();
+    anyText.getContent().add("Choice of overlap with requested region.");
+    param.setDESCRIPTION(anyText);
+    listParam.add(param);
+
+    param = new Param();
+    param.setName("INPUT:VERB");
+    param.setValue(this.resourceModel.getParameterByName(TableAccessProtocolLibrary.VERB).getValue());
+    param.setDatatype(DataType.INT);
+    anyText = new AnyTEXT();
+    anyText.getContent().add("Verbosity level, controlling the number of columns returned.");
+    param.setDESCRIPTION(anyText);
+    listParam.add(param);
+
+    dataModel.put("params", listParam);
+
+    String dictionaryName = resourceModel.getParameterByName(TableAccessProtocolLibrary.DICTIONARY).getValue();
+    final List<String> columnList = new ArrayList<String>();
+    List<Field> fieldList = new ArrayList<Field>();
+    try {
+        List<ColumnConceptMappingDTO> mappingList = getDicoFromConfiguration(datasetApp, dictionaryName);
+        setFields(fieldList, columnList, mappingList);
+    }catch (SitoolsException ex) {
+             
+    }
+   */ 
+  }
+    
+    @Override
+    public final Map getDataModel() {
+      return Collections.unmodifiableMap(this.dataModel);
+    }
+
+    /* GETTER DE LA CLASSE */
+    public String getQuery() {
+        return query;
+    }
+    public String getFormat() {
+        return format;
+    }
+    public Context getContext() {
+        return context;
+    }
+
+    public Request getRequest() {
+        return request;
+    }
+    public DataSetApplication getDatasetApp() {
+        return datasetApp;
+    }
+
+    public ResourceModel getResourceModel() {
+        return resourceModel;
+    }
+ 
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolLibrary.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolLibrary.java
new file mode 100644
index 0000000..fa956eb
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolLibrary.java
@@ -0,0 +1,129 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package fr.ias.sitools.vo.tap;
+
+import fr.ias.sitools.vo.representation.VOTableRepresentation;
+import fr.cnes.sitools.dataset.DataSetApplication;
+import fr.cnes.sitools.plugins.resources.model.ResourceModel;
+import java.util.Map;
+import java.util.logging.Level;
+import org.restlet.Context;
+import org.restlet.Request;
+
+/**
+ *
+ * @author marc
+ */
+public class TableAccessProtocolLibrary {
+
+    public enum langSupported {
+
+        ADQL
+    };
+
+    public enum formatResultsSupported {
+
+        VOTABLE
+    };
+
+    // Pour la requete
+    public static final String FORMAT = "FORMAT";
+    public static final String QUERY = "QUERY";
+    public static final String LANG = "LANG";
+    public static final String PHASE = "PHASE";
+    public static final String REQUEST = "REQUEST";
+    // String pour décomposer la requete ADQL
+    public static final String SELECT = "SELECT";
+    public static final String FROM = "FROM";
+    public static final String WHERE = "WHERE";
+    public static final String SELECT_ALL = "*";
+    public static final String BLANCK = " ";
+
+    private transient DataSetApplication datasetApp;
+    private transient ResourceModel resourceModel;
+    private transient Request request;
+    private transient Context context;
+
+    /**
+     *
+     */
+    public static final String DICTIONARY = "PARAM_Dictionary";
+    //Pour les Metadata
+    /**
+     *
+     */
+    public static final String DESCRIPTION = "Description";
+    /**
+     *
+     */
+    public static final String INSTRUMENT = "Instrument";
+    /**
+     *
+     */
+    public static final String SERVICE_NAME = "Service Name";
+    /**
+     *
+     */
+    public static final String MAX_RECORDS = "Max records";
+
+    public TableAccessProtocolLibrary(final DataSetApplication datasetApp, final ResourceModel resourceModel, final Request request, final Context context) {
+        this.datasetApp = datasetApp;
+        this.resourceModel = resourceModel;
+        this.request = request;
+        this.context = context;
+    }
+
+    /**
+     * Fill data Model that will be used in the template.
+     *
+     * @return data model for the template
+     */
+    private Map fillDataModel() {
+        // init
+        Map dataModel = null;
+        Map<String, Object> map = this.request.getAttributes();
+        /*
+         String entityAsText = this.request.getEntityAsText(); 
+         String query1 = this.request.getResourceRef().getQuery();
+         String queryDecoded = this.request.getResourceRef().getQuery(true);
+         String queryNotDecoded = this.request.getResourceRef().getQuery(false);
+         */
+        String tapRequestType = this.request.getAttributes().get("tapRequestType").toString();
+        // Handling input parameters
+        final DataModelInterface inputParameters = new TableAccessProtocolInputParameters(datasetApp, request, this.context, this.resourceModel);
+        if (tapRequestType.equalsIgnoreCase("sync")) {
+            this.context.getLogger().log(Level.INFO, "JE SUIS DANS LE SYNC !!!");
+            // data model response
+            if (inputParameters.getDataModel().containsKey("infos")) {
+                dataModel = inputParameters.getDataModel();
+            } else {
+                final TableAccessProtocolDataModelInterface response = new TableAccessProtocolResponse((TableAccessProtocolInputParameters) inputParameters, resourceModel);
+                dataModel = response.getDataModel();
+            }
+        } else if (tapRequestType.equalsIgnoreCase("async")) {
+            this.context.getLogger().log(Level.INFO, "JE SUIS DANS LE ASYNC !!!");
+            TableAccessProtocolAsynchronousResponse asyncTask = new TableAccessProtocolAsynchronousResponse((TableAccessProtocolInputParameters) inputParameters);
+            asyncTask.run();
+            
+            
+        } else {
+            this.context.getLogger().log(Level.INFO, "JE SUIS DANS NI SYNC NI ASYNC !!!");
+        }
+
+        return dataModel;
+    }
+
+    /**
+     * VOTable response.
+     *
+     * @return VOTable response
+     */
+    public final VOTableRepresentation getResponse() {
+        final Map dataModel = fillDataModel();
+        return new VOTableRepresentation(dataModel, "votable.ftl");
+    }
+
+}
diff --git a/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolResponse.java b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolResponse.java
new file mode 100644
index 0000000..c4fb6b5
--- /dev/null
+++ b/hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolResponse.java
@@ -0,0 +1,487 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.ias.sitools.vo.tap;
+
+import adql.parser.ADQLParser;
+import adql.parser.ParseException;
+import adql.query.ADQLQuery;
+import adql.translator.ADQLTranslator;
+import adql.translator.PostgreSQLTranslator;
+import adql.translator.TranslationException;
+//import fr.cnes.sitools.astro.representation.DatabaseRequestModel;
+import fr.cnes.sitools.common.exception.SitoolsException;
+import fr.cnes.sitools.dataset.DataSetApplication;
+import fr.cnes.sitools.dataset.converter.business.ConverterChained;
+import fr.cnes.sitools.dataset.database.DatabaseRequest;
+import fr.cnes.sitools.dataset.database.DatabaseRequestFactory;
+import fr.cnes.sitools.dataset.database.DatabaseRequestParameters;
+import fr.cnes.sitools.dataset.database.common.DataSetExplorerUtil;
+import fr.cnes.sitools.dataset.dto.ColumnConceptMappingDTO;
+import fr.cnes.sitools.dataset.dto.DictionaryMappingDTO;
+import fr.cnes.sitools.dataset.model.Column;
+import fr.cnes.sitools.dataset.model.Predicat;
+import fr.cnes.sitools.dictionary.model.Concept;
+import fr.cnes.sitools.plugins.resources.model.ResourceModel;
+import fr.cnes.sitools.util.Util;
+import fr.ias.sitools.vo.representation.DatabaseRequestIasModel;
+import freemarker.template.TemplateSequenceModel;
+import java.math.BigInteger;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.ivoa.xml.votable.v1.AnyTEXT;
+import net.ivoa.xml.votable.v1.DataType;
+import net.ivoa.xml.votable.v1.Field;
+import net.ivoa.xml.votable.v1.Info;
+import net.ivoa.xml.votable.v1.Param;
+import org.restlet.Context;
+
+/**
+ *
+ * @author marc
+ */
+class TableAccessProtocolResponse implements TableAccessProtocolDataModelInterface { 
+    
+    /**
+    * Data model.
+    */
+    private final transient Map dataModel = new HashMap();
+    
+    /**
+    * Context 
+    **/
+    private final transient Context ctx;
+    
+    /**
+    * The ADQL Query
+    */
+    private final String adqlQuery;
+    
+    /**
+     * The Psql Query from the ADQL query
+     */
+    private transient String psqlQuery;
+    /**
+     * The col to query
+     */
+    private ArrayList<String> colsToQuery = new ArrayList<String>();
+    
+    private String clauseWhereToQuery;
+    
+    private String clauseLimit;
+    private int clauseLimitInt;
+    private String format;
+    
+    boolean isPrimaryKey;
+    
+    public TableAccessProtocolResponse(final TableAccessProtocolInputParameters inputParameters, final ResourceModel model) {        
+        this.format = inputParameters.getFormat();
+        this.adqlQuery = inputParameters.getQuery();
+        this.ctx = inputParameters.getContext();
+
+        if(this.adqlQuery == null || this.adqlQuery .equalsIgnoreCase("")){
+            // TO DO
+        }else{
+            processQuery();
+            createResponse(inputParameters, model); 
+        }
+    }
+
+    private void createResponse(final TableAccessProtocolInputParameters inputParameters, final ResourceModel model){
+
+
+        // On récupère le nom du dico
+        final String dictionaryName = model.getParameterByName(TableAccessProtocolLibrary.DICTIONARY).getValue();
+
+        //On set les params
+        setVotableParametersFromConfiguration(this.dataModel, model);
+        //On requete la base et on remplit le template
+        setVotableResource(inputParameters.getDatasetApp(), inputParameters, model, dictionaryName);
+
+        // On set le query_status à OK
+        setQueryInfos(model);
+   
+    }
+    // FONCTIONS PRIVATE
+    /**
+    * Creates the response based on Table.
+    *
+    * @param datasetApp Dataset application
+    * @param inputParameters Input Parameters
+    * @param model data model
+    * @param dictionaryName TAP dictionary
+    */
+    private void setVotableResource(final DataSetApplication datasetApp, final TableAccessProtocolInputParameters inputParameters,
+          final ResourceModel model, final String dictionaryName) {
+        
+        final List<Field> fieldList = new ArrayList<Field>();
+        final List<String> columnStringList = new ArrayList<String>();
+        final List<Column> columnList = datasetApp.getDataSet().getColumnModel();
+        
+        DatabaseRequest databaseRequest = null;
+        try {
+            // On récupère les columns
+
+            // On récupere le mapping
+            List<ColumnConceptMappingDTO> mappingList = getDicoFromConfiguration(datasetApp, dictionaryName);
+            
+            final DatabaseRequestParameters dbParams = setQueryParameters(datasetApp, model, inputParameters, mappingList);
+
+            // On récupère les colonnes à requeter
+            List<Column> listCol = getColumnToQuery(columnList);
+            listCol = checkPrimaryKeyAndAddItColTQuery(columnList, listCol);
+            // On envoie les colonnes à requeter
+            dbParams.setSqlVisibleColumns(listCol);
+            
+            // S'il y a un parametre Limit on le rajoute au parametre de requete
+            if(this.clauseLimitInt > 0)
+            {
+                dbParams.setMaxrows(this.clauseLimitInt);
+            }   
+            databaseRequest = DatabaseRequestFactory.getDatabaseRequest(dbParams);
+            databaseRequest.checkRequest();
+            // Execute query
+            databaseRequest.createRequest();
+
+            getCtx().getLogger().log(Level.FINEST, "-------- DB REQUEST : {0}", databaseRequest.getRequestAsString());
+
+            setFields(fieldList, columnStringList, mappingList, listCol);
+            
+            final int count = (databaseRequest.getCount() > dbParams.getPaginationExtend()) ? dbParams.getPaginationExtend() : databaseRequest.getCount();
+            dataModel.put("nrows", count);
+            dataModel.put("fields", fieldList);
+            dataModel.put("sqlColAlias", columnStringList);
+            
+            final ConverterChained converterChained = datasetApp.getConverterChained();
+            
+            //final TemplateSequenceModel rows = new DatabaseRequestModel(databaseRequest, converterChained);
+            final TemplateSequenceModel rows = new DatabaseRequestIasModel(databaseRequest, converterChained);
+
+            dataModel.put("rows", rows);
+        } catch (SitoolsException ex) {
+            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
+        }            
+    }
+    
+    /**
+   * Set Query parameters to the database.
+   *
+   * @param datasetApp Dataset Application
+   * @param model Data model
+   * @param inputParameters Input Parameters
+   * @return DatabaseRequestParamerters object
+   */
+  @SuppressWarnings("empty-statement")
+  private DatabaseRequestParameters setQueryParameters(final DataSetApplication datasetApp, final ResourceModel model,
+          final TableAccessProtocolInputParameters inputParameters, List<ColumnConceptMappingDTO> mappingList) {
+
+    // Get the dataset
+    final DataSetExplorerUtil dsExplorerUtil = new DataSetExplorerUtil(datasetApp, inputParameters.getRequest(),
+            inputParameters.getContext());
+
+    // Get query parameters
+    final DatabaseRequestParameters dbParams = dsExplorerUtil.getDatabaseParams();
+    // Get dataset records
+    final int nbRecordsInDataSet = datasetApp.getDataSet().getNbRecords();
+
+    // Get max records that is defined by admin
+    int nbMaxRecords = Integer.valueOf(model.getParameterByName(TableAccessProtocolLibrary.MAX_RECORDS).getValue());
+    nbMaxRecords = (nbMaxRecords > nbRecordsInDataSet || nbMaxRecords == -1) ? nbRecordsInDataSet : nbMaxRecords;
+    // if a limit clause is defined, used it.
+    if(this.clauseLimit != null){        
+        nbMaxRecords = Integer.parseInt(this.clauseLimit);
+    }
+    // Set max records
+    dbParams.setPaginationExtend(nbMaxRecords);
+    
+    
+    
+    final List<Predicat> predicatList = dbParams.getPredicats();
+    //String customQuery = "AND ra > 25 and dec < 180 and flux > 0.256";
+    Predicat predicat = new Predicat();
+    
+    predicat.setStringDefinition(this.clauseWhereToQuery);
+    predicatList.add(predicat);
+    dbParams.setPredicats(predicatList);
+    
+    return dbParams;
+  }
+
+    
+    private void setQueryInfos(final ResourceModel model){
+        final List<Info> queryInfos = new ArrayList<Info>();
+        
+        Info info = new Info();
+        info.setName("QUERY_STATUS");
+        info.setValueAttribute("OK");
+        queryInfos.add(info);
+        info = new Info();
+        info.setName("ADQL query");
+        String query = this.adqlQuery.replaceAll("\"", "").replaceAll(">","&gt;").replaceAll("<","&lt;");
+        info.setValueAttribute(query);
+        
+        queryInfos.add(info);
+
+        this.dataModel.put("queryInfos", queryInfos);
+    }
+    /**
+   * Sets VOTable parameters coming from administration configuration.
+   *
+   * @param dataModel data model to set
+   * @param model parameters from administration
+   */
+  private void setVotableParametersFromConfiguration(final Map dataModel, final ResourceModel model) {
+    final List<Param> params = new ArrayList<Param>();
+    setVotableParam(params, model, TableAccessProtocolLibrary.INSTRUMENT, DataType.CHAR);
+    setVotableParam(params, model, TableAccessProtocolLibrary.SERVICE_NAME, DataType.CHAR);
+    if (Util.isSet(params)) {
+      this.dataModel.put("params", params);
+    }
+  }
+
+  /**
+   * Sets Votable Param.
+   *
+   * @param params List of params
+   * @param model data model
+   * @param parameterName parameter name
+   * @param datatype datatype
+   */
+  private void setVotableParam(final List<Param> params, final ResourceModel model, final String parameterName,
+          final DataType datatype) {
+    final String parameterValue = model.getParameterByName(parameterName).getValue();
+    if (Util.isNotEmpty(parameterValue)) {
+        final Param param = new Param();
+        param.setName(parameterName);
+        param.setValue(parameterValue);
+        param.setDatatype(datatype);
+        params.add(param);
+    }
+  }
+    /**
+    * Provide the mapping between SQL column/concept for a given dictionary.
+    *
+    * @param datasetApp Application where this service is attached
+    * @param dicoToFind Dictionary name to find
+    * @return Returns a mapping SQL column/Concept
+    * @throws SitoolsException No mapping has been done or cannot find the dico
+    */
+    private List<ColumnConceptMappingDTO> getDicoFromConfiguration(final DataSetApplication datasetApp,
+          final String dicoToFind) throws SitoolsException {
+        List<ColumnConceptMappingDTO> colConceptMappingDTOList = null;
+        
+        // Get the list of dictionnaries related to the datasetApplication
+        final List<DictionaryMappingDTO> dicoMappingList = datasetApp.getDictionaryMappings();
+        if (!Util.isSet(dicoMappingList) || dicoMappingList.isEmpty()) {
+          throw new SitoolsException("No mapping with VO concepts has been done. please contact the administrator");
+        }
+
+        // For each dictionary, find the interesting one and return the mapping SQLcolumn/concept
+        for (DictionaryMappingDTO dicoMappingIter : dicoMappingList) {
+          final String dicoName = dicoMappingIter.getDictionaryName();
+          if (dicoToFind.equals(dicoName)) {
+            colConceptMappingDTOList = dicoMappingIter.getMapping();
+            break;
+          }
+        }
+        return colConceptMappingDTOList;
+    }
+    
+    
+    private List<Column> getColumnToQuery(List<Column> columnList){
+        List<Column> colsToQueryList = new ArrayList<Column>();
+        String all = this.adqlQuery.split(TableAccessProtocolLibrary.SELECT)[1].split(TableAccessProtocolLibrary.FROM)[0];      
+        if(this.colsToQuery.size() == 1 && all.contains("*")){
+            for(Column colCol : columnList){ 
+                colsToQueryList.add(colCol);
+            }
+            return colsToQueryList;
+        }
+        for(String col : this.colsToQuery){          
+            for(Column colCol : columnList){            
+                if(col.equalsIgnoreCase(colCol.getColumnAlias())){
+                    colsToQueryList.add(colCol);
+                }
+            }
+        }
+        
+        return colsToQueryList;
+    }
+    
+    /**
+   * Set Fields and columnSqlAliasList.
+   *
+   * @param fieldList List of fields to display on the VOTable
+   * @param colToQuery List of column to query and so to display in VOTable
+   * @param columnList List of SQL column
+   * @param mappingList List of SQL column/concept
+   */
+  private void setFields(final List<Field> fieldList, final List<String> columnList, final List<ColumnConceptMappingDTO> mappingList, final List<Column> colToQuery) {
+    
+    List<Column> colToQuery2 = colToQuery;
+    if(!isPrimaryKey){
+        colToQuery2.remove(colToQuery2.size()-1);
+    }
+    for(Column col : colToQuery2){
+        
+        for (ColumnConceptMappingDTO mappingIter : mappingList) {
+            if(col.getColumnAlias().equalsIgnoreCase(mappingIter.getColumnAlias())){
+                
+                String id = null;
+                String name = null;
+                String ucd = null;
+                String utype = null;
+                String ref = null;
+                String datatype = null;
+                String width = null;
+                String precision = null;
+                String unit = null;
+                String type = null;
+                String xtype = null;
+                String arraysize = null;
+                String descriptionValue = null;
+                columnList.add(mappingIter.getColumnAlias());
+                final Concept concept = mappingIter.getConcept();
+                if (concept.getName() != null) {
+                  name = concept.getName();
+                }
+                if (concept.getPropertyFromName("ID").getValue() != null) {
+                  id = concept.getPropertyFromName("ID").getValue();
+                }
+                if (concept.getPropertyFromName("ucd").getValue() != null) {
+                  ucd = concept.getPropertyFromName("ucd").getValue();
+                }
+                if (concept.getPropertyFromName("utype").getValue() != null) {
+                  utype = concept.getPropertyFromName("utype").getValue();
+                }
+                if (concept.getPropertyFromName("ref").getValue() != null) {
+                  ref = concept.getPropertyFromName("ref").getValue();
+                }
+                if (concept.getPropertyFromName("datatype").getValue() != null) {
+                  datatype = concept.getPropertyFromName("datatype").getValue();
+                }
+                if (concept.getPropertyFromName("width").getValue() != null) {
+                  width = concept.getPropertyFromName("width").getValue();
+                }
+                if (concept.getPropertyFromName("precision").getValue() != null) {
+                  precision = concept.getPropertyFromName("precision").getValue();
+                }
+                if (concept.getPropertyFromName("unit").getValue() != null) {
+                  unit = concept.getPropertyFromName("unit").getValue();
+                }
+                if (concept.getPropertyFromName("type").getValue() != null) {
+                  type = concept.getPropertyFromName("type").getValue();
+                }
+                if (concept.getPropertyFromName("xtype").getValue() != null) {
+                  xtype = concept.getPropertyFromName("xtype").getValue();
+                }
+                if (concept.getPropertyFromName("arraysize").getValue() != null) {
+                  arraysize = concept.getPropertyFromName("arraysize").getValue();
+                }
+                if (concept.getDescription() != null) {
+                  descriptionValue = concept.getDescription();
+                }
+                final Field field = new Field();
+                field.setID(id);
+                field.setName(name);
+                field.setUcd(ucd);
+                field.setUtype(utype);
+                field.setRef(ref);
+                field.setDatatype(DataType.fromValue(datatype));
+                if (width != null) {
+                  field.setWidth(BigInteger.valueOf(Long.valueOf(width)));
+                }
+                field.setPrecision(precision);
+                field.setUnit(unit);
+                field.setType(type);
+                field.setXtype(xtype);
+                field.setArraysize(arraysize);
+                final AnyTEXT anyText = new AnyTEXT();
+                anyText.getContent().add(descriptionValue);
+                field.setDESCRIPTION(anyText);
+                fieldList.add(field);
+            }
+        }
+    }
+  }
+  //List<Column> columnList = datasetApp.getDataSet().getColumnModel();
+  private List<Column> checkPrimaryKeyAndAddItColTQuery(List<Column> columnList, List<Column> colToQuery){
+      Column colPrimKey = null;
+      for(Column co : columnList){
+          if(co.isPrimaryKey()){
+              colPrimKey = co;
+          }
+      }
+      for(Column col : colToQuery){
+          if(col.isPrimaryKey()){
+              isPrimaryKey = true; 
+          }
+      }
+      if(!isPrimaryKey &&  "" != colPrimKey.getColumnAlias()){
+          colToQuery.add(colPrimKey);
+      }
+      
+      return colToQuery;
+  }
+    
+    private void processQuery(){
+        try {
+            // On crée un parser pour transformer notre string query en adql query
+            ADQLParser parser = new ADQLParser();
+            ADQLQuery adqlQueryValue = parser.parseQuery(this.adqlQuery);
+            // On traduit l'adql query en psql query
+            ADQLTranslator translator = new PostgreSQLTranslator();
+
+            this.psqlQuery = translator.translate(adqlQueryValue);
+
+
+            if(this.psqlQuery.contains("Limit ")){
+                this.clauseLimit = this.psqlQuery.split("Limit ")[1];
+                this.clauseLimitInt = Integer.parseInt(this.clauseLimit.replaceAll(" ", ""));
+                this.psqlQuery = this.psqlQuery.split("Limit ")[0];
+            }else{
+                this.clauseLimit = null;
+                this.clauseLimitInt = -1;
+            }
+
+            this.clauseWhereToQuery = "AND"+ this.psqlQuery.split(TableAccessProtocolLibrary.FROM)[1].split(TableAccessProtocolLibrary.WHERE)[1];  
+
+            String[] colsToQueryTmp = this.psqlQuery.split(TableAccessProtocolLibrary.FROM)[0].split(TableAccessProtocolLibrary.SELECT)[1].split(",");
+            for(String col : colsToQueryTmp){
+                if(col.equalsIgnoreCase(TableAccessProtocolLibrary.SELECT_ALL)){
+                    colsToQuery.add(col.replaceAll(TableAccessProtocolLibrary.BLANCK, ""));
+                    break;
+                }else{
+                    colsToQuery.add(col.split("AS")[0].replaceAll(TableAccessProtocolLibrary.BLANCK, ""));
+                }
+            }
+            if(format == null || format.equalsIgnoreCase("")){
+                // TO DO
+            }else{
+                ctx.getLogger().log(Level.INFO, "format = "+format);
+            }
+        } catch (TranslationException ex) {
+            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (ParseException ex) {
+            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
+        }
+  }
+    @Override
+    public final Map getDataModel() {
+        return Collections.unmodifiableMap(this.dataModel);
+    }
+    
+    // GETTER DE LA CLASSE
+    public Context getCtx() {
+        return ctx;
+    }
+}
diff --git a/webstatDev/idoc_Maison/db.sqlite3 b/webstatDev/idoc_Maison/db.sqlite3
new file mode 100644
index 0000000..178a120
Binary files /dev/null and b/webstatDev/idoc_Maison/db.sqlite3 differ
diff --git a/webstatDev/idoc_Maison/idoc/__init__.pyc b/webstatDev/idoc_Maison/idoc/__init__.pyc
index c9eb6c1..675652c 100644
Binary files a/webstatDev/idoc_Maison/idoc/__init__.pyc and b/webstatDev/idoc_Maison/idoc/__init__.pyc differ
diff --git a/webstatDev/idoc_Maison/idoc/settings.py b/webstatDev/idoc_Maison/idoc/settings.py
index 50121c9..9bd8870 100644
--- a/webstatDev/idoc_Maison/idoc/settings.py
+++ b/webstatDev/idoc_Maison/idoc/settings.py
@@ -59,24 +59,24 @@ WSGI_APPLICATION = 'idoc.wsgi.application'
 # Database
 # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
 
-#DATABASES = {
-#    'default': {
-#        'ENGINE': 'django.db.backends.sqlite3',
-#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
-#    }
-#}
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    }
+}
+'''
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.postgresql_psycopg2',
-        'NAME':  'webstat_DB',
+        'NAME':  'webstat_DB_TEST',
         'USER': 'postgres',
         'PASSWORD': '',
         'HOST': 'localhost',
         'PORT': 5432
     }
 }
-
-
+'''
 
 # Internationalization
 # https://docs.djangoproject.com/en/1.7/topics/i18n/
diff --git a/webstatDev/idoc_Maison/idoc/settings.pyc b/webstatDev/idoc_Maison/idoc/settings.pyc
index 934dab9..a93338a 100644
Binary files a/webstatDev/idoc_Maison/idoc/settings.pyc and b/webstatDev/idoc_Maison/idoc/settings.pyc differ
diff --git a/webstatDev/idoc_Maison/idoc/urls.pyc b/webstatDev/idoc_Maison/idoc/urls.pyc
index c61d6f3..c5e1d86 100644
Binary files a/webstatDev/idoc_Maison/idoc/urls.pyc and b/webstatDev/idoc_Maison/idoc/urls.pyc differ
diff --git a/webstatDev/idoc_Maison/idoc/wsgi.pyc b/webstatDev/idoc_Maison/idoc/wsgi.pyc
index 00649af..2f6bde1 100644
Binary files a/webstatDev/idoc_Maison/idoc/wsgi.pyc and b/webstatDev/idoc_Maison/idoc/wsgi.pyc differ
diff --git a/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724793157.svg b/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724793157.svg
new file mode 100644
index 0000000..1aa92ba
--- /dev/null
+++ b/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724793157.svg	
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" id="chart-2370f94c-da85-49db-92d5-7f3a46c574f6" class="pygal-chart" viewBox="0 0 800 600"><!--Generated with pygal 1.7.0 (lxml) ©Kozea 2011-2014 on 2015-06-10--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .title{font-family:"monospace";font-size:16px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .legends .legend text{font-family:"monospace";font-size:14px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis text{font-family:"monospace";font-size:10px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis text.major{font-family:"monospace";font-size:10px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .series text{font-family:"monospace";font-size:8px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip text{font-family:"monospace";font-size:16px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 text.no_data{font-size:64px}
+#chart-2370f94c-da85-49db-92d5-7f3a46c574f6{background-color:black}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 path,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 rect,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 circle{-webkit-transition:250ms;-moz-transition:250ms;transition:250ms}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .graph &gt; .background{fill:black}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .plot &gt; .background{fill:#111}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .graph{fill:#999}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 text.no_data{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .title{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .legends .legend text{fill:#999}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .legends .legend:hover text{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .line{stroke:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .guide.line{stroke:#555}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .major.line{stroke:#999}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis text.major{stroke:#eee;fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y .guides:hover .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .line-graph .axis.x .guides:hover .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .xy-graph .axis.x .guides:hover .guide.line{stroke:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .guides:hover text{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .reactive{fill-opacity:.8}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .reactive.active,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .active .reactive{fill-opacity:.4}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .series{stroke-width:1.0;stroke-linejoin:round;stroke-linecap:round;stroke-dasharray:0,0}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .series text{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip rect{fill:#111;stroke:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip text{fill:#eee}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .map-element{fill:#999;stroke:#555 !important;opacity:.9;stroke-width:3;-webkit-transition:250ms;-moz-transition:250ms;-o-transition:250ms;transition:250ms}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .map-element:hover{opacity:1;stroke-width:10}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-0,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-0 a:visited{stroke:#ff5995;fill:#ff5995}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-1,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-1 a:visited{stroke:#b6e354;fill:#b6e354}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-2,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-2 a:visited{stroke:#feed6c;fill:#feed6c}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-3,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-3 a:visited{stroke:#8cedff;fill:#8cedff}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-4,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-4 a:visited{stroke:#9e6ffe;fill:#9e6ffe}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-5,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-5 a:visited{stroke:#899ca1;fill:#899ca1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-6,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-6 a:visited{stroke:#f8f8f2;fill:#f8f8f2}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-7,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-7 a:visited{stroke:#bf4646;fill:#bf4646}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-8,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-8 a:visited{stroke:#516083;fill:#516083}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-9,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-9 a:visited{stroke:#f92672;fill:#f92672}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-10,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-10 a:visited{stroke:#82b414;fill:#82b414}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-11,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-11 a:visited{stroke:#fd971f;fill:#fd971f}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-12,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-12 a:visited{stroke:#56c2d6;fill:#56c2d6}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-13,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-13 a:visited{stroke:#808384;fill:#808384}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-14,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-14 a:visited{stroke:#8c54fe;fill:#8c54fe}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-15,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .color-15 a:visited{stroke:#465457;fill:#465457}
+#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 text.no_data{text-anchor:middle}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .guide.line{fill-opacity:0}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .centered{text-anchor:middle}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .title{text-anchor:middle}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .legends .legend text{fill-opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.x text{text-anchor:middle}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y text{text-anchor:end}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y2 text{text-anchor:start}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y .logarithmic text:not(.major),#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y2 .logarithmic text:not(.major){font-size:50%}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .guide.line{stroke-dasharray:4,4}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .major.guide.line{stroke-dasharray:6,6}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis text.major{stroke-width:0.5px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .horizontal .axis.y .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .horizontal .axis.y2 .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .vertical .axis.x .guide.line{opacity:0}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .horizontal .axis.always_show .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y .guides:hover .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.y2 .guides:hover .guide.line,#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis.x .guides:hover .guide.line{opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .axis .guides:hover text{opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .nofill{fill:none}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .subtle-fill{fill-opacity:.2}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .dot{stroke-width:1px;fill-opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .dot.active{stroke-width:5px}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .series text{stroke:none}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .series text.active{opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip rect{fill-opacity:0.8}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip text{fill-opacity:1}#chart-2370f94c-da85-49db-92d5-7f3a46c574f6 .tooltip text tspan.label{fill-opacity:.8}</style><script type="text/javascript">window.config = {"inner_radius": 0, "print_values": false, "tooltip_font_size": 16, "xrange": null, "legend_at_bottom_columns": null, "height": 600, "legend_at_bottom": false, "show_legend": true, "show_dots": true, "explicit_size": false, "legend_font_size": 14, "y_labels_major": null, "show_minor_x_labels": true, "major_label_font_size": 10, "fill": false, "half_pie": false, "x_value_formatter": null, "style": {"opacity": ".8", "foreground": "#999", "plot_background": "#111", "stroke_style": "round", "foreground_light": "#eee", "transition": "250ms", "foreground_dark": "#555", "stroke_dasharray": "0,0", "opacity_hover": ".4", "stroke_width": 1.0, "colors": ["#ff5995", "#b6e354", "#feed6c", "#8cedff", "#9e6ffe", "#899ca1", "#f8f8f2", "#bf4646", "#516083", "#f92672", "#82b414", "#fd971f", "#56c2d6", "#808384", "#8c54fe", "#465457"], "background": "black", "font_family": "monospace"}, "x_label_rotation": 0, "missing_value_fill_truncation": "x", "zero": 0, "margin_right": null, "interpolation_parameters": {}, "x_labels_major": null, "rounded_bars": null, "label_font_size": 10, "show_y_labels": true, "dots_size": 2.5, "show_y_guides": true, "show_minor_y_labels": true, "x_labels": null, "y_title": null, "value_font_size": 8, "order_min": null, "disable_xml_declaration": false, "strict": false, "css": ["style.css", "graph.css"], "mode": null, "show_only_major_dots": false, "y_label_rotation": 0, "human_readable": false, "show_x_guides": false, "spacing": 10, "x_labels_major_count": null, "pretty_print": false, "tooltip_border_radius": 0, "interpolate": null, "js": ["http://kozea.github.io/pygal.js/javascripts/svg.jquery.js", "http://kozea.github.io/pygal.js/javascripts/pygal-tooltips.js"], "y_labels": null, "y_labels_major_every": null, "x_label_format": "%Y-%m-%d %H:%M:%S.%f", "interpolation_precision": 250, "x_title": null, "value_formatter": null, "no_data_font_size": 64, "logarithmic": false, "width": 800, "print_zeroes": false, "no_data_text": "No data", "truncate_legend": null, "x_labels_major_every": null, "title": "Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-01", "legend_box_size": 12, "no_prefix": false, "stroke": true, "title_font_size": 16, "include_x_axis": false, "range": null, "truncate_label": null, "margin_top": null, "margin_left": null, "y_labels_major_count": null, "margin_bottom": null, "margin": 20, "stack_from_top": false, "show_x_labels": true}</script><script type="text/javascript" xlink:href="http://kozea.github.io/pygal.js/javascripts/svg.jquery.js"/><script type="text/javascript" xlink:href="http://kozea.github.io/pygal.js/javascripts/pygal-tooltips.js"/></defs><title>Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-01</title><g class="graph pie-graph vertical"><rect class="background" height="600" width="800" x="0" y="0"/><g class="plot" transform="translate(20, 46)"><rect class="background" height="534" width="760" x="0" y="0"/></g><g class="titles"><text class="title plot_title" x="400.0" y="26">Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-01</text></g><g class="plot overlay" transform="translate(20, 46)"/><g class="plot text-overlay" transform="translate(20, 46)"><text class="no_data" x="380.0" y="267.0">No data</text></g><g class="plot tooltip-overlay" transform="translate(20, 46)"><g class="tooltip" style="opacity: 0" transform="translate(0 0)"><a><rect class="tooltip-box" height="0" rx="0" ry="0" width="0"/><text class="text"><tspan class="label"/><tspan class="value"/></text></a></g></g><g class="legends" transform="translate(10, 56)"/><g class="legends" transform="translate(790, 56)"/></g></svg>
\ No newline at end of file
diff --git a/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724918292.png b/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724918292.png
new file mode 100644
index 0000000..36e996d
Binary files /dev/null and b/webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724918292.png differ
diff --git a/webstatDev/idoc_Maison/webstat/__init__.pyc b/webstatDev/idoc_Maison/webstat/__init__.pyc
index 41c0f0b..cad5204 100644
Binary files a/webstatDev/idoc_Maison/webstat/__init__.pyc and b/webstatDev/idoc_Maison/webstat/__init__.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/admin.pyc b/webstatDev/idoc_Maison/webstat/admin.pyc
index 04f06aa..26138bd 100644
Binary files a/webstatDev/idoc_Maison/webstat/admin.pyc and b/webstatDev/idoc_Maison/webstat/admin.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/forms.pyc b/webstatDev/idoc_Maison/webstat/forms.pyc
index 4343492..0f02ae6 100644
Binary files a/webstatDev/idoc_Maison/webstat/forms.pyc and b/webstatDev/idoc_Maison/webstat/forms.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/libChart4StatSitools2.pyc b/webstatDev/idoc_Maison/webstat/libChart4StatSitools2.pyc
index 8ef871c..04e09fc 100644
Binary files a/webstatDev/idoc_Maison/webstat/libChart4StatSitools2.pyc and b/webstatDev/idoc_Maison/webstat/libChart4StatSitools2.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/libStatSitools.pyc b/webstatDev/idoc_Maison/webstat/libStatSitools.pyc
index 482b928..eb70d8d 100644
Binary files a/webstatDev/idoc_Maison/webstat/libStatSitools.pyc and b/webstatDev/idoc_Maison/webstat/libStatSitools.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/libStatSitoolsConstante.pyc b/webstatDev/idoc_Maison/webstat/libStatSitoolsConstante.pyc
index d3df0b2..19c3dcf 100644
Binary files a/webstatDev/idoc_Maison/webstat/libStatSitoolsConstante.pyc and b/webstatDev/idoc_Maison/webstat/libStatSitoolsConstante.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/models.pyc b/webstatDev/idoc_Maison/webstat/models.pyc
index 28d1800..fdd46e0 100644
Binary files a/webstatDev/idoc_Maison/webstat/models.pyc and b/webstatDev/idoc_Maison/webstat/models.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/templatetags/__init__.pyc b/webstatDev/idoc_Maison/webstat/templatetags/__init__.pyc
index e37c54e..7314f65 100644
Binary files a/webstatDev/idoc_Maison/webstat/templatetags/__init__.pyc and b/webstatDev/idoc_Maison/webstat/templatetags/__init__.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/templatetags/per_cent_filters.pyc b/webstatDev/idoc_Maison/webstat/templatetags/per_cent_filters.pyc
index 2f7f2b6..0e9186b 100644
Binary files a/webstatDev/idoc_Maison/webstat/templatetags/per_cent_filters.pyc and b/webstatDev/idoc_Maison/webstat/templatetags/per_cent_filters.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/urls.pyc b/webstatDev/idoc_Maison/webstat/urls.pyc
index fa98c95..a46a87f 100644
Binary files a/webstatDev/idoc_Maison/webstat/urls.pyc and b/webstatDev/idoc_Maison/webstat/urls.pyc differ
diff --git a/webstatDev/idoc_Maison/webstat/views.pyc b/webstatDev/idoc_Maison/webstat/views.pyc
index c2b685c..2273f79 100644
Binary files a/webstatDev/idoc_Maison/webstat/views.pyc and b/webstatDev/idoc_Maison/webstat/views.pyc differ
