Initial stub implementation

Change-Id: I29f3e18820d43f028c7b925d54b239a5df00697d
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..68892bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+/target
+/.classpath
+/.project
+/.settings/org.maven.ide.eclipse.prefs
+/.settings/org.eclipse.m2e.core.prefs
+/.idea
diff --git a/BUCK b/BUCK
new file mode 100644
index 0000000..e9575ac
--- /dev/null
+++ b/BUCK
@@ -0,0 +1,8 @@
+gerrit_plugin(
+  name = 'ref-protection',
+  srcs = glob(['src/main/java/**/*.java']),
+  resources = glob(['src/main/resources/**/*']),
+  manifest_entries = [
+    'Gerrit-Module: com.googlesource.gerrit.plugins.refprotection.RefProtectionModule'
+  ],
+)
diff --git a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefProtectionModule.java b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefProtectionModule.java
new file mode 100644
index 0000000..d8b3f14
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefProtectionModule.java
@@ -0,0 +1,13 @@
+package com.googlesource.gerrit.plugins.refprotection;
+
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.inject.AbstractModule;
+
+public class RefProtectionModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(
+        RefUpdateListener.class);
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
new file mode 100644
index 0000000..92b6527
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
@@ -0,0 +1,82 @@
+package com.googlesource.gerrit.plugins.refprotection;
+
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+
+import org.eclipse.jgit.lib.ObjectId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class RefUpdateListener implements GitReferenceUpdatedListener {
+
+  private static final Logger log = LoggerFactory
+      .getLogger(RefUpdateListener.class);
+
+  @Override
+  public void onGitReferenceUpdated(final Event event) {
+    if (!isNewRef(event) && isRelevantRef(event)) {
+      if (isRefDeleted(event) || isNonFastForwardUpdate(event)) {
+        createBackupBranch(event);
+      }
+    }
+  }
+
+  /**
+   * Create a backup branch for the given ref.
+   *
+   * @param event the Event
+   */
+  private void createBackupBranch(Event event) {
+    // TODO
+  }
+
+  /**
+   * Is the event on a relevant ref?
+   *
+   * @param event the Event
+   * @return True if relevant, otherwise False.
+   */
+  private boolean isRelevantRef(Event event) {
+    return event.getRefName().startsWith(R_HEADS)
+        || event.getRefName().startsWith(R_TAGS);
+  }
+
+  /**
+   * Is the event a new ref?
+   *
+   * @param event the Event
+   * @return True if a new ref, otherwise False.
+   */
+  private boolean isNewRef(Event event) {
+    return event.getOldObjectId().equals(ObjectId.zeroId().getName());
+  }
+
+  /**
+   * Is the event a ref deletion?
+   *
+   * @param event the Event
+   * @return True if a ref deletion, otherwise False.
+   */
+  private boolean isRefDeleted(Event event) {
+    if (event.getNewObjectId().equals(ObjectId.zeroId().getName())) {
+      log.info(String.format(
+          "Ref Deleted: project [%s] refname [%s] old object id [%s]",
+          event.getProjectName(), event.getRefName(), event.getOldObjectId()));
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Is the event a non-fast-forward update?
+   *
+   * @param event the Event
+   * @return True if a non-fast-forward update, otherwise False.
+   */
+  private boolean isNonFastForwardUpdate(Event event) {
+    // TODO
+    return false;
+  }
+}
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
new file mode 100644
index 0000000..b917002
--- /dev/null
+++ b/src/main/resources/Documentation/about.md
@@ -0,0 +1,2 @@
+Makes backups of deleted refs.
+