/*
 * 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.nutch.parse;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Map.Entry;

import org.apache.hadoop.io.MapWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;

/* An outgoing link from a page. */
public class Outlink implements Writable {

  private String toUrl;
  private String anchor;
  private MapWritable md;

  public Outlink() {
  }

  public Outlink(String toUrl, String anchor) throws MalformedURLException {
    this.toUrl = toUrl;
    if (anchor == null)
      anchor = "";
    this.anchor = anchor;
    md = null;
  }

  public void readFields(DataInput in) throws IOException {
    toUrl = Text.readString(in);
    anchor = Text.readString(in);
    boolean hasMD = in.readBoolean();
    if (hasMD) {
      md = new org.apache.hadoop.io.MapWritable();
      md.readFields(in);
    } else
      md = null;
  }

  /** Skips over one Outlink in the input. */
  public static void skip(DataInput in) throws IOException {
    Text.skip(in); // skip toUrl
    Text.skip(in); // skip anchor
    boolean hasMD = in.readBoolean();
    if (hasMD) {
      MapWritable metadata = new org.apache.hadoop.io.MapWritable();
      metadata.readFields(in);
      ;
    }
  }

  public void write(DataOutput out) throws IOException {
    Text.writeString(out, toUrl);
    Text.writeString(out, anchor);
    if (md != null && md.size() > 0) {
      out.writeBoolean(true);
      md.write(out);
    } else {
      out.writeBoolean(false);
    }
  }

  public static Outlink read(DataInput in) throws IOException {
    Outlink outlink = new Outlink();
    outlink.readFields(in);
    return outlink;
  }

  public String getToUrl() {
    return toUrl;
  }

  public void setUrl(String toUrl) {
    this.toUrl = toUrl;
  }

  public String getAnchor() {
    return anchor;
  }

  public MapWritable getMetadata() {
    return md;
  }

  public void setMetadata(MapWritable md) {
    this.md = md;
  }

  public boolean equals(Object o) {
    if (!(o instanceof Outlink))
      return false;
    Outlink other = (Outlink) o;
    return this.toUrl.equals(other.toUrl) && this.anchor.equals(other.anchor);
  }

  public String toString() {
    StringBuffer repr = new StringBuffer("toUrl: ");
    repr.append(toUrl);
    repr.append(" anchor: ");
    repr.append(anchor);
    if (md != null && !md.isEmpty()) {
      for (Entry<Writable, Writable> e : md.entrySet()) {
        repr.append(" ");
        repr.append(e.getKey());
        repr.append(": ");
        repr.append(e.getValue());
      }
    }
    return repr.toString();
  }

  @Override
  public int hashCode() {
    return toUrl.hashCode() ^ anchor.hashCode();
  }
}
