/* * Copyright 2000-2014 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.remote; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.remote.ext.CredentialsCase; import com.intellij.remote.ext.CredentialsManager; import com.intellij.remote.ext.RemoteCredentialsHandler; import com.intellij.remote.ext.UnknownCredentialsHolder; import org.jdom.Element; import org.jetbrains.annotations.NotNull; /** * @author traff */ // TODO: (next) rename to 'RemoteSdkDataDelegate' ? public class RemoteConnectionCredentialsWrapper { private UserDataHolderBase myCredentialsTypeHolder = new UserDataHolderBase(); public <C> void setCredentials(Key<C> key, C credentials) { myCredentialsTypeHolder = new UserDataHolderBase(); myCredentialsTypeHolder.putUserData(key, credentials); } public Object getConnectionKey() { return getCredentials(); } public void save(final Element rootElement) { getTypeHandler().save(rootElement); } public static IllegalStateException unknownConnectionType() { return new IllegalStateException("Unknown connection type"); //TODO } public void copyTo(final RemoteConnectionCredentialsWrapper copy) { copy.myCredentialsTypeHolder = new UserDataHolderBase(); Pair<Object, CredentialsType> credentialsAndProvider = getCredentialsAndType(); credentialsAndProvider.getSecond().putCredentials(copy.myCredentialsTypeHolder, credentialsAndProvider.getFirst()); } @NotNull public String getId() { return getTypeHandler().getId(); } public RemoteCredentialsHandler getTypeHandler() { Pair<Object, CredentialsType> credentialsAndType = getCredentialsAndType(); return credentialsAndType.getSecond().getHandler(credentialsAndType.getFirst()); } public CredentialsType getRemoteConnectionType() { return getCredentialsAndType().getSecond(); } public Object getCredentials() { return getCredentialsAndType().getFirst(); } private Pair<Object, CredentialsType> getCredentialsAndType() { for (CredentialsType type : CredentialsManager.getInstance().getAllTypes()) { Object credentials = type.getCredentials(myCredentialsTypeHolder); if (credentials != null) { return Pair.create(credentials, type); } } final UnknownCredentialsHolder credentials = CredentialsType.UNKNOWN.getCredentials(myCredentialsTypeHolder); if (credentials != null) return Pair.create(credentials, CredentialsType.UNKNOWN); throw unknownConnectionType(); } public void switchType(CredentialsCase... cases) { Pair<Object, CredentialsType> credentialsAndType = getCredentialsAndType(); CredentialsType type = credentialsAndType.getSecond(); for (CredentialsCase credentialsCase : cases) { if (credentialsCase.getType() == type) { credentialsCase.process(credentialsAndType.getFirst()); return; } } } @Override public boolean equals(Object obj) { if (obj instanceof RemoteConnectionCredentialsWrapper) { RemoteConnectionCredentialsWrapper w = (RemoteConnectionCredentialsWrapper)obj; try { Object credentials = getCredentials(); Object counterCredentials = w.getCredentials(); return credentials.equals(counterCredentials); } catch (IllegalStateException e) { return false; } } return false; } public String getPresentableDetails(final String interpreterPath) { return getTypeHandler().getPresentableDetails(interpreterPath); } }