From 8c28a2e4c999dc5e8e29123b4ec34ef8462e6482 Mon Sep 17 00:00:00 2001
From: ribeaudc <ribeaudc>
Date: Fri, 16 Nov 2007 02:43:09 +0000
Subject: [PATCH] add: - 'NotImplementedException'.

SVN: 2601
---
 .../exceptions/NotImplementedException.java   | 137 ++++++++++++++++++
 1 file changed, 137 insertions(+)
 create mode 100644 common/source/java/ch/systemsx/cisd/common/exceptions/NotImplementedException.java

diff --git a/common/source/java/ch/systemsx/cisd/common/exceptions/NotImplementedException.java b/common/source/java/ch/systemsx/cisd/common/exceptions/NotImplementedException.java
new file mode 100644
index 00000000000..df3437a60b8
--- /dev/null
+++ b/common/source/java/ch/systemsx/cisd/common/exceptions/NotImplementedException.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * Licensed 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 ch.systemsx.cisd.common.exceptions;
+
+import java.io.Serializable;
+
+/**
+ * This is an extension to the <code>RuntimeException</code> for unimplemented methods. The empty constructor tries to
+ * get the method resp. the class name the exception has been thrown.
+ * <p>
+ * This class should be used everywhere where the <i>Apache</i> commons one can not (because the library is not
+ * imported, for instance).
+ * </p>
+ * 
+ * @author Chritian Ribeaud
+ * @see org.apache.commons.lang.NotImplementedException
+ */
+public final class NotImplementedException extends RuntimeException
+{
+
+    private static final long serialVersionUID = 1L;
+
+    /** The error message for this exception. */
+    private String message;
+
+    public NotImplementedException()
+    {
+        super();
+        StackTraceExtractor extractor = new StackTraceExtractor(this);
+        setMessage(extractor.getMethodName() + " method not implemented in " + extractor.getSimpleClassName());
+    }
+
+    public NotImplementedException(String message)
+    {
+        super(message);
+    }
+
+    public NotImplementedException(Throwable cause)
+    {
+        super(cause);
+    }
+
+    public NotImplementedException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    /** Sets the error message for this exception. */
+    public final void setMessage(final String message)
+    {
+        this.message = message;
+    }
+
+    /**
+     * Returns the error message for this exception. If the error message has not been defined in this class, returns
+     * the error message defined in the super class.
+     * 
+     * @see java.lang.Throwable#getMessage()
+     */
+    @Override
+    public final String getMessage()
+    {
+        if (message == null)
+        {
+            return super.getMessage();
+        }
+        return message;
+    }
+
+    /**
+     * An automatic stack trace extractor.
+     * 
+     * @author Christian Ribeaud
+     */
+    public static class StackTraceExtractor implements Serializable
+    {
+
+        private static final long serialVersionUID = 1L;
+
+        private final Throwable throwable;
+
+        private final int index;
+
+        public StackTraceExtractor(final Throwable throwable)
+        {
+            this(throwable, 0);
+        }
+
+        public StackTraceExtractor(final Throwable throwable, final int index)
+        {
+            this.throwable = throwable;
+            this.index = index;
+        }
+
+        public final String getClassName()
+        {
+            return throwable.getStackTrace()[index].getClassName();
+        }
+
+        public final String getMethodName()
+        {
+            return throwable.getStackTrace()[index].getMethodName();
+        }
+
+        public final String getSimpleClassName()
+        {
+            String fullClassName = getClassName();
+            if (null == fullClassName || "".equals(fullClassName))
+            {
+                return "";
+            }
+            // The simple class name is everything after the last dot.
+            // If there's no dot then the whole thing is the class name.
+            int lastDot = fullClassName.lastIndexOf('.');
+            if (0 > lastDot)
+            {
+                return fullClassName;
+            }
+            // Otherwise, extract the class name.
+            return fullClassName.substring(++lastDot);
+        }
+    }
+}
-- 
GitLab