blob: 35f89fb7b511fa1ab691ce3c0650a10018703ce8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.olingo.client.api.domain;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.commons.api.Constants;
/**
* OData link.
*/
public class ClientLink extends ClientItem implements ClientAnnotatable {
public static class Builder {
private URI uri;
private ClientLinkType type;
private String title;
private String mediaETag;
public Builder setURI(final URI uri) {
this.uri = uri;
return this;
}
public Builder setURI(final URI baseURI, final String href) {
uri = getURI(baseURI, href);
return this;
}
public Builder setType(final ClientLinkType type) {
this.type = type;
return this;
}
public Builder setTitle(final String title) {
this.title = title;
return this;
}
public Builder setEtag(final String eTag) {
this.mediaETag= eTag;
return this;
}
public ClientLink build() {
return new ClientLink(uri, type, title, mediaETag);
}
}
/**
* Build URI starting from the given base and href.
* <br/>
* If href is absolute or base is null then base will be ignored.
*
* @param base URI prefix.
* @param href URI suffix.
* @return built URI.
*/
private static URI getURI(final URI base, final String href) {
if (href == null) {
throw new IllegalArgumentException("Null link provided");
}
URI uri = URI.create(href);
if (!uri.isAbsolute() && base != null) {
uri = URI.create(base.toASCIIString() + "/" + href);
}
return uri.normalize();
}
/**
* Link type.
*/
private final ClientLinkType type;
/**
* Link rel.
*/
private final String rel;
/**
* ETag for media edit links.
*/
private String mediaETag;
private final List<ClientAnnotation> annotations = new ArrayList<ClientAnnotation>();
/**
* Constructor.
*
* @param uri URI.
* @param type type.
* @param title title.
*/
public ClientLink(final URI uri, final ClientLinkType type, final String title) {
this(uri, type, title, null);
}
public ClientLink(final URI uri, final ClientLinkType type, final String title, final String eTag) {
super(title);
this.type = type;
setLink(uri);
this.mediaETag = eTag;
switch (this.type) {
case ASSOCIATION:
rel = Constants.NS_ASSOCIATION_LINK_REL + title;
break;
case ENTITY_NAVIGATION:
case ENTITY_SET_NAVIGATION:
rel = Constants.NS_NAVIGATION_LINK_REL + title;
break;
case MEDIA_EDIT:
rel = Constants.NS_MEDIA_EDIT_LINK_REL + title;
break;
case MEDIA_READ:
rel = Constants.NS_MEDIA_READ_LINK_REL + title;
break;
default:
rel = Constants.NS_MEDIA_EDIT_LINK_REL + title;
break;
}
}
/**
* Constructor.
*
* @param version OData service version.
* @param baseURI base URI.
* @param href href.
* @param type type.
* @param title title.
*/
protected ClientLink(final URI baseURI, final String href, final ClientLinkType type, final String title) {
this(getURI(baseURI, href), type, title);
}
/**
* Gets link type.
*
* @return link type;
*/
public ClientLinkType getType() {
return type;
}
public ClientInlineEntity asInlineEntity() {
return (this instanceof ClientInlineEntity) ? (ClientInlineEntity) this : null;
}
public ClientInlineEntitySet asInlineEntitySet() {
return (this instanceof ClientInlineEntitySet) ? (ClientInlineEntitySet) this : null;
}
/**
* Gets link rel.
*
* @return link rel
*/
public String getRel() {
return rel;
}
/**
* Gets Media ETag.
*
* @return media ETag
*/
public String getMediaETag() {
return mediaETag;
}
public List<ClientAnnotation> getAnnotations() {
return annotations;
}
}