/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.virtuoso;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Nullable;
import virtuoso.sql.ExtendedString;
import virtuoso.sql.RdfBox;
import com.mysema.commons.l10n.support.LocaleUtil;
import com.mysema.rdfbean.model.BID;
import com.mysema.rdfbean.model.LIT;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.xsd.ConverterRegistry;
/**
* @author tiwe
*
*/
public class Converter {
private final ConverterRegistry converters;
private final Map<String, UID> datatypes = new HashMap<String, UID>(1024);
private final Map<String, Locale> locales = new HashMap<String, Locale>(128);
public Converter(ConverterRegistry converters) {
this.converters = converters;
}
@Nullable
public NODE toNODE(@Nullable Object val) {
if (val == null) {
return null;
} else if (val instanceof ExtendedString) {
return toNODE((ExtendedString) val);
} else if (val instanceof RdfBox) {
return toNODE((RdfBox) val);
} else if (val instanceof String) {
return new LIT(val.toString());
} else {
UID datatype = converters.getDatatype(val.getClass());
if (datatype != null) {
return new LIT(converters.toString(val), datatype);
} else {
throw new IllegalArgumentException("Unkown type " + val.getClass().getName());
}
}
}
private NODE toNODE(ExtendedString ves) {
final String value = ves.toString();
if (ves.getIriType() == ExtendedString.IRI && (ves.getStrType() & 0x01) == 0x01) {
if (value.startsWith("_:")) {
return new BID(value.substring(2));
}
if (value.indexOf(':') < 0) {
return new UID(":" + value);
} else {
return new UID(value);
}
} else if (ves.getIriType() == ExtendedString.BNODE) {
return new BID(value.substring(9)); // "nodeID://"
} else {
return new LIT(value);
}
}
private LIT toNODE(RdfBox rb) {
if (rb.getLang() != null) {
return new LIT(rb.toString(), getLocale(rb.getLang()));
} else if (rb.getType() != null) {
return new LIT(rb.toString(), getUID(rb.getType()));
} else {
return new LIT(rb.toString());
}
}
private UID getUID(String datatype) {
UID uid = datatypes.get(datatype);
if (uid == null) {
uid = new UID(datatype);
datatypes.put(datatype, uid);
}
return uid;
}
private Locale getLocale(String lang) {
Locale locale = locales.get(lang);
if (locale == null) {
locale = LocaleUtil.parseLocale(lang);
locales.put(lang, locale);
}
return locale;
}
}