package org.odata4j.core;
import java.util.List;
/**
* A static factory to create immutable {@link OLink} instances.
*/
public class OLinks {
private OLinks() {}
/**
* Creates a new {@link OLink} of sub-type {@link ORelatedEntitiesLink}.
*/
public static ORelatedEntitiesLink relatedEntities(final String relation, final String title, final String href) {
return new ORelatedEntitiesLinkImpl(relation, title, href);
}
/**
* Creates a new {@link OLink} of sub-type {@link ORelatedEntitiesLinkInline}.
*/
public static ORelatedEntitiesLinkInline relatedEntitiesInline(final String relation, final String title, final String href, final List<OEntity> relatedEntities) {
return new ORelatedEntitiesLinkInlineImpl(relation, title, href, relatedEntities);
}
/**
* Creates a new {@link OLink} of sub-type {@link ORelatedEntityLink}.
*/
public static ORelatedEntityLink relatedEntity(final String relation, final String title, final String href) {
return new ORelatedEntityLinkImpl(relation, title, href);
}
/**
* Creates a new {@link OLink} of sub-type {@link ORelatedEntityLinkInline}.
*/
public static ORelatedEntityLinkInline relatedEntityInline(final String relation, final String title, final String href, final OEntity relatedEntity) {
return new ORelatedEntityLinkInlineImpl(relation, title, href, relatedEntity);
}
public static ONamedStreamLink namedStreamLink(final String relation, final String title, final String href, final String type) {
return new ONamedStreamLinkImpl(relation, title, href, type);
}
private static abstract class OLinkImpl implements OLink {
private final Class<?> interfaceType;
private final String title;
private final String relation;
private final String href;
private final String type;
public OLinkImpl(Class<?> interfaceType, String relation, String title, String href) {
this.interfaceType = interfaceType;
this.title = title;
this.relation = relation;
this.href = href;
this.type = null;
}
public OLinkImpl(Class<?> interfaceType, String relation, String title, String href, String type) {
this.interfaceType = interfaceType;
this.title = title;
this.relation = relation;
this.href = href;
this.type = type;
}
@Override
public String getTitle() {
return title;
}
@Override
public String getRelation() {
return relation;
}
@Override
public String getHref() {
return href;
}
@Override
public String getType() {
return this.type;
}
@Override
public String toString() {
return String.format("%s[rel=%s,title=%s,href=%s]", interfaceType.getSimpleName(), relation, title, href);
}
}
private static class ORelatedEntitiesLinkImpl extends OLinkImpl implements ORelatedEntitiesLink {
public ORelatedEntitiesLinkImpl(String relation, String title, String href) {
super(ORelatedEntitiesLink.class, relation, title, href);
}
@Override
public boolean isInline() {
return false;
}
@Override
public boolean isCollection() {
return true;
}
@Override
public OEntity getRelatedEntity() {
return null;
}
@Override
public List<OEntity> getRelatedEntities() {
return null;
}
}
private static class ORelatedEntitiesLinkInlineImpl extends OLinkImpl implements ORelatedEntitiesLinkInline {
private final List<OEntity> relatedEntities;
public ORelatedEntitiesLinkInlineImpl(String relation, String title, String href, List<OEntity> relatedEntities) {
super(ORelatedEntitiesLinkInline.class, relation, title, href);
this.relatedEntities = relatedEntities;
}
@Override
public List<OEntity> getRelatedEntities() {
return relatedEntities;
}
@Override
public boolean isInline() {
return true;
}
@Override
public boolean isCollection() {
return true;
}
@Override
public OEntity getRelatedEntity() {
return null;
}
}
private static class ORelatedEntityLinkImpl extends OLinkImpl implements ORelatedEntityLink {
public ORelatedEntityLinkImpl(String relation, String title, String href) {
super(ORelatedEntityLink.class, relation, title, href);
}
@Override
public boolean isInline() {
return false;
}
@Override
public boolean isCollection() {
return false;
}
@Override
public OEntity getRelatedEntity() {
return null;
}
@Override
public List<OEntity> getRelatedEntities() {
return null;
}
}
private static class ORelatedEntityLinkInlineImpl extends OLinkImpl implements ORelatedEntityLinkInline {
private final OEntity relatedEntity;
public ORelatedEntityLinkInlineImpl(String relation, String title, String href, OEntity relatedEntity) {
super(ORelatedEntityLinkInline.class, relation, title, href);
this.relatedEntity = relatedEntity;
}
@Override
public OEntity getRelatedEntity() {
return relatedEntity;
}
@Override
public boolean isInline() {
return true;
}
@Override
public boolean isCollection() {
return false;
}
@Override
public List<OEntity> getRelatedEntities() {
return null;
}
}
private static class ONamedStreamLinkImpl extends OLinkImpl implements ONamedStreamLink {
public ONamedStreamLinkImpl(String relation, String title, String href, String type) {
super(ONamedStreamLink.class, relation, title, href, type);
}
@Override
public boolean isInline() {
return false;
}
@Override
public boolean isCollection() {
return false;
}
@Override
public OEntity getRelatedEntity() {
return null;
}
@Override
public List<OEntity> getRelatedEntities() {
return null;
}
}
}