Class MerchIndexingListener
- java.lang.Object
-
- com.hybris.merchandising.indexer.listeners.MerchIndexingListener
-
- All Implemented Interfaces:
IndexerBatchListener,IndexerListener,org.springframework.beans.factory.Aware,org.springframework.beans.factory.BeanFactoryAware
public class MerchIndexingListener extends java.lang.Object implements IndexerBatchListener, org.springframework.beans.factory.BeanFactoryAware, IndexerListener
MerchIndexingListener is a listener for carrying out actions following a Solr index.
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.lang.StringACTION_KEYprotected static java.lang.StringCATALOG_IDprotected static java.lang.StringCATALOG_VERSIONprotected static java.lang.StringDEFAULT_QUERY_TEMPLATEprotected static java.lang.StringDESCRIPTION_KEYprotected static java.lang.StringEXECUTEprotected static java.lang.StringFACET_KEYprotected static java.lang.StringFACET_VALUES_KEYprotected static java.lang.StringID_KEYprotected static java.lang.StringIMAGES_KEYprotected static java.lang.StringNAME_KEYprotected static java.lang.StringSUMMARY_KEYprotected static java.lang.StringURL_KEY
-
Constructor Summary
Constructors Constructor Description MerchIndexingListener()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidafterBatch(IndexerBatchContext batchContext)Handles a notification that the processing for a particularIndexerBatchContexthas just been completed.voidafterBatchError(IndexerBatchContext batchContext)Handles a notification that the processing for a particularIndexerBatchContextfailed.voidafterIndex(IndexerContext context)Handles a notification that the indexing for a particularIndexerContexthas just been completed.voidafterIndexError(IndexerContext context)Handles a notification that the indexing for a particularIndexerContextfailed.voidbeforeBatch(IndexerBatchContext batchContext)Handles a notification that the processing for a particularIndexerBatchContextis about to begin.voidbeforeIndex(IndexerContext context)Handles a notification that the indexing for a particularIndexerContextis about to begin.protected java.lang.StringcreateActionForIndexOperation(IndexOperation indexOperation)createActionForIndexOperation is a method for retrieving the action to use when sending to Merchandising for a givenIndexOperation.protected java.util.Map<java.lang.Object,java.lang.Object>createFacetValueMapping(java.lang.Object fieldValue, SearchQuery query, IndexedProperty indexedProperty, java.lang.Object displayNameProvider)createFacetValueMapping creates a map of key -> value pairs for a given facet.protected java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo>createIndexedPropertiesMapping(IndexerBatchContext batchContext, SearchQuery searchQuery)createIndexedPropertiesMapping is a method for retrieving a map of configured key value pairs for handling mapping between Solr internal data model and what to export.protected com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfocreateIndexedPropertyInfo(SearchQuery searchQuery, IndexedProperty indexedProperty)createIndexedPropertyInfo is a method for returning anMerchIndexingListener.IndexedPropertyInforepresenting a mapping from the Solr output to the configured Merchandising specific output.protected java.util.Map<java.lang.String,FacetField>createMerchFacetPropertiesMapping(IndexerBatchContext batchContext, SearchQuery searchQuery, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)createMerchFacetPropertiesMapping is a method for mapping facets to output for consumption by Merchandising.protected java.util.List<java.util.Map<java.lang.Object,java.lang.Object>>createMerchFacetValues(FacetField facet, SearchQuery query, IndexedProperty indexedProperty, InputDocument document, com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo indexedPropertyInfo)createMerchFacetValues is a method for retrieving the values for a provided facet.protected java.util.Map<java.lang.String,java.lang.String>createMerchImagePropertiesMapping(java.util.List<MerchImagePropertyModel> merchImageProperties, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)createMerchImagePropertiesMapping is an image specific method from mapping from a configured list ofMerchImagePropertyModelto the indexed properties within Solr.protected java.util.Map<java.lang.String,java.lang.String>createMerchPropertiesMapping(java.util.List<MerchPropertyModel> merchProperties, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)createMerchPropertiesMapping is a method for mapping from the configured list ofMerchPropertyModelto the indexed properties within Solr.protected SearchQuerycreateSearchQuery(IndexerBatchContext batchContext, MerchIndexingConfigModel merchIndexingConfig)createSearchQuery is used to generate an instance ofSearchQueryto query Solr to retrieve updated product information.protected java.lang.StringextractPropName(AbstractMerchPropertyModel merchProp)extractPropName is a method for retrieving the name of an indexed property.protected java.lang.StringextractPropTranslatedName(AbstractMerchPropertyModel merchProp)extractPropTranslatedName is a method for retrieving the mapped name of an indexed property.protected CommonI18NServicegetCommonI18NService()FacetSearchServicegetFacetSearchService()FieldNameTranslatorgetFieldNameTranslator()MerchCatalogServiceClientgetMerchCatalogServiceClient()protected MerchCategoryExportergetMerchCategoryExporter()protected MerchIndexingConfigServicegetMerchIndexingConfigService()protected SessionServicegetSessionService()protected booleanisMerchIndexingEnabled(java.util.Optional<MerchIndexingConfigModel> merchIdxConf)protected booleanisToSynchronize(java.util.List<CatalogVersionModel> catalogVersionsToExport, InputDocument document)isToSynchonize is a method for determining whether a given document is for the Online or Staging catalog.protected voidpopulateBasicProperties(java.util.Map<java.lang.String,java.lang.Object> product, IndexerBatchContext batchContext)populateBasicProperties is used to retrieve a value from theIndexerBatchContextand update it in the provided output map.protected voidpopulateMerchFacetProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,FacetField> merchFacetPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, SearchQuery searchQuery)populateMerchFacetProperties is a method for populating facet information in the mapping to Merchandising.protected voidpopulateMerchImagesProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,java.lang.String> merchImagesPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, MerchIndexingConfigModel merchIndexingConfig)populateMerchImagesProperties is a method for retrieving values from the providedInputDocument.protected voidpopulateMerchProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,java.lang.String> merchPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, MerchIndexingConfigModel indexConfig)populateMerchProperties is a method for retrieving values from the providedInputDocument.protected java.lang.StringresolveFacetValueDisplayName(SearchQuery searchQuery, IndexedProperty indexedProperty, java.lang.Object facetDisplayNameProvider, java.lang.String facetValue)resolveFacetValueDisplayName is a method for retrieving the display name for a given facet.protected java.lang.ObjectresolveFacetValuesDisplayNameProvider(java.lang.String beanName)resolveFacetValuesDisplayNameProvider is a utility method for retrieving a bean from the configured bean factory.protected voidsanitiseFields(java.util.Map<java.lang.String,java.lang.Object> product)Sanitise fields is a method for URL encoding specific fields of a product.voidsetBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)voidsetCommonI18NService(CommonI18NService commonI18NService)voidsetFacetSearchService(FacetSearchService facetSearchService)voidsetFieldNameTranslator(FieldNameTranslator fieldNameTranslator)voidsetMerchCatalogServiceClient(MerchCatalogServiceClient merchCatalogServiceClient)voidsetMerchCategoryExporter(MerchCategoryExporter merchCategoryExporter)voidsetMerchIndexingConfigService(MerchIndexingConfigService merchIndexingConfigService)voidsetSessionService(SessionService sessionService)protected java.lang.StringtranslateField(SearchQuery query, java.lang.String field)translateField returns the translated value for a given query and field.
-
-
-
Field Detail
-
DEFAULT_QUERY_TEMPLATE
protected static final java.lang.String DEFAULT_QUERY_TEMPLATE
- See Also:
- Constant Field Values
-
EXECUTE
protected static final java.lang.String EXECUTE
- See Also:
- Constant Field Values
-
ID_KEY
protected static final java.lang.String ID_KEY
- See Also:
- Constant Field Values
-
NAME_KEY
protected static final java.lang.String NAME_KEY
- See Also:
- Constant Field Values
-
DESCRIPTION_KEY
protected static final java.lang.String DESCRIPTION_KEY
- See Also:
- Constant Field Values
-
SUMMARY_KEY
protected static final java.lang.String SUMMARY_KEY
- See Also:
- Constant Field Values
-
ACTION_KEY
protected static final java.lang.String ACTION_KEY
- See Also:
- Constant Field Values
-
IMAGES_KEY
protected static final java.lang.String IMAGES_KEY
- See Also:
- Constant Field Values
-
FACET_KEY
protected static final java.lang.String FACET_KEY
- See Also:
- Constant Field Values
-
FACET_VALUES_KEY
protected static final java.lang.String FACET_VALUES_KEY
- See Also:
- Constant Field Values
-
URL_KEY
protected static final java.lang.String URL_KEY
- See Also:
- Constant Field Values
-
CATALOG_VERSION
protected static final java.lang.String CATALOG_VERSION
- See Also:
- Constant Field Values
-
CATALOG_ID
protected static final java.lang.String CATALOG_ID
- See Also:
- Constant Field Values
-
-
Method Detail
-
afterBatch
public void afterBatch(IndexerBatchContext batchContext) throws IndexerException
Handles a notification that the processing for a particularIndexerBatchContexthas just been completed.- Specified by:
afterBatchin interfaceIndexerBatchListener- Parameters:
batchContext- - theIndexerBatchContext- Throws:
IndexerException- if an error occurs
-
isToSynchronize
protected boolean isToSynchronize(java.util.List<CatalogVersionModel> catalogVersionsToExport, InputDocument document)
isToSynchonize is a method for determining whether a given document is for the Online or Staging catalog.- Parameters:
catalogVersionsToExport- a list of configured catalog versions for synchronizing with Merchandising.document- theInputDocumentwhich has been indexed.- Returns:
- true if the catalog / catalog version are to be synchronized, false otherwise.
-
sanitiseFields
protected void sanitiseFields(java.util.Map<java.lang.String,java.lang.Object> product)
Sanitise fields is a method for URL encoding specific fields of a product.- Parameters:
product- the product to sanitise (as a Map).
-
createSearchQuery
protected SearchQuery createSearchQuery(IndexerBatchContext batchContext, MerchIndexingConfigModel merchIndexingConfig) throws IndexerException
createSearchQuery is used to generate an instance ofSearchQueryto query Solr to retrieve updated product information.- Parameters:
batchContext- theIndexerBatchContextrepresenting the indexer batch.merchIndexingConfig- theMerchIndexingConfigModelrepresenting the config we are using for the indexing.- Returns:
- an
SearchQueryto use with the search. - Throws:
IndexerException- in case of error.
-
createIndexedPropertiesMapping
protected java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> createIndexedPropertiesMapping(IndexerBatchContext batchContext, SearchQuery searchQuery)
createIndexedPropertiesMapping is a method for retrieving a map of configured key value pairs for handling mapping between Solr internal data model and what to export.- Parameters:
batchContext- theIndexerBatchContextto retrieve from.searchQuery- theSearchQueryused to create the indexed property with.- Returns:
- a Map containing key value pairs for the mapping.
-
createIndexedPropertyInfo
protected com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo createIndexedPropertyInfo(SearchQuery searchQuery, IndexedProperty indexedProperty)
createIndexedPropertyInfo is a method for returning anMerchIndexingListener.IndexedPropertyInforepresenting a mapping from the Solr output to the configured Merchandising specific output.- Parameters:
searchQuery- theSearchQuerybeing used to retrieve the value from.indexedProperty- theIndexedPropertybeing used for the query.- Returns:
- an
IndexedPropertyInforepresenting the mapping.
-
createMerchPropertiesMapping
protected java.util.Map<java.lang.String,java.lang.String> createMerchPropertiesMapping(java.util.List<MerchPropertyModel> merchProperties, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)
createMerchPropertiesMapping is a method for mapping from the configured list ofMerchPropertyModelto the indexed properties within Solr.- Parameters:
merchProperties- the mapping we wish to use for the output.indexedPropertiesMapping- the Solr mapping.- Returns:
- a Map containing the mapped output.
-
createMerchImagePropertiesMapping
protected java.util.Map<java.lang.String,java.lang.String> createMerchImagePropertiesMapping(java.util.List<MerchImagePropertyModel> merchImageProperties, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)
createMerchImagePropertiesMapping is an image specific method from mapping from a configured list ofMerchImagePropertyModelto the indexed properties within Solr.- Parameters:
merchImageProperties- the mapping we wish to use for the image output.indexedPropertiesMapping- the Solr mapping.- Returns:
- a Map containing the mapped output.
-
extractPropName
protected java.lang.String extractPropName(AbstractMerchPropertyModel merchProp)
extractPropName is a method for retrieving the name of an indexed property.- Parameters:
merchProp- anAbstractMerchPropertyModelwe wish to retrieve the name of.- Returns:
- a String containing the name.
-
extractPropTranslatedName
protected java.lang.String extractPropTranslatedName(AbstractMerchPropertyModel merchProp)
extractPropTranslatedName is a method for retrieving the mapped name of an indexed property. If not present, we default to the name of the indexed property.- Parameters:
merchProp- theAbstractMerchPropertyModelwe wish to retrieve the name of.- Returns:
- a String containing the name.
-
createMerchFacetPropertiesMapping
protected java.util.Map<java.lang.String,FacetField> createMerchFacetPropertiesMapping(IndexerBatchContext batchContext, SearchQuery searchQuery, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping)
createMerchFacetPropertiesMapping is a method for mapping facets to output for consumption by Merchandising.- Parameters:
batchContext- theIndexerBatchContextrepresenting the indexer batch.searchQuery- theSearchQueryused for the request.indexedPropertiesMapping- the mapping used for the request.- Returns:
- a Map containing key -> facet pairs.
-
populateBasicProperties
protected void populateBasicProperties(java.util.Map<java.lang.String,java.lang.Object> product, IndexerBatchContext batchContext)populateBasicProperties is used to retrieve a value from theIndexerBatchContextand update it in the provided output map.- Parameters:
product- aMaprepresenting the product output.batchContext- anIndexerBatchContextto retrieve product details from.
-
populateMerchProperties
protected void populateMerchProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,java.lang.String> merchPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, MerchIndexingConfigModel indexConfig)populateMerchProperties is a method for retrieving values from the providedInputDocument.- Parameters:
product- aMaprepresenting the product output.document- theInputDocumentrepresenting the search result.merchPropertiesMapping- a key -> value pair mapping for mapping to Merchandising output.indexedPropertiesMapping- a map containing indexed properties.indexConfig- an instance ofMerchIndexingConfigModelcontaining the configuration being used for this indexing.
-
populateMerchImagesProperties
protected void populateMerchImagesProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,java.lang.String> merchImagesPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, MerchIndexingConfigModel merchIndexingConfig)populateMerchImagesProperties is a method for retrieving values from the providedInputDocument.- Parameters:
product- aMaprepresenting the product output.document- theInputDocumentrepresenting the search result.merchImagesPropertiesMapping- a key -> value pair mapping for mapping to Merchandising output.indexedPropertiesMapping- a map containing indexed properties.merchIndexingConfig- an instance ofMerchIndexingConfigModelcontaining the configuration being used for this indexing.
-
populateMerchFacetProperties
protected void populateMerchFacetProperties(java.util.Map<java.lang.String,java.lang.Object> product, InputDocument document, java.util.Map<java.lang.String,FacetField> merchFacetPropertiesMapping, java.util.Map<java.lang.String,com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo> indexedPropertiesMapping, SearchQuery searchQuery)populateMerchFacetProperties is a method for populating facet information in the mapping to Merchandising.- Parameters:
product- aMaprepresenting the product output.document- theInputDocumentrepresenting the search result.merchFacetPropertiesMapping- a key -> value pair mapping for mapping to Merchandising output.indexedPropertiesMapping- a map containing indexed properties.searchQuery- theSearchQuerybeing used to retrieve facets from.
-
createMerchFacetValues
protected java.util.List<java.util.Map<java.lang.Object,java.lang.Object>> createMerchFacetValues(FacetField facet, SearchQuery query, IndexedProperty indexedProperty, InputDocument document, com.hybris.merchandising.indexer.listeners.MerchIndexingListener.IndexedPropertyInfo indexedPropertyInfo)
createMerchFacetValues is a method for retrieving the values for a provided facet.- Parameters:
facet- theFacetFieldwe are retrieving values for.query- theSearchQueryto retrieve values using.indexedProperty- theIndexedPropertyrepresenting the value we wish to retrieve.indexedPropertyInfo- theMerchIndexingListener.IndexedPropertyInforepresenting the field to retrieve.- Returns:
- a Map containing the facet mapping.
-
resolveFacetValuesDisplayNameProvider
protected java.lang.Object resolveFacetValuesDisplayNameProvider(java.lang.String beanName)
resolveFacetValuesDisplayNameProvider is a utility method for retrieving a bean from the configured bean factory.- Parameters:
beanName- the bean to retrieve.- Returns:
- an
Objectrepresenting the bean if found, null otherwise.
-
resolveFacetValueDisplayName
protected java.lang.String resolveFacetValueDisplayName(SearchQuery searchQuery, IndexedProperty indexedProperty, java.lang.Object facetDisplayNameProvider, java.lang.String facetValue)
resolveFacetValueDisplayName is a method for retrieving the display name for a given facet.- Parameters:
searchQuery- theSearchQuerywe are using for the retrieval.indexedProperty- theIndexedPropertywe are retrieving.facetDisplayNameProvider- the value provider for the display name.facetValue- the value we wish to retrieve.- Returns:
- the display name for the facet.
-
createFacetValueMapping
protected java.util.Map<java.lang.Object,java.lang.Object> createFacetValueMapping(java.lang.Object fieldValue, SearchQuery query, IndexedProperty indexedProperty, java.lang.Object displayNameProvider)createFacetValueMapping creates a map of key -> value pairs for a given facet.- Parameters:
fieldValue- the value of the facet to use.query- theSearchQuerybeing used to resolve the display name from.indexedProperty- theIndexedPropertybeing used to resolve the display name from.displayNameProvider- the configured display name provider.- Returns:
- a Map containing facet value mapping.
-
translateField
protected java.lang.String translateField(SearchQuery query, java.lang.String field)
translateField returns the translated value for a given query and field.- Parameters:
query- theSearchQuerywe are using to retrieve the translated value from.field- the query's field to retrieve.- Returns:
- a String containing the translated field.
-
createActionForIndexOperation
protected java.lang.String createActionForIndexOperation(IndexOperation indexOperation)
createActionForIndexOperation is a method for retrieving the action to use when sending to Merchandising for a givenIndexOperation.- Parameters:
indexOperation- the operation to retrieve the value for.- Returns:
- the action to use.
-
isMerchIndexingEnabled
protected boolean isMerchIndexingEnabled(java.util.Optional<MerchIndexingConfigModel> merchIdxConf)
-
afterIndex
public void afterIndex(IndexerContext context) throws IndexerException
Handles a notification that the indexing for a particularIndexerContexthas just been completed.- Specified by:
afterIndexin interfaceIndexerListener- Parameters:
context- - theIndexerContext- Throws:
IndexerException- if an error occurs
-
beforeBatch
public void beforeBatch(IndexerBatchContext batchContext) throws IndexerException
Handles a notification that the processing for a particularIndexerBatchContextis about to begin.- Specified by:
beforeBatchin interfaceIndexerBatchListener- Parameters:
batchContext- - theIndexerBatchContext- Throws:
IndexerException- if an error occurs
-
afterBatchError
public void afterBatchError(IndexerBatchContext batchContext) throws IndexerException
Handles a notification that the processing for a particularIndexerBatchContextfailed.- Specified by:
afterBatchErrorin interfaceIndexerBatchListener- Parameters:
batchContext- - theIndexerBatchContext- Throws:
IndexerException- if an error occurs
-
beforeIndex
public void beforeIndex(IndexerContext context) throws IndexerException
Handles a notification that the indexing for a particularIndexerContextis about to begin.- Specified by:
beforeIndexin interfaceIndexerListener- Parameters:
context- - theIndexerContext- Throws:
IndexerException- if an error occurs
-
afterIndexError
public void afterIndexError(IndexerContext context) throws IndexerException
Handles a notification that the indexing for a particularIndexerContextfailed.- Specified by:
afterIndexErrorin interfaceIndexerListener- Parameters:
context- - theIndexerContext- Throws:
IndexerException- if an error occurs
-
setBeanFactory
public void setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory) throws org.springframework.beans.BeansException- Specified by:
setBeanFactoryin interfaceorg.springframework.beans.factory.BeanFactoryAware- Throws:
org.springframework.beans.BeansException
-
getFacetSearchService
public FacetSearchService getFacetSearchService()
-
setFacetSearchService
public void setFacetSearchService(FacetSearchService facetSearchService)
-
getFieldNameTranslator
public FieldNameTranslator getFieldNameTranslator()
-
setFieldNameTranslator
public void setFieldNameTranslator(FieldNameTranslator fieldNameTranslator)
-
getMerchCatalogServiceClient
public MerchCatalogServiceClient getMerchCatalogServiceClient()
-
setMerchCatalogServiceClient
public void setMerchCatalogServiceClient(MerchCatalogServiceClient merchCatalogServiceClient)
-
getMerchIndexingConfigService
protected MerchIndexingConfigService getMerchIndexingConfigService()
-
setMerchIndexingConfigService
public void setMerchIndexingConfigService(MerchIndexingConfigService merchIndexingConfigService)
-
getSessionService
protected SessionService getSessionService()
-
setSessionService
public void setSessionService(SessionService sessionService)
-
getCommonI18NService
protected CommonI18NService getCommonI18NService()
-
setCommonI18NService
public void setCommonI18NService(CommonI18NService commonI18NService)
-
getMerchCategoryExporter
protected MerchCategoryExporter getMerchCategoryExporter()
-
setMerchCategoryExporter
public void setMerchCategoryExporter(MerchCategoryExporter merchCategoryExporter)
-
-