public class EtlConfig extends Object implements CacheProvider<String,Object>, ObjectStorage, FieldsRepository, Serializable, InfoLogger, ExecutorProvider
Modifier and Type | Class and Description |
---|---|
static class |
EtlConfig.CREATE_CONFIG_ERRORS
Possible errors during creation of the configuration file.
|
FieldsRepository.FieldsRepositoryConfig
Modifier and Type | Field and Description |
---|---|
static Map<String,Integer> |
ACTIONS
The map of ACTIONS.
|
static Map<String,String> |
ACTIONS_DESC
The map ACTION descriptions.
|
static String |
ACTIVE_CONNECTIONS
The ACTIVE_CONNECTIONS.
|
static String |
ALIAS
The ALIAS.
|
static String |
ALIAS_PARAMS
The ALIAS_PARAMS.
|
static String |
AUTO_COMMIT
The AUTO_COMMIT flag.
|
static String |
CACHE
The CACHE.
|
static String |
CDATA
The CDATA.
|
static String |
CLEAR_VAR
The CLEAR variable name.
|
static String |
CONFIG
The CONFIG.
|
static String |
CONN_NAME
The CONN_NAME.
|
static String |
CONNECOR_CLASS_NAME
The CONNECOR_CLASS_NAME.
|
static String |
CONNECTION
The Constant CONNECTION.
|
static String |
CONNECTION_ALIAS
The CONNECTION_ALIAS.
|
static String |
CONNECTION_FACTORY
The CONNECTION_FACTORY.
|
static String |
CONNECTIONS
The CONNECTIONS.
|
static String |
CREATE_SQL
The CREATE_SQL.
|
static String |
CREATE_TABLE_VAR
The CREATE_TABLE variable name.
|
static String |
DATA_FILENAME_VAR
The DATA_FILENAME variable name.
|
static String |
DATA_FOLDER_VAR
The DATA_FOLDER variable name.
|
static String |
DB_PARAMS_VAR
The DB_PARAMS variable name.
|
static String |
DB_URL_VAR
The DB_URL variable name.
|
static int |
DEF_MAX_THREADS_IN_POLL_VAR
The DEF MAX NUMBER OF THREADS
|
static int |
DEFAULT_ACTION
The DEFAULT ACTION.
|
static String |
DEFAULT_ACTION_DESC
The default action description.
|
static String |
DEFAULT_APP_NAME
The DEFAULT_APP_NAME for the ETl framework.
|
static String |
DEFAULT_CACHE_CLASS
The DEFAULT_CACHE_CLASS.
|
static String |
DEFAULT_CONNECTION_FACTORY_CLASS
The DEFAULT_CONNECTION_FACTORY_CLASS.
|
static String |
DEFAULT_CONNECTOR
The DEFAULT_CONNECTOR.
|
static String |
DEFAULT_DELIMITER
The DEFAULT_DELIMITER.
|
static String |
DEFAULT_DRIVER
The DEFAULT DRIVER CLASS NAME.
|
static String |
DEFAULT_ETL_CONFIG
The default etl config file name.
|
static long |
DEFAULT_KEEP_ALIVE_INTERVAL
The default keep alive interval.
|
static long |
DEFAULT_KILL_INTERVAL
The default kill interval.
|
static int |
DEFAULT_LOG_LEVEL
The DEFAULT_LOG_LEVEL.
|
static int |
DEFAULT_LOG_STEP
The DEFAULT_LOG_STEP.
|
static String |
DEFAULT_SCENARIO_PATH
The default scenarios path.
|
static String |
DEFAULT_TITLE
The DEFAULT_TITLE for the ETl framework.
|
static String |
DELIMETER_VAR
The DELIMETER variable name.
|
static String |
DEST_CONNECTION_NAME
The default destination connection name.
|
static String |
DESTINATION
The DESTINATION.
|
static String |
DESTINATION_DATA_SET_VAR
The DESTINATION DATA SET variable name.
|
static String |
DESTINATIONS
The DESTINATIONS.
|
static String |
DRIVER
The DRIVER.
|
static String |
DRIVING_DATA_SET_VAR
The DRIVING DATA SET variable name.
|
static String |
DROP_SQL
The DROP_SQL.
|
static String |
ERROR_MASK_VAR
The ERROR_MASK variable name.
|
static String |
ETL_CODE
The ETL_CODE.
|
static String |
ETL_CONFIG_PROP
The ETL_CONFIG file name property.
|
static String |
EXCLUDE_VAR
The EXCLUDE variable name.
|
static String |
EXECUTE
The EXECUTE.
|
static int |
EXTRACT
Extract only.
|
static String |
EXTRACT_DESC_STR
The EXTRACT description.
|
static int |
EXTRACT_LOAD
Extracts and loads data.
|
static String |
EXTRACT_LOAD_DESC_STR
The EXTRACT and LOAD description.
|
static String |
EXTRACT_LOAD_STR
The EXTRACT and LOAD code.
|
static String |
EXTRACT_STR
The EXTRACT code.
|
static String |
FIELDS_VAR
The FIELDS variable name.
|
static String |
FILE_VAR
The FILE variable name.
|
static String |
FROM_CONNECTION_NAME_VAR
The 'FROM' CONNECTION NAME variable name.
|
static String |
GROUP_BY_VAR
The GROUP_BY variable name.
|
static String |
IGNORE_CASE_VAR
The IGNORE CHAR CASE variable name.
|
static String |
INCLUDE_VAR
The INCLUDE variable name.
|
static String |
INIT_SQL
The INIT_SQL.
|
static String |
INSERT_VAR
The INSERT variable name.
|
static String |
KEEP_ALIVE_PROP
The Constant KEEP_ALIVE_PROP.
|
static String |
KEYS_VAR
The KEYS variable name.
|
static String |
KILL_PROP |
static int |
LOAD
Load only.
|
static String |
LOAD_DESC_STR
The LOAD description.
|
static String |
LOAD_STR
The LOAD code.
|
static String |
LOG_LEVEL
The LOG LEVEL.
|
static String |
LOG_STEP
The Constant LOG_STEP.
|
static String |
MAX_THREADS_IN_POLL_VAR
The MAX NUMBER OF THREADS variable name.
|
static String |
MAX_THREADS_VAR
The MAX NUMBER OF THREADS variable name.
|
static String |
NONE
The NONE.
|
static int |
NOTHING
Does nothing.
|
static String |
ONEXCEPTION_VAR
The ONEXCEPTION variable name.
|
static String |
PARAMS_VAR
The PARAMS variable name.
|
static String |
PASSWORD
The PASSWORD.
|
static String |
PASSWORD_VAR
The PASSWORD variable name.
|
static String |
PERSIST_METADATA_VAR
The PERSIST_METADATA variable name.
|
static String |
PROPERTIES
The PROPERTIES.
|
static int |
RETURN_CANCELLED
Process cancelled.
|
static int |
RETURN_CONFIG_NOT_INITIALIZED
Process finished, config cannot be initialized or was not initialized.
|
static int |
RETURN_ERROR
Process finished, there are errors.
|
static int |
RETURN_NO_CONFIG
Process finished, config is not specified or cannot be found.
|
static int |
RETURN_NO_DRIVERS
Process finished, no drivers or connectors found.
|
static int |
RETURN_OK
Process finished, with no errors.
|
static int |
RETURN_WARNING
Process finished, with warnings.
|
static String |
SCENARIO
The SCENARIO.
|
static String |
SCENARIO_ACTION
The SCENARIO_ACTION.
|
static String |
SCENARIO_DEST_CONNECTION_NAME
The SCENARIO_DEST_CONNECTION_NAME.
|
static String |
SCENARIO_NAME
The SCENARIO_NAME.
|
static String |
SCENARIO_PARALLEL
The SCENARIO_PARALLEL.
|
static String |
SCENARIO_PATH_PROP
The SCENARIO_PATH property.
|
static String |
SCENARIO_VAR_VALUE
The SCENARIO_VAR_VALUE.
|
static String |
SCENARIO_VARS
The SCENARIO_VARS.
|
static String |
SHELL_EXT_VAR
The SHELL_EXT variable name.
|
static String |
SOURCE
The SOURSE.
|
static String |
SOURCE_CONNECTION_NAME
The default source connection name.
|
static String |
SOURCES
The SOURSES.
|
static String |
SUCCESS_MASK_VAR
The SUCCESS_MASK variable name.
|
static String |
TABLE_VAR
The TABLE variable name.
|
static String |
TEMP_TABLE_VAR
The TEMP_TABLE variable name.
|
static String |
THIS_ROW_VAR
The THIS_ROW variable name.
|
static String |
TO_CONNECTION_NAME_VAR
The 'TO' CONNECTION NAME variable name.
|
static String |
TRANSPORT
The TRANSPORT.
|
static String |
TRIM_VAR
The TRIM variable name.
|
static String |
URL
The URL.
|
static String |
USER_ID
The USER_ID.
|
static String |
USER_VAR
The USER variable name.
|
static String |
USING_VAR
The USING variable name.
|
Constructor and Description |
---|
EtlConfig()
Instantiates a new etl config.
|
Modifier and Type | Method and Description |
---|---|
void |
addAlias(Alias alias)
Adds the alias to the map using alias name.
|
void |
addAliasToMap(String name,
Alias alias)
Adds the alias to the map using given name.
|
void |
addConnection(Alias alias,
String name,
String defName)
Creates (if needed) and adds the connection using given alias.
|
void |
addException(Throwable ex)
Adds the exception to the log of all hanlded exceptions.
|
void |
addResponseHeader(String name,
String value)
Adds the response header.
|
void |
addScenario(Scenario scenario)
Adds the scenario to execute.
|
void |
clear()
Clear the config.
|
TypedKeyValue<String,EtlConfig.CREATE_CONFIG_ERRORS> |
createConfig(String fileName,
String scriptName,
Map<String,Alias> connections,
Map<String,String> vars,
int action,
boolean override)
Create ETL configuration file.
|
TypedKeyValue<String,EtlConfig.CREATE_CONFIG_ERRORS> |
createConfig(String fileName,
String scriptName,
Map<String,Alias> connections,
Map<String,String> vars,
int action,
boolean override,
String scenarioXml)
Create ETL configuration file.
|
int |
getAction(String action)
Gets the action from the code.
|
int |
getActionByDesc(String desc)
Gets the action by description.
|
List<KeyValue> |
getActions(String actions)
Gets the actions allowed for the scenario.
|
Map<String,Alias> |
getAliasesMap()
Gets the map of the aliases.
|
AtomicLong |
getAtomicLong()
Gets the atomic long.
|
Cache<String,Object> |
getCache()
Gets the cache.
|
EtlConnectionFactory |
getConnectionFactory()
Gets the connection factory.
|
int |
getCountOfTheParallelScenarious()
Gets the count of the scenarios which will be executed in parallel.
|
List<String> |
getDebugInfo()
Gets the debug information, recorded during executing of the ETL
scenario.
|
String |
getDescByAction(String action)
Gets the action description by action.
|
Set<Driver> |
getDrivers()
Gets the drivers.
|
Point |
getErrorLocationInSql()
Gets the location of the error in SQL.
|
List<Scenario> |
getExecute()
Gets the
List of the etl scenarios to execute. |
ExecutorService |
getExecutorService(String name,
int maxThreads)
Gets the executor service.
|
List<FieldDef> |
getFieldDef(String key,
int type)
Gets the list of field definitions by given key and type.
|
Integer |
getGlobalRowLimit()
Gets the global row limit.
|
Throwable |
getLastException()
Gets the last exception.
|
String |
getLastExecutedCode()
Gets the last executed code (code = sql).
|
String |
getLastExecutedFileName()
Gets the last executed file name.
|
int |
getLogLevel()
Gets the log level.
|
int |
getLogStep()
Gets the "log step".
|
String |
getMainScenarioName()
Gets the main scenario name.
|
String |
getMetadataFileName(String driverClassName)
Gets the metadata file name.
|
String |
getMetadataFolder()
Gets the metadata folder.
|
long |
getNewAtomicLong()
Gets the new atomic long.
|
Map<String,String> |
getResponseHeaders()
Gets the response headers.
|
String |
getScenarioPath()
Gets the default path for the scenario files.
|
String |
getString(String key)
Gets the string representation of the value by the key.
|
String |
getTenant()
Gets the tenant.
|
String |
getUser()
Gets the user.
|
Object |
getValue(String key)
Gets the value by the key.
|
String |
getXmlConfigFileName()
Gets the xml config file name.
|
void |
init()
Initializes EtlConfig.
|
boolean |
initConfigXml()
Initializes the EtlConfig by parsing default xml configuration file.
|
boolean |
initConfigXml(String configFileName)
Initializes the EtlConfig by parsing given xml configuration file.
|
boolean |
isEnabled()
Checks if config enabled.
|
boolean |
isRequestStop()
Checks if user requested to stop the loop.
|
boolean |
isUpdateLocation()
Checks if "update location" flag is set.
|
boolean |
isVarcharOnly(String key)
Checks if all fields are varchars.
|
void |
log(String line)
Log the information.
|
void |
removeResponseHeader(String name)
Removes the response header.
|
void |
removeScenarios()
Removes all scenarios.
|
void |
setAliasesMap(Map<String,Alias> value)
Sets the map of aliases.
|
void |
setEnabled(boolean enabled)
Sets the enabled flag for the config.
|
void |
setErrorLocationInSql(Point value)
Sets the location of the error in SQL.
|
void |
setExecute(List<Scenario> value)
Sets the list of the etl scenarios to execute.
|
void |
setGlobalRowLimit(Integer value)
Sets the global row limit.
|
void |
setLastException(Throwable ex)
Sets the last exception.
|
void |
setLastExecutedCode(String value)
Sets the last executed code.
|
void |
setLastExecutedFileName(String value)
Sets the last executed file name.
|
void |
setLogLevel(int logLevel)
Sets the log level.
|
void |
setLogStep(int value)
Sets the log step.
|
void |
setMainScenarioName(String mainScenarioName)
Sets the main scenario name.
|
void |
setRequestStop(boolean value)
Sets the value for the "request stop" flag used to check if user
requested to stop the loop.
|
void |
setScenarioPath(String value)
Sets the scenario path.
|
void |
setTenant(String tenant)
Sets the tenant.
|
void |
setUpdateLocation(boolean value)
Sets the value of the "update location" flag.
|
void |
setUser(String user)
Sets the user.
|
void |
setValue(String key,
Object value)
Associates value with the key.
|
void |
setXmlConfigFileName(String value)
Sets the xml config file name.
|
void |
updateConnections()
Creates connections using previously set map of the aliases.
|
void |
updateLocation(LocationProvider locationProvider,
Point startLocation,
Point endLocation)
Updates location of the ETl artifact in the XML stream.
|
public static final String DEFAULT_TITLE
public static final String DEFAULT_APP_NAME
public static final int NOTHING
public static final int EXTRACT
public static final int LOAD
public static final int EXTRACT_LOAD
public static final int DEFAULT_ACTION
public static final String EXTRACT_STR
public static final String LOAD_STR
public static final String EXTRACT_LOAD_STR
public static final String EXTRACT_DESC_STR
public static final String LOAD_DESC_STR
public static final String EXTRACT_LOAD_DESC_STR
public static final String DEFAULT_ACTION_DESC
public static final Map<String,Integer> ACTIONS
public static final Map<String,String> ACTIONS_DESC
public static final int RETURN_OK
public static final int RETURN_ERROR
public static final int RETURN_NO_CONFIG
public static final int RETURN_CONFIG_NOT_INITIALIZED
public static final int RETURN_NO_DRIVERS
public static final int RETURN_WARNING
public static final int RETURN_CANCELLED
public static final String KEEP_ALIVE_PROP
public static final String KILL_PROP
public static final String SCENARIO_PATH_PROP
public static final String ETL_CONFIG_PROP
public static String NONE
public static final String ETL_CODE
public static final String CONFIG
public static final String PROPERTIES
public static final String LOG_STEP
public static final String LOG_LEVEL
public static final String CONNECTION_FACTORY
public static final String CACHE
public static final String CONNECTIONS
public static final String CONNECTION
public static final String CONNECTION_ALIAS
public static final String DRIVER
public static final String CDATA
public static final String URL
public static final String USER_ID
public static final String PASSWORD
public static final String AUTO_COMMIT
public static final String ALIAS_PARAMS
public static final String INIT_SQL
public static final String CONNECOR_CLASS_NAME
public static final String TRANSPORT
public static final String ACTIVE_CONNECTIONS
public static final String SOURCES
public static final String SOURCE
public static final String ALIAS
public static final String CONN_NAME
public static final String DESTINATIONS
public static final String DESTINATION
public static final String EXECUTE
public static final String SCENARIO
public static final String SCENARIO_NAME
public static final String SCENARIO_ACTION
public static final String SCENARIO_DEST_CONNECTION_NAME
public static final String SCENARIO_VARS
public static final String SCENARIO_VAR_VALUE
public static final String SCENARIO_PARALLEL
public static final String DATA_FOLDER_VAR
public static final String DATA_FILENAME_VAR
public static final String PERSIST_METADATA_VAR
public static final String DELIMETER_VAR
public static final String CLEAR_VAR
public static final String TEMP_TABLE_VAR
public static final String TABLE_VAR
public static final String FILE_VAR
public static final String CREATE_TABLE_VAR
public static final String INSERT_VAR
public static final String USING_VAR
public static final String ONEXCEPTION_VAR
public static final String ERROR_MASK_VAR
public static final String SUCCESS_MASK_VAR
public static final String USER_VAR
public static final String PASSWORD_VAR
public static final String DB_URL_VAR
public static final String DB_PARAMS_VAR
public static final String SHELL_EXT_VAR
public static final String PARAMS_VAR
public static final String DRIVING_DATA_SET_VAR
public static final String DESTINATION_DATA_SET_VAR
public static final String KEYS_VAR
public static final String GROUP_BY_VAR
public static final String MAX_THREADS_VAR
public static final String MAX_THREADS_IN_POLL_VAR
public static final int DEF_MAX_THREADS_IN_POLL_VAR
public static final String IGNORE_CASE_VAR
public static final String TRIM_VAR
public static final String THIS_ROW_VAR
public static final String FIELDS_VAR
public static final String EXCLUDE_VAR
public static final String INCLUDE_VAR
public static final String FROM_CONNECTION_NAME_VAR
public static final String TO_CONNECTION_NAME_VAR
public static final int DEFAULT_LOG_LEVEL
public static final int DEFAULT_LOG_STEP
public static final String DEFAULT_DRIVER
public static final String DEFAULT_CONNECTOR
public static final String DEFAULT_CACHE_CLASS
public static final String DEFAULT_CONNECTION_FACTORY_CLASS
public static final String DEFAULT_DELIMITER
public static final String DROP_SQL
public static final String CREATE_SQL
public static String DEST_CONNECTION_NAME
public static String SOURCE_CONNECTION_NAME
public static String DEFAULT_SCENARIO_PATH
public static String DEFAULT_ETL_CONFIG
public static long DEFAULT_KEEP_ALIVE_INTERVAL
public static long DEFAULT_KILL_INTERVAL
public void clear()
public void addAlias(Alias alias)
alias
- The aliasAlias
public void addAliasToMap(String name, Alias alias)
name
- the namealias
- the alias to addpublic void addConnection(Alias alias, String name, String defName) throws Exception
alias
- the aliasname
- the namedefName
- the default nameException
- in case of any errorpublic void addScenario(Scenario scenario)
scenario
- the scenarioScenario
public TypedKeyValue<String,EtlConfig.CREATE_CONFIG_ERRORS> createConfig(String fileName, String scriptName, Map<String,Alias> connections, Map<String,String> vars, int action, boolean override) throws Exception
fileName
- the file namescriptName
- the script nameconnections
- the connectionsvars
- the variablesaction
- the actionoverride
- if true allow to override existing fileException
- in case of any errorpublic TypedKeyValue<String,EtlConfig.CREATE_CONFIG_ERRORS> createConfig(String fileName, String scriptName, Map<String,Alias> connections, Map<String,String> vars, int action, boolean override, String scenarioXml) throws Exception
fileName
- the file namescriptName
- the script nameconnections
- the connectionsvars
- the variablesaction
- the actionoverride
- if true allow to override existing filescenarioXml
- the scenario xmlException
- in case of any errorpublic int getAction(String action)
action
- the codepublic int getActionByDesc(String desc)
desc
- the descriptionpublic List<KeyValue> getActions(String actions)
actions
- the actionspublic Map<String,Alias> getAliasesMap()
public AtomicLong getAtomicLong()
public Cache<String,Object> getCache()
CacheProvider
getCache
in interface CacheProvider<String,Object>
public EtlConnectionFactory getConnectionFactory()
public int getCountOfTheParallelScenarious()
public String getDescByAction(String action)
action
- the actionpublic Set<Driver> getDrivers()
public Point getErrorLocationInSql()
public List<Scenario> getExecute()
List
of the etl scenarios to execute. It is
possible to execute multiple scenarios either in the separate threads or
sequentially.List
of the etl scenarios to executepublic List<FieldDef> getFieldDef(String key, int type)
FieldsRepository
java.sql.Types
.getFieldDef
in interface FieldsRepository
key
- the keytype
- the typepublic boolean isVarcharOnly(String key)
FieldsRepository
isVarcharOnly
in interface FieldsRepository
key
- the keypublic Integer getGlobalRowLimit()
public String getLastExecutedCode()
public String getLastExecutedFileName()
public int getLogStep()
Extracting row 10 out of 1000
Extracting row 20 out of 1000
The default value is 0 which means each row\event will be logged.
public long getNewAtomicLong()
public String getScenarioPath()
public String getMetadataFolder()
public String getMetadataFileName(String driverClassName)
driverClassName
- the driver class namepublic String getString(String key)
ObjectStorage
getString
in interface ObjectStorage
key
- the keypublic String getTenant()
public String getUser()
public Object getValue(String key)
ObjectStorage
getValue
in interface ObjectStorage
key
- the keypublic String getXmlConfigFileName()
public void init()
public boolean initConfigXml() throws Exception
Exception
- in case of any errorpublic boolean initConfigXml(String configFileName) throws Exception
configFileName
- name of the xml configuration fileException
- in case of any errorpublic boolean isUpdateLocation()
public void removeScenarios()
public void setAliasesMap(Map<String,Alias> value)
value
- the valuepublic void setErrorLocationInSql(Point value)
value
- the new location of the error in SQLpublic void setExecute(List<Scenario> value)
addScenario(scenario)
.
Example of the list of the etl scenarios defined in the configuration file:
<execute>
<scenario name="sc1.xml" action="extract_load" parallel="Yes" />
<scenario name="sc2.xml" action="extract_load" parallel="Yes" />
</execute>
value
- the new list of scenarios to executepublic void setGlobalRowLimit(Integer value)
value
- the new global row limitpublic void setLastExecutedCode(String value)
value
- the new last executed codepublic void setLastExecutedFileName(String value)
value
- the new last executed file namepublic void setLogStep(int value)
Example of the log step property defined in the configuration file:
<properties>
<log_step>100</log_step>
</properties>
value
- The new log steppublic void setScenarioPath(String value)
value
- the new scenario pathpublic void setTenant(String tenant)
tenant
- the tenant to setpublic void setUpdateLocation(boolean value)
value
- the new value of the "update location" flagpublic void setUser(String user)
user
- the user to setpublic void setValue(String key, Object value)
ObjectStorage
setValue
in interface ObjectStorage
key
- the keyvalue
- the valuepublic void setXmlConfigFileName(String value)
value
- the new xml config file namepublic void updateConnections() throws Exception
Exception
- in case of any errorpublic void updateLocation(LocationProvider locationProvider, Point startLocation, Point endLocation)
locationProvider
- the location providerstartLocation
- the start locationendLocation
- the end locationpublic List<String> getDebugInfo()
public void log(String line)
InfoLogger
log
in interface InfoLogger
line
- the informationpublic void addException(Throwable ex)
InfoLogger
addException
in interface InfoLogger
ex
- Throwablepublic void setLastException(Throwable ex)
setLastException
in interface InfoLogger
ex
- the expublic Throwable getLastException()
InfoLogger
getLastException
in interface InfoLogger
public ExecutorService getExecutorService(String name, int maxThreads)
ExecutorProvider
getExecutorService
in interface ExecutorProvider
name
- the name of the cached executormaxThreads
- the max number of threadspublic int getLogLevel()
public void setLogLevel(int logLevel)
logLevel
- the new log levelpublic boolean isEnabled()
public void setEnabled(boolean enabled)
enabled
- the new value of the enabled flagpublic boolean isRequestStop()
public void setRequestStop(boolean value)
value
- the new value of the "request stop" flag.public Map<String,String> getResponseHeaders()
public void addResponseHeader(String name, String value)
name
- the namevalue
- the valuepublic void removeResponseHeader(String name)
name
- the namepublic String getMainScenarioName()
public void setMainScenarioName(String mainScenarioName)
mainScenarioName
- the new main scenario nameCopyright © 2010-2020 Toolsverse. All Rights Reserved.