package won.protocol.util;
import org.apache.jena.rdf.model.*;
import org.apache.jena.vocabulary.DCTerms;
import org.apache.jena.vocabulary.RDF;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import won.protocol.model.Need;
import won.protocol.model.NeedState;
import won.protocol.vocabulary.WON;
import java.net.URI;
/**
* User: gabriel
* Date: 09.04.13
* Time: 15:36
*/
public class NeedModelMapper implements ModelMapper<Need>
{
final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Model toModel(Need need)
{
Model model = ModelFactory.createDefaultModel();
Resource needResource = model.createResource(need.getNeedURI().toString(), WON.NEED);
Literal creationDate = DateTimeUtils.toLiteral(need.getCreationDate(), model);
if (creationDate != null) {
model.add(model.createStatement(needResource, DCTerms.created, creationDate));
}
model.add(model.createStatement(needResource, WON.IS_IN_STATE, WON.toResource(need.getState())));
// We don't add the need owner's endpoint here as this is confidential information
return model;
}
@Override
public Need fromModel(Model model)
{
Need need = new Need();
ResIterator needIt = model.listSubjectsWithProperty(RDF.type, WON.NEED);
if (!needIt.hasNext()) throw new IllegalArgumentException("at least one RDF node must be of type won:Need");
Resource needRes = needIt.next();
logger.debug("processing need resource {}", needRes.getURI());
need.setNeedURI(URI.create(needRes.getURI()));
Statement dateStat = needRes.getProperty(DCTerms.created);
if (dateStat != null && dateStat.getObject().isLiteral()) {
need.setCreationDate(DateTimeUtils.toDate(dateStat.getObject().asLiteral(), model));
logger.debug("found needCreationDate literal value '{}'",dateStat.getObject().asLiteral().getString());
} else {
logger.debug("no needCreationDate property found for need resource {}", needRes.getURI());
}
Statement stateStat = needRes.getProperty(WON.IS_IN_STATE);
if (stateStat != null && stateStat.getObject().isResource()) {
URI uri = URI.create(stateStat.getResource().getURI());
need.setState(NeedState.parseString(uri.getFragment()));
logger.debug("found isInState literal value '{}'",stateStat.getObject().asResource().getURI());
} else {
logger.debug("no isInState property found for need resource {}", needRes.getURI());
}
need.setWonNodeURI(URI.create(needRes.getPropertyResourceValue(WON.HAS_WON_NODE).toString()));
return need;
}
}