2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FilterConverter.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
22 * @description Reference from CalendarConverter.cpp
25 #include <dpl/log/log.h>
26 #include <CommonsJavaScript/ScopedJSStringRef.h>
27 #include <CommonsJavaScript/Validator.h>
28 #include <CommonsJavaScript/JSUtils.h>
29 #include "JSAttributeFilter.h"
30 #include "JSAttributeRangeFilter.h"
31 #include "JSCompositeFilter.h"
32 #include "JSAbstractFilterArray.h"
33 #include "JSSortMode.h"
34 #include "FilterConverter.h"
36 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_TYPE "type"
37 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_ORDER "order"
38 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_FILTERS "filters"
39 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_IDS "ids"
40 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_ATTRIBUTE_NAME "attributeName"
41 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_MATCH_FLAG "matchFlag"
42 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_MATCH_VALUES "matchValues"
43 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_INITIAL_VALUE "initialValue"
44 #define TIZEN_FILTER_CONVERTER_ATTRIBUTE_END_VALUE "endValue"
46 namespace DeviceAPI {
\rnamespace Tizen {
48 using namespace DeviceAPI::Tizen;
49 using namespace WrtDeviceApis::Commons;
50 using namespace WrtDeviceApis::CommonsJavaScript;
54 FilterConverter::FilterConverter(JSContextRef context) : Converter(context)
59 FilterConverter::~FilterConverter()
64 JSValueRef FilterConverter::toJSValueRef(FilterPtr arg)
67 ThrowMsg(NullPointerException, "Filter is NULL.");
69 JSValueRef result = NULL;
71 if(arg->getFilterType() == UNION_FILTER || arg->getFilterType() == INTERSECTION_FILTER)
73 CompositeFilterPtr filter = DPL::DynamicPointerCast<CompositeFilter>(arg);
75 result = toJSValueRef(filter);
77 else if(arg->getFilterType() == ATTRIBUTE_FILTER)
79 AttributeFilterPtr filter = DPL::DynamicPointerCast<AttributeFilter>(arg);
81 result = toJSValueRef(filter);
83 else if(arg->getFilterType() == ATTRIBUTE_RANGE_FILTER)
85 AttributeRangeFilterPtr filter = DPL::DynamicPointerCast<AttributeRangeFilter>(arg);
87 result = toJSValueRef(filter);
93 FilterPtr FilterConverter::toFilter(const JSValueRef& arg)
96 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
98 if(!JSValueIsObject(m_context, arg))
99 ThrowMsg(InvalidArgumentException, "Filter is not object.");
101 if(JSCompositeFilter::isObjectOfClass(m_context, arg))
102 return DPL::StaticPointerCast<IFilter>(JSCompositeFilter::getCompositeFilter(m_context, arg));
104 if(JSAttributeFilter::isObjectOfClass(m_context, arg))
105 return DPL::StaticPointerCast<IFilter>(JSAttributeFilter::getAttributeFilter(m_context, arg));
107 if(JSAttributeRangeFilter::isObjectOfClass(m_context, arg))
108 return DPL::StaticPointerCast<IFilter>(JSAttributeRangeFilter::getAttributeRangeFilter(m_context, arg));
110 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
111 return FilterPtr(NULL);
114 JSValueRef FilterConverter::toJSValueRef(const FilterArrayPtr& arg)
117 ThrowMsg(NullPointerException, "FilterArray is NULL.");
119 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSAbstractFilterArray::getClassRef(), arg);
122 FilterArrayPtr FilterConverter::toFilterArray(const JSValueRef& arg)
125 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
127 if(JSAbstractFilterArray::isObjectOfClass(m_context, arg))
128 return JSAbstractFilterArray::getAbstractFilterArray(m_context, arg);
130 if(!JSIsArrayValue(m_context, arg))
131 ThrowMsg(InvalidArgumentException, "JSValueRef is not Array.");
133 FilterArrayPtr retVal;
135 JSObjectRef obj = toJSObjectRef(arg);
136 retVal = FilterArrayPtr(new FilterArray());
138 unsigned int length = JSGetArrayLength(m_context, obj);
139 for(unsigned int i=0; i<length; i++)
141 JSValueRef value = JSGetArrayElement(m_context, obj, i);
143 if(JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value)) {
144 ThrowMsg(InvalidArgumentException, "CompositeFilter.filters has null elements.");
149 filter = toFilter(value);
150 } Catch (Exception) {
151 ThrowMsg(InvalidArgumentException, "Element is not an AbstractFilter (" << i << ")");
154 retVal->push_back(filter);
160 JSValueRef FilterConverter::toJSValueRef(const CompositeFilterPtr& arg)
163 ThrowMsg(NullPointerException, "CompositeFilter is NULL.");
165 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSCompositeFilter::getClassRef(), arg);
168 CompositeFilterPtr FilterConverter::toCompositeFilter(const JSValueRef& arg)
171 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
173 if(!JSCompositeFilter::isObjectOfClass(m_context, arg))
174 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
176 return JSCompositeFilter::getCompositeFilter(m_context, arg);
179 JSValueRef FilterConverter::toJSValueRef(const AttributeFilterPtr& arg)
182 ThrowMsg(NullPointerException, "AttributeFilter is NULL.");
184 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSAttributeFilter::getClassRef(), arg);
187 AttributeFilterPtr FilterConverter::toAttributeFilter(const JSValueRef& arg)
190 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
192 if(!JSAttributeFilter::isObjectOfClass(m_context, arg))
193 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
195 return JSAttributeFilter::getAttributeFilter(m_context, arg);
198 JSValueRef FilterConverter::toJSValueRef(const AttributeRangeFilterPtr& arg)
201 ThrowMsg(NullPointerException, "AttributeRangeFilter is NULL.");
203 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSAttributeRangeFilter::getClassRef(), arg);
206 AttributeRangeFilterPtr FilterConverter::toAttributeRangeFilter(const JSValueRef& arg)
209 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
211 if(!JSAttributeRangeFilter::isObjectOfClass(m_context, arg))
212 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
214 return JSAttributeRangeFilter::getAttributeRangeFilter(m_context, arg);
217 JSValueRef FilterConverter::toJSValueRef(const SortModePtr& arg)
220 ThrowMsg(NullPointerException, "SortMode is NULL.");
222 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSSortMode::getClassRef(), arg);
225 SortModePtr FilterConverter::toSortMode(const JSValueRef& arg)
228 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
230 if(!JSSortMode::isObjectOfClass(m_context, arg))
231 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
233 return JSSortMode::getSortMode(m_context, arg);
236 JSValueRef FilterConverter::toJSValueRef(const SortModeArrayPtr& arg)
238 // Not used any more.
240 ThrowMsg(NullPointerException, "SortModeArray is NULL.");
242 int size = arg->size();
244 JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
246 ThrowMsg(ConversionException, "Can not create array object.");
248 for(int i = 0; i < size; i++)
250 JSValueRef jsvalue = toJSValueRef(arg->at(i));
251 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue))
252 ThrowMsg(ConversionException, "Can not fill SortMode array.");
255 return static_cast<JSValueRef>(resultObject);
258 SortModeArrayPtr FilterConverter::toSortModeArray(const JSValueRef& arg)
260 // Not used any more.
262 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
264 if(!JSIsArrayValue(m_context, arg))
265 ThrowMsg(InvalidArgumentException, "Not an array type.");
267 SortModeArrayPtr sortModeArray = SortModeArrayPtr(new SortModeArray());
268 JSObjectRef object = toJSObjectRef(arg);
270 unsigned int length = JSGetArrayLength(m_context, object);
271 for(unsigned int i=0; i<length; i++)
273 JSValueRef value = JSGetArrayElement(m_context, object, i);
275 if(JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value)) {
276 ThrowMsg(InvalidArgumentException, "CompositeFilter.filters has null elements.");
279 SortModePtr sortMode = toSortMode(value);
281 sortModeArray->push_back(sortMode);
284 return sortModeArray;
287 JSValueRef FilterConverter::toJSValueRef(const AnyPtr& arg)
290 ThrowMsg(NullPointerException, "Any is NULL.");
292 AnyTypeConverterFactory::ConverterType converter =
293 AnyTypeConverterFactory::getConverter(m_context);
295 return converter->toJSValueRef(arg);
298 AnyPtr FilterConverter::toAny(const JSValueRef& arg)
301 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
305 AnyTypeConverterFactory::ConverterType converter =
306 AnyTypeConverterFactory::getConverter(m_context);
308 return converter->toAny(arg);
311 JSValueRef FilterConverter::toJSValueRef(const AnyArrayPtr& arg)
314 ThrowMsg(NullPointerException, "AnyArray is NULL.");
316 AnyTypeConverterFactory::ConverterType converter =
317 AnyTypeConverterFactory::getConverter(m_context);
319 int size = arg->size();
321 JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
323 ThrowMsg(ConversionException, "Can not create array object.");
325 for(int i = 0; i < size; i++)
327 JSValueRef jsvalue = converter->toJSValueRef(arg->at(i));
328 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue))
329 ThrowMsg(ConversionException, "Can not fill any array.");
332 return static_cast<JSValueRef>(resultObject);
335 AnyArrayPtr FilterConverter::toAnyArray(const JSValueRef& arg)
338 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
342 retVal = AnyArrayPtr(new AnyArray());
344 JSObjectRef obj = toJSObjectRef(arg);
345 AnyTypeConverterFactory::ConverterType converter =
346 AnyTypeConverterFactory::getConverter(m_context);
348 unsigned int length = JSGetArrayLength(m_context, obj);
349 for(unsigned int i=0; i<length; i++)
351 JSValueRef value = JSGetArrayElement(m_context, obj, i);
353 if(JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value)) {
354 ThrowMsg(InvalidArgumentException, "IDFilter.ids has null elements.");
356 AnyPtr any = converter->toAny(value);
358 retVal->push_back(any);
364 JSValueRef FilterConverter::toJSValueRef(const FilterType& arg)
366 string compositeFilterTypeStr;
368 if(arg == UNION_FILTER)
369 compositeFilterTypeStr = "UNION";
370 else if(arg == INTERSECTION_FILTER)
371 compositeFilterTypeStr = "INTERSECTION";
373 ThrowMsg(ConversionException, "Can not create CompositeFilterType.");
375 return toJSValueRef(compositeFilterTypeStr);
378 FilterType FilterConverter::toCompositeFilterType(const JSValueRef& arg)
381 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
383 if(!JSValueIsString(m_context, arg))
384 ThrowMsg(InvalidArgumentException, "Value is not an string.");
386 string compositeFilterTypeStr = toString(arg);
387 FilterType compositeFilterType;
389 if(compositeFilterTypeStr == "UNION")
390 compositeFilterType = UNION_FILTER;
391 else if(compositeFilterTypeStr == "INTERSECTION")
392 compositeFilterType = INTERSECTION_FILTER;
394 ThrowMsg(InvalidArgumentException, "CompositeFilterType cannot have " << compositeFilterTypeStr);
396 return compositeFilterType;
399 JSValueRef FilterConverter::toJSValueRef(const MatchFlag& arg)
403 if(arg == MATCH_EXACTLY)
404 matchFlagStr = "EXACTLY";
405 else if(arg == MATCH_FULLSTRING)
406 matchFlagStr = "FULLSTRING";
407 else if(arg == MATCH_CONTAINS)
408 matchFlagStr = "CONTAINS";
409 else if(arg == MATCH_STARTSWITH)
410 matchFlagStr = "STARTSWITH";
411 else if(arg == MATCH_ENDSWITH)
412 matchFlagStr = "ENDSWITH";
413 else if(arg == MATCH_EXISTS)
414 matchFlagStr = "EXISTS";
416 ThrowMsg(ConversionException, "Can not create MatchFlag.");
418 return toJSValueRef(matchFlagStr);
421 MatchFlag FilterConverter::toMatchFlag(const JSValueRef& arg)
424 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
426 if(!JSValueIsString(m_context, arg))
427 ThrowMsg(InvalidArgumentException, "Value is not an string.");
429 string matchFlagStr = toString(arg);
432 if(matchFlagStr == "EXACTLY")
433 matchFlag = MATCH_EXACTLY;
434 else if(matchFlagStr == "FULLSTRING")
435 matchFlag = MATCH_FULLSTRING;
436 else if(matchFlagStr == "CONTAINS")
437 matchFlag = MATCH_CONTAINS;
438 else if(matchFlagStr == "STARTSWITH")
439 matchFlag = MATCH_STARTSWITH;
440 else if(matchFlagStr == "ENDSWITH")
441 matchFlag = MATCH_ENDSWITH;
442 else if(matchFlagStr == "EXISTS")
443 matchFlag = MATCH_EXISTS;
445 ThrowMsg(InvalidArgumentException, "FilterMatchFlag cannot have " << matchFlagStr);
450 JSValueRef FilterConverter::toJSValueRef(const SortOrder& arg)
454 if(arg == ASCENDING_SORT_ORDER)
455 sortOrderStr = "ASC";
456 else if(arg == DESCENDING_SORT_ORDER)
457 sortOrderStr = "DESC";
459 ThrowMsg(ConversionException, "Can not create SortModeOrder.");
461 return toJSValueRef(sortOrderStr);
464 SortOrder FilterConverter::toSortOrder(const JSValueRef& arg)
467 ThrowMsg(NullPointerException, "JSValueRef is NULL.");
469 if(!JSValueIsString(m_context, arg))
470 ThrowMsg(InvalidArgumentException, "Value is not an string.");
472 string sortOrderStr = toString(arg);
475 if(sortOrderStr == "ASC")
476 sortOrder = ASCENDING_SORT_ORDER;
477 else if(sortOrderStr == "DESC")
478 sortOrder = DESCENDING_SORT_ORDER;
480 ThrowMsg(InvalidArgumentException, "SortModeOrder cannot have " << sortOrderStr);
485 void FilterConverter::initFilterAttrs()
487 m_compositeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_TYPE);
488 m_compositeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_FILTERS);
490 m_attributeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_ATTRIBUTE_NAME);
491 m_attributeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_MATCH_FLAG);
492 m_attributeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_MATCH_VALUES);
494 m_attributeRangeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_ATTRIBUTE_NAME);
495 m_attributeRangeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_INITIAL_VALUE);
496 m_attributeRangeFilterAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_END_VALUE);
498 m_sortModeAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_ORDER);
499 m_sortModeAttrs.push_back(TIZEN_FILTER_CONVERTER_ATTRIBUTE_ATTRIBUTE_NAME);