[NO ISSUE][HYR] Logging improvements, cleanup

- abbreviate java package names in IActivity display names, as these
  are used in thread names, which adds a lot of bloat to logs: all
  but the last segment of the package are replaced with the first
  letter of the segment

  e.g. org.apache.hyracks.api.rewriter.runtime.SuperActivity
       -> o.a.h.a.r.runtime.SuperActivity

Change-Id: I092f2988f1efa0ffbf7e6395313edbc482f377a4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/9403
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mblow@apache.org>
Reviewed-by: Hussain Towaileb <hussainht@gmail.com>
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/IActivity.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/IActivity.java
index f7e4d42..033e744 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/IActivity.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/IActivity.java
@@ -19,14 +19,30 @@
 package org.apache.hyracks.api.dataflow;
 
 import java.io.Serializable;
+import java.util.regex.Pattern;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IActivity extends Serializable {
-    public ActivityId getActivityId();
+    ActivityId getActivityId();
 
-    public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
-            IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) throws HyracksDataException;
+    IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx, IRecordDescriptorProvider recordDescProvider,
+            int partition, int nPartitions) throws HyracksDataException;
+
+    default String getDisplayName() {
+        return DisplayNameHelper.toDisplayName(getClass().getName());
+    }
+
+    class DisplayNameHelper {
+        static final Pattern PREFIX_PATTERN = Pattern.compile("\\B\\w+(\\.[a-z])");
+
+        private DisplayNameHelper() {
+        }
+
+        static String toDisplayName(String className) {
+            return PREFIX_PATTERN.matcher(className).replaceAll("$1");
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/runtime/SuperActivityOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/runtime/SuperActivityOperatorNodePushable.java
index 168d7dd..1d8c774 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/runtime/SuperActivityOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/runtime/SuperActivityOperatorNodePushable.java
@@ -55,6 +55,7 @@
  * connected activities in a single thread.
  */
 public class SuperActivityOperatorNodePushable implements IOperatorNodePushable {
+    private static final String CLASS_SIMPLE_NAME = SuperActivityOperatorNodePushable.class.getSimpleName();
     private final Map<ActivityId, IOperatorNodePushable> operatorNodePushables = new HashMap<>();
     private final List<IOperatorNodePushable> operatorNodePushablesBFSOrder = new ArrayList<>();
     private final Map<ActivityId, IActivity> startActivities;
@@ -223,8 +224,7 @@
                     try {
                         Thread.currentThread()
                                 .setName(Thread.currentThread().getName() + ":" + ctx.getJobletContext().getJobId()
-                                        + ":" + ctx.getTaskAttemptId() + ":"
-                                        + SuperActivityOperatorNodePushable.class.getSimpleName());
+                                        + ":" + ctx.getTaskAttemptId() + ":" + CLASS_SIMPLE_NAME);
                         action.run(op);
                     } catch (Throwable th) { // NOSONAR: Must catch all causes of failure
                         failures.offer(th);
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/dataflow/IActivityTest.java b/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/dataflow/IActivityTest.java
new file mode 100644
index 0000000..98830c4
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/dataflow/IActivityTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.hyracks.api.dataflow;
+
+import static org.apache.hyracks.api.dataflow.IActivity.DisplayNameHelper.toDisplayName;
+
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.rewriter.runtime.SuperActivity;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IActivityTest {
+    @Test
+    public void testDisplayName() {
+        IActivity dummyActivity = new DummyActivity();
+        final String displayName = dummyActivity.getDisplayName();
+        Assert.assertEquals("o.a.h.a.dataflow.DummyActivity", displayName);
+        Assert.assertEquals("o.a.h.a.r.runtime.SuperActivity", toDisplayName(SuperActivity.class.getName()));
+        Assert.assertEquals("o.a.h.a.r.o.std.SplitOperatorDescriptor$AbstractReplicateOperatorDescriptor",
+                toDisplayName("org.apache.hyracks.algebricks.runtime.operators.std.SplitOperatorDescriptor"
+                        + "$AbstractReplicateOperatorDescriptor"));
+    }
+}
+
+class DummyActivity implements IActivity {
+    @Override
+    public ActivityId getActivityId() {
+        return null;
+    }
+
+    @Override
+    public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
+            IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) throws HyracksDataException {
+        return null;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
index 69f1113..551d8fa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
@@ -150,8 +150,7 @@
                 LOGGER.trace("Initializing {} -> {} for {}", taId, han, jobId);
                 final int partition = tid.getPartition();
                 List<IConnectorDescriptor> inputs = ac.getActivityInputMap().get(aid);
-                task = null;
-                task = new Task(joblet, flags, taId, han.getClass().getName(), ncs.getExecutor(), ncs,
+                task = new Task(joblet, flags, taId, han.getDisplayName(), ncs.getExecutor(), ncs,
                         createInputChannels(td, inputs));
                 IOperatorNodePushable operator = han.createPushRuntime(task, rdp, partition, td.getPartitionCount());
                 List<IPartitionCollector> collectors = new ArrayList<>();
@@ -185,7 +184,7 @@
                     }
                 }
 
-                task.setTaskRuntime(collectors.toArray(new IPartitionCollector[collectors.size()]), operator);
+                task.setTaskRuntime(collectors.toArray(new IPartitionCollector[0]), operator);
                 joblet.addTask(task);
                 task.start();
                 taskIndex++;