Project

General

Profile

Revision 94284c9a

Added by Marc Nicolas almost 9 years ago

ajout du dev sur le protocol TAP

View differences:

hesiod/javaExt/src/fr/ias/sitools/vo/representation/DatabaseRequestIasModel.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6

  
7
package fr.ias.sitools.vo.representation;
8

  
9
import fr.cnes.sitools.astro.representation.DatabaseRequestModel;
10
import fr.cnes.sitools.common.exception.SitoolsException;
11
import fr.cnes.sitools.dataset.converter.business.ConverterChained;
12
import fr.cnes.sitools.dataset.database.DatabaseRequest;
13
import java.util.logging.Level;
14
import java.util.logging.Logger;
15

  
16
/**
17
 *
18
 * @author marc
19
 */
20
public class DatabaseRequestIasModel extends  DatabaseRequestModel {
21
    
22
    /**
23
   * Logger.
24
   */
25
    private static final Logger LOG = Logger.getLogger(DatabaseRequestIasModel.class.getName());
26
   /**
27
     * DB Result set.
28
     */
29
    private DatabaseRequest request;
30
    /**
31
     * SITools2 converters.
32
     */
33
    private ConverterChained converterChained;
34
    /**
35
     * Number of rows.
36
     */
37
    private transient int sizeValue;
38

  
39
    /**
40
     * Empty constructor.
41
     */
42
    protected DatabaseRequestIasModel() {
43
        setSize(0);
44
    }
45

  
46
    public DatabaseRequestIasModel(DatabaseRequest rsVal, ConverterChained converterChainedVal) {
47
        super(rsVal, converterChainedVal);
48
        int countRowRequest = rsVal.getCount();
49
        setSize(countRowRequest);
50

  
51
        // we need to close the connection here
52
        // otherwise the connection will not be free.
53
        if (this.size() == 0) {
54
            try {
55
                this.request.close();
56
            } catch (SitoolsException ex) {
57
                LOG.log(Level.SEVERE, null, ex);
58
            }
59
        }
60
    }
61
    
62
    
63
    
64
}
hesiod/javaExt/src/fr/ias/sitools/vo/representation/VOTableRepresentation.java
1
 /*******************************************************************************
2
 * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
3
 *
4
 * This file is part of SITools2.
5
 *
6
 * SITools2 is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * SITools2 is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
18
 ******************************************************************************/
19
package fr.ias.sitools.vo.representation;
20

  
21
import java.io.IOException;
22
import java.io.OutputStream;
23
import java.util.Map;
24
import java.util.logging.Level;
25
import java.util.logging.Logger;
26
import org.restlet.data.LocalReference;
27
import org.restlet.data.MediaType;
28
import org.restlet.ext.freemarker.TemplateRepresentation;
29
import org.restlet.representation.OutputRepresentation;
30
import org.restlet.representation.Representation;
31
import org.restlet.resource.ClientResource;
32

  
33
/**
34
 * Creates a VOTable representation with a template and a data model. The data model is the following :
35
 * <pre>
36
 * root
37
 *    |__ description
38
 *    |__ infos
39
 *    |      |__ id
40
 *    |      |__ name (required)
41
 *    |      |__ valueAttribute (required)
42
 *    |      |__ xtype
43
 *    |      |__ ref
44
 *    |      |__ unit
45
 *    |      |__ ucd
46
 *    |      |__ utype
47
 *    |      |__ value
48
 *    |__ params (List)
49
 *    |      |__ param
50
 *    |           |__ id
51
 *    |           |__ unit
52
 *    |           |__ datatype (required)
53
 *    |           |__ precision
54
 *    |           |__ width
55
 *    |           |__ xtype
56
 *    |           |__ ref
57
 *    |           |__ name (required)
58
 *    |           |__ ucd
59
 *    |           |__ utype
60
 *    |           |__ arraysize
61
 *    |           |__ value (required)
62
 *    |           |__ DESCRIPTION
63
 *    |           |__ VALUES
64
 *    |                 |__ id
65
 *    |                 |__ type
66
 *    |                 |__ null
67
 *    |                 |__ ref
68
 *    |                 |__ OPTION (List)
69
 *    |                        |__ option
70
 *    |                               |__ name
71
 *    |                               |__ value (required)
72
 *    |__ fields (List)
73
 *    |      |__ field
74
 *    |           |__ DESCRIPTION
75
 *    |           |__ id
76
 *    |           |__ name (required)
77
 *    |           |__ ucd
78
 *    |           |__ utype
79
 *    |           |__ ref
80
 *    |           |__ datatype (required)
81
 *    |           |__ width
82
 *    |           |__ precision
83
 *    |           |__ unit
84
 *    |           |__ type
85
 *    |           |__ xtype
86
 *    |           |__ arraysize
87
 *    |__ rows (List) (required)
88
 *    |     |__ row (required)
89
 *    |
90
 *    |__ sqlColAlias (List) (required)
91
 *    |      |__ sqlcol (required)
92
 *    |__ mappingColAliasConceptSql (Hash) (optional)
93
 *    |__ siaCut (boolean, optional)
94
 *    |__ nrows (optional)
95
 *    |__ mapPartFileCutUrl (Hash) (optional)
96
 *    |__ primaryKey (optional)
97
 *    |__ queryParams (POS,SIZE,...)
98
 *    |__ queryInfos (Query status)
99
 *
100
 * </pre> Provide a VOTable representation by streaming based on Freemarker To have a dataModel by streaming, dataModel for rows element
101
 * must use the DatabaseRequestModel adapter
102
 *
103
 * @author Jean-Christophe Malapert <jean-christophe.malapert@cnes.fr>
104
 */
105
public class VOTableRepresentation extends OutputRepresentation {
106

  
107
  /**
108
   * Logger.
109
   */
110
  private static final Logger LOG = Logger.getLogger(VOTableRepresentation.class.getName());
111
  /**
112
   * Default template file = votable.ftl.
113
   */
114
  public static final String DEFAULT_TEMPLATE = "votable.ftl";
115
  /**
116
   * Data model that contains the information to represent.
117
   */
118
  private Map dataModel;
119
  /**
120
   * Template file.
121
   */
122
  private String ftl;
123

  
124
  /**
125
   * Creates a VOTableRepresentation based on a dataModel and a templateFile.
126
   *
127
   * @param dataModelVal DataModel
128
   * @param ftlVal template File
129
   */
130
  public VOTableRepresentation(final Map dataModelVal, final String ftlVal) {
131
    super(MediaType.TEXT_XML);
132
    setDataModel(dataModelVal);
133
    setFtl(ftlVal);
134
  }
135
  /**
136
   * Creates a GeoJson representation with the default template (<code>DEFAULT_TEMPLATE</code>).
137
   *
138
   * @param dataModelVal the data model
139
   */
140
  public VOTableRepresentation(final Map dataModelVal) {
141
    this(dataModelVal, DEFAULT_TEMPLATE);
142
  }
143
  /**
144
   * Writes the representation.
145
   *
146
   * @param outputStream output stream
147
   * @throws IOException Exception
148
   */
149
  @Override
150
  public final void write(final OutputStream outputStream) throws IOException {
151
    final Representation metadataFtl = new ClientResource(LocalReference.createClapReference(getClass().getPackage()) + "/"
152
            + getFtl()).get();       
153
    final TemplateRepresentation tpl = new TemplateRepresentation(metadataFtl, getDataModel(), getMediaType());    
154
    LOG.log(Level.FINEST, getFtl(), tpl);
155
    outputStream.write(tpl.getText().getBytes());
156
    outputStream.flush();
157
  }
158

  
159

  
160
    /**
161
     * Returns the data model.
162
     * @return the dataModel
163
     */
164
    protected final Map getDataModel() {
165
        return dataModel;
166
    }
167

  
168
    /**
169
     * Sets the data model.
170
     * @param dataModelVal the dataModel to set
171
     */
172
    protected final void setDataModel(final Map dataModelVal) {
173
        this.dataModel = dataModelVal;
174
    }
175

  
176
    /**
177
     * Returns the template filename.
178
     * @return the ftl
179
     */
180
    protected final String getFtl() {
181
        return ftl;
182
    }
183

  
184
    /**
185
     * Sets the template filename.
186
     * @param ftlVal the ftl to set
187
     */
188
    protected final void setFtl(final String ftlVal) {
189
        this.ftl = ftlVal;
190
    }
191
}
hesiod/javaExt/src/fr/ias/sitools/vo/representation/votable.ftl
1
<?xml version="1.0" ?>
2
<VOTABLE version="1.2" xmlns="http://www.ivoa.net/xml/VOTable/v1.2">
3
    <RESOURCE type="results">
4
    <#if description?exists><DESCRIPTION>${description}</DESCRIPTION></#if>
5
    <#if queryInfos?exists>
6
        <#list queryInfos as queryInfo>
7
            <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> />
8
        </#list>
9
    </#if>
10
    <#if queryParams?exists>
11
        <#list queryParams as queryParam>
12
            <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}"/>
13
        </#list>
14
    </#if>
15
    <#if infos?exists>
16
        <#list infos as info>
17
            <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> />
18
        </#list>
19
    </#if>
20
    <#if params?exists>
21
        <#list params as param>
22
            <#if param.DESCRIPTION?exists>
23
                <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}">
24
                    <DESCRIPTION>
25
                    <#list param.DESCRIPTION.content as description>
26
                        ${description}
27
                    </#list>
28
                    </DESCRIPTION>
29
                <#if param.VALUES?exists>
30
                    <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>>
31
                    <#if param.VALUES.OPTION?exists>
32
                    <#list param.VALUES.OPTION as option>
33
                        <OPTION<#if option.name?exists> name="${option.name}"</#if> value="${option.value}"/>
34
                    </#list>
35
                    </#if>
36
                    </VALUES>
37
                </#if>
38
                </PARAM>
39
            <#else>
40
                <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}"/>
41
            </#if>
42
        </#list>
43
    </#if>
44
    <#if fields?exists>
45
        <#list fields as field> 
46
            <#if field.DESCRIPTION?exists>
47
                <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>>
48
                    <DESCRIPTION>
49
                    <#list field.DESCRIPTION.content as description>
50
                        ${description}
51
                    </#list>
52
                    </DESCRIPTION>
53
                </FIELD>
54
            <#else>
55
                <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> />
56
            </#if>
57
        </#list>
58
    </#if>
59
    <#if rows?exists>
60
    <#if nrows != 0>
61
    <TABLE<#if nrows?exists> nrows="${nrows}"</#if>>
62
    <DATA>
63
        <TABLEDATA>
64
        <#list rows as row>
65
        <TR>
66
            <#list sqlColAlias as sqlcol>
67
            <#if row["${sqlcol}"] == "null"><TD> <#if sqlcol?exists> header : ${sqlcol}</#if></TD><#else><TD>${row["${sqlcol}"]}</TD></#if>
68
            </#list>
69
        </TR>
70
        </#list>
71
        </TABLEDATA>
72
    </DATA>
73
    </TABLE>
74
    </#if>
75
    </#if>
76
    
77
    </RESOURCE>
78
</VOTABLE>
hesiod/javaExt/src/fr/ias/sitools/vo/tap/DataModelInterface.java
1
 /*******************************************************************************
2
 * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
3
 *
4
 * This file is part of SITools2.
5
 *
6
 * SITools2 is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * SITools2 is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
18
 ******************************************************************************/
19
package fr.ias.sitools.vo.tap;
20

  
21
import java.util.Map;
22

  
23
/**
24
 * Provides an interface to get the data model.
25
 *
26
 * @author Jean-Christophe Malapert
27
 */
28
public interface DataModelInterface {
29

  
30
  /**
31
   * Returns the data model.
32
   *
33
   * @return data model
34
   */
35
  Map getDataModel();
36
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolAsynchronousResponse.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6

  
7
package fr.ias.sitools.vo.tap;
8

  
9
import fr.cnes.sitools.extensions.astro.application.uws.common.Util;
10
import fr.cnes.sitools.extensions.astro.application.uws.jobmanager.AbstractJobTask;
11
import fr.cnes.sitools.xml.uws.v1.Job;
12
import java.util.ArrayList;
13
import java.util.Date;
14
import java.util.List;
15
import java.util.logging.Level;
16
import javax.xml.datatype.DatatypeConfigurationException;
17
import net.ivoa.xml.uws.v1.ErrorSummary;
18
import net.ivoa.xml.uws.v1.ErrorType;
19
import net.ivoa.xml.uws.v1.ExecutionPhase;
20
import org.restlet.engine.Engine;
21

  
22
/**
23
 *
24
 * @author marc
25
 */
26
public class TableAccessProtocolAsynchronousResponse extends AbstractJobTask {
27

  
28
    final TableAccessProtocolInputParameters inputParams;
29
    
30
    public TableAccessProtocolAsynchronousResponse(final TableAccessProtocolInputParameters inputParameters) {
31
        this.inputParams = inputParameters;
32
    }
33
    
34
    @Override
35
    public void run() {
36
        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, "***************** JE SUIS DANS LE RUN !!!");
37
        try {
38
            setBlinker(Thread.currentThread());
39
            setStartTime(Util.convertIntoXMLGregorian(new Date()));
40
            setPhase(ExecutionPhase.EXECUTING);
41
            final List<String> filenameList = createJob();
42
            //createResults(filenameList);
43
            setEndTime(Util.convertIntoXMLGregorian(new Date()));
44
            setPhase(ExecutionPhase.COMPLETED);
45
        } catch (DatatypeConfigurationException ex) {
46
            Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, null, ex);
47
            final ErrorSummary errorSumm = new ErrorSummary();
48
            errorSumm.setMessage(ex.getMessage());
49
            errorSumm.setType(ErrorType.FATAL);
50
            errorSumm.setHasDetail(true);
51
            setError(errorSumm);
52
            setPhase(ExecutionPhase.ERROR);
53
        } catch (Error error) {
54
            Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE, null, error);
55
            final ErrorSummary errorSumm = new ErrorSummary();
56
            errorSumm.setMessage(error.getMessage());
57
            errorSumm.setType(ErrorType.FATAL);
58
            errorSumm.setHasDetail(true);
59
            setError(errorSumm);
60
            setPhase(ExecutionPhase.ERROR);
61
        }
62
    }
63

  
64
    private List<String> createJob(){
65
        List<String> a = new ArrayList<String>();
66
        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++");
67
        
68
        final String query = this.inputParams.getQuery();
69
        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++ QUERY : "+query);
70
        //final String format = String.valueOf(getParameterValue(TableAccessProtocolLibrary.FORMAT));
71
        //final String lang = String.valueOf(getParameterValue(TableAccessProtocolLibrary.LANG));
72
        Engine.getLogger(TableAccessProtocolAsynchronousResponse.class.getName()).log(Level.SEVERE,"+++++++++++++++++++++++ getJobInfo "+getJobInfo().toString());
73
        return a;
74
    }
75
    
76
    @Override
77
    public Job getCapabilities() {
78
        throw new UnsupportedOperationException("Not supported yet.");
79
    }
80
    
81
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolDataModelInterface.java
1
 /*******************************************************************************
2
 * Copyright 2010-2013 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
3
 *
4
 * This file is part of SITools2.
5
 *
6
 * SITools2 is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * SITools2 is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
18
 ******************************************************************************/
19
package fr.ias.sitools.vo.tap;
20
import java.util.Map;
21

  
22
/*
23
 * To change this license header, choose License Headers in Project Properties.
24
 * To change this template file, choose Tools | Templates
25
 * and open the template in the editor.
26
 */
27

  
28
/**
29
 *
30
 * @author marc
31
 */
32
interface TableAccessProtocolDataModelInterface {
33
     Map getDataModel();
34
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolException.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6

  
7
package fr.ias.sitools.vo.tap;
8

  
9
import fr.cnes.sitools.common.exception.SitoolsException;
10

  
11
/**
12
 * @author marc
13
 */
14
public class TableAccessProtocolException extends SitoolsException {
15

  
16
    public TableAccessProtocolException(String message) {
17
        super(message);
18
    }
19
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolInputParameters.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6

  
7
package fr.ias.sitools.vo.tap;
8

  
9
import fr.cnes.sitools.dataset.DataSetApplication;
10
import fr.cnes.sitools.plugins.resources.model.ResourceModel;
11
import java.util.ArrayList;
12
import java.util.Collections;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.logging.Level;
17
import net.ivoa.xml.votable.v1.Info;
18
import org.restlet.Context;
19
import org.restlet.Request;
20

  
21
/**
22
 *
23
 * @author marc
24
 */
25
public class TableAccessProtocolInputParameters implements DataModelInterface {
26
     
27
    /**
28
    * Data model that stores the metadata response of the service.
29
    */
30
    private final transient Map dataModel = new HashMap();
31
    /**
32
    * Request.
33
    */
34
    private final transient Request request;
35
    /**
36
    * Context.
37
    */
38
    private final transient Context context;
39
    /**
40
    * Application where this resources is linked.
41
    */
42
    private final transient DataSetApplication datasetApp;
43
    /**
44
    * Configuration parameters of this resource.
45
    */
46
    private final transient ResourceModel resourceModel;
47

  
48
    private final String query;
49
    private final String format;
50
   
51
    
52
    /**
53
    * Constructs the objet that returns the metadata of the service.
54
    * @param datasetAppVal application
55
    * @param requestVal request
56
    * @param contextVal context
57
    * @param resourceModelVal configuration parameters
58
    */
59
    public TableAccessProtocolInputParameters(final DataSetApplication datasetAppVal, final Request requestVal, final Context contextVal, final ResourceModel resourceModelVal) {
60
        this.request = requestVal;
61
        this.context = contextVal;
62
        this.datasetApp = datasetAppVal;
63
        this.resourceModel = resourceModelVal;
64
        final String requestType = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.REQUEST);
65
        final String langRequest = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.LANG);
66
        final String phase = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.PHASE);
67
        this.query = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.QUERY);
68
        this.format = this.request.getResourceRef().getQueryAsForm().getFirstValue(TableAccessProtocolLibrary.FORMAT);
69
        //if(langRequestTableAccessProtocolLibrary.langSupported.)
70
        //fillMetadataFormat();
71
    }
72
    
73
   /**
74
   * Fills metadata response.
75
   */
76
  private void fillMetadataFormat() {
77
      
78
    this.dataModel.put("description", this.resourceModel.getParameterByName(TableAccessProtocolLibrary.DESCRIPTION).getValue());
79

  
80
    final Info info = new Info();
81
    info.setName("QUERY_STATUS");
82
    info.setValueAttribute("OK");
83
    final List<Info> listInfos = new ArrayList<Info>();
84
    listInfos.add(info);
85
    this.dataModel.put("infos", listInfos);
86
   
87
    /* ON EN N'A PAS BESOIN
88
    final List<Param> listParam = new ArrayList<Param>();
89
    Param param = new Param();
90
    param.setName("INPUT:POS");
91
    param.setValue("0,0");
92
    param.setDatatype(DataType.DOUBLE);
93
    AnyTEXT anyText = new AnyTEXT();
94
    anyText.getContent().add("Search Position in the form ra,dec where ra and dec are given in decimal degrees in the ICRS coordinate system.");
95
    param.setDESCRIPTION(anyText);
96
    listParam.add(param);
97

  
98
    param = new Param();
99
    param.setName("INPUT:SIZE");
100
    param.setValue("0.05");
101
    param.setDatatype(DataType.DOUBLE);
102
    anyText = new AnyTEXT();
103
    anyText.getContent().add("Size of search region in the RA and Dec directions.");
104
    param.setDESCRIPTION(anyText);
105
    listParam.add(param);
106

  
107
    param = new Param();
108
    param.setName("INPUT:FORMAT");
109
    param.setValue(TableAccessProtocolLibrary.ParamStandardFormat.ALL.name());
110
    param.setDatatype(DataType.CHAR);
111
    param.setArraysize("*");
112
    AnyTEXT anyText = new AnyTEXT();
113
    anyText.getContent().add("Requested format of result.");
114
    param.setDESCRIPTION(anyText);
115
    
116

  
117
    //TODO : le faire pour chaque format
118
    listParam.add(param);
119
 ON EN N'A PAS BESOIN    
120
    param = new Param();
121
    param.setName("INPUT:INTERSECT");
122
    param.setValue(this.resourceModel.getParameterByName(TableAccessProtocolLibrary.INTERSECT).getValue());
123
    param.setDatatype(DataType.CHAR);
124
    anyText = new AnyTEXT();
125
    anyText.getContent().add("Choice of overlap with requested region.");
126
    param.setDESCRIPTION(anyText);
127
    listParam.add(param);
128

  
129
    param = new Param();
130
    param.setName("INPUT:VERB");
131
    param.setValue(this.resourceModel.getParameterByName(TableAccessProtocolLibrary.VERB).getValue());
132
    param.setDatatype(DataType.INT);
133
    anyText = new AnyTEXT();
134
    anyText.getContent().add("Verbosity level, controlling the number of columns returned.");
135
    param.setDESCRIPTION(anyText);
136
    listParam.add(param);
137

  
138
    dataModel.put("params", listParam);
139

  
140
    String dictionaryName = resourceModel.getParameterByName(TableAccessProtocolLibrary.DICTIONARY).getValue();
141
    final List<String> columnList = new ArrayList<String>();
142
    List<Field> fieldList = new ArrayList<Field>();
143
    try {
144
        List<ColumnConceptMappingDTO> mappingList = getDicoFromConfiguration(datasetApp, dictionaryName);
145
        setFields(fieldList, columnList, mappingList);
146
    }catch (SitoolsException ex) {
147
             
148
    }
149
   */ 
150
  }
151
    
152
    @Override
153
    public final Map getDataModel() {
154
      return Collections.unmodifiableMap(this.dataModel);
155
    }
156

  
157
    /* GETTER DE LA CLASSE */
158
    public String getQuery() {
159
        return query;
160
    }
161
    public String getFormat() {
162
        return format;
163
    }
164
    public Context getContext() {
165
        return context;
166
    }
167

  
168
    public Request getRequest() {
169
        return request;
170
    }
171
    public DataSetApplication getDatasetApp() {
172
        return datasetApp;
173
    }
174

  
175
    public ResourceModel getResourceModel() {
176
        return resourceModel;
177
    }
178
 
179
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolLibrary.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package fr.ias.sitools.vo.tap;
7

  
8
import fr.ias.sitools.vo.representation.VOTableRepresentation;
9
import fr.cnes.sitools.dataset.DataSetApplication;
10
import fr.cnes.sitools.plugins.resources.model.ResourceModel;
11
import java.util.Map;
12
import java.util.logging.Level;
13
import org.restlet.Context;
14
import org.restlet.Request;
15

  
16
/**
17
 *
18
 * @author marc
19
 */
20
public class TableAccessProtocolLibrary {
21

  
22
    public enum langSupported {
23

  
24
        ADQL
25
    };
26

  
27
    public enum formatResultsSupported {
28

  
29
        VOTABLE
30
    };
31

  
32
    // Pour la requete
33
    public static final String FORMAT = "FORMAT";
34
    public static final String QUERY = "QUERY";
35
    public static final String LANG = "LANG";
36
    public static final String PHASE = "PHASE";
37
    public static final String REQUEST = "REQUEST";
38
    // String pour décomposer la requete ADQL
39
    public static final String SELECT = "SELECT";
40
    public static final String FROM = "FROM";
41
    public static final String WHERE = "WHERE";
42
    public static final String SELECT_ALL = "*";
43
    public static final String BLANCK = " ";
44

  
45
    private transient DataSetApplication datasetApp;
46
    private transient ResourceModel resourceModel;
47
    private transient Request request;
48
    private transient Context context;
49

  
50
    /**
51
     *
52
     */
53
    public static final String DICTIONARY = "PARAM_Dictionary";
54
    //Pour les Metadata
55
    /**
56
     *
57
     */
58
    public static final String DESCRIPTION = "Description";
59
    /**
60
     *
61
     */
62
    public static final String INSTRUMENT = "Instrument";
63
    /**
64
     *
65
     */
66
    public static final String SERVICE_NAME = "Service Name";
67
    /**
68
     *
69
     */
70
    public static final String MAX_RECORDS = "Max records";
71

  
72
    public TableAccessProtocolLibrary(final DataSetApplication datasetApp, final ResourceModel resourceModel, final Request request, final Context context) {
73
        this.datasetApp = datasetApp;
74
        this.resourceModel = resourceModel;
75
        this.request = request;
76
        this.context = context;
77
    }
78

  
79
    /**
80
     * Fill data Model that will be used in the template.
81
     *
82
     * @return data model for the template
83
     */
84
    private Map fillDataModel() {
85
        // init
86
        Map dataModel = null;
87
        Map<String, Object> map = this.request.getAttributes();
88
        /*
89
         String entityAsText = this.request.getEntityAsText(); 
90
         String query1 = this.request.getResourceRef().getQuery();
91
         String queryDecoded = this.request.getResourceRef().getQuery(true);
92
         String queryNotDecoded = this.request.getResourceRef().getQuery(false);
93
         */
94
        String tapRequestType = this.request.getAttributes().get("tapRequestType").toString();
95
        // Handling input parameters
96
        final DataModelInterface inputParameters = new TableAccessProtocolInputParameters(datasetApp, request, this.context, this.resourceModel);
97
        if (tapRequestType.equalsIgnoreCase("sync")) {
98
            this.context.getLogger().log(Level.INFO, "JE SUIS DANS LE SYNC !!!");
99
            // data model response
100
            if (inputParameters.getDataModel().containsKey("infos")) {
101
                dataModel = inputParameters.getDataModel();
102
            } else {
103
                final TableAccessProtocolDataModelInterface response = new TableAccessProtocolResponse((TableAccessProtocolInputParameters) inputParameters, resourceModel);
104
                dataModel = response.getDataModel();
105
            }
106
        } else if (tapRequestType.equalsIgnoreCase("async")) {
107
            this.context.getLogger().log(Level.INFO, "JE SUIS DANS LE ASYNC !!!");
108
            TableAccessProtocolAsynchronousResponse asyncTask = new TableAccessProtocolAsynchronousResponse((TableAccessProtocolInputParameters) inputParameters);
109
            asyncTask.run();
110
            
111
            
112
        } else {
113
            this.context.getLogger().log(Level.INFO, "JE SUIS DANS NI SYNC NI ASYNC !!!");
114
        }
115

  
116
        return dataModel;
117
    }
118

  
119
    /**
120
     * VOTable response.
121
     *
122
     * @return VOTable response
123
     */
124
    public final VOTableRepresentation getResponse() {
125
        final Map dataModel = fillDataModel();
126
        return new VOTableRepresentation(dataModel, "votable.ftl");
127
    }
128

  
129
}
hesiod/javaExt/src/fr/ias/sitools/vo/tap/TableAccessProtocolResponse.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6

  
7
package fr.ias.sitools.vo.tap;
8

  
9
import adql.parser.ADQLParser;
10
import adql.parser.ParseException;
11
import adql.query.ADQLQuery;
12
import adql.translator.ADQLTranslator;
13
import adql.translator.PostgreSQLTranslator;
14
import adql.translator.TranslationException;
15
//import fr.cnes.sitools.astro.representation.DatabaseRequestModel;
16
import fr.cnes.sitools.common.exception.SitoolsException;
17
import fr.cnes.sitools.dataset.DataSetApplication;
18
import fr.cnes.sitools.dataset.converter.business.ConverterChained;
19
import fr.cnes.sitools.dataset.database.DatabaseRequest;
20
import fr.cnes.sitools.dataset.database.DatabaseRequestFactory;
21
import fr.cnes.sitools.dataset.database.DatabaseRequestParameters;
22
import fr.cnes.sitools.dataset.database.common.DataSetExplorerUtil;
23
import fr.cnes.sitools.dataset.dto.ColumnConceptMappingDTO;
24
import fr.cnes.sitools.dataset.dto.DictionaryMappingDTO;
25
import fr.cnes.sitools.dataset.model.Column;
26
import fr.cnes.sitools.dataset.model.Predicat;
27
import fr.cnes.sitools.dictionary.model.Concept;
28
import fr.cnes.sitools.plugins.resources.model.ResourceModel;
29
import fr.cnes.sitools.util.Util;
30
import fr.ias.sitools.vo.representation.DatabaseRequestIasModel;
31
import freemarker.template.TemplateSequenceModel;
32
import java.math.BigInteger;
33

  
34
import java.util.ArrayList;
35
import java.util.Collections;
36
import java.util.HashMap;
37
import java.util.List;
38
import java.util.Map;
39
import java.util.logging.Level;
40
import java.util.logging.Logger;
41
import net.ivoa.xml.votable.v1.AnyTEXT;
42
import net.ivoa.xml.votable.v1.DataType;
43
import net.ivoa.xml.votable.v1.Field;
44
import net.ivoa.xml.votable.v1.Info;
45
import net.ivoa.xml.votable.v1.Param;
46
import org.restlet.Context;
47

  
48
/**
49
 *
50
 * @author marc
51
 */
52
class TableAccessProtocolResponse implements TableAccessProtocolDataModelInterface { 
53
    
54
    /**
55
    * Data model.
56
    */
57
    private final transient Map dataModel = new HashMap();
58
    
59
    /**
60
    * Context 
61
    **/
62
    private final transient Context ctx;
63
    
64
    /**
65
    * The ADQL Query
66
    */
67
    private final String adqlQuery;
68
    
69
    /**
70
     * The Psql Query from the ADQL query
71
     */
72
    private transient String psqlQuery;
73
    /**
74
     * The col to query
75
     */
76
    private ArrayList<String> colsToQuery = new ArrayList<String>();
77
    
78
    private String clauseWhereToQuery;
79
    
80
    private String clauseLimit;
81
    private int clauseLimitInt;
82
    private String format;
83
    
84
    boolean isPrimaryKey;
85
    
86
    public TableAccessProtocolResponse(final TableAccessProtocolInputParameters inputParameters, final ResourceModel model) {        
87
        this.format = inputParameters.getFormat();
88
        this.adqlQuery = inputParameters.getQuery();
89
        this.ctx = inputParameters.getContext();
90

  
91
        if(this.adqlQuery == null || this.adqlQuery .equalsIgnoreCase("")){
92
            // TO DO
93
        }else{
94
            processQuery();
95
            createResponse(inputParameters, model); 
96
        }
97
    }
98

  
99
    private void createResponse(final TableAccessProtocolInputParameters inputParameters, final ResourceModel model){
100

  
101

  
102
        // On récupère le nom du dico
103
        final String dictionaryName = model.getParameterByName(TableAccessProtocolLibrary.DICTIONARY).getValue();
104

  
105
        //On set les params
106
        setVotableParametersFromConfiguration(this.dataModel, model);
107
        //On requete la base et on remplit le template
108
        setVotableResource(inputParameters.getDatasetApp(), inputParameters, model, dictionaryName);
109

  
110
        // On set le query_status à OK
111
        setQueryInfos(model);
112
   
113
    }
114
    // FONCTIONS PRIVATE
115
    /**
116
    * Creates the response based on Table.
117
    *
118
    * @param datasetApp Dataset application
119
    * @param inputParameters Input Parameters
120
    * @param model data model
121
    * @param dictionaryName TAP dictionary
122
    */
123
    private void setVotableResource(final DataSetApplication datasetApp, final TableAccessProtocolInputParameters inputParameters,
124
          final ResourceModel model, final String dictionaryName) {
125
        
126
        final List<Field> fieldList = new ArrayList<Field>();
127
        final List<String> columnStringList = new ArrayList<String>();
128
        final List<Column> columnList = datasetApp.getDataSet().getColumnModel();
129
        
130
        DatabaseRequest databaseRequest = null;
131
        try {
132
            // On récupère les columns
133

  
134
            // On récupere le mapping
135
            List<ColumnConceptMappingDTO> mappingList = getDicoFromConfiguration(datasetApp, dictionaryName);
136
            
137
            final DatabaseRequestParameters dbParams = setQueryParameters(datasetApp, model, inputParameters, mappingList);
138

  
139
            // On récupère les colonnes à requeter
140
            List<Column> listCol = getColumnToQuery(columnList);
141
            listCol = checkPrimaryKeyAndAddItColTQuery(columnList, listCol);
142
            // On envoie les colonnes à requeter
143
            dbParams.setSqlVisibleColumns(listCol);
144
            
145
            // S'il y a un parametre Limit on le rajoute au parametre de requete
146
            if(this.clauseLimitInt > 0)
147
            {
148
                dbParams.setMaxrows(this.clauseLimitInt);
149
            }   
150
            databaseRequest = DatabaseRequestFactory.getDatabaseRequest(dbParams);
151
            databaseRequest.checkRequest();
152
            // Execute query
153
            databaseRequest.createRequest();
154

  
155
            getCtx().getLogger().log(Level.FINEST, "-------- DB REQUEST : {0}", databaseRequest.getRequestAsString());
156

  
157
            setFields(fieldList, columnStringList, mappingList, listCol);
158
            
159
            final int count = (databaseRequest.getCount() > dbParams.getPaginationExtend()) ? dbParams.getPaginationExtend() : databaseRequest.getCount();
160
            dataModel.put("nrows", count);
161
            dataModel.put("fields", fieldList);
162
            dataModel.put("sqlColAlias", columnStringList);
163
            
164
            final ConverterChained converterChained = datasetApp.getConverterChained();
165
            
166
            //final TemplateSequenceModel rows = new DatabaseRequestModel(databaseRequest, converterChained);
167
            final TemplateSequenceModel rows = new DatabaseRequestIasModel(databaseRequest, converterChained);
168

  
169
            dataModel.put("rows", rows);
170
        } catch (SitoolsException ex) {
171
            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
172
        }            
173
    }
174
    
175
    /**
176
   * Set Query parameters to the database.
177
   *
178
   * @param datasetApp Dataset Application
179
   * @param model Data model
180
   * @param inputParameters Input Parameters
181
   * @return DatabaseRequestParamerters object
182
   */
183
  @SuppressWarnings("empty-statement")
184
  private DatabaseRequestParameters setQueryParameters(final DataSetApplication datasetApp, final ResourceModel model,
185
          final TableAccessProtocolInputParameters inputParameters, List<ColumnConceptMappingDTO> mappingList) {
186

  
187
    // Get the dataset
188
    final DataSetExplorerUtil dsExplorerUtil = new DataSetExplorerUtil(datasetApp, inputParameters.getRequest(),
189
            inputParameters.getContext());
190

  
191
    // Get query parameters
192
    final DatabaseRequestParameters dbParams = dsExplorerUtil.getDatabaseParams();
193
    // Get dataset records
194
    final int nbRecordsInDataSet = datasetApp.getDataSet().getNbRecords();
195

  
196
    // Get max records that is defined by admin
197
    int nbMaxRecords = Integer.valueOf(model.getParameterByName(TableAccessProtocolLibrary.MAX_RECORDS).getValue());
198
    nbMaxRecords = (nbMaxRecords > nbRecordsInDataSet || nbMaxRecords == -1) ? nbRecordsInDataSet : nbMaxRecords;
199
    // if a limit clause is defined, used it.
200
    if(this.clauseLimit != null){        
201
        nbMaxRecords = Integer.parseInt(this.clauseLimit);
202
    }
203
    // Set max records
204
    dbParams.setPaginationExtend(nbMaxRecords);
205
    
206
    
207
    
208
    final List<Predicat> predicatList = dbParams.getPredicats();
209
    //String customQuery = "AND ra > 25 and dec < 180 and flux > 0.256";
210
    Predicat predicat = new Predicat();
211
    
212
    predicat.setStringDefinition(this.clauseWhereToQuery);
213
    predicatList.add(predicat);
214
    dbParams.setPredicats(predicatList);
215
    
216
    return dbParams;
217
  }
218

  
219
    
220
    private void setQueryInfos(final ResourceModel model){
221
        final List<Info> queryInfos = new ArrayList<Info>();
222
        
223
        Info info = new Info();
224
        info.setName("QUERY_STATUS");
225
        info.setValueAttribute("OK");
226
        queryInfos.add(info);
227
        info = new Info();
228
        info.setName("ADQL query");
229
        String query = this.adqlQuery.replaceAll("\"", "").replaceAll(">","&gt;").replaceAll("<","&lt;");
230
        info.setValueAttribute(query);
231
        
232
        queryInfos.add(info);
233

  
234
        this.dataModel.put("queryInfos", queryInfos);
235
    }
236
    /**
237
   * Sets VOTable parameters coming from administration configuration.
238
   *
239
   * @param dataModel data model to set
240
   * @param model parameters from administration
241
   */
242
  private void setVotableParametersFromConfiguration(final Map dataModel, final ResourceModel model) {
243
    final List<Param> params = new ArrayList<Param>();
244
    setVotableParam(params, model, TableAccessProtocolLibrary.INSTRUMENT, DataType.CHAR);
245
    setVotableParam(params, model, TableAccessProtocolLibrary.SERVICE_NAME, DataType.CHAR);
246
    if (Util.isSet(params)) {
247
      this.dataModel.put("params", params);
248
    }
249
  }
250

  
251
  /**
252
   * Sets Votable Param.
253
   *
254
   * @param params List of params
255
   * @param model data model
256
   * @param parameterName parameter name
257
   * @param datatype datatype
258
   */
259
  private void setVotableParam(final List<Param> params, final ResourceModel model, final String parameterName,
260
          final DataType datatype) {
261
    final String parameterValue = model.getParameterByName(parameterName).getValue();
262
    if (Util.isNotEmpty(parameterValue)) {
263
        final Param param = new Param();
264
        param.setName(parameterName);
265
        param.setValue(parameterValue);
266
        param.setDatatype(datatype);
267
        params.add(param);
268
    }
269
  }
270
    /**
271
    * Provide the mapping between SQL column/concept for a given dictionary.
272
    *
273
    * @param datasetApp Application where this service is attached
274
    * @param dicoToFind Dictionary name to find
275
    * @return Returns a mapping SQL column/Concept
276
    * @throws SitoolsException No mapping has been done or cannot find the dico
277
    */
278
    private List<ColumnConceptMappingDTO> getDicoFromConfiguration(final DataSetApplication datasetApp,
279
          final String dicoToFind) throws SitoolsException {
280
        List<ColumnConceptMappingDTO> colConceptMappingDTOList = null;
281
        
282
        // Get the list of dictionnaries related to the datasetApplication
283
        final List<DictionaryMappingDTO> dicoMappingList = datasetApp.getDictionaryMappings();
284
        if (!Util.isSet(dicoMappingList) || dicoMappingList.isEmpty()) {
285
          throw new SitoolsException("No mapping with VO concepts has been done. please contact the administrator");
286
        }
287

  
288
        // For each dictionary, find the interesting one and return the mapping SQLcolumn/concept
289
        for (DictionaryMappingDTO dicoMappingIter : dicoMappingList) {
290
          final String dicoName = dicoMappingIter.getDictionaryName();
291
          if (dicoToFind.equals(dicoName)) {
292
            colConceptMappingDTOList = dicoMappingIter.getMapping();
293
            break;
294
          }
295
        }
296
        return colConceptMappingDTOList;
297
    }
298
    
299
    
300
    private List<Column> getColumnToQuery(List<Column> columnList){
301
        List<Column> colsToQueryList = new ArrayList<Column>();
302
        String all = this.adqlQuery.split(TableAccessProtocolLibrary.SELECT)[1].split(TableAccessProtocolLibrary.FROM)[0];      
303
        if(this.colsToQuery.size() == 1 && all.contains("*")){
304
            for(Column colCol : columnList){ 
305
                colsToQueryList.add(colCol);
306
            }
307
            return colsToQueryList;
308
        }
309
        for(String col : this.colsToQuery){          
310
            for(Column colCol : columnList){            
311
                if(col.equalsIgnoreCase(colCol.getColumnAlias())){
312
                    colsToQueryList.add(colCol);
313
                }
314
            }
315
        }
316
        
317
        return colsToQueryList;
318
    }
319
    
320
    /**
321
   * Set Fields and columnSqlAliasList.
322
   *
323
   * @param fieldList List of fields to display on the VOTable
324
   * @param colToQuery List of column to query and so to display in VOTable
325
   * @param columnList List of SQL column
326
   * @param mappingList List of SQL column/concept
327
   */
328
  private void setFields(final List<Field> fieldList, final List<String> columnList, final List<ColumnConceptMappingDTO> mappingList, final List<Column> colToQuery) {
329
    
330
    List<Column> colToQuery2 = colToQuery;
331
    if(!isPrimaryKey){
332
        colToQuery2.remove(colToQuery2.size()-1);
333
    }
334
    for(Column col : colToQuery2){
335
        
336
        for (ColumnConceptMappingDTO mappingIter : mappingList) {
337
            if(col.getColumnAlias().equalsIgnoreCase(mappingIter.getColumnAlias())){
338
                
339
                String id = null;
340
                String name = null;
341
                String ucd = null;
342
                String utype = null;
343
                String ref = null;
344
                String datatype = null;
345
                String width = null;
346
                String precision = null;
347
                String unit = null;
348
                String type = null;
349
                String xtype = null;
350
                String arraysize = null;
351
                String descriptionValue = null;
352
                columnList.add(mappingIter.getColumnAlias());
353
                final Concept concept = mappingIter.getConcept();
354
                if (concept.getName() != null) {
355
                  name = concept.getName();
356
                }
357
                if (concept.getPropertyFromName("ID").getValue() != null) {
358
                  id = concept.getPropertyFromName("ID").getValue();
359
                }
360
                if (concept.getPropertyFromName("ucd").getValue() != null) {
361
                  ucd = concept.getPropertyFromName("ucd").getValue();
362
                }
363
                if (concept.getPropertyFromName("utype").getValue() != null) {
364
                  utype = concept.getPropertyFromName("utype").getValue();
365
                }
366
                if (concept.getPropertyFromName("ref").getValue() != null) {
367
                  ref = concept.getPropertyFromName("ref").getValue();
368
                }
369
                if (concept.getPropertyFromName("datatype").getValue() != null) {
370
                  datatype = concept.getPropertyFromName("datatype").getValue();
371
                }
372
                if (concept.getPropertyFromName("width").getValue() != null) {
373
                  width = concept.getPropertyFromName("width").getValue();
374
                }
375
                if (concept.getPropertyFromName("precision").getValue() != null) {
376
                  precision = concept.getPropertyFromName("precision").getValue();
377
                }
378
                if (concept.getPropertyFromName("unit").getValue() != null) {
379
                  unit = concept.getPropertyFromName("unit").getValue();
380
                }
381
                if (concept.getPropertyFromName("type").getValue() != null) {
382
                  type = concept.getPropertyFromName("type").getValue();
383
                }
384
                if (concept.getPropertyFromName("xtype").getValue() != null) {
385
                  xtype = concept.getPropertyFromName("xtype").getValue();
386
                }
387
                if (concept.getPropertyFromName("arraysize").getValue() != null) {
388
                  arraysize = concept.getPropertyFromName("arraysize").getValue();
389
                }
390
                if (concept.getDescription() != null) {
391
                  descriptionValue = concept.getDescription();
392
                }
393
                final Field field = new Field();
394
                field.setID(id);
395
                field.setName(name);
396
                field.setUcd(ucd);
397
                field.setUtype(utype);
398
                field.setRef(ref);
399
                field.setDatatype(DataType.fromValue(datatype));
400
                if (width != null) {
401
                  field.setWidth(BigInteger.valueOf(Long.valueOf(width)));
402
                }
403
                field.setPrecision(precision);
404
                field.setUnit(unit);
405
                field.setType(type);
406
                field.setXtype(xtype);
407
                field.setArraysize(arraysize);
408
                final AnyTEXT anyText = new AnyTEXT();
409
                anyText.getContent().add(descriptionValue);
410
                field.setDESCRIPTION(anyText);
411
                fieldList.add(field);
412
            }
413
        }
414
    }
415
  }
416
  //List<Column> columnList = datasetApp.getDataSet().getColumnModel();
417
  private List<Column> checkPrimaryKeyAndAddItColTQuery(List<Column> columnList, List<Column> colToQuery){
418
      Column colPrimKey = null;
419
      for(Column co : columnList){
420
          if(co.isPrimaryKey()){
421
              colPrimKey = co;
422
          }
423
      }
424
      for(Column col : colToQuery){
425
          if(col.isPrimaryKey()){
426
              isPrimaryKey = true; 
427
          }
428
      }
429
      if(!isPrimaryKey &&  "" != colPrimKey.getColumnAlias()){
430
          colToQuery.add(colPrimKey);
431
      }
432
      
433
      return colToQuery;
434
  }
435
    
436
    private void processQuery(){
437
        try {
438
            // On crée un parser pour transformer notre string query en adql query
439
            ADQLParser parser = new ADQLParser();
440
            ADQLQuery adqlQueryValue = parser.parseQuery(this.adqlQuery);
441
            // On traduit l'adql query en psql query
442
            ADQLTranslator translator = new PostgreSQLTranslator();
443

  
444
            this.psqlQuery = translator.translate(adqlQueryValue);
445

  
446

  
447
            if(this.psqlQuery.contains("Limit ")){
448
                this.clauseLimit = this.psqlQuery.split("Limit ")[1];
449
                this.clauseLimitInt = Integer.parseInt(this.clauseLimit.replaceAll(" ", ""));
450
                this.psqlQuery = this.psqlQuery.split("Limit ")[0];
451
            }else{
452
                this.clauseLimit = null;
453
                this.clauseLimitInt = -1;
454
            }
455

  
456
            this.clauseWhereToQuery = "AND"+ this.psqlQuery.split(TableAccessProtocolLibrary.FROM)[1].split(TableAccessProtocolLibrary.WHERE)[1];  
457

  
458
            String[] colsToQueryTmp = this.psqlQuery.split(TableAccessProtocolLibrary.FROM)[0].split(TableAccessProtocolLibrary.SELECT)[1].split(",");
459
            for(String col : colsToQueryTmp){
460
                if(col.equalsIgnoreCase(TableAccessProtocolLibrary.SELECT_ALL)){
461
                    colsToQuery.add(col.replaceAll(TableAccessProtocolLibrary.BLANCK, ""));
462
                    break;
463
                }else{
464
                    colsToQuery.add(col.split("AS")[0].replaceAll(TableAccessProtocolLibrary.BLANCK, ""));
465
                }
466
            }
467
            if(format == null || format.equalsIgnoreCase("")){
468
                // TO DO
469
            }else{
470
                ctx.getLogger().log(Level.INFO, "format = "+format);
471
            }
472
        } catch (TranslationException ex) {
473
            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
474
        } catch (ParseException ex) {
475
            Logger.getLogger(TableAccessProtocolResponse.class.getName()).log(Level.SEVERE, null, ex);
476
        }
477
  }
478
    @Override
479
    public final Map getDataModel() {
480
        return Collections.unmodifiableMap(this.dataModel);
481
    }
482
    
483
    // GETTER DE LA CLASSE
484
    public Context getCtx() {
485
        return ctx;
486
    }
487
}
webstatDev/idoc_Maison/idoc/settings.py
59 59
# Database
60 60
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases
61 61

  
62
#DATABASES = {
63
#    'default': {
64
#        'ENGINE': 'django.db.backends.sqlite3',
65
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
66
#    }
67
#}
62
DATABASES = {
63
    'default': {
64
        'ENGINE': 'django.db.backends.sqlite3',
65
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
66
    }
67
}
68
'''
68 69
DATABASES = {
69 70
    'default': {
70 71
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
71
        'NAME':  'webstat_DB',
72
        'NAME':  'webstat_DB_TEST',
72 73
        'USER': 'postgres',
73 74
        'PASSWORD': '',
74 75
        'HOST': 'localhost',
75 76
        'PORT': 5432
76 77
    }
77 78
}
78

  
79

  
79
'''
80 80

  
81 81
# Internationalization
82 82
# https://docs.djangoproject.com/en/1.7/topics/i18n/
webstatDev/idoc_Maison/static/chart/Volume de telechargement par IP entre le 2011-02-01 et le 2012-02-0120150610093724793157.svg
1
<?xml version='1.0' encoding='utf-8'?>
2
<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}
3
#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}
4
#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>

Also available in: Unified diff