/*
 * Copyright (c) 2014, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * 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 com.google.dart.engine.source;

import com.google.dart.engine.internal.context.TimestampedData;
import com.google.dart.engine.utilities.general.ObjectUtilities;
import com.google.dart.engine.utilities.translation.DartOmit;

import java.net.URI;

/**
 * An implementation of an non-existing {@link Source}.
 * 
 * @coverage dart.engine.source
 */
public class NonExistingSource implements Source {
  private final String name;
  private final UriKind uriKind;

  public NonExistingSource(String name, UriKind uriKind) {
    this.name = name;
    this.uriKind = uriKind;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof NonExistingSource) {
      NonExistingSource other = (NonExistingSource) obj;
      return other.uriKind == uriKind && ObjectUtilities.equals(other.name, name);
    }
    return false;
  }

  @Override
  public boolean exists() {
    return false;
  }

  @Override
  public TimestampedData<CharSequence> getContents() throws Exception {
    throw new UnsupportedOperationException(name + "does not exist.");
  }

  @Override
  @Deprecated
  @DartOmit
  public void getContentsToReceiver(ContentReceiver receiver) throws Exception {
    throw new UnsupportedOperationException(name + "does not exist.");
  }

  @Override
  public String getEncoding() {
    throw new UnsupportedOperationException(name + "does not exist.");
  }

  @Override
  public String getFullName() {
    return name;
  }

  @Override
  public long getModificationStamp() {
    return 0;
  }

  @Override
  public String getShortName() {
    return name;
  }

  @Override
  public URI getUri() {
    return null;
  }

  @Override
  public UriKind getUriKind() {
    return uriKind;
  }

  @Override
  public int hashCode() {
    return name.hashCode();
  }

  @Override
  public boolean isInSystemLibrary() {
    return false;
  }

  @Override
  public URI resolveRelativeUri(URI relativeUri) {
    throw new UnsupportedOperationException(name + "does not exist.");
  }
}
