Project

General

Profile

Boolean Custom » History » Version 2

Anonymous, 05/06/2012 17:21

1 1 Anonymous
h1. Boolean Custom
2 1 Anonymous
3 1 Anonymous
Le Boolean Custom permet de faire une requête en prenant en compte ou non certaines observations d'après leurs spécificité : long/short run, anti/center, windescriptor ou non ...
4 1 Anonymous
5 1 Anonymous
Le code javascript correspondant :
6 1 Anonymous
7 1 Anonymous
Côté ADMIN : 
8 1 Anonymous
9 1 Anonymous
<pre><code class="javascript">
10 1 Anonymous
11 1 Anonymous
/***************************************
12 1 Anonymous
 * Copyright 2011 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
13 1 Anonymous
 * 
14 1 Anonymous
 * This file is part of SITools2.
15 1 Anonymous
 * 
16 1 Anonymous
 * SITools2 is free software: you can redistribute it and/or modify
17 1 Anonymous
 * it under the terms of the GNU General Public License as published by
18 1 Anonymous
 * the Free Software Foundation, either version 3 of the License, or
19 1 Anonymous
 * (at your option) any later version.
20 1 Anonymous
 * 
21 1 Anonymous
 * SITools2 is distributed in the hope that it will be useful,
22 1 Anonymous
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 1 Anonymous
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 1 Anonymous
 * GNU General Public License for more details.
25 1 Anonymous
 * 
26 1 Anonymous
 * You should have received a copy of the GNU General Public License
27 1 Anonymous
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
28 1 Anonymous
 ***************************************/
29 1 Anonymous
Ext.namespace('sitools.component.forms.multiParam');
30 1 Anonymous
31 1 Anonymous
sitools.component.forms.multiParam.BooleanCustom = Ext.extend(sitools.component.forms.multiParam.abstractForm, {
32 1 Anonymous
	height : 330,
33 1 Anonymous
	id : "sitools.component.forms.definitionId",
34 1 Anonymous
	initComponent : function () {
35 1 Anonymous
		this.winPropComponent.specificHeight = 430;
36 1 Anonymous
		this.winPropComponent.specificWidth = 380;
37 1 Anonymous
		sitools.component.forms.multiParam.BooleanCustom.superclass.initComponent.call(this);
38 1 Anonymous
39 1 Anonymous
		var labels = ['Column'];
40 1 Anonymous
		var i = 1;
41 1 Anonymous
		this['mapParam' + i] = new Ext.form.ComboBox({
42 1 Anonymous
			fieldLabel : labels[i - 1],
43 1 Anonymous
			triggerAction : 'all',
44 1 Anonymous
			name : "PARAM" + i,
45 1 Anonymous
			specificType : "mapParam", 
46 1 Anonymous
			columnIndex : i, 
47 1 Anonymous
			lazyRender : true,
48 1 Anonymous
			mode : 'local',
49 1 Anonymous
			store : this.storeColumn,
50 1 Anonymous
			valueField : 'columnAlias',
51 1 Anonymous
			displayField : 'header',
52 1 Anonymous
			anchor : '100%', 
53 1 Anonymous
			allowBlank : true 
54 1 Anonymous
55 1 Anonymous
		}); 
56 1 Anonymous
57 1 Anonymous
		if (this.action == "modify") {
58 1 Anonymous
			Ext.apply(this['mapParam' + i], {
59 1 Anonymous
				value : this.selectedRecord.data.code[i - 1]
60 1 Anonymous
			});
61 1 Anonymous
		}
62 1 Anonymous
63 1 Anonymous
		this.insert(i, this['mapParam' + i]);
64 1 Anonymous
65 1 Anonymous
66 1 Anonymous
		this.componentUncheckedValue = new Ext.form.TextField({
67 1 Anonymous
			fieldLabel : i18n.get('label.defaultValue') + 'Uncheked Value',
68 1 Anonymous
			name : 'componentUncheckedValue',
69 1 Anonymous
			anchor : '100%'
70 1 Anonymous
		});
71 1 Anonymous
		this.componentCheckedValue = new Ext.form.TextField({
72 1 Anonymous
			fieldLabel : i18n.get('label.defaultValue') + 'Cheked Value',
73 1 Anonymous
			name : 'componentCheckedValue',
74 1 Anonymous
			anchor : '100%'
75 1 Anonymous
		});
76 1 Anonymous
		this.add(this.componentUncheckedValue);
77 1 Anonymous
		this.add(this.componentCheckedValue);
78 1 Anonymous
		this.cb = new Ext.form.Checkbox ({
79 1 Anonymous
			fieldLabel : i18n.get('label.defaultValue') + 'Default State',
80 1 Anonymous
			name : 'defaultStatus',
81 1 Anonymous
			allowBlank : true,
82 1 Anonymous
			checked : false,
83 1 Anonymous
			value : false
84 1 Anonymous
		});
85 1 Anonymous
		this.add(this.cb);
86 1 Anonymous
87 1 Anonymous
88 1 Anonymous
89 1 Anonymous
	},
90 1 Anonymous
	onRender : function () {
91 1 Anonymous
		sitools.component.forms.multiParam.BooleanCustom.superclass.onRender.apply(this, arguments);
92 1 Anonymous
		if (this.action == 'modify') {
93 1 Anonymous
			if (!Ext.isEmpty(this.selectedRecord.data.defaultValues)) {
94 1 Anonymous
				this.componentUncheckedValue.setValue(this.selectedRecord.data.defaultValues[0]);
95 1 Anonymous
				this.componentCheckedValue.setValue(this.selectedRecord.data.defaultValues[1]);
96 1 Anonymous
				this.cb.setValue(this.selectedRecord.data.defaultValues[2]);
97 1 Anonymous
			}
98 1 Anonymous
		}
99 1 Anonymous
	},
100 1 Anonymous
	_onValidate : function (action, gridFormComponents) {
101 1 Anonymous
		var f = this.getForm();
102 1 Anonymous
		if (!f.isValid()) {
103 1 Anonymous
			Ext.Msg.alert(i18n.get('label.error'), i18n.get('warning.invalidForm'));
104 1 Anonymous
			return false;
105 1 Anonymous
		}
106 1 Anonymous
		var param1, UncheckedValue, CheckedValue, code, defaultState; // defaultValue;
107 1 Anonymous
		if (action == 'modify') {
108 1 Anonymous
			var rec = gridFormComponents.getSelectionModel().getSelected();
109 1 Anonymous
			param1 = Ext.isEmpty(f.findField('PARAM1')) ? "" : f.findField('PARAM1').getValue();
110 1 Anonymous
			code = [param1];
111 1 Anonymous
			var labelParam1 = Ext.isEmpty(f.findField('LABEL_PARAM1')) ? "" : f.findField('LABEL_PARAM1').getValue();
112 1 Anonymous
			var css = Ext.isEmpty(f.findField('CSS')) ? "" : f.findField('CSS').getValue();
113 1 Anonymous
			UncheckedValue = Ext.isEmpty(f.findField('componentUncheckedValue')) ? "" : f.findField('componentUncheckedValue').getValue();
114 1 Anonymous
			CheckedValue = Ext.isEmpty(f.findField('componentCheckedValue')) ? "" : f.findField('componentCheckedValue').getValue();
115 1 Anonymous
			defaultState = Ext.isEmpty(f.findField('defaultStatus')) ? "" : f.findField('defaultStatus').getValue();
116 1 Anonymous
117 1 Anonymous
			rec.set('label', labelParam1);
118 1 Anonymous
			rec.set('code', code);
119 1 Anonymous
			rec.set('css', css);
120 1 Anonymous
			rec.set('componentDefaultHeight', f.findField('componentDefaultHeight').getValue());
121 1 Anonymous
			rec.set('componentDefaultWidth', f.findField('componentDefaultWidth').getValue());
122 1 Anonymous
123 1 Anonymous
			rec.set('defaultValues', [ UncheckedValue,  CheckedValue, defaultState ]);
124 1 Anonymous
		} else {
125 1 Anonymous
			var formComponentsStore = gridFormComponents.getStore();
126 1 Anonymous
			defaultState = Ext.isEmpty(f.findField('defaultStatus')) ? "" : f.findField('defaultStatus').getValue();
127 1 Anonymous
			UncheckedValue = Ext.isEmpty(f.findField('componentUncheckedValue')) ? "" : f.findField('componentUncheckedValue').getValue();
128 1 Anonymous
			CheckedValue = Ext.isEmpty(f.findField('componentCheckedValue')) ? "" : f.findField('componentCheckedValue').getValue();
129 1 Anonymous
130 1 Anonymous
			// Génération de l'id
131 1 Anonymous
			var lastId = 0;
132 1 Anonymous
			var greatY = 0;
133 1 Anonymous
			formComponentsStore.each(function (component) {
134 1 Anonymous
				if (component.data.id > lastId) {
135 1 Anonymous
					lastId = parseInt(component.data.id, 10);
136 1 Anonymous
				}
137 1 Anonymous
				if (component.data.ypos > greatY) {
138 1 Anonymous
					greatY = parseInt(component.data.ypos, 10)  + parseInt(component.data.height, 10);
139 1 Anonymous
				}
140 1 Anonymous
141 1 Anonymous
			});
142 1 Anonymous
			var componentId = lastId + 1;
143 1 Anonymous
			componentId = componentId.toString();
144 1 Anonymous
			var componentYpos = greatY + 10;
145 1 Anonymous
			param1 = Ext.isEmpty(f.findField('PARAM1')) ? "" : f.findField('PARAM1').getValue();
146 1 Anonymous
			code = [param1];
147 1 Anonymous
			formComponentsStore.add(new Ext.data.Record({
148 1 Anonymous
				label : f.findField('LABEL_PARAM1').getValue(),
149 1 Anonymous
				type : this.ctype,
150 1 Anonymous
				code : code,
151 1 Anonymous
				width : f.findField('componentDefaultWidth').getValue(),
152 1 Anonymous
				height : f.findField('componentDefaultHeight').getValue(),
153 1 Anonymous
				id : componentId,
154 1 Anonymous
				ypos : componentYpos,
155 1 Anonymous
				css : f.findField('CSS').getValue(),
156 1 Anonymous
				jsAdminObject : this.jsAdminObject,
157 1 Anonymous
				jsUserObject : this.jsUserObject,
158 1 Anonymous
				defaultValues : [ UncheckedValue,  CheckedValue, defaultState ]
159 1 Anonymous
			}));
160 1 Anonymous
		}
161 1 Anonymous
		return true;
162 1 Anonymous
	}
163 1 Anonymous
164 1 Anonymous
});
165 1 Anonymous
166 1 Anonymous
</code></pre>
167 1 Anonymous
168 1 Anonymous
169 1 Anonymous
Côté CLIENT : 
170 1 Anonymous
171 1 Anonymous
172 1 Anonymous
<pre><code class="javascript">
173 1 Anonymous
/***************************************
174 1 Anonymous
 * Copyright 2011 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
175 1 Anonymous
 * 
176 1 Anonymous
 * This file is part of SITools2.
177 1 Anonymous
 * 
178 1 Anonymous
 * SITools2 is free software: you can redistribute it and/or modify
179 1 Anonymous
 * it under the terms of the GNU General Public License as published by
180 1 Anonymous
 * the Free Software Foundation, either version 3 of the License, or
181 1 Anonymous
 * (at your option) any later version.
182 1 Anonymous
 * 
183 1 Anonymous
 * SITools2 is distributed in the hope that it will be useful,
184 1 Anonymous
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
185 1 Anonymous
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
186 1 Anonymous
 * GNU General Public License for more details.
187 1 Anonymous
 * 
188 1 Anonymous
 * You should have received a copy of the GNU General Public License
189 1 Anonymous
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
190 1 Anonymous
 ***************************************/
191 1 Anonymous
192 1 Anonymous
Ext.ns('sitools.component.users.SubSelectionParameters.SingleSelection');
193 1 Anonymous
194 1 Anonymous
sitools.component.users.SubSelectionParameters.SingleSelection.BooleanCustom = Ext.extend(Ext.Container, {
195 1 Anonymous
196 1 Anonymous
	initComponent : function () {
197 1 Anonymous
		this.cbv = new Ext.form.Checkbox ({
198 1 Anonymous
			allowBlank : true,
199 1 Anonymous
			checked : eval(this.defaultValues[2]),
200 1 Anonymous
			value : eval(this.defaultValues[2])
201 1 Anonymous
		});
202 1 Anonymous
		Ext.apply(this, {
203 1 Anonymous
			layout : "hbox",
204 1 Anonymous
			stype : "sitoolsFormContainer",
205 1 Anonymous
			items : [new Ext.Container({
206 1 Anonymous
				border : false,
207 1 Anonymous
				html : this.label,
208 1 Anonymous
				width : 100
209 1 Anonymous
			}), this.cbv]
210 1 Anonymous
		});
211 1 Anonymous
		sitools.component.users.SubSelectionParameters.SingleSelection.BooleanCustom.superclass.initComponent.apply(
212 1 Anonymous
				this, arguments);
213 1 Anonymous
	},
214 1 Anonymous
215 1 Anonymous
	getSelectedValue : function () {
216 1 Anonymous
		if (this.cbv.getValue()) {
217 1 Anonymous
			return this.defaultValues[1];
218 1 Anonymous
		} else {
219 1 Anonymous
			return this.defaultValues[0];
220 1 Anonymous
		}
221 1 Anonymous
222 1 Anonymous
	},
223 1 Anonymous
	getParameterValue : function () {
224 1 Anonymous
		var value = this.getSelectedValue();
225 1 Anonymous
		return this.type + "|" + this.code + "|" + value;
226 1 Anonymous
	}
227 1 Anonymous
228 1 Anonymous
});
229 1 Anonymous
230 1 Anonymous
</code></pre>
231 1 Anonymous
232 2 Anonymous
Code JAVA à inclure dans workspace/fr.cnes.sitools.extensions/src/fr/cnes/sitools/filter et référencer la classe dans le fichier fr.cnes.sitools.filter.FilterHelper
233 1 Anonymous
234 1 Anonymous
<pre><code class="java">
235 1 Anonymous
/*******************************************************************************
236 1 Anonymous
 * Copyright 2011 CNES - CENTRE NATIONAL d'ETUDES SPATIALES
237 1 Anonymous
 * 
238 1 Anonymous
 * This file is part of SITools2.
239 1 Anonymous
 * 
240 1 Anonymous
 * SITools2 is free software: you can redistribute it and/or modify
241 1 Anonymous
 * it under the terms of the GNU General Public License as published by
242 1 Anonymous
 * the Free Software Foundation, either version 3 of the License, or
243 1 Anonymous
 * (at your option) any later version.
244 1 Anonymous
 * 
245 1 Anonymous
 * SITools2 is distributed in the hope that it will be useful,
246 1 Anonymous
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
247 1 Anonymous
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
248 1 Anonymous
 * GNU General Public License for more details.
249 1 Anonymous
 * 
250 1 Anonymous
 * You should have received a copy of the GNU General Public License
251 1 Anonymous
 * along with SITools2.  If not, see <http://www.gnu.org/licenses/>.
252 1 Anonymous
 ******************************************************************************/
253 1 Anonymous
package fr.cnes.sitools.filter.basic;
254 1 Anonymous
255 1 Anonymous
import java.util.HashMap;
256 1 Anonymous
import java.util.List;
257 1 Anonymous
import java.util.Set;
258 1 Anonymous
259 1 Anonymous
import org.restlet.Request;
260 1 Anonymous
import org.restlet.data.Form;
261 1 Anonymous
import org.restlet.ext.wadl.ParameterInfo;
262 1 Anonymous
import org.restlet.ext.wadl.ParameterStyle;
263 1 Anonymous
264 1 Anonymous
import fr.cnes.sitools.common.validator.ConstraintViolation;
265 1 Anonymous
import fr.cnes.sitools.common.validator.Validator;
266 1 Anonymous
import fr.cnes.sitools.dataset.DataSetApplication;
267 1 Anonymous
import fr.cnes.sitools.dataset.filter.business.AbstractFilter;
268 1 Anonymous
import fr.cnes.sitools.dataset.model.Column;
269 1 Anonymous
import fr.cnes.sitools.dataset.model.DataSet;
270 1 Anonymous
import fr.cnes.sitools.dataset.model.Operator;
271 1 Anonymous
import fr.cnes.sitools.dataset.model.Predicat;
272 1 Anonymous
import fr.cnes.sitools.util.SQLUtils;
273 1 Anonymous
274 1 Anonymous
/**
275 1 Anonymous
 * Filter defined for Single Value Component
276 1 Anonymous
 * 
277 1 Anonymous
 * 
278 1 Anonymous
 * @author d.arpin
279 1 Anonymous
 */
280 1 Anonymous
public final class BooleanCustom extends AbstractFilter {
281 1 Anonymous
  /**
282 1 Anonymous
   * The index of TYPE
283 1 Anonymous
   */
284 1 Anonymous
  private static final int TYPE = 0;
285 1 Anonymous
  /**
286 1 Anonymous
   * The index of COLUMN
287 1 Anonymous
   */
288 1 Anonymous
  private static final int COLUMN = 1;
289 1 Anonymous
  /**
290 1 Anonymous
   * The index of Values
291 1 Anonymous
   */
292 1 Anonymous
  private static final int VALUES = 2;
293 1 Anonymous
294 1 Anonymous
  /**
295 1 Anonymous
   * The list of component that uses this filter
296 1 Anonymous
   */
297 1 Anonymous
  private enum TYPE_COMPONENT {
298 1 Anonymous
    /** Boolean Custom type */
299 1 Anonymous
    BOOLEAN_CUSTOM
300 1 Anonymous
  }
301 1 Anonymous
302 1 Anonymous
  /** The TEMPLATE_PARAM */
303 1 Anonymous
  private static final String TEMPLATE_PARAM = "p[#]";
304 1 Anonymous
305 1 Anonymous
  /**
306 1 Anonymous
   * Default constructor
307 1 Anonymous
   */
308 1 Anonymous
  public BooleanCustom() {
309 1 Anonymous
310 1 Anonymous
    super();
311 1 Anonymous
    this.setName("BooleanCustom");
312 1 Anonymous
    this.setDescription("Required when using Boolean Custom Component");
313 1 Anonymous
314 1 Anonymous
    this.setAuthor("Matthieu Husson");
315 1 Anonymous
    this.setClassAuthor("IAS");
316 1 Anonymous
    this.setClassOwner("MH@IAS");
317 1 Anonymous
    this.setVersion("0.1");
318 1 Anonymous
    this.setDefaultFilter(true);
319 1 Anonymous
320 1 Anonymous
    HashMap<String, ParameterInfo> rpd = new HashMap<String, ParameterInfo>();
321 1 Anonymous
322 1 Anonymous
    ParameterInfo paramInfo;
323 1 Anonymous
    paramInfo = new ParameterInfo("p[#]", false, "xs:string", ParameterStyle.QUERY, "BOOLEAN_CUSTOM|columnAlias|value");
324 1 Anonymous
    rpd.put("0", paramInfo);
325 1 Anonymous
    this.setRequestParamsDescription(rpd);
326 1 Anonymous
    //
327 1 Anonymous
328 1 Anonymous
  }
329 1 Anonymous
330 1 Anonymous
  @Override
331 1 Anonymous
  public List<Predicat> createPredicats(Request request, List<Predicat> predicats) throws Exception {
332 1 Anonymous
    DataSetApplication dsApplication = null;
333 1 Anonymous
    DataSet ds = null;
334 1 Anonymous
335 1 Anonymous
    Form params = request.getResourceRef().getQueryAsForm();
336 1 Anonymous
    boolean filterExists = true;
337 1 Anonymous
    int i = 0;
338 1 Anonymous
    // Build predicat for filters param
339 1 Anonymous
    while (filterExists) {
340 1 Anonymous
      String index = TEMPLATE_PARAM.replace("#", Integer.toString(i++));
341 1 Anonymous
      String formParam = params.getFirstValue(index);
342 1 Anonymous
      if (formParam != null) {
343 1 Anonymous
        String[] parameters = formParam.split("\\|");
344 1 Anonymous
        TYPE_COMPONENT[] types = TYPE_COMPONENT.values();
345 1 Anonymous
        Boolean trouve = false;
346 1 Anonymous
        for (TYPE_COMPONENT typeCmp : types) {
347 1 Anonymous
          if (typeCmp.name().equals(parameters[TYPE])) {
348 1 Anonymous
            trouve = true;
349 1 Anonymous
          }
350 1 Anonymous
        }
351 1 Anonymous
        if (trouve) {
352 1 Anonymous
          if (dsApplication == null) {
353 1 Anonymous
            dsApplication = (DataSetApplication) getContext().getAttributes().get("DataSetApplication");
354 1 Anonymous
            ds = dsApplication.getDataSet();
355 1 Anonymous
          }
356 1 Anonymous
          String columnAlias = null;
357 1 Anonymous
          if (parameters.length >= VALUES) {
358 1 Anonymous
359 1 Anonymous
            /*
360 1 Anonymous
             * columnsAlias = parameters[COLUMN].split(","); ArrayList<Column> columns = new ArrayList<Column>(); for
361 1 Anonymous
             * (String columnAlias : columnsAlias) { Column col = ds.findByColumnAlias(columnAlias); if (col != null) {
362 1 Anonymous
             * columns.add(col); }
363 1 Anonymous
             * 
364 1 Anonymous
             * }
365 1 Anonymous
             */
366 1 Anonymous
            columnAlias = parameters[COLUMN];
367 1 Anonymous
            Column col = ds.findByColumnAlias(columnAlias);
368 1 Anonymous
            if (col != null && col.getFilter() != null && col.getFilter()) {
369 1 Anonymous
              // get the value and escape it to avoid SQL injection
370 1 Anonymous
              String value = SQLUtils.escapeString(parameters[VALUES]);
371 1 Anonymous
              Predicat predicat = new Predicat();
372 1 Anonymous
              if (value != null) {
373 1 Anonymous
                predicat.setLeftAttribute(col);
374 1 Anonymous
                predicat.setNbOpenedParanthesis(0);
375 1 Anonymous
                predicat.setNbClosedParanthesis(0);
376 1 Anonymous
                predicat.setCompareOperator(Operator.EQ.value());
377 1 Anonymous
                predicat.setRightValue("'" + value + "'");
378 1 Anonymous
379 1 Anonymous
                
380 1 Anonymous
                if(value.equalsIgnoreCase("false")){
381 1 Anonymous
                  predicats.add(predicat);
382 1 Anonymous
                }
383 1 Anonymous
              }
384 1 Anonymous
            }
385 1 Anonymous
386 1 Anonymous
          }
387 1 Anonymous
        }
388 1 Anonymous
      }
389 1 Anonymous
390 1 Anonymous
      else {
391 1 Anonymous
        filterExists = false;
392 1 Anonymous
      }
393 1 Anonymous
    }
394 1 Anonymous
395 1 Anonymous
    return predicats;
396 1 Anonymous
  }
397 1 Anonymous
398 1 Anonymous
  /**
399 1 Anonymous
   * Gets the validator for this Filter
400 1 Anonymous
   * 
401 1 Anonymous
   * @return the validator for the filter
402 1 Anonymous
   */
403 1 Anonymous
  @Override
404 1 Anonymous
  public Validator<AbstractFilter> getValidator() {
405 1 Anonymous
    return new Validator<AbstractFilter>() {
406 1 Anonymous
      @Override
407 1 Anonymous
      public Set<ConstraintViolation> validate(AbstractFilter item) {
408 1 Anonymous
        // TODO Auto-generated method stub
409 1 Anonymous
        return null;
410 1 Anonymous
      }
411 1 Anonymous
    };
412 1 Anonymous
  }
413 1 Anonymous
414 1 Anonymous
}
415 1 Anonymous
</code></pre>