You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2017/11/02 17:14:21 UTC

[geode] branch develop updated: GEODE-3936: remove ThreadUtil (#998)

This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new a9a444f  GEODE-3936: remove ThreadUtil (#998)
a9a444f is described below

commit a9a444f96b6b9b2f77d5e2721907b77f20fb09ca
Author: jinmeiliao <ji...@pivotal.io>
AuthorDate: Thu Nov 2 10:14:19 2017 -0700

    GEODE-3936: remove ThreadUtil (#998)
---
 .../apache/geode/internal/lang/ThreadUtils.java    | 138 -------------
 .../internal/logging/log4j/AlertAppender.java      |   5 +-
 .../geode/internal/lang/ThreadUtilsJUnitTest.java  | 220 ---------------------
 3 files changed, 3 insertions(+), 360 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/lang/ThreadUtils.java b/geode-core/src/main/java/org/apache/geode/internal/lang/ThreadUtils.java
deleted file mode 100644
index 9797a18..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/lang/ThreadUtils.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.internal.lang;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.Thread.State;
-
-/**
- * The ThreadUtils class is an abstract utility class for working with and invoking methods on
- * Threads.
- * <p/>
- * 
- * @see java.lang.Thread
- * @since GemFire 7.0
- */
-public abstract class ThreadUtils {
-
-  /**
-   * Gets the name of the particular Thread or null if the Thread object reference is null.
-   * <p/>
-   * 
-   * @param thread the Thread object whose name is returned.
-   * @return a String value indicating the name of the Thread or null if the Thread object reference
-   *         is null.
-   * @see java.lang.Thread#getName()
-   */
-  public static String getThreadName(final Thread thread) {
-    return (thread == null ? null : thread.getName());
-  }
-
-  /**
-   * Interrupts the specified Thread, guarding against null.
-   * <p/>
-   * 
-   * @param thread the Thread to interrupt.
-   * @see java.lang.Thread#interrupt()
-   */
-  public static void interrupt(final Thread thread) {
-    if (thread != null) {
-      thread.interrupt();
-    }
-  }
-
-  /**
-   * Determines whether the specified Thread is alive, guarding against null Object references.
-   * <p/>
-   * 
-   * @param thread the Thread to determine for aliveness.
-   * @return a boolean value indicating whether the specified Thread is alive. Will return false if
-   *         the Thread Object references is null.
-   * @see java.lang.Thread#isAlive()
-   */
-  public static boolean isAlive(final Thread thread) {
-    return (thread != null && thread.isAlive());
-  }
-
-  /**
-   * Determines whether the specified Thread is in a waiting state, guarding against null Object
-   * references
-   * <p/>
-   * 
-   * @param thread the Thread to access it's state.
-   * @return a boolean value indicating whether the Thread is in a waiting state. If the Thread
-   *         Object reference is null, then this method return false, as no Thread is clearly not
-   *         waiting for anything.
-   * @see java.lang.Thread#getState()
-   * @see java.lang.Thread.State#WAITING
-   */
-  public static boolean isWaiting(final Thread thread) {
-    return (thread != null && thread.getState().equals(State.WAITING));
-  }
-
-  /**
-   * Causes the current Thread to sleep for the specified number of milliseconds. If the current
-   * Thread is interrupted during sleep, the interrupt flag on the current Thread will remain set
-   * and the duration, in milliseconds, of completed sleep is returned.
-   * <p/>
-   * 
-   * @param milliseconds an integer value specifying the number of milliseconds the current Thread
-   *        should sleep.
-   * @return a long value indicating duration in milliseconds of completed sleep by the current
-   *         Thread.
-   * @see java.lang.System#nanoTime()
-   * @see java.lang.Thread#sleep(long)
-   */
-  public static long sleep(final long milliseconds) {
-    final long t0 = System.nanoTime();
-
-    try {
-      Thread.sleep(milliseconds);
-    } catch (InterruptedException ignore) {
-      Thread.currentThread().interrupt();
-    }
-
-    return (System.nanoTime() - t0) / 1000;
-  }
-
-  /**
-   * Returns a stack trace of the {@code Throwable} as a {@code String}.
-   * 
-   * @param throwable The throwable for which to create the stack trace.
-   * @param expectNull True if null should be returned when {@code throwable} is null or false to
-   *        return "" when {@code throwable} is null
-   * @return null if {@code throwable} is null and {@code expectNull} is true, "" if
-   *         {@code throwable} is null and {@code expectNull} is false, otherwise the stack trace
-   *         for {@code throwable}
-   */
-  public static String stackTraceToString(final Throwable throwable, final boolean expectNull) {
-    if (throwable == null) {
-      if (expectNull == true) {
-        return null;
-      }
-
-      return "";
-    }
-
-    StringWriter stringWriter = new StringWriter();
-    PrintWriter printWriter = new PrintWriter(stringWriter);
-    throwable.printStackTrace(printWriter);
-    printWriter.close();
-    return stringWriter.toString();
-  }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java b/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java
index a7151cc..5f39257 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java
@@ -20,6 +20,7 @@ import java.util.Date;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
@@ -33,7 +34,6 @@ import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.admin.Alert;
 import org.apache.geode.internal.admin.remote.AlertListenerMessage;
-import org.apache.geode.internal.lang.ThreadUtils;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.tcp.ReenteredConnectException;
 
@@ -138,7 +138,8 @@ public class AlertAppender extends AbstractAppender implements PropertyChangeLis
       final Date date = new Date(event.getTimeMillis());
       final String threadName = event.getThreadName();
       final String logMessage = event.getMessage().getFormattedMessage();
-      final String stackTrace = ThreadUtils.stackTraceToString(event.getThrown(), true);
+      final String stackTrace =
+          (event.getThrown() == null) ? null : ExceptionUtils.getStackTrace(event.getThrown());
       final String connectionName = ds.getConfig().getName();
 
       for (Listener listener : this.listeners) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/lang/ThreadUtilsJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/lang/ThreadUtilsJUnitTest.java
deleted file mode 100644
index 30af492..0000000
--- a/geode-core/src/test/java/org/apache/geode/internal/lang/ThreadUtilsJUnitTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.internal.lang;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.*;
-
-import java.lang.Thread.State;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import edu.umd.cs.mtc.MultithreadedTestCase;
-import edu.umd.cs.mtc.TestFramework;
-import org.jmock.Expectations;
-import org.jmock.Mockery;
-import org.jmock.lib.concurrent.Synchroniser;
-import org.jmock.lib.legacy.ClassImposteriser;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import org.apache.geode.test.junit.categories.UnitTest;
-
-/**
- * The ThreadUtilsJUnitTest class is a test suite of test cases for testing the contract and
- * functionality of the ThreadUtils class.
- * <p/>
- * 
- * @see org.apache.geode.internal.lang.ThreadUtils
- * @see org.jmock.Expectations
- * @see org.jmock.Mockery
- * @see org.junit.Assert
- * @see org.junit.Test
- * @since GemFire 7.0
- */
-@Category(UnitTest.class)
-public class ThreadUtilsJUnitTest {
-
-  protected Mockery mockContext;
-
-  @Before
-  public void setUp() {
-    mockContext = new Mockery() {
-      {
-        setImposteriser(ClassImposteriser.INSTANCE);
-        setThreadingPolicy(new Synchroniser());
-      }
-    };
-  }
-
-  @After
-  public void tearDown() {
-    mockContext.assertIsSatisfied();
-  }
-
-  @Test
-  public void testGetThreadNameWithNull() {
-    assertNull(ThreadUtils.getThreadName(null));
-  }
-
-  @Test
-  public void testGetThreadNameWithThread() {
-    assertNotNull(ThreadUtils.getThreadName(Thread.currentThread()));
-  }
-
-  @Test
-  public void testInterruptWithNullThread() {
-    ThreadUtils.interrupt(null);
-  }
-
-  @Test
-  public void testInterruptWithNonNullThread() {
-    final Thread mockThread = mockContext.mock(Thread.class, "Interrupted Thread");
-
-    mockContext.checking(new Expectations() {
-      {
-        oneOf(mockThread).interrupt();
-      }
-    });
-
-    ThreadUtils.interrupt(mockThread);
-  }
-
-  @Test
-  public void testIsAlive() {
-    assertTrue(ThreadUtils.isAlive(Thread.currentThread()));
-  }
-
-  @Test
-  public void testIsAliveWithNullThread() {
-    assertFalse(ThreadUtils.isAlive(null));
-  }
-
-  @Test
-  public void testIsAliveWithUnstartedThread() {
-    final Thread thread = new Thread(new Runnable() {
-      public void run() {}
-    });
-    assertFalse(ThreadUtils.isAlive(thread));
-  }
-
-  @Test
-  public void testIsAliveWithStoppedThread() throws InterruptedException {
-    final AtomicBoolean ran = new AtomicBoolean(false);
-
-    final Thread thread = new Thread(new Runnable() {
-      public void run() {
-        ran.set(true);
-      }
-    });
-
-    thread.start();
-    thread.join(50);
-
-    assertFalse(ThreadUtils.isAlive(thread));
-    assertTrue(ran.get());
-  }
-
-  @Test
-  public void testIsWaitingWithNullThread() {
-    assertFalse(ThreadUtils.isWaiting(null));
-  }
-
-  @Test
-  public void testIsWaitingWithRunningThread() {
-    final Thread runningThread = mockContext.mock(Thread.class, "Running Thread");
-
-    mockContext.checking(new Expectations() {
-      {
-        oneOf(runningThread).getState();
-        will(returnValue(State.RUNNABLE));
-      }
-    });
-
-    assertFalse(ThreadUtils.isWaiting(runningThread));
-  }
-
-  @Test
-  public void testIsWaitingWithWaitingThread() {
-    final Thread waitingThread = mockContext.mock(Thread.class, "Waiting Thread");
-
-    mockContext.checking(new Expectations() {
-      {
-        one(waitingThread).getState();
-        will(returnValue(State.WAITING));
-      }
-    });
-
-    assertTrue(ThreadUtils.isWaiting(waitingThread));
-  }
-
-  @Test
-  public void testSleep() {
-    final long t0 = System.currentTimeMillis();
-    final long sleepDuration = ThreadUtils.sleep(500);
-    final long t1 = System.currentTimeMillis();
-
-    assertTrue(t1 > t0);
-    assertTrue(sleepDuration > 0);
-  }
-
-  @Ignore("This is really just testing Thread.sleep(long)")
-  @Test
-  public void testSleepWithInterrupt() throws Throwable {
-    TestFramework.runOnce(new SleepInterruptedMultithreadedTestCase(10 * 1000));
-  }
-
-  protected static class SleepInterruptedMultithreadedTestCase extends MultithreadedTestCase {
-
-    private final long sleepDuration;
-
-    private volatile Thread sleeperThread;
-    private volatile boolean sleeperWasInterrupted;
-    private volatile long actualSleepDuration;
-
-    public SleepInterruptedMultithreadedTestCase(final long sleepDuration) {
-      assert sleepDuration > 0 : "The duration of sleep must be greater than equal to 0!";
-      this.sleepDuration = sleepDuration;
-    }
-
-    public void thread1() {
-      assertTick(0);
-      sleeperThread = Thread.currentThread();
-      sleeperThread.setName("Sleeper Thread");
-      waitForTick(1);
-      actualSleepDuration = ThreadUtils.sleep(sleepDuration);
-      sleeperWasInterrupted = sleeperThread.isInterrupted();
-      assertTick(2);
-    }
-
-    public void thread2() throws Exception {
-      assertTick(0);
-      Thread.currentThread().setName("Interrupting Thread");
-      waitForTick(1);
-      waitForTick(2);
-      sleeperThread.interrupt();
-      assertTick(2);
-    }
-
-    @Override
-    public void finish() {
-      assertThat(sleeperWasInterrupted).isTrue();
-      assertThat(actualSleepDuration).isGreaterThan(0);
-    }
-  }
-
-}

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].