package org.odata4j.format.json; import java.io.Reader; import java.util.ArrayList; import java.util.List; import org.odata4j.core.OCollection; import org.odata4j.core.OComplexObject; import org.odata4j.core.ODataVersion; import org.odata4j.edm.EdmCollectionType; import org.odata4j.edm.EdmComplexType; import org.odata4j.edm.EdmProperty; import org.odata4j.edm.EdmProperty.CollectionKind; import org.odata4j.edm.EdmSimpleType; import org.odata4j.format.FormatParser; import org.odata4j.format.Settings; import org.odata4j.format.SingleLink; import org.odata4j.format.SingleLinks; import org.odata4j.format.json.JsonStreamReaderFactory.JsonStreamReader; import org.odata4j.format.json.JsonStreamReaderFactory.JsonStreamReader.JsonEvent; public class JsonSingleLinkFormatParser extends JsonFormatParser implements FormatParser<SingleLink> { public JsonSingleLinkFormatParser(Settings settings) { super(settings); } @Override public SingleLink parse(Reader reader) { // {"uri": "http://host/service.svc/Orders(1)"} JsonStreamReader jsr = JsonStreamReaderFactory.createJsonStreamReader(reader); try { while (jsr.hasNext()) { JsonEvent event = jsr.nextEvent(); if (event.isStartProperty() && event.asStartProperty().getName().equals("uri")) { String uri = jsr.nextEvent().asEndProperty().getValue(); return SingleLinks.create(uri); } } throw new RuntimeException("JsonSingleLinkFormatParser: failed to get the link from json string."); } finally { jsr.close(); } } public static Iterable<SingleLink> parseLinks(Reader reader) { EdmProperty.Builder ctPropBuilder = EdmProperty.newBuilder("uri").setType(EdmSimpleType.STRING); List<EdmProperty.Builder> complexTypeBuilder = new ArrayList<EdmProperty.Builder>(); complexTypeBuilder.add(ctPropBuilder); EdmComplexType.Builder ctBuilder = new EdmComplexType.Builder().addProperties(complexTypeBuilder).setName("uriLinks"); EdmComplexType uriCtType = ctBuilder.build(); Settings s = new Settings(ODataVersion.V2, null, null, null, null, true, new EdmCollectionType(CollectionKind.Collection, uriCtType)); OCollection<OComplexObject> linkCollection = (OCollection<OComplexObject>) new JsonCollectionFormatParser(s).parse(reader); List<SingleLink> rt = new ArrayList<SingleLink>(); for (OComplexObject obj : linkCollection) { rt.add(SingleLinks.create(obj.getProperty("uri", String.class).getValue())); } return rt; } }