/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed 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 com.intellij.cvsSupport2.config;

import com.intellij.cvsSupport2.connections.ext.ExtConnection;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import org.jdom.Element;

/**
 * author: lesya
 */
public class ExtConfiguration implements JDOMExternalizable, Cloneable{
  public String CVS_RSH = ExtConnection.DEFAULT_RSH;
  public String PRIVATE_KEY_FILE = "";
  public String ADDITIONAL_PARAMETERS = "";

  private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.config.ExtConfiguration");
  public boolean USE_INTERNAL_SSH_IMPLEMENTATION = false;

  @Override
  public void readExternal(Element element) throws InvalidDataException {
     DefaultJDOMExternalizer.readExternal(this, element);
  }

  @Override
  public void writeExternal(Element element) throws WriteExternalException {
    DefaultJDOMExternalizer.writeExternal(this, element);
  }

  @Override
  public ExtConfiguration clone() {
    try {
      return (ExtConfiguration) super.clone();
    } catch (CloneNotSupportedException e) {
      LOG.error(e);
      return new ExtConfiguration();
    }
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    ExtConfiguration that = (ExtConfiguration)o;
    if (USE_INTERNAL_SSH_IMPLEMENTATION != that.USE_INTERNAL_SSH_IMPLEMENTATION) return false;
    if (USE_INTERNAL_SSH_IMPLEMENTATION) {
      return true;
    }
    if (!ADDITIONAL_PARAMETERS.equals(that.ADDITIONAL_PARAMETERS)) return false;
    if (!CVS_RSH.equals(that.CVS_RSH)) return false;
    if (!PRIVATE_KEY_FILE.equals(that.PRIVATE_KEY_FILE)) return false;

    return true;
  }

  @Override
  public int hashCode() {
    if (USE_INTERNAL_SSH_IMPLEMENTATION) {
      return 1;
    }
    int result = CVS_RSH.hashCode();
    result = 31 * result + PRIVATE_KEY_FILE.hashCode();
    result = 31 * result + ADDITIONAL_PARAMETERS.hashCode();
    result = 31 * result + (USE_INTERNAL_SSH_IMPLEMENTATION ? 1 : 0);
    return result;
  }
}
