Project

General

Profile

Download (12.5 KB) Statistics
| Branch: | Revision:

git_sitools_idoc / hesiod / javaExt / src / fr / ias / sitools / filters / basic / TextAreaCorotFilter.java @ 6552a8ce

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.filters.basic;
8

    
9
import fr.cnes.sitools.common.validator.Validator;
10
import fr.cnes.sitools.dataset.DataSetApplication;
11
import fr.cnes.sitools.dataset.model.Column;
12
import fr.cnes.sitools.dataset.model.DataSet;
13
import fr.cnes.sitools.dataset.model.Operator;
14
import fr.cnes.sitools.dataset.model.Predicat;
15
import fr.cnes.sitools.dataset.plugins.filters.core.AbstractFormFilter;
16
import static fr.cnes.sitools.dataset.plugins.filters.core.AbstractFormFilter.TEMPLATE_PARAM;
17
import fr.cnes.sitools.datasource.jdbc.business.SitoolsSQLDataSource;
18
import fr.cnes.sitools.datasource.jdbc.business.SitoolsSQLDataSourceFactory;
19
import fr.cnes.sitools.util.SQLUtils;
20
import java.util.ArrayList;
21
import java.util.Arrays;
22
import java.util.HashMap;
23
import java.util.List;
24
import java.util.logging.Level;
25
import org.restlet.Request;
26
import org.restlet.data.Form;
27
import org.restlet.ext.wadl.ParameterInfo;
28
import org.restlet.ext.wadl.ParameterStyle;
29

    
30
/**
31
 *
32
 * @author marc
33
 */
34
public class TextAreaCorotFilter  extends AbstractFormFilter {
35
    
36
    private enum TYPE_COMPONENT {
37
    /** DefaultType */
38
    TEXTAREA,
39
    TEXTAREAHDNUMBERCOROT
40
    }
41
    
42
    private String[] values;
43
    /**
44
   * The index of TYPE
45
   */
46
    private static final int TYPE = 0;
47
    /**
48
    * The index of COLUMN
49
    */
50
    private static final int COLUMN = 1;
51
    /**
52
    * The index of Values
53
    */
54
    private static final int VALUES = 2;
55
    
56
    /**
57
    * The number of values
58
    */
59
    private static final int NUMBER_OF_VALUES = 1;
60
    
61
    public TextAreaCorotFilter() {
62
        super();
63
        this.setName("TextAreaCorotFilter");
64
        this.setDescription("Required when using TextAreaCorot component");
65
        this.setClassAuthor("MNICOLAS");
66
        this.setClassOwner("IAS");
67
        this.setClassVersion("0.2");
68
        this.setDefaultFilter(true);
69
        
70
        HashMap<String, ParameterInfo> rpd = new HashMap<String, ParameterInfo>();
71

    
72
        ParameterInfo param1 = new ParameterInfo("p[#]", false, "xs:string", ParameterStyle.QUERY, "TEXTAREA|columnAlias|value");
73
        rpd.put("0", param1);
74
        ParameterInfo param2 = new ParameterInfo("p[#]", false, "xs:string", ParameterStyle.QUERY, "TEXTAREAHDNUMBERCOROT|columnAlias|value");
75
        rpd.put("1", param2);
76
     
77
        ParameterInfo param3 = new ParameterInfo("c[#]", false, "xs:string", ParameterStyle.QUERY,"TEXTAREA|dictionaryName,conceptName|value");
78
        rpd.put("2", param3);
79
        ParameterInfo param4 = new ParameterInfo("c[#]", false, "xs:string", ParameterStyle.QUERY,"TEXTAREAHDNUMBERCOROT|dictionaryName,conceptName|value");
80
        rpd.put("3", param4);
81
  
82
        this.setRequestParamsDescription(rpd);
83
    
84
    }
85
        
86

    
87
    @Override
88
    public List<Predicat> createPredicats(Request rqst, List<Predicat> predicats) throws Exception {
89
        DataSetApplication dsApplication = (DataSetApplication) getContext().getAttributes().get("DataSetApplication");
90
        DataSet ds =  dsApplication.getDataSet();
91
        boolean isConcept = true;
92
        Form params = rqst.getResourceRef().getQueryAsForm();
93
        boolean filterExists = true;
94
        int i = 0;
95
        while (filterExists) {
96
            String index = TEMPLATE_PARAM_CONCEPT.replace("#", Integer.toString(i));
97
            String formParam = params.getFirstValue(index);
98
            if (formParam == null) {
99
                isConcept = false;
100
                index = TEMPLATE_PARAM.replace("#", Integer.toString(i));
101
                formParam = params.getFirstValue(index);
102
            }
103
            i++;
104
            if (formParam != null) {
105
                String[] parameters = formParam.split("\\|");
106
                TYPE_COMPONENT[] types = TYPE_COMPONENT.values();
107
                Boolean trouve = false;
108
                for (TYPE_COMPONENT typeCmp : types) {
109
                    if (typeCmp.name().equals(parameters[TYPE])) {
110
                        trouve = true;
111
                    }
112
                }
113
            
114
                if (trouve && parameters[TYPE].equalsIgnoreCase("TEXTAREA")) {
115
                    if (checkValues(parameters)) {
116
                        String[] columnsAlias = parameters[COLUMN].split(",");
117
                        ArrayList<Column> columns = new ArrayList<Column>();
118
                        for (String columnAlias : columnsAlias) {
119
                            Column col = ds.findByColumnAlias(columnAlias);
120
                            if (col != null) {
121
                                columns.add(col);
122
                            }
123
                        }
124
                        String value = String.valueOf(SQLUtils.escapeString(values[0]));
125

    
126
                        List<String> valuesFilter = getValuesCorotId(value);
127

    
128
                        if(valuesFilter != null){
129
                            
130
                            String columnAlias = getColumnAlias(isConcept, parameters, dsApplication);
131
                        
132
                            if (columnAlias != null) {
133
                                Column col = ds.findByColumnAlias(columnAlias);
134
                                Predicat predicat = new Predicat();
135
                                if (!value.isEmpty()) {
136
                                    predicat.setLeftString(col.getColumnAlias());
137
                                    predicat.setNbOpenedParanthesis(0);
138
                                    predicat.setNbClosedParanthesis(0);                                
139
                                    predicat.setCompareOperator(Operator.IN);
140
                                    predicat.setRightValue(valuesFilter);
141
                                    predicats.add(predicat);
142
                                }
143
                            }
144
                        }
145
                    }    
146
                }else if(trouve && parameters[TYPE].equalsIgnoreCase("TEXTAREAHDNUMBERCOROT")){
147
                    if (checkValues(parameters)) {
148
                        
149
                        String[] columnsAlias = parameters[COLUMN].split(",");
150
                        ArrayList<Column> columns = new ArrayList<Column>();
151
                        for (String columnAlias : columnsAlias) {
152
                            Column col = ds.findByColumnAlias(columnAlias);
153
                            if (col != null) {
154
                                columns.add(col);
155
                            }
156
                        }
157

    
158
                        String value = String.valueOf(SQLUtils.escapeString(values[0]));
159
                        List<String> valuesFilter = getValuesHdNumber(value);
160
                        if(valuesFilter != null){
161
                            String columnAlias = getColumnAlias(isConcept, parameters, dsApplication);
162
                            if (columnAlias != null) {
163
                                Column col = ds.findByColumnAlias(columnAlias);
164
                                Predicat predicat = new Predicat();
165
                                if (!value.isEmpty()) {
166
                                    predicat.setLeftString(col.getColumnAlias());
167
                                    predicat.setNbOpenedParanthesis(0);
168
                                    predicat.setNbClosedParanthesis(0);                                
169
                                    predicat.setCompareOperator(Operator.IN);
170
                                    predicat.setRightValue(valuesFilter);
171
                                    predicats.add(predicat);
172
                                }
173
                            }
174
                        }
175
                    } 
176
                }
177
            }else {
178
                filterExists = false;
179
            }
180
        }
181
        return predicats;
182
    }
183

    
184
    /**
185
   * Check the number of values
186
   * 
187
   * @param parameters
188
   *          the values
189
   * @return true if the number of values is correct
190
   */
191
  private boolean checkValues(String[] parameters) {
192
    values = Arrays.copyOfRange(parameters, VALUES, VALUES + NUMBER_OF_VALUES);
193
    if (values.length == NUMBER_OF_VALUES) {
194
      return true;
195
    }
196
    return false;
197
  }
198
    
199
    @Override
200
    public Validator<?> getValidator() {
201
        // TODO Auto-generated method stub
202
        return null;
203
    }
204
    
205
    private List<String> getValuesCorotId(String value){
206
        List<String> valuesFilter = new ArrayList<String>();
207
        List<String> valuesFilterTmp = new ArrayList<String>();
208
        List<String> valuesToSearchTmp = new ArrayList<String>();
209
        String separator = null;
210
        value = value.replaceAll("\\\\n", "!"); 
211
        for(int j =0;j<value.length();j++){
212
            if(!Character.isDigit(value.charAt(j))){
213
                separator = String.valueOf(value.charAt(j));
214
                break;
215
            }                          
216
        }
217
        if(separator != null){
218
                valuesFilterTmp = Arrays.asList(value.split(separator));
219
        }else{
220
                valuesFilterTmp = Arrays.asList(value);
221
        }
222
//-----------------------------------------------------
223
        int whiteSpacePlace = -1;
224
        for(String corotIdTmp : valuesFilterTmp){
225
            if(corotIdTmp.contains(" ")){
226
                whiteSpacePlace = corotIdTmp.indexOf(" ");
227
                if(whiteSpacePlace == 0){
228
                    int i=0;
229
                    while(Character.isWhitespace(corotIdTmp.charAt(i))){
230
                            i++;
231
                    }
232
                    corotIdTmp = corotIdTmp.substring(i);
233
                    whiteSpacePlace = corotIdTmp.indexOf(" ");
234
                }
235
                valuesToSearchTmp.add(corotIdTmp.substring(whiteSpacePlace+1));
236
            }else{
237
                valuesToSearchTmp.add(corotIdTmp);
238
            }    
239
        }
240
        for(String tmp : valuesToSearchTmp){
241
            boolean isDigitValue = true;
242
                for(int l=0;l<tmp.length();l++){
243
                    if(!Character.isDigit(tmp.charAt(l))){
244
                        isDigitValue = false;
245
                    }
246
                }
247
                if(isDigitValue){
248
                    valuesFilter.add(tmp);
249
                }
250
        }
251
//--------------------------------------------------------            
252
    /*    if(separator != null){
253
            for(String corotId : valuesToSearchTmp){
254
                boolean isDigitValue = true;
255
                for(int l=0;l<corotId.length();l++){
256
                    if(!Character.isDigit(corotId.charAt(l))){
257
                        isDigitValue = false;
258
                    }
259
                }
260
                if(isDigitValue){
261
                    valuesFilter.add(corotId);
262
                }
263
            }
264
        } else {
265
            valuesFilter.add(value);
266
        }
267
        */
268
        
269
        return valuesFilter;
270
    }
271
    
272
    private List<String> getValuesHdNumber(String value){
273
        List<String> valuesToSearchTmp = new ArrayList<String>();
274
        List<String> valuesToSearch = new ArrayList<String>();
275
        List<String> tmp = new ArrayList<String>();
276
        String separator = null;
277

    
278
        value = value.replaceAll("\\\\n", "!"); 
279
        for(int j =0;j<value.length();j++){
280
            if(!Character.isLetterOrDigit(value.charAt(j)) && !Character.isWhitespace(value.charAt(j))){
281
                separator = String.valueOf(value.charAt(j));
282
                break;
283
            }           
284
        }
285
        if(separator != null){
286
                tmp = Arrays.asList(value.split(separator));
287
        }else{
288
                tmp = Arrays.asList(value);
289
        }
290
        int whiteSpacePlace = -1;
291
        for(String hdNumberTmp : tmp){
292
            if(hdNumberTmp.contains(" ")){
293
                whiteSpacePlace = hdNumberTmp.indexOf(" ");
294
                if(whiteSpacePlace == 0){
295
                    int i=0;
296
                    while(Character.isWhitespace(hdNumberTmp.charAt(i))){
297
                            i++;
298
                    }
299
                    hdNumberTmp = hdNumberTmp.substring(i);
300
                    whiteSpacePlace = hdNumberTmp.indexOf(" ");
301
                }
302
                valuesToSearchTmp.add(hdNumberTmp.substring(whiteSpacePlace+1)); 
303
            }if(hdNumberTmp.toLowerCase().contains("hd") && !hdNumberTmp.contains(" ")){
304
                valuesToSearchTmp.add(hdNumberTmp.substring(2));
305
            }if(!hdNumberTmp.toLowerCase().contains("hd") && !hdNumberTmp.contains(" ")){
306
                valuesToSearchTmp.add(hdNumberTmp);
307
            }
308
        }  
309
        for(String hdNumber : valuesToSearchTmp){
310
            valuesToSearch.add("HD "+hdNumber);
311
        }
312
        return valuesToSearch;
313
    }
314
    
315
}