/*
* Copyright 2012 Erlend Hamnaberg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.hamnaberg.json;
import javaslang.control.Option;
import net.hamnaberg.json.extension.Extended;
import java.net.URI;
import java.util.*;
public final class Link extends Extended<Link> {
Link(Json.JObject delegate) {
super(delegate);
}
@Override
protected Link copy(Json.JObject value) {
return new Link(value);
}
public static Link create(URI href, String rel) {
return create(href, rel, Option.none(), Option.none(), Option.none());
}
public static Link create(URI href, String rel, Option<String> prompt) {
return create(href, rel, prompt, Option.none(), Option.none());
}
public static Link create(URI href, String rel, Option<String> prompt, Option<String> name) {
return create(href, rel, prompt, name, Option.none());
}
public static Link create(URI href, String rel, Option<String> prompt, Option<String> name, Option<Render> render) {
Map<String, Json.JValue> obj = new LinkedHashMap<>();
Json.JObject node = Json.jObject(
Json.tuple("href", Json.jString(Option.of(href).getOrElseThrow(() -> new IllegalArgumentException("Href may not be null")).toString())),
Json.tuple("rel", Json.jString(Option.of(rel).getOrElseThrow(() -> new IllegalArgumentException("Relation may not be null"))))
);
prompt.forEach(value -> obj.put("prompt", Json.jString(value)));
render.forEach(value -> obj.put("render", Json.jString(value.getName())));
name.forEach(value -> obj.put("name", Json.jString(value)));
return new Link(node.concat(Json.jObject(obj)));
}
public URI getHref() {
return delegate.getAsString("href").map(URI::create).getOrElse((URI)null);
}
public Link withHref(URI href) {
return copy(delegate.put("href", href.toString()));
}
public String getRel() {
return delegate.getAsString("rel").getOrElse((String)null);
}
public Link withRel(String rel) {
return copy(delegate.put("rel", rel));
}
public List<String> getParsedRel() {
return Arrays.asList(getRel().split("\\s"));
}
public Option<String> getPrompt() {
return Option.of(getAsString("prompt"));
}
public Link withPrompt(String prompt) {
return copy(delegate.put("prompt", prompt));
}
public Option<String> getName() {
return Option.of(getAsString("name"));
}
public Link withName(String name) {
return copy(delegate.put("name", name));
}
public Render getRender() {
return delegate.getAsString("render").map(Render::valueOf).getOrElse(Render.Link);
}
public Link withRender(Render render) {
return copy(delegate.put("render", render.getName()));
}
@Override
public String toString() {
return String.format("Link{href=%s,rel=%s,prompt=%s,name=%s,render=%s}", getHref(), getRel(), getPrompt(), getName(), getRender());
}
public void validate() {
Option.of(getHref()).getOrElseThrow(() -> new IllegalArgumentException("Href was null"));
Option.of(getRel()).getOrElseThrow(() -> new IllegalArgumentException("Rel was null"));
}
static List<Link> fromArray(Json.JArray node) {
return node.getListAsObjects().map(Link::new).toJavaList();
}
}