public void widgetDisposed( DisposeEvent event ) { if ( transGraph.trans != null ) { KettleLogStore.discardLines( transGraph.trans.getLogChannelId(), true ); } } } );
@VisibleForTesting void discardLogLines( TransExecutorData transExecutorData ) { // Keep the strain on the logging back-end conservative. // TODO: make this optional/user-defined later Trans executorTrans = transExecutorData.getExecutorTrans(); if ( executorTrans != null ) { KettleLogStore.discardLines( executorTrans.getLogChannelId(), false ); LoggingRegistry.getInstance().removeIncludingChildren( executorTrans.getLogChannelId() ); } }
/** * Gets the logging hierarchy. * * @return the logging hierarchy */ public List<LoggingHierarchy> getLoggingHierarchy() { List<LoggingHierarchy> hierarchy = new ArrayList<>(); List<String> childIds = LoggingRegistry.getInstance().getLogChannelChildren( getLogChannelId() ); for ( String childId : childIds ) { LoggingObjectInterface loggingObject = LoggingRegistry.getInstance().getLoggingObject( childId ); if ( loggingObject != null ) { hierarchy.add( new LoggingHierarchy( getLogChannelId(), batchId, loggingObject ) ); } } return hierarchy; }
@GET @Path( "/remove/{id : .+}" ) public Response removeTransformation( @PathParam( "id" ) String id ) { Trans trans = CarteResource.getTransformation( id ); CarteObjectEntry entry = CarteResource.getCarteObjectEntry( id ); KettleLogStore.discardLines( trans.getLogChannelId(), true ); CarteSingleton.getInstance().getTransformationMap().removeTransformation( entry ); return Response.ok().build(); }
@GET @Path( "/start/{id : .+}" ) @Produces( { MediaType.APPLICATION_JSON } ) public TransformationStatus startTransformation( @PathParam( "id" ) String id ) { Trans trans = CarteResource.getTransformation( id ); try { // Discard old log lines from old transformation runs // KettleLogStore.discardLines( trans.getLogChannelId(), true ); String carteObjectId = UUID.randomUUID().toString(); SimpleLoggingObject servletLoggingObject = new SimpleLoggingObject( getClass().getName(), LoggingObjectType.CARTE, null ); servletLoggingObject.setContainerObjectId( carteObjectId ); servletLoggingObject.setLogLevel( trans.getLogLevel() ); trans.setParent( servletLoggingObject ); trans.execute( null ); } catch ( KettleException e ) { e.printStackTrace(); } return getTransformationStatus( id ); }
@Test @PrepareForTest( { Encode.class } ) public void testWillStopInputStepsOnly() throws ServletException, IOException { KettleLogStore.init(); HttpServletRequest mockHttpServletRequest = mock( HttpServletRequest.class ); HttpServletResponse mockHttpServletResponse = mock( HttpServletResponse.class ); Trans mockTrans = mock( Trans.class ); TransMeta mockTransMeta = mock( TransMeta.class ); LogChannelInterface mockChannelInterface = mock( LogChannelInterface.class ); StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter( out ); when( mockHttpServletRequest.getContextPath() ).thenReturn( StopTransServlet.CONTEXT_PATH ); when( mockHttpServletRequest.getParameter( "inputOnly" ) ).thenReturn( "Y" ); when( mockHttpServletRequest.getParameter( "name" ) ).thenReturn( "test" ); when( mockHttpServletRequest.getParameter( "id" ) ).thenReturn( "123" ); when( mockHttpServletResponse.getWriter() ).thenReturn( printWriter ); when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); stopTransServlet.doGet( mockHttpServletRequest, mockHttpServletResponse ); Mockito.verify( mockTrans ).safeStop(); } }
/** * This test demonstrates the issue fixed in PDI-17436. * When a job is scheduled twice, it gets the same log channel Id and both logs get merged */ @Test public void testTwoTransformationsGetSameLogChannelId() throws Exception { TransMeta meta = mock( TransMeta.class ); doReturn( new String[] { "X", "Y", "Z" } ).when( meta ).listVariables(); doReturn( new String[] { "A", "B", "C" } ).when( meta ).listParameters(); doReturn( "XYZ" ).when( meta ).getVariable( anyString() ); doReturn( "" ).when( meta ).getParameterDescription( anyString() ); doReturn( "" ).when( meta ).getParameterDefault( anyString() ); doReturn( "ABC" ).when( meta ).getParameterValue( anyString() ); Trans trans1 = new Trans( meta ); Trans trans2 = new Trans( meta ); assertEquals( trans1.getLogChannelId(), trans2.getLogChannelId() ); }
@Test @PrepareForTest( { Encode.class } ) public void testRemoveTransServletEscapesHtmlWhenTransFound() throws ServletException, IOException { KettleLogStore.init(); HttpServletRequest mockHttpServletRequest = mock( HttpServletRequest.class ); HttpServletResponse mockHttpServletResponse = mock( HttpServletResponse.class ); Trans mockTrans = mock( Trans.class ); TransMeta mockTransMeta = mock( TransMeta.class ); LogChannelInterface mockChannelInterface = mock( LogChannelInterface.class ); StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter( out ); PowerMockito.spy( Encode.class ); when( mockHttpServletRequest.getContextPath() ).thenReturn( RemoveTransServlet.CONTEXT_PATH ); when( mockHttpServletRequest.getParameter( anyString() ) ).thenReturn( ServletTestUtils.BAD_STRING_TO_TEST ); when( mockHttpServletResponse.getWriter() ).thenReturn( printWriter ); when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTransMeta.getMaximum() ).thenReturn( new Point( 10, 10 ) ); removeTransServlet.doGet( mockHttpServletRequest, mockHttpServletResponse ); assertFalse( ServletTestUtils.hasBadText( ServletTestUtils.getInsideOfTag( "H3", out.toString() ) ) ); PowerMockito.verifyStatic( atLeastOnce() ); Encode.forHtml( anyString() ); } }
@Test @PrepareForTest( { Encode.class } ) public void testStartTransServletEscapesHtmlWhenTransFound() throws ServletException, IOException { KettleLogStore.init(); HttpServletRequest mockHttpServletRequest = mock( HttpServletRequest.class ); HttpServletResponse mockHttpServletResponse = mock( HttpServletResponse.class ); Trans mockTrans = mock( Trans.class ); TransMeta mockTransMeta = mock( TransMeta.class ); LogChannelInterface mockChannelInterface = mock( LogChannelInterface.class ); StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter( out ); PowerMockito.spy( Encode.class ); when( mockHttpServletRequest.getContextPath() ).thenReturn( StartTransServlet.CONTEXT_PATH ); when( mockHttpServletRequest.getParameter( anyString() ) ).thenReturn( ServletTestUtils.BAD_STRING_TO_TEST ); when( mockHttpServletResponse.getWriter() ).thenReturn( printWriter ); when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTransMeta.getMaximum() ).thenReturn( new Point( 10, 10 ) ); startTransServlet.doGet( mockHttpServletRequest, mockHttpServletResponse ); assertFalse( ServletTestUtils.hasBadText( ServletTestUtils.getInsideOfTag( "H1", out.toString() ) ) ); PowerMockito.verifyStatic( atLeastOnce() ); Encode.forHtml( anyString() ); } }
@Test @PrepareForTest( { Encode.class } ) public void testStopTransServletEscapesHtmlWhenTransFound() throws ServletException, IOException { KettleLogStore.init(); HttpServletRequest mockHttpServletRequest = mock( HttpServletRequest.class ); HttpServletResponse mockHttpServletResponse = mock( HttpServletResponse.class ); Trans mockTrans = mock( Trans.class ); TransMeta mockTransMeta = mock( TransMeta.class ); LogChannelInterface mockChannelInterface = mock( LogChannelInterface.class ); StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter( out ); PowerMockito.spy( Encode.class ); when( mockHttpServletRequest.getContextPath() ).thenReturn( StopTransServlet.CONTEXT_PATH ); when( mockHttpServletRequest.getParameter( anyString() ) ).thenReturn( ServletTestUtils.BAD_STRING_TO_TEST ); when( mockHttpServletResponse.getWriter() ).thenReturn( printWriter ); when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTransMeta.getMaximum() ).thenReturn( new Point( 10, 10 ) ); stopTransServlet.doGet( mockHttpServletRequest, mockHttpServletResponse ); assertFalse( ServletTestUtils.hasBadText( ServletTestUtils.getInsideOfTag( "H1", out.toString() ) ) ); PowerMockito.verifyStatic( atLeastOnce() ); Encode.forHtml( anyString() ); }
when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTrans.getLogChannelId() ).thenReturn( logId ); when( mockTrans.isFinishedOrStopped() ).thenReturn( true ); when( mockTrans.getStatus() ).thenReturn( "Finished" );
when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTransMeta.getMaximum() ).thenReturn( new Point( 10, 10 ) );
@Test @PrepareForTest( { Encode.class } ) public void testStartExecutionTransServletEscapesHtmlWhenTransFound() throws ServletException, IOException { KettleLogStore.init(); HttpServletRequest mockHttpServletRequest = mock( HttpServletRequest.class ); HttpServletResponse mockHttpServletResponse = mock( HttpServletResponse.class ); Trans mockTrans = mock( Trans.class ); TransMeta mockTransMeta = mock( TransMeta.class ); LogChannelInterface mockChannelInterface = mock( LogChannelInterface.class ); StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter( out ); PowerMockito.spy( Encode.class ); when( mockHttpServletRequest.getContextPath() ).thenReturn( StartExecutionTransServlet.CONTEXT_PATH ); when( mockHttpServletRequest.getParameter( anyString() ) ).thenReturn( ServletTestUtils.BAD_STRING_TO_TEST ); when( mockHttpServletResponse.getWriter() ).thenReturn( printWriter ); when( mockTransformationMap.getTransformation( any( CarteObjectEntry.class ) ) ).thenReturn( mockTrans ); when( mockTrans.getLogChannel() ).thenReturn( mockChannelInterface ); when( mockTrans.isReadyToStart() ).thenReturn( true ); when( mockTrans.getLogChannelId() ).thenReturn( "test" ); when( mockTrans.getTransMeta() ).thenReturn( mockTransMeta ); when( mockTransMeta.getMaximum() ).thenReturn( new Point( 10, 10 ) ); startExecutionTransServlet.doGet( mockHttpServletRequest, mockHttpServletResponse ); assertFalse( ServletTestUtils.hasBadText( ServletTestUtils.getInsideOfTag( "H1", out.toString() ) ) ); PowerMockito.verifyStatic( atLeastOnce() ); Encode.forHtml( anyString() ); } }
/** * This test demonstrates the fix for PDI-17436. * Two schedules -> two Carte object Ids -> two log channel Ids */ @Test public void testTwoTransformationsGetDifferentLogChannelIdWithDifferentCarteId() throws Exception { TransMeta meta1 = mock( TransMeta.class ); doReturn( new String[] { "X", "Y", "Z" } ).when( meta1 ).listVariables(); doReturn( new String[] { "A", "B", "C" } ).when( meta1 ).listParameters(); doReturn( "XYZ" ).when( meta1 ).getVariable( anyString() ); doReturn( "" ).when( meta1 ).getParameterDescription( anyString() ); doReturn( "" ).when( meta1 ).getParameterDefault( anyString() ); doReturn( "ABC" ).when( meta1 ).getParameterValue( anyString() ); TransMeta meta2 = mock( TransMeta.class ); doReturn( new String[] { "X", "Y", "Z" } ).when( meta2 ).listVariables(); doReturn( new String[] { "A", "B", "C" } ).when( meta2 ).listParameters(); doReturn( "XYZ" ).when( meta2 ).getVariable( anyString() ); doReturn( "" ).when( meta2 ).getParameterDescription( anyString() ); doReturn( "" ).when( meta2 ).getParameterDefault( anyString() ); doReturn( "ABC" ).when( meta2 ).getParameterValue( anyString() ); String carteId1 = UUID.randomUUID().toString(); String carteId2 = UUID.randomUUID().toString(); doReturn( carteId1 ).when( meta1 ).getContainerObjectId(); doReturn( carteId2 ).when( meta2 ).getContainerObjectId(); Trans trans1 = new Trans( meta1 ); Trans trans2 = new Trans( meta2 ); assertNotEquals( trans1.getContainerObjectId(), trans2.getContainerObjectId() ); assertNotEquals( trans1.getLogChannelId(), trans2.getLogChannelId() ); }
@Before public void setUp() throws KettleException { // add variable to row generator step StepMetaInterface stepMetaInterface = spy( new RowGeneratorMeta() ); ( (RowGeneratorMeta) stepMetaInterface ).setRowLimit( "${ROW_LIMIT}" ); String[] strings = {}; when( ( (RowGeneratorMeta) stepMetaInterface ).getFieldName() ).thenReturn( strings ); StepMeta stepMeta = new StepMeta(); stepMeta.setStepMetaInterface( stepMetaInterface ); stepMeta.setName( "ROW_STEP_META" ); StepDataInterface stepDataInterface = stepMeta.getStepMetaInterface().getStepData(); // add variable to transformation variable space Map<String, String> map = new HashMap<String, String>(); map.put( "ROW_LIMIT", "1440" ); TransMeta transMeta = spy( new TransMeta() ); transMeta.injectVariables( map ); when( transMeta.findStep( anyString() ) ).thenReturn( stepMeta ); Trans trans = spy( new Trans( transMeta, null ) ); when( trans.getSocketRepository() ).thenReturn( null ); when( trans.getLogChannelId() ).thenReturn( "ROW_LIMIT" ); //prepare row generator, substitutes variable by value from transformation variable space rowGenerator = spy( new RowGenerator( stepMeta, stepDataInterface, 0, transMeta, trans ) ); rowGenerator.initializeVariablesFrom( trans ); rowGenerator.init( stepMetaInterface, stepDataInterface ); }
db.setCommit( logCommitSize ); List<String> logChannelIds = LoggingRegistry.getInstance().getLogChannelChildren( getLogChannelId() ); for ( String logChannelId : logChannelIds ) { Queue<MetricsSnapshotInterface> snapshotList =
LoggingRegistry.getInstance().removeIncludingChildren( trans.getLogChannelId() ); KettleLogStore.discardLines( trans.getLogChannelId(), false );
private boolean handleError() throws KettleStepException { SingleThreaderData singleThreaderData = getData(); if ( getStepMeta().isDoingErrorHandling() ) { int lastLogLine = KettleLogStore.getLastBufferLineNr(); StringBuffer logText = KettleLogStore.getAppender().getBuffer( singleThreaderData.mappingTrans.getLogChannelId(), false, singleThreaderData.lastLogLine ); singleThreaderData.lastLogLine = lastLogLine; for ( Object[] row : singleThreaderData.errorBuffer ) { putError( getInputRowMeta(), row, 1L, logText.toString(), null, "STR-001" ); } singleThreaderData.executor.clearError(); return true; // continue } else { setErrors( 1 ); stopAll(); logError( BaseMessages.getString( PKG, "SingleThreader.Log.ErrorOccurredInSubTransformation" ) ); return false; // stop running } }
String channelId = getData().getExecutorTrans().getLogChannelId(); String logText = KettleLogStore.getAppender().getBuffer( channelId, false ).toString(); outputRow[ idx++ ] = logText; outputRow[ idx++ ] = getData().getExecutorTrans().getLogChannelId();
private void refreshImage( GC canvasGc ) { List<MetricsDuration> durations = MetricsUtil.getAllDurations( transGraph.trans.getLogChannelId() ); if ( Utils.isEmpty( durations ) ) {