UndecoratedUuidInlineUriHandler.java
package org.wikidata.query.rdf.blazegraph.inline.uri;
import java.util.Locale;
import java.util.UUID;
import com.bigdata.rdf.internal.InlineURIHandler;
import com.bigdata.rdf.internal.impl.literal.AbstractLiteralIV;
import com.bigdata.rdf.internal.impl.literal.UUIDLiteralIV;
import com.bigdata.rdf.model.BigdataLiteral;
/**
* InlineURIHandler for UUID type URIs with not decoration - like no dashes and
* always lowercase. Like values and references.
*/
public class UndecoratedUuidInlineUriHandler extends InlineURIHandler {
public UndecoratedUuidInlineUriHandler(String namespace) {
super(namespace);
}
@Override
@SuppressWarnings("rawtypes")
protected AbstractLiteralIV createInlineIV(String localName) {
localName = localName.replace("-", "");
// localName should look like this:
// 91212dc3fcc8b65607d27f92b36e5761
if (localName.length() != 32) {
return null;
}
try {
long first = parseUnsigned(localName, 0, 16);
long second = parseUnsigned(localName, 16, 32);
return new UUIDLiteralIV(new UUID(first, second));
} catch (IllegalArgumentException ex) {
return null;
}
}
@Override
public String getLocalNameFromDelegate(AbstractLiteralIV<BigdataLiteral, ?> delegate) {
return delegate.stringValue().replace("-", "").toLowerCase(Locale.ROOT);
}
/**
* Parse an unsigned long into a java long.
*/
private static long parseUnsigned(String s, int from, int to) {
long value = 0;
for (int pos = from; pos < to; pos++) {
int digit = Character.digit(s.charAt(pos), 16);
if (digit == -1) {
throw new NumberFormatException(s);
}
value = value * 16 + digit;
}
return value;
}
}