public void undoTransformationAction(TransMeta transMeta, TransAction transAction) { switch (transAction.getType()) { // We created a new step : undo this... case TransAction.TYPE_ACTION_NEW_STEP: // Delete the step at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeStep(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // We created a new connection : undo this... case TransAction.TYPE_ACTION_NEW_CONNECTION: // Delete the connection at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeDatabase(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // We created a new note : undo this... case TransAction.TYPE_ACTION_NEW_NOTE: // Delete the note at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeNote(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // We created a new hop : undo this... case TransAction.TYPE_ACTION_NEW_HOP: // Delete the hop at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeTransHop(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // We created a new slave : undo this... case TransAction.TYPE_ACTION_NEW_SLAVE: // Delete the slave at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.getSlaveServers().remove(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // We created a new slave : undo this... case TransAction.TYPE_ACTION_NEW_CLUSTER: // Delete the slave at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.getClusterSchemas().remove(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // // DELETE // // We delete a step : undo this... case TransAction.TYPE_ACTION_DELETE_STEP: // un-Delete the step at correct location: re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { StepMeta stepMeta = (StepMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addStep(idx, stepMeta); } spoon.refreshTree(); spoon.refreshGraph(); break; // We deleted a connection : undo this... case TransAction.TYPE_ACTION_DELETE_CONNECTION: // re-insert the connection at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { DatabaseMeta ci = (DatabaseMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addDatabase(idx, ci); } spoon.refreshTree(); spoon.refreshGraph(); break; // We delete new note : undo this... case TransAction.TYPE_ACTION_DELETE_NOTE: // re-insert the note at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { NotePadMeta ni = (NotePadMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addNote(idx, ni); } spoon.refreshTree(); spoon.refreshGraph(); break; // We deleted a hop : undo this... case TransAction.TYPE_ACTION_DELETE_HOP: // re-insert the hop at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { TransHopMeta hi = (TransHopMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; // Build a new hop: StepMeta from = transMeta.findStep(hi.getFromStep().getName()); StepMeta to = transMeta.findStep(hi.getToStep().getName()); TransHopMeta hinew = new TransHopMeta(from, to); transMeta.addTransHop(idx, hinew); } spoon.refreshTree(); spoon.refreshGraph(); break; // // CHANGE // // We changed a step : undo this... case TransAction.TYPE_ACTION_CHANGE_STEP: // Delete the current step, insert previous version. for (int i = 0; i < transAction.getCurrent().length; i++) { StepMeta prev = (StepMeta) ((StepMeta) transAction.getPrevious()[i]).clone(); int idx = transAction.getCurrentIndex()[i]; transMeta.getStep(idx).replaceMeta(prev); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a connection : undo this... case TransAction.TYPE_ACTION_CHANGE_CONNECTION: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { DatabaseMeta prev = (DatabaseMeta) transAction.getPrevious()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.getDatabase(idx).replaceMeta((DatabaseMeta) prev.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a note : undo this... case TransAction.TYPE_ACTION_CHANGE_NOTE: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeNote(idx); NotePadMeta prev = (NotePadMeta) transAction.getPrevious()[i]; transMeta.addNote(idx, (NotePadMeta) prev.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a hop : undo this... case TransAction.TYPE_ACTION_CHANGE_HOP: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { TransHopMeta prev = (TransHopMeta) transAction.getPrevious()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.removeTransHop(idx); transMeta.addTransHop(idx, (TransHopMeta) prev.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // // POSITION // // The position of a step has changed: undo this... case TransAction.TYPE_ACTION_POSITION_STEP: // Find the location of the step: for (int i = 0; i < transAction.getCurrentIndex().length; i++) { StepMeta stepMeta = transMeta.getStep(transAction.getCurrentIndex()[i]); stepMeta.setLocation(transAction.getPreviousLocation()[i]); } spoon.refreshGraph(); break; // The position of a note has changed: undo this... case TransAction.TYPE_ACTION_POSITION_NOTE: for (int i = 0; i < transAction.getCurrentIndex().length; i++) { int idx = transAction.getCurrentIndex()[i]; NotePadMeta npi = transMeta.getNote(idx); Point prev = transAction.getPreviousLocation()[i]; npi.setLocation(prev); } spoon.refreshGraph(); break; default: break; } // OK, now check if we need to do this again... if (transMeta.viewNextUndo() != null) { if (transMeta.viewNextUndo().getNextAlso()) spoon.undoAction(transMeta); } }
public void redoTransformationAction(TransMeta transMeta, TransAction transAction) { switch (transAction.getType()) { case TransAction.TYPE_ACTION_NEW_STEP: // re-delete the step at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { StepMeta stepMeta = (StepMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addStep(idx, stepMeta); spoon.refreshTree(); spoon.refreshGraph(); } break; case TransAction.TYPE_ACTION_NEW_CONNECTION: // re-insert the connection at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { DatabaseMeta ci = (DatabaseMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addDatabase(idx, ci); spoon.refreshTree(); spoon.refreshGraph(); } break; case TransAction.TYPE_ACTION_NEW_NOTE: // re-insert the note at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { NotePadMeta ni = (NotePadMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addNote(idx, ni); spoon.refreshTree(); spoon.refreshGraph(); } break; case TransAction.TYPE_ACTION_NEW_HOP: // re-insert the hop at correct location: for (int i = 0; i < transAction.getCurrent().length; i++) { TransHopMeta hi = (TransHopMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.addTransHop(idx, hi); spoon.refreshTree(); spoon.refreshGraph(); } break; // // DELETE // case TransAction.TYPE_ACTION_DELETE_STEP: // re-remove the step at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeStep(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; case TransAction.TYPE_ACTION_DELETE_CONNECTION: // re-remove the connection at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeDatabase(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; case TransAction.TYPE_ACTION_DELETE_NOTE: // re-remove the note at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeNote(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; case TransAction.TYPE_ACTION_DELETE_HOP: // re-remove the hop at correct location: for (int i = transAction.getCurrent().length - 1; i >= 0; i--) { int idx = transAction.getCurrentIndex()[i]; transMeta.removeTransHop(idx); } spoon.refreshTree(); spoon.refreshGraph(); break; // // CHANGE // // We changed a step : undo this... case TransAction.TYPE_ACTION_CHANGE_STEP: // Delete the current step, insert previous version. for (int i = 0; i < transAction.getCurrent().length; i++) { StepMeta stepMeta = (StepMeta) ((StepMeta) transAction.getCurrent()[i]).clone(); transMeta.getStep(transAction.getCurrentIndex()[i]).replaceMeta(stepMeta); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a connection : undo this... case TransAction.TYPE_ACTION_CHANGE_CONNECTION: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { DatabaseMeta databaseMeta = (DatabaseMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.getDatabase(idx).replaceMeta((DatabaseMeta) databaseMeta.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a note : undo this... case TransAction.TYPE_ACTION_CHANGE_NOTE: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { NotePadMeta ni = (NotePadMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.removeNote(idx); transMeta.addNote(idx, (NotePadMeta) ni.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // We changed a hop : undo this... case TransAction.TYPE_ACTION_CHANGE_HOP: // Delete & re-insert for (int i = 0; i < transAction.getCurrent().length; i++) { TransHopMeta hi = (TransHopMeta) transAction.getCurrent()[i]; int idx = transAction.getCurrentIndex()[i]; transMeta.removeTransHop(idx); transMeta.addTransHop(idx, (TransHopMeta) hi.clone()); } spoon.refreshTree(); spoon.refreshGraph(); break; // // CHANGE POSITION // case TransAction.TYPE_ACTION_POSITION_STEP: for (int i = 0; i < transAction.getCurrentIndex().length; i++) { // Find & change the location of the step: StepMeta stepMeta = transMeta.getStep(transAction.getCurrentIndex()[i]); stepMeta.setLocation(transAction.getCurrentLocation()[i]); } spoon.refreshGraph(); break; case TransAction.TYPE_ACTION_POSITION_NOTE: for (int i = 0; i < transAction.getCurrentIndex().length; i++) { int idx = transAction.getCurrentIndex()[i]; NotePadMeta npi = transMeta.getNote(idx); Point curr = transAction.getCurrentLocation()[i]; npi.setLocation(curr); } spoon.refreshGraph(); break; default: break; } // OK, now check if we need to do this again... if (transMeta.viewNextUndo() != null) { if (transMeta.viewNextUndo().getNextAlso()) spoon.redoAction(transMeta); } }
public DataNode elementToDataNode(final RepositoryElementInterface element) throws KettleException { TransMeta transMeta = (TransMeta) element; DataNode rootNode = new DataNode(NODE_TRANS); DataNode stepsNode = rootNode.addNode(NODE_STEPS); if (transMeta.getPrivateTransformationDatabases() != null) { // save all private transformations database name http://jira.pentaho.com/browse/PPP-3405 DataNode privateDatabaseNode = rootNode.addNode(NODE_TRANS_PRIVATE_DATABASES); for (String privateDatabase : transMeta.getPrivateTransformationDatabases()) { privateDatabaseNode.addNode(privateDatabase); } } // Also save all the steps in the transformation! // int stepNr = 0; for (StepMeta step : transMeta.getSteps()) { stepNr++; DataNode stepNode = stepsNode.addNode( sanitizeNodeName(step.getName()) + "_" + stepNr + EXT_STEP); // $NON-NLS-1$ // Store the main data // stepNode.setProperty(PROP_NAME, step.getName()); stepNode.setProperty(PROP_DESCRIPTION, step.getDescription()); stepNode.setProperty(PROP_STEP_TYPE, step.getStepID()); stepNode.setProperty(PROP_STEP_DISTRIBUTE, step.isDistributes()); stepNode.setProperty( PROP_STEP_ROW_DISTRIBUTION, step.getRowDistribution() == null ? null : step.getRowDistribution().getCode()); stepNode.setProperty(PROP_STEP_COPIES, step.getCopies()); stepNode.setProperty(PROP_STEP_COPIES_STRING, step.getCopiesString()); stepNode.setProperty(PROP_STEP_GUI_LOCATION_X, step.getLocation().x); stepNode.setProperty(PROP_STEP_GUI_LOCATION_Y, step.getLocation().y); stepNode.setProperty(PROP_STEP_GUI_DRAW, step.isDrawn()); // Also save the step group attributes map // AttributesMapUtil.saveAttributesMap(stepNode, step); // Save the step metadata using the repository save method, NOT XML // That is because we want to keep the links to databases, conditions, etc by ID, not name. // StepMetaInterface stepMetaInterface = step.getStepMetaInterface(); DataNode stepCustomNode = new DataNode(NODE_STEP_CUSTOM); Repository proxy = new RepositoryProxy(stepCustomNode); compatibleSaveRep(stepMetaInterface, proxy, null, null); stepMetaInterface.saveRep(proxy, proxy.getMetaStore(), null, null); stepNode.addNode(stepCustomNode); // Save the partitioning information by reference as well... // StepPartitioningMeta partitioningMeta = step.getStepPartitioningMeta(); if (partitioningMeta != null && partitioningMeta.getPartitionSchema() != null && partitioningMeta.isPartitioned()) { DataNodeRef ref = new DataNodeRef(partitioningMeta.getPartitionSchema().getObjectId().getId()); stepNode.setProperty(PROP_PARTITIONING_SCHEMA, ref); stepNode.setProperty( PROP_PARTITIONING_METHOD, partitioningMeta.getMethodCode()); // method of partitioning if (partitioningMeta.getPartitioner() != null) { DataNode partitionerCustomNode = new DataNode(NODE_PARTITIONER_CUSTOM); proxy = new RepositoryProxy(partitionerCustomNode); partitioningMeta.getPartitioner().saveRep(proxy, null, null); stepNode.addNode(partitionerCustomNode); } } // Save the clustering information as well... // stepNode.setProperty( PROP_CLUSTER_SCHEMA, step.getClusterSchema() == null ? "" : step.getClusterSchema() //$NON-NLS-1$ .getName()); // Save the error hop metadata // StepErrorMeta stepErrorMeta = step.getStepErrorMeta(); if (stepErrorMeta != null) { stepNode.setProperty( PROP_STEP_ERROR_HANDLING_SOURCE_STEP, stepErrorMeta.getSourceStep() != null ? stepErrorMeta.getSourceStep().getName() : ""); //$NON-NLS-1$ stepNode.setProperty( PROP_STEP_ERROR_HANDLING_TARGET_STEP, stepErrorMeta.getTargetStep() != null ? stepErrorMeta.getTargetStep().getName() : ""); //$NON-NLS-1$ stepNode.setProperty(PROP_STEP_ERROR_HANDLING_IS_ENABLED, stepErrorMeta.isEnabled()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_NR_VALUENAME, stepErrorMeta.getNrErrorsValuename()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_DESCRIPTIONS_VALUENAME, stepErrorMeta.getErrorDescriptionsValuename()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_FIELDS_VALUENAME, stepErrorMeta.getErrorFieldsValuename()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_CODES_VALUENAME, stepErrorMeta.getErrorCodesValuename()); stepNode.setProperty(PROP_STEP_ERROR_HANDLING_MAX_ERRORS, stepErrorMeta.getMaxErrors()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_MAX_PCT_ERRORS, stepErrorMeta.getMaxPercentErrors()); stepNode.setProperty( PROP_STEP_ERROR_HANDLING_MIN_PCT_ROWS, stepErrorMeta.getMinPercentRows()); } } // Save the notes // DataNode notesNode = rootNode.addNode(NODE_NOTES); notesNode.setProperty(PROP_NR_NOTES, transMeta.nrNotes()); for (int i = 0; i < transMeta.nrNotes(); i++) { NotePadMeta note = transMeta.getNote(i); DataNode noteNode = notesNode.addNode(NOTE_PREFIX + i); noteNode.setProperty(PROP_XML, note.getXML()); } // Finally, save the hops // DataNode hopsNode = rootNode.addNode(NODE_HOPS); hopsNode.setProperty(PROP_NR_HOPS, transMeta.nrTransHops()); for (int i = 0; i < transMeta.nrTransHops(); i++) { TransHopMeta hop = transMeta.getTransHop(i); DataNode hopNode = hopsNode.addNode(TRANS_HOP_PREFIX + i); hopNode.setProperty(TRANS_HOP_FROM, hop.getFromStep().getName()); hopNode.setProperty(TRANS_HOP_TO, hop.getToStep().getName()); hopNode.setProperty(TRANS_HOP_ENABLED, hop.isEnabled()); } // Parameters // String[] paramKeys = transMeta.listParameters(); DataNode paramsNode = rootNode.addNode(NODE_PARAMETERS); paramsNode.setProperty(PROP_NR_PARAMETERS, paramKeys == null ? 0 : paramKeys.length); for (int idx = 0; idx < paramKeys.length; idx++) { DataNode paramNode = paramsNode.addNode(TRANS_PARAM_PREFIX + idx); String key = paramKeys[idx]; String description = transMeta.getParameterDescription(paramKeys[idx]); String defaultValue = transMeta.getParameterDefault(paramKeys[idx]); paramNode.setProperty(PARAM_KEY, key != null ? key : ""); // $NON-NLS-1$ paramNode.setProperty(PARAM_DEFAULT, defaultValue != null ? defaultValue : ""); // $NON-NLS-1$ paramNode.setProperty(PARAM_DESC, description != null ? description : ""); // $NON-NLS-1$ } // Let's not forget to save the details of the transformation itself. // This includes logging information, parameters, etc. // saveTransformationDetails(rootNode, transMeta); return rootNode; }