Skip to content
Snippets Groups Projects
Commit 207781bf authored by Benoit Lavenier's avatar Benoit Lavenier
Browse files

Add implementation of /wot/certified-by and /wot/certifiers-of

parent 47775a5b
No related branches found
No related tags found
No related merge requests found
Showing
with 866 additions and 558 deletions
/target/
package io.ucoin.client.core.model;
import java.io.Serializable;
/**
* Basic information on a identity.
*
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since 1.0
*
*/
public class BasicIdentity implements Serializable {
private static final long serialVersionUID = 8080689271400316984L;
private String pubkey;
private String signature;
private String uid;
public String getPubkey() {
return pubkey;
}
public void setPubkey(String pubkey) {
this.pubkey = pubkey;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder()
.append("uid=").append(uid)
.append(",pubkey=").append(pubkey)
.append(",signature").append(signature);
return sb.toString();
}
}
package io.ucoin.client.core.model; package io.ucoin.client.core.model;
public class Identity { public class Identity extends BasicIdentity {
private String pubkey; private static final long serialVersionUID = -7451079677730158794L;
private String signature; private int timestamp = -1;
private int timestamp;
private String uid;
public String getPubkey() {
return pubkey;
}
public void setPubkey(String pubkey) {
this.pubkey = pubkey;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
/**
* The timestamp value of the signature date
* @return
*/
public int getTimestamp() { public int getTimestamp() {
return timestamp; return timestamp;
} }
...@@ -34,11 +18,4 @@ public class Identity { ...@@ -34,11 +18,4 @@ public class Identity {
this.timestamp = timestamp; this.timestamp = timestamp;
} }
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
} }
...@@ -2,6 +2,8 @@ package io.ucoin.client.core.model; ...@@ -2,6 +2,8 @@ package io.ucoin.client.core.model;
public class Member extends Identity{ public class Member extends Identity{
private static final long serialVersionUID = 8448049949323699700L;
private String number; private String number;
private String hash; private String hash;
......
package io.ucoin.client.core.model;
/**
* A certification, return by <code>/wot/certified-by/[uid]</code> or <code>/wot/certifiers-of/[uid]</code>
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since 1.0
*
*/
public class WotCertification extends BasicIdentity{
private static final long serialVersionUID = 2204517069552693026L;
public WotCertificationTime cert_time;
/**
* Indicate whether the certification is written in the blockchain or not.
*/
public boolean written;
public WotCertificationTime getCert_time() {
return cert_time;
}
public void setCert_time(WotCertificationTime cert_time) {
this.cert_time = cert_time;
}
/**
* Indicate whether the certification is written in the blockchain or not.
*/
public boolean isWritten() {
return written;
}
public void setWritten(boolean written) {
this.written = written;
}
}
package io.ucoin.client.core.model;
import java.io.Serializable;
public class WotCertificationTime implements Serializable{
private static final long serialVersionUID = -358639516878884523L;
private int block = -1;
private int medianTime = -1;
public int getBlock() {
return block;
}
public void setBlock(int block) {
this.block = block;
}
public int getMedianTime() {
return medianTime;
}
public void setMedianTime(int medianTime) {
this.medianTime = medianTime;
}
}
package io.ucoin.client.core.model;
import java.util.List;
/**
* A list of certifications done to user, or by user
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since 1.0
*
*/
public class WotIdentityCertifications extends BasicIdentity {
private static final long serialVersionUID = 8568496827055074607L;
private List<WotCertification> certifications;
public List<WotCertification> getCertifications() {
return certifications;
}
public void setCertifications(List<WotCertification> certifications) {
this.certifications = certifications;
}
}
...@@ -9,6 +9,7 @@ import java.io.IOException; ...@@ -9,6 +9,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader;
import java.net.ConnectException; import java.net.ConnectException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
...@@ -127,10 +128,24 @@ public abstract class AbstractService implements Closeable { ...@@ -127,10 +128,24 @@ public abstract class AbstractService implements Closeable {
protected Object parseResponse(CloseableHttpResponse response, Class<?> ResultClass) throws IOException { protected Object parseResponse(CloseableHttpResponse response, Class<?> ResultClass) throws IOException {
Object result; Object result;
// If trace enable, log the response before parsing
if (log.isTraceEnabled()) {
try (InputStream content = response.getEntity().getContent()) {
String jsonString = getContentAsString(content);
log.trace("Parsing response:\n" + jsonString);
result = gson.fromJson(jsonString, ResultClass);
}
}
// trace not enable
else {
try (InputStream content = response.getEntity().getContent()) { try (InputStream content = response.getEntity().getContent()) {
Reader reader = new InputStreamReader(content, Charsets.UTF_8); Reader reader = new InputStreamReader(content, Charsets.UTF_8);
result = gson.fromJson(reader, ResultClass); result = gson.fromJson(reader, ResultClass);
} }
}
if (result == null) { if (result == null) {
throw new UCoinTechnicalException("ucoin.client.core.emptyResponse"); throw new UCoinTechnicalException("ucoin.client.core.emptyResponse");
...@@ -142,4 +157,15 @@ public abstract class AbstractService implements Closeable { ...@@ -142,4 +157,15 @@ public abstract class AbstractService implements Closeable {
return result; return result;
} }
protected String getContentAsString(InputStream content) throws IOException {
Reader reader = new InputStreamReader(content, Charsets.UTF_8);
StringBuilder result = new StringBuilder();
char[] buf = new char[64];
int len = 0;
while((len = reader.read(buf)) != -1) {
result.append(buf, 0, len);
}
return result.toString();
}
} }
...@@ -19,6 +19,9 @@ public interface ProtocolUrls { ...@@ -19,6 +19,9 @@ public interface ProtocolUrls {
public static final String WOT_LOOKUP = WOT_BASE + "/lookup/%s"; public static final String WOT_LOOKUP = WOT_BASE + "/lookup/%s";
public static final String WOT_CERTIFIED_BY = WOT_BASE + "/certified-by/%s";
public static final String WOT_CERTIFIERS_OF = WOT_BASE + "/certifiers-of/%s";
} }
package io.ucoin.client.core.service; package io.ucoin.client.core.service;
import io.ucoin.client.core.model.WotIdentityCertifications;
import io.ucoin.client.core.model.WotLookupResult; import io.ucoin.client.core.model.WotLookupResult;
import io.ucoin.client.core.model.WotLookupResults; import io.ucoin.client.core.model.WotLookupResults;
import io.ucoin.client.core.model.WotLookupUId; import io.ucoin.client.core.model.WotLookupUId;
...@@ -37,11 +38,12 @@ public class WotService extends AbstractService { ...@@ -37,11 +38,12 @@ public class WotService extends AbstractService {
log.debug(String.format("Try to find user info by uid: %s", uid)); log.debug(String.format("Try to find user info by uid: %s", uid));
} }
// get parameter // call lookup
String path = String.format(ProtocolUrls.WOT_LOOKUP, uid); String path = String.format(ProtocolUrls.WOT_LOOKUP, uid);
HttpGet lookupHttpGet = new HttpGet(getAppendedPath(path)); HttpGet lookupHttpGet = new HttpGet(getAppendedPath(path));
WotLookupResults lookupResults = executeRequest(lookupHttpGet, WotLookupResults.class); WotLookupResults lookupResults = executeRequest(lookupHttpGet, WotLookupResults.class);
// Retrieve the exact uid
WotLookupUId uniqueResult = getUid(lookupResults, uid); WotLookupUId uniqueResult = getUid(lookupResults, uid);
if (uniqueResult == null) { if (uniqueResult == null) {
throw new UCoinTechnicalException("User not found, with uid=" + uid); throw new UCoinTechnicalException("User not found, with uid=" + uid);
...@@ -50,6 +52,36 @@ public class WotService extends AbstractService { ...@@ -50,6 +52,36 @@ public class WotService extends AbstractService {
return uniqueResult; return uniqueResult;
} }
public WotIdentityCertifications getCertifiedBy(String uid) throws Exception {
if (log.isDebugEnabled()) {
log.debug(String.format("Try to get certifications done by uid: %s", uid));
}
// call certified-by
String path = String.format(ProtocolUrls.WOT_CERTIFIED_BY, uid);
HttpGet httpGet = new HttpGet(getAppendedPath(path));
WotIdentityCertifications result = executeRequest(httpGet, WotIdentityCertifications.class);
return result;
}
public WotIdentityCertifications getCertifiersOf(String uid) throws Exception {
if (log.isDebugEnabled()) {
log.debug(String.format("Try to get certifications done to uid: %s", uid));
}
// call certifiers-of
String path = String.format(ProtocolUrls.WOT_CERTIFIERS_OF, uid);
HttpGet httpGet = new HttpGet(getAppendedPath(path));
WotIdentityCertifications result = executeRequest(httpGet, WotIdentityCertifications.class);
return result;
}
/* -- Internal methods -- */ /* -- Internal methods -- */
protected WotLookupUId getUid(WotLookupResults lookupResults, String filterUid) { protected WotLookupUId getUid(WotLookupResults lookupResults, String filterUid) {
......
ucoinj.config=
ucoinj.config.option.basedir.description=
ucoinj.config.option.cache.directory.description=
ucoinj.config.option.data.directory.description=
ucoinj.config.option.i18n.directory.description=
ucoinj.config.option.i18n.locale.description=
ucoinj.config.option.inceptionYear.description=
ucoinj.config.option.node.currency.description=
ucoinj.config.option.node.host.description=
ucoinj.config.option.node.port.description=
ucoinj.config.option.node.protocol.description=
ucoinj.config.option.node.timeout.description=
ucoinj.config.option.organizationName.description=
ucoinj.config.option.passwd.description=
ucoinj.config.option.salt.description=
ucoinj.config.option.site.url.description=
ucoinj.config.option.tmp.directory.description=
ucoinj.config.option.version.description=
ucoinj.config.parse.error=
quadrige2.config.parse.error=Erreur lors de la lecture de la ligne de commande quadrige2.config.parse.error=Erreur lors de la lecture de la ligne de commande
ucoinj.config=
ucoinj.config.option.basedir.description=
ucoinj.config.option.cache.directory.description=
ucoinj.config.option.data.directory.description=
ucoinj.config.option.i18n.directory.description=
ucoinj.config.option.i18n.locale.description=
ucoinj.config.option.inceptionYear.description=
ucoinj.config.option.node.currency.description=
ucoinj.config.option.node.host.description=
ucoinj.config.option.node.port.description=
ucoinj.config.option.node.protocol.description=
ucoinj.config.option.node.timeout.description=
ucoinj.config.option.organizationName.description=
ucoinj.config.option.passwd.description=
ucoinj.config.option.salt.description=
ucoinj.config.option.site.url.description=
ucoinj.config.option.tmp.directory.description=
ucoinj.config.option.version.description=
ucoinj.config.parse.error=
...@@ -3,7 +3,7 @@ package io.ucoin.client.core.service; ...@@ -3,7 +3,7 @@ package io.ucoin.client.core.service;
import io.ucoin.client.core.TestResource; import io.ucoin.client.core.TestResource;
import io.ucoin.client.core.model.BlockchainBlock; import io.ucoin.client.core.model.BlockchainBlock;
import io.ucoin.client.core.model.BlockchainParameter; import io.ucoin.client.core.model.BlockchainParameter;
import io.ucoin.client.core.model.Identity; import io.ucoin.client.core.model.BasicIdentity;
import io.ucoin.client.core.model.Member; import io.ucoin.client.core.model.Member;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
...@@ -44,7 +44,7 @@ public class BlockchainServiceTest { ...@@ -44,7 +44,7 @@ public class BlockchainServiceTest {
Assert.assertNotNull(result); Assert.assertNotNull(result);
Assert.assertNotNull(result.getCurrency()); Assert.assertNotNull(result.getCurrency());
for (Identity id: result.getIdentities()) { for (BasicIdentity id: result.getIdentities()) {
Assert.assertNotNull(id.getUid()); Assert.assertNotNull(id.getUid());
} }
......
package io.ucoin.client.core.service; package io.ucoin.client.core.service;
import io.ucoin.client.core.TestResource; import io.ucoin.client.core.TestResource;
import io.ucoin.client.core.model.BasicIdentity;
import io.ucoin.client.core.model.Identity;
import io.ucoin.client.core.model.WotCertification;
import io.ucoin.client.core.model.WotCertificationTime;
import io.ucoin.client.core.model.WotIdentityCertifications;
import io.ucoin.client.core.model.WotLookupResults; import io.ucoin.client.core.model.WotLookupResults;
import io.ucoin.client.core.model.WotLookupUId; import io.ucoin.client.core.model.WotLookupUId;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.junit.Assert; import org.junit.Assert;
...@@ -37,4 +43,77 @@ public class WotServiceTest { ...@@ -37,4 +43,77 @@ public class WotServiceTest {
// close // close
service.close(); service.close();
} }
@Test
public void getCertifiedBy() throws Exception {
WotService service = new WotService();
WotIdentityCertifications result = service.getCertifiedBy(resource.getFixtures().getUid());
assertBasicIdentity(result, false);
Assert.assertTrue(String.format("Test user (uid=%s) should have some certifications return by %s",
resource.getFixtures().getUid(),
ProtocolUrls.WOT_CERTIFIED_BY),
CollectionUtils.isNotEmpty(result.getCertifications()));
for (WotCertification cert: result.getCertifications()) {
Assert.assertNotNull(cert.getUid());
WotCertificationTime certTime = cert.getCert_time();
Assert.assertNotNull(certTime);
Assert.assertTrue(certTime.getBlock() >= 0);
Assert.assertNotNull(certTime.getMedianTime() >= 0);
}
// close
service.close();
}
@Test
public void getCertifiersOf() throws Exception {
WotService service = new WotService();
WotIdentityCertifications result = service.getCertifiersOf(resource.getFixtures().getUid());
assertBasicIdentity(result, false);
Assert.assertTrue(String.format("Test user (uid=%s) should have some certifications return by %s",
resource.getFixtures().getUid(),
ProtocolUrls.WOT_CERTIFIERS_OF),
CollectionUtils.isNotEmpty(result.getCertifications()));
for (WotCertification cert: result.getCertifications()) {
Assert.assertNotNull(cert.getUid());
WotCertificationTime certTime = cert.getCert_time();
Assert.assertNotNull(certTime);
Assert.assertTrue(certTime.getBlock() >= 0);
Assert.assertNotNull(certTime.getMedianTime() >= 0);
}
// close
service.close();
}
/* -- internal methods */
protected void assertBasicIdentity(BasicIdentity identity, boolean withSignature) {
Assert.assertNotNull(identity);
Assert.assertNotNull(identity.getUid());
Assert.assertNotNull(identity.getPubkey());
if (withSignature) {
Assert.assertNotNull(identity.getSignature());
}
else {
Assert.assertNull(identity.getSignature());
}
}
protected void assertIdentity(Identity identity) {
assertBasicIdentity(identity, true);
Assert.assertTrue(identity.getTimestamp() > 0);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment