From: Nigel Magnay <nigel.magnay@gmail.com>
To: Git ML <git@vger.kernel.org>
Subject: [JGIT PATCH] 1/2 : (reworked) Externalizable/Serializable Items
Date: Mon, 16 Feb 2009 20:12:29 +0000 [thread overview]
Message-ID: <320075ff0902161212s1980cd70r8cdc4c21550333ee@mail.gmail.com> (raw)
JGit is used as a library in external projects such as build tools.
Some of the representations of git data structures are useful
in these external tools - but - it is often desirable to be able to
either persist these objects, or serialize them across the wire.
Apply Externalizable to URIish and RefSpec, and Serializable to
ObjectId and RemoteConfig (in order to avoid the undesirable
requirement of a public, no-args constructor needed for Externalizable).
Signed-off-by: Nigel Magnay <nigel.magnay@gmail.com>
---
.../src/org/spearce/jgit/lib/ObjectId.java | 22 +++++-
.../src/org/spearce/jgit/transport/RefSpec.java | 77 +++++++++++++------
.../org/spearce/jgit/transport/RemoteConfig.java | 79 +++++++++++++++++++-
.../src/org/spearce/jgit/transport/URIish.java | 29 +++++++-
4 files changed, 179 insertions(+), 28 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectId.java
b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectId.java
index 52ce0d4..7c3b922 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectId.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectId.java
@@ -38,6 +38,10 @@
package org.spearce.jgit.lib;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import org.spearce.jgit.util.NB;
@@ -45,7 +49,7 @@
/**
* A SHA-1 abstraction.
*/
-public class ObjectId extends AnyObjectId {
+public class ObjectId extends AnyObjectId implements Serializable {
private static final ObjectId ZEROID;
private static final String ZEROID_STR;
@@ -269,4 +273,20 @@ protected ObjectId(final AnyObjectId src) {
public ObjectId toObjectId() {
return this;
}
+
+ private void writeObject(ObjectOutputStream os) throws IOException {
+ os.writeInt(w1);
+ os.writeInt(w2);
+ os.writeInt(w3);
+ os.writeInt(w4);
+ os.writeInt(w5);
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException {
+ w1 = ois.readInt();
+ w2 = ois.readInt();
+ w3 = ois.readInt();
+ w4 = ois.readInt();
+ w5 = ois.readInt();
+ }
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java
index 521110b..0ee89b0 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java
@@ -37,6 +37,11 @@
package org.spearce.jgit.transport;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
import org.spearce.jgit.lib.Constants;
import org.spearce.jgit.lib.Ref;
@@ -46,7 +51,7 @@
* A ref specification provides matching support and limited rules to rewrite a
* reference in one repository to another reference in another repository.
*/
-public class RefSpec {
+public class RefSpec implements Externalizable {
/**
* Suffix for wildcard ref spec component, that indicate matching all refs
* with specified prefix.
@@ -109,30 +114,7 @@ public RefSpec() {
* the specification is invalid.
*/
public RefSpec(final String spec) {
- String s = spec;
- if (s.startsWith("+")) {
- force = true;
- s = s.substring(1);
- }
-
- final int c = s.indexOf(':');
- if (c == 0) {
- s = s.substring(1);
- if (isWildcard(s))
- throw new IllegalArgumentException("Invalid wildcards " + spec);
- dstName = s;
- } else if (c > 0) {
- srcName = s.substring(0, c);
- dstName = s.substring(c + 1);
- if (isWildcard(srcName) && isWildcard(dstName))
- wildcard = true;
- else if (isWildcard(srcName) || isWildcard(dstName))
- throw new IllegalArgumentException("Invalid wildcards " + spec);
- } else {
- if (isWildcard(s))
- throw new IllegalArgumentException("Invalid wildcards " + spec);
- srcName = s;
- }
+ initializeFromString(spec);
}
/**
@@ -161,6 +143,42 @@ private RefSpec(final RefSpec p) {
}
/**
+ * Initialize the ref specification from a string.
+ *
+ * @param spec
+ * string describing the specification.
+ * @throws IllegalArgumentException
+ * the specification is invalid.
+ */
+ private void initializeFromString(final String spec) {
+ srcName = null;
+ String s = spec;
+ if (s.startsWith("+")) {
+ force = true;
+ s = s.substring(1);
+ }
+
+ final int c = s.indexOf(':');
+ if (c == 0) {
+ s = s.substring(1);
+ if (isWildcard(s))
+ throw new IllegalArgumentException("Invalid wildcards " + spec);
+ dstName = s;
+ } else if (c > 0) {
+ srcName = s.substring(0, c);
+ dstName = s.substring(c + 1);
+ if (isWildcard(srcName) && isWildcard(dstName))
+ wildcard = true;
+ else if (isWildcard(srcName) || isWildcard(dstName))
+ throw new IllegalArgumentException("Invalid wildcards " + spec);
+ } else {
+ if (isWildcard(s))
+ throw new IllegalArgumentException("Invalid wildcards " + spec);
+ srcName = s;
+ }
+ }
+
+ /**
* Check if this specification wants to forcefully update the destination.
*
* @return true if this specification asks for updates without merge tests.
@@ -421,4 +439,13 @@ public String toString() {
}
return r.toString();
}
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ initializeFromString(in.readUTF());
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeUTF(toString());
+ }
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java
index 5bbf664..899f73f 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java
@@ -38,6 +38,10 @@
package org.spearce.jgit.transport;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
@@ -53,7 +57,7 @@
* describing how refs should be transferred between this repository and the
* remote repository.
*/
-public class RemoteConfig {
+public class RemoteConfig implements Serializable {
private static final String SECTION = "remote";
private static final String KEY_URL = "url";
@@ -382,4 +386,77 @@ public TagOpt getTagOpt() {
public void setTagOpt(final TagOpt option) {
tagopt = option != null ? option : TagOpt.AUTO_FOLLOW;
}
+
+ private void writeObject(ObjectOutputStream os) throws IOException {
+
+ // Name
+ os.writeUTF(name);
+
+ // Key, Value pairs
+ for (URIish uri : uris) {
+ os.writeUTF(KEY_URL);
+ os.writeUTF(uri.toPrivateString());
+ }
+
+ for (RefSpec refspec : fetch) {
+ os.writeUTF(KEY_FETCH);
+ os.writeUTF(refspec.toString());
+ }
+
+ for (RefSpec refspec : push) {
+ os.writeUTF(KEY_PUSH);
+ os.writeUTF(refspec.toString());
+ }
+
+ os.writeUTF(KEY_UPLOADPACK);
+ os.writeUTF(uploadpack);
+
+ os.writeUTF(KEY_RECEIVEPACK);
+ os.writeUTF(receivepack);
+
+ os.writeUTF(KEY_TAGOPT);
+ os.writeUTF(tagopt.option());
+
+ // End marker
+ os.writeUTF("");
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException {
+ uris = new ArrayList<URIish>();
+ fetch = new ArrayList<RefSpec>();
+ push = new ArrayList<RefSpec>();
+ uploadpack = DEFAULT_UPLOAD_PACK;
+ receivepack = DEFAULT_RECEIVE_PACK;
+
+ name = ois.readUTF();
+
+ for (String key = ois.readUTF(); key.length() > 0; key = ois.readUTF()) {
+ String value = ois.readUTF();
+
+ if (key.equals(KEY_URL)) {
+ try {
+ uris.add(new URIish(value));
+ } catch (URISyntaxException e) {
+ throw new IOException("Invalid URI in RemoteConfig : "
+ + value);
+ }
+ } else if (key.equals(KEY_FETCH)) {
+ fetch.add(new RefSpec(value));
+
+ } else if (key.equals(KEY_PUSH)) {
+ push.add(new RefSpec(value));
+
+ } else if (key.equals(KEY_UPLOADPACK)) {
+ uploadpack = value;
+
+ } else if (key.equals(KEY_RECEIVEPACK)) {
+ receivepack = value;
+
+ } else if (key.equals(KEY_TAGOPT)) {
+ tagopt = TagOpt.fromOption(value);
+ }
+
+ }
+
+ }
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java
index b86e00c..6b85f45 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java
@@ -38,6 +38,10 @@
package org.spearce.jgit.transport;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.regex.Matcher;
@@ -49,7 +53,7 @@
* RFC 2396 URI's is that no URI encoding/decoding ever takes place. A space or
* any special character is written as-is.
*/
-public class URIish {
+public class URIish implements Externalizable {
private static final Pattern FULL_URI = Pattern
.compile("^(?:([a-z][a-z0-9+-]+)://(?:([^/]+?)(?::([^/]+?))?@)?(?:([^/]+?))?(?::(\\d+))?)?((?:[A-Za-z]:)?/.+)$");
@@ -75,6 +79,16 @@
* @throws URISyntaxException
*/
public URIish(String s) throws URISyntaxException {
+ initializeFromString(s);
+ }
+
+ /**
+ * Set fields from string based URI.
+ *
+ * @param s
+ * @throws URISyntaxException
+ */
+ private void initializeFromString(String s) throws URISyntaxException {
s = s.replace('\\', '/');
Matcher matcher = FULL_URI.matcher(s);
if (matcher.matches()) {
@@ -357,4 +371,17 @@ private String format(final boolean includePassword) {
return r.toString();
}
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ try {
+ initializeFromString(in.readUTF());
+ } catch (URISyntaxException e) {
+ throw new IOException("Incorrect format URI");
+ }
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeUTF(format(true));
+ }
}
--
1.6.0.2
next reply other threads:[~2009-02-16 20:14 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-16 20:12 Nigel Magnay [this message]
2009-02-16 20:16 ` [JGIT PATCH] 1/2 : (reworked) Externalizable/Serializable Items Johannes Schindelin
2009-02-18 16:30 ` Shawn O. Pearce
2009-02-18 20:59 ` Robin Rosenberg
2009-02-18 21:48 ` Shawn O. Pearce
2009-02-18 22:19 ` Sverre Rabbelier
2009-02-18 23:21 ` Robin Rosenberg
2009-02-18 23:27 ` Shawn O. Pearce
[not found] ` <320075ff0902200127m3e516621m60a608bc891ab992@mail.gmail.com>
2009-02-20 9:28 ` Nigel Magnay
2009-02-20 20:32 ` Shawn O. Pearce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=320075ff0902161212s1980cd70r8cdc4c21550333ee@mail.gmail.com \
--to=nigel.magnay@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).