LinkedEntity.java

package au.com.mountainpass.hyperstate.core.entities;

import java.net.URI;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang3.NotImplementedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.core.ParameterizedTypeReference;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import au.com.mountainpass.hyperstate.core.Link;

public class LinkedEntity extends Entity {
  private final Link link;

  public LinkedEntity(final Link link) {
    this.link = link;
  }

  public LinkedEntity(final Link link, final String label, final Set<String> natures) {
    this.link = link;
    setNatures(natures);
    setTitle(label);
  }

  // public LinkedEntity(@JsonProperty("href") URI address,
  // @JsonProperty("title") String label,
  // @JsonProperty("class") Set<String> natures) {
  // this.link = new RestLink(address, natures, label);
  // setNatures(natures);
  // setTitle(label);
  // }

  public LinkedEntity(final Link link, final String label, final String... natures) {
    this.link = link;
    setNatures(new HashSet<String>(Arrays.asList(natures)));
    setTitle(label);
  }

  @Override
  @JsonProperty("href")
  public URI getAddress() {
    return link.getAddress();
  }

  @JsonIgnore
  public Link getLink() {
    return link;
  }

  @Override
  public <K, T extends EntityWrapper<K>> T reload(final Class<T> type) {
    throw new NotImplementedException("TODO");
  }

  @Override
  public <K, T extends EntityWrapper<K>> T resolve(final Class<T> type) {
    return link.resolve(type);
  }

  @Override
  public <K, T extends EntityWrapper<K>> T resolve(final ParameterizedTypeReference<T> type) {
    return link.resolve(type);
  }

  @Autowired
  public void setApplicationContext(final ApplicationContext context) {
    final AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
    bpp.setBeanFactory(context.getAutowireCapableBeanFactory());
    bpp.processInjection(this.link);
  }

  @Override
  public LinkedEntity toLinkedEntity() {
    return this;
  }
}