Search in sources :

Example 1 with Router

use of org.jumpmind.symmetric.model.Router in project symmetric-ds by JumpMind.

the class DataExtractorService method lookupAndOrderColumnsAccordingToTriggerHistory.

protected Table lookupAndOrderColumnsAccordingToTriggerHistory(String routerId, TriggerHistory triggerHistory, Node sourceNode, Node targetNode, boolean setTargetTableName, boolean useDatabaseDefinition) {
    String catalogName = triggerHistory.getSourceCatalogName();
    String schemaName = triggerHistory.getSourceSchemaName();
    String tableName = triggerHistory.getSourceTableName();
    Table table = null;
    if (useDatabaseDefinition) {
        table = platform.getTableFromCache(catalogName, schemaName, tableName, false);
        if (table != null && table.getColumnCount() < triggerHistory.getParsedColumnNames().length) {
            /*
                 * If the column count is less than what trigger history reports, then
                 * chances are the table cache is out of date.
                 */
            table = platform.getTableFromCache(catalogName, schemaName, tableName, true);
        }
        if (table != null) {
            table = table.copyAndFilterColumns(triggerHistory.getParsedColumnNames(), triggerHistory.getParsedPkColumnNames(), true);
        } else {
            throw new SymmetricException("Could not find the following table.  It might have been dropped: %s", Table.getFullyQualifiedTableName(catalogName, schemaName, tableName));
        }
    } else {
        table = new Table(tableName);
        table.addColumns(triggerHistory.getParsedColumnNames());
        table.setPrimaryKeys(triggerHistory.getParsedPkColumnNames());
    }
    Router router = triggerRouterService.getRouterById(routerId, false);
    if (router != null && setTargetTableName) {
        if (router.isUseSourceCatalogSchema()) {
            table.setCatalog(catalogName);
            table.setSchema(schemaName);
        } else {
            table.setCatalog(null);
            table.setSchema(null);
        }
        if (StringUtils.equals(Constants.NONE_TOKEN, router.getTargetCatalogName())) {
            table.setCatalog(null);
        } else if (StringUtils.isNotBlank(router.getTargetCatalogName())) {
            table.setCatalog(replaceVariables(sourceNode, targetNode, router.getTargetCatalogName()));
        }
        if (StringUtils.equals(Constants.NONE_TOKEN, router.getTargetSchemaName())) {
            table.setSchema(null);
        } else if (StringUtils.isNotBlank(router.getTargetSchemaName())) {
            table.setSchema(replaceVariables(sourceNode, targetNode, router.getTargetSchemaName()));
        }
        if (StringUtils.isNotBlank(router.getTargetTableName())) {
            table.setName(router.getTargetTableName());
        }
    }
    return table;
}
Also used : TransformTable(org.jumpmind.symmetric.io.data.transform.TransformTable) Table(org.jumpmind.db.model.Table) SymmetricException(org.jumpmind.symmetric.SymmetricException) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) Router(org.jumpmind.symmetric.model.Router) AbstractFileParsingRouter(org.jumpmind.symmetric.route.AbstractFileParsingRouter)

Example 2 with Router

use of org.jumpmind.symmetric.model.Router in project symmetric-ds by JumpMind.

the class TriggerRouterService method getRouters.

public List<Router> getRouters(boolean replaceVariables) {
    List<Router> routers = sqlTemplate.query(getSql("select ", "selectRoutersColumnList", "selectRoutersSql"), new RouterMapper(configurationService.getNodeGroupLinks(false)));
    if (replaceVariables) {
        @SuppressWarnings({ "rawtypes", "unchecked" }) Map<String, String> replacements = (Map) parameterService.getAllParameters();
        for (Router router : routers) {
            router.setTargetCatalogName(FormatUtils.replaceTokens(router.getTargetCatalogName(), replacements, true));
            router.setTargetSchemaName(FormatUtils.replaceTokens(router.getTargetSchemaName(), replacements, true));
            router.setTargetTableName(FormatUtils.replaceTokens(router.getTargetTableName(), replacements, true));
        }
    }
    return routers;
}
Also used : TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) ConfigurationChangedDataRouter(org.jumpmind.symmetric.route.ConfigurationChangedDataRouter) FileSyncDataRouter(org.jumpmind.symmetric.route.FileSyncDataRouter) Router(org.jumpmind.symmetric.model.Router) Map(java.util.Map) HashMap(java.util.HashMap)

Example 3 with Router

use of org.jumpmind.symmetric.model.Router in project symmetric-ds by JumpMind.

the class AbstractSymmetricEngine method uninstall.

public synchronized void uninstall() {
    log.warn("Attempting an uninstall of all SymmetricDS database objects from the database");
    stop();
    log.info("Just cleaned {} files in the staging area during the uninstall.", getStagingManager().clean(0));
    try {
        Table table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_TRIGGER_ROUTER));
        if (table != null) {
            List<Grouplet> grouplets = groupletService.getGrouplets(true);
            for (Grouplet grouplet : grouplets) {
                groupletService.deleteGrouplet(grouplet);
            }
            List<TriggerRouter> triggerRouters = triggerRouterService.getTriggerRouters(false, true);
            for (TriggerRouter triggerRouter : triggerRouters) {
                triggerRouterService.deleteTriggerRouter(triggerRouter);
            }
            List<FileTriggerRouter> fileTriggerRouters = fileSyncService.getFileTriggerRouters();
            for (FileTriggerRouter fileTriggerRouter : fileTriggerRouters) {
                fileSyncService.deleteFileTriggerRouter(fileTriggerRouter);
            }
            List<Router> routers = triggerRouterService.getRouters(true);
            for (Router router : routers) {
                triggerRouterService.deleteRouter(router);
            }
        }
        table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_CONFLICT));
        if (table != null) {
            // need to remove all conflicts before we can remove the node
            // group links
            List<ConflictNodeGroupLink> conflicts = dataLoaderService.getConflictSettingsNodeGroupLinks();
            for (ConflictNodeGroupLink conflict : conflicts) {
                dataLoaderService.delete(conflict);
            }
        }
        table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_TRANSFORM_TABLE));
        if (table != null) {
            // need to remove all transforms before we can remove the node
            // group links
            List<TransformTableNodeGroupLink> transforms = transformService.getTransformTables(false);
            for (TransformTableNodeGroupLink transformTable : transforms) {
                transformService.deleteTransformTable(transformTable.getTransformId());
            }
        }
        table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_ROUTER));
        if (table != null) {
            List<Router> objects = triggerRouterService.getRouters(true);
            for (Router router : objects) {
                triggerRouterService.deleteRouter(router);
            }
        }
        table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_CONFLICT));
        if (table != null) {
            List<ConflictNodeGroupLink> objects = dataLoaderService.getConflictSettingsNodeGroupLinks();
            for (ConflictNodeGroupLink obj : objects) {
                dataLoaderService.delete(obj);
            }
        }
        table = platform.readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_NODE_GROUP_LINK));
        if (table != null) {
            // remove the links so the symmetric table trigger will be
            // removed
            List<NodeGroupLink> links = configurationService.getNodeGroupLinks(false);
            for (NodeGroupLink nodeGroupLink : links) {
                configurationService.deleteNodeGroupLink(nodeGroupLink);
            }
        }
        if (table != null) {
            // this should remove all triggers because we have removed all the
            // trigger configuration
            triggerRouterService.syncTriggers();
        }
    } catch (SqlException ex) {
        log.warn("Error while trying remove triggers on tables", ex);
    }
    // remove any additional triggers that may remain because they were not in trigger history
    symmetricDialect.cleanupTriggers();
    symmetricDialect.dropTablesAndDatabaseObjects();
    // force cache to be cleared
    nodeService.deleteIdentity();
    parameterService.setDatabaseHasBeenInitialized(false);
    log.warn("Finished uninstalling SymmetricDS database objects from the database");
}
Also used : Table(org.jumpmind.db.model.Table) ConflictNodeGroupLink(org.jumpmind.symmetric.service.impl.DataLoaderService.ConflictNodeGroupLink) SqlException(org.jumpmind.db.sql.SqlException) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) Router(org.jumpmind.symmetric.model.Router) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) Grouplet(org.jumpmind.symmetric.model.Grouplet) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) TransformTableNodeGroupLink(org.jumpmind.symmetric.service.impl.TransformService.TransformTableNodeGroupLink) ConflictNodeGroupLink(org.jumpmind.symmetric.service.impl.DataLoaderService.ConflictNodeGroupLink) NodeGroupLink(org.jumpmind.symmetric.model.NodeGroupLink) TransformTableNodeGroupLink(org.jumpmind.symmetric.service.impl.TransformService.TransformTableNodeGroupLink)

Example 4 with Router

use of org.jumpmind.symmetric.model.Router in project symmetric-ds by JumpMind.

the class DataService method insertReloadEvent.

public boolean insertReloadEvent(TableReloadRequest request, boolean deleteAtClient) {
    boolean successful = false;
    if (request != null && request.isReloadEnabled()) {
        ITriggerRouterService triggerRouterService = engine.getTriggerRouterService();
        INodeService nodeService = engine.getNodeService();
        Node targetNode = nodeService.findNode(request.getTargetNodeId());
        if (targetNode != null) {
            TriggerRouter triggerRouter = triggerRouterService.getTriggerRouterForCurrentNode(request.getTriggerId(), request.getRouterId(), false);
            if (triggerRouter != null) {
                Trigger trigger = triggerRouter.getTrigger();
                Router router = triggerRouter.getRouter();
                NodeGroupLink link = router.getNodeGroupLink();
                Node me = nodeService.findIdentity();
                if (link.getSourceNodeGroupId().equals(me.getNodeGroupId())) {
                    if (link.getTargetNodeGroupId().equals(targetNode.getNodeGroupId())) {
                        TriggerHistory triggerHistory = lookupTriggerHistory(trigger);
                        ISqlTransaction transaction = null;
                        try {
                            transaction = sqlTemplate.startSqlTransaction();
                            if (parameterService.is(ParameterConstants.INITIAL_LOAD_DELETE_BEFORE_RELOAD)) {
                                String overrideDeleteStatement = StringUtils.isNotBlank(request.getReloadDeleteStmt()) ? request.getReloadDeleteStmt() : null;
                                insertPurgeEvent(transaction, targetNode, triggerRouter, triggerHistory, false, overrideDeleteStatement, -1, null);
                            }
                            insertReloadEvent(transaction, targetNode, triggerRouter, triggerHistory, request.getReloadSelect(), false, -1, null, Status.NE);
                            if (!targetNode.requires13Compatiblity() && deleteAtClient) {
                                insertSqlEvent(transaction, triggerHistory, trigger.getChannelId(), targetNode, String.format("delete from %s where target_node_id='%s' and source_node_id='%s' and trigger_id='%s' and router_id='%s'", TableConstants.getTableName(tablePrefix, TableConstants.SYM_TABLE_RELOAD_REQUEST), request.getTargetNodeId(), request.getSourceNodeId(), request.getTriggerId(), request.getRouterId()), false, -1, null);
                            }
                            deleteTableReloadRequest(transaction, request);
                            transaction.commit();
                        } catch (Error ex) {
                            if (transaction != null) {
                                transaction.rollback();
                            }
                            throw ex;
                        } catch (RuntimeException ex) {
                            if (transaction != null) {
                                transaction.rollback();
                            }
                            throw ex;
                        } finally {
                            close(transaction);
                        }
                    } else {
                        log.error("Could not reload table for node {} because the router {} target node group id {} did not match", new Object[] { request.getTargetNodeId(), request.getRouterId(), link.getTargetNodeGroupId() });
                    }
                } else {
                    log.error("Could not reload table for node {} because the router {} source node group id {} did not match", new Object[] { request.getTargetNodeId(), request.getRouterId(), link.getSourceNodeGroupId() });
                }
            } else {
                log.error("Could not reload table for node {} because the trigger router ({}, {}) could not be found", new Object[] { request.getTargetNodeId(), request.getTriggerId(), request.getRouterId() });
            }
        } else {
            log.error("Could not reload table for node {} because the node could not be found", request.getTargetNodeId());
        }
    }
    return successful;
}
Also used : ITriggerRouterService(org.jumpmind.symmetric.service.ITriggerRouterService) Node(org.jumpmind.symmetric.model.Node) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) Router(org.jumpmind.symmetric.model.Router) ISqlTransaction(org.jumpmind.db.sql.ISqlTransaction) Trigger(org.jumpmind.symmetric.model.Trigger) TriggerHistory(org.jumpmind.symmetric.model.TriggerHistory) INodeService(org.jumpmind.symmetric.service.INodeService) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) NodeGroupLink(org.jumpmind.symmetric.model.NodeGroupLink)

Example 5 with Router

use of org.jumpmind.symmetric.model.Router in project symmetric-ds by JumpMind.

the class FileSyncDataRouter method routeToNodes.

public Set<String> routeToNodes(SimpleRouterContext context, DataMetaData dataMetaData, Set<Node> nodes, boolean initialLoad, boolean initialLoadSelectUsed, TriggerRouter triggerRouter) {
    Set<String> nodeIds = new HashSet<String>();
    IFileSyncService fileSyncService = engine.getFileSyncService();
    IRouterService routerService = engine.getRouterService();
    Map<String, String> newData = getNewDataAsString(null, dataMetaData, engine.getSymmetricDialect());
    String triggerId = newData.get("TRIGGER_ID");
    String routerId = newData.get("ROUTER_ID");
    String sourceNodeId = newData.get("LAST_UPDATE_BY");
    String lastEventType = newData.get("LAST_EVENT_TYPE");
    if (triggerId == null) {
        Map<String, String> oldData = getOldDataAsString(null, dataMetaData, engine.getSymmetricDialect());
        triggerId = oldData.get("TRIGGER_ID");
        routerId = oldData.get("ROUTER_ID");
        sourceNodeId = oldData.get("LAST_UPDATE_BY");
        lastEventType = oldData.get("LAST_EVENT_TYPE");
    }
    LastEventType eventType = LastEventType.fromCode(lastEventType);
    FileTriggerRouter fileTriggerRouter = fileSyncService.getFileTriggerRouter(triggerId, routerId);
    if (fileTriggerRouter != null && fileTriggerRouter.isEnabled()) {
        if (fileTriggerRouter.getRouter().getNodeGroupLink().equals(triggerRouter.getRouter().getNodeGroupLink())) {
            if (eventType == null || eventType == LastEventType.DELETE && fileTriggerRouter.getFileTrigger().isSyncOnDelete() || eventType == LastEventType.MODIFY && fileTriggerRouter.getFileTrigger().isSyncOnModified() || eventType == LastEventType.CREATE && fileTriggerRouter.getFileTrigger().isSyncOnCreate()) {
                Router router = fileTriggerRouter.getRouter();
                Map<String, IDataRouter> routers = routerService.getRouters();
                IDataRouter dataRouter = null;
                if (StringUtils.isNotBlank(router.getRouterType())) {
                    dataRouter = routers.get(router.getRouterType());
                }
                if (dataRouter == null) {
                    dataRouter = routers.get("default");
                }
                if (context instanceof ChannelRouterContext) {
                    ((ChannelRouterContext) context).addUsedDataRouter(dataRouter);
                }
                dataMetaData.setRouter(router);
                nodeIds.addAll(dataRouter.routeToNodes(context, dataMetaData, nodes, false, false, triggerRouter));
                nodeIds.remove(sourceNodeId);
            }
        }
    } else {
        log.error("Could not find a trigger router with a trigger_id of {} and a router_id of {}.  The file snapshot will not be routed", triggerId, routerId);
    }
    return nodeIds;
}
Also used : LastEventType(org.jumpmind.symmetric.model.FileSnapshot.LastEventType) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) IFileSyncService(org.jumpmind.symmetric.service.IFileSyncService) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) Router(org.jumpmind.symmetric.model.Router) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) HashSet(java.util.HashSet) IRouterService(org.jumpmind.symmetric.service.IRouterService)

Aggregations

Router (org.jumpmind.symmetric.model.Router)40 TriggerRouter (org.jumpmind.symmetric.model.TriggerRouter)26 Test (org.junit.Test)25 Trigger (org.jumpmind.symmetric.model.Trigger)14 Table (org.jumpmind.db.model.Table)12 Node (org.jumpmind.symmetric.model.Node)12 HashSet (java.util.HashSet)11 TriggerHistory (org.jumpmind.symmetric.model.TriggerHistory)10 Data (org.jumpmind.symmetric.model.Data)9 DataMetaData (org.jumpmind.symmetric.model.DataMetaData)9 NodeChannel (org.jumpmind.symmetric.model.NodeChannel)9 ArrayList (java.util.ArrayList)8 ConfigurationChangedDataRouter (org.jumpmind.symmetric.route.ConfigurationChangedDataRouter)8 FileSyncDataRouter (org.jumpmind.symmetric.route.FileSyncDataRouter)8 FileTriggerRouter (org.jumpmind.symmetric.model.FileTriggerRouter)7 FileTrigger (org.jumpmind.symmetric.model.FileTrigger)5 ITriggerRouterService (org.jumpmind.symmetric.service.ITriggerRouterService)5 HashMap (java.util.HashMap)4 LinkedHashMap (java.util.LinkedHashMap)3 ISymmetricDialect (org.jumpmind.symmetric.db.ISymmetricDialect)3