Improve LocalProxyTransaction.doExists()
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / identifiers / ShardIdentifier.java
index c6928815938058dbddc7bdb8b920c60fa2e0f7da..7c206adc5859cc5117894ee72eb6e5bb1f62db9a 100644 (file)
@@ -5,38 +5,54 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.controller.cluster.datastore.identifiers;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.opendaylight.controller.cluster.access.concepts.MemberName;
 
 public class ShardIdentifier {
+    // This pattern needs to remain in sync with toString(), which produces
+    // strings with corresponding to "%s-shard-%s-%s"
+    private static final Pattern PATTERN = Pattern.compile("(\\S+)-shard-(\\S+)-(\\S+)");
+
     private final String shardName;
-    private final String memberName;
+    private final MemberName memberName;
     private final String type;
+    private final String fullName;
 
+    ShardIdentifier(final String shardName, final MemberName memberName, final String type) {
+        this.shardName = requireNonNull(shardName, "shardName should not be null");
+        this.memberName = requireNonNull(memberName, "memberName should not be null");
+        this.type = requireNonNull(type, "type should not be null");
 
-    public ShardIdentifier(String shardName, String memberName, String type) {
+        fullName = memberName.getName() + "-shard-" + shardName + "-" + type;
+    }
 
-        Preconditions.checkNotNull(shardName, "shardName should not be null");
-        Preconditions.checkNotNull(memberName, "memberName should not be null");
-        Preconditions.checkNotNull(type, "type should not be null");
+    public static ShardIdentifier create(final String shardName, final MemberName memberName, final String type) {
+        return new ShardIdentifier(shardName, memberName, type);
+    }
+
+    public static ShardIdentifier fromShardIdString(final String shardIdString) {
+        final Matcher matcher = PATTERN.matcher(shardIdString);
+        checkArgument(matcher.matches(), "Invalid shard id \"%s\"", shardIdString);
 
-        this.shardName = shardName;
-        this.memberName = memberName;
-        this.type = type;
+        return new ShardIdentifier(matcher.group(2), MemberName.forName(matcher.group(1)), matcher.group(3));
     }
 
     @Override
-    public boolean equals(Object o) {
-        if (this == o) {
+    public boolean equals(final Object obj) {
+        if (this == obj) {
             return true;
         }
-        if (o == null || getClass() != o.getClass()) {
+        if (obj == null || getClass() != obj.getClass()) {
             return false;
         }
 
-        ShardIdentifier that = (ShardIdentifier) o;
+        ShardIdentifier that = (ShardIdentifier) obj;
 
         if (!memberName.equals(that.memberName)) {
             return false;
@@ -59,39 +75,57 @@ public class ShardIdentifier {
         return result;
     }
 
-    @Override public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append(memberName).append("-shard-").append(shardName).append("-").append(type);
-        return builder.toString();
+    @Override
+    public String toString() {
+        // ensure the output of toString matches the pattern above
+        return fullName;
+    }
+
+    public String getShardName() {
+        return shardName;
+    }
+
+    public MemberName getMemberName() {
+        return memberName;
     }
 
-    public static Builder builder(){
-        return new Builder();
+    public String getType() {
+        return type;
     }
 
     public static class Builder {
         private String shardName;
-        private String memberName;
+        private MemberName memberName;
         private String type;
 
-        public ShardIdentifier build(){
+        public ShardIdentifier build() {
             return new ShardIdentifier(shardName, memberName, type);
         }
 
-        public Builder shardName(String shardName){
-            this.shardName = shardName;
+        public Builder shardName(final String newShardName) {
+            this.shardName = newShardName;
             return this;
         }
 
-        public Builder memberName(String memberName){
-            this.memberName = memberName;
+        public Builder memberName(final MemberName newMemberName) {
+            this.memberName = newMemberName;
             return this;
         }
 
-        public Builder type(String type){
-            this.type = type;
+        public Builder type(final String newType) {
+            this.type = newType;
             return this;
         }
 
+        public Builder fromShardIdString(final String shardId) {
+            Matcher matcher = PATTERN.matcher(shardId);
+
+            if (matcher.matches()) {
+                memberName = MemberName.forName(matcher.group(1));
+                shardName = matcher.group(2);
+                type = matcher.group(3);
+            }
+            return this;
+        }
     }
 }