/* * 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.UserDataHolderBase; import com.intellij.remote.ext.*; /** * @author traff */ public abstract class CredentialsType<T> { public static final String VAGRANT_PREFIX = "vagrant://"; public static final String SFTP_DEPLOYMENT_PREFIX = "sftp://"; public static final Key<VagrantBasedCredentialsHolder> VAGRANT_BASED_CREDENTIALS = Key.create("VAGRANT_BASED_CREDENTIALS"); public static final Key<WebDeploymentCredentialsHolder> WEB_DEPLOYMENT_BASED_CREDENTIALS = Key.create("WEB_DEPLOYMENT_BASED_CREDENTIALS"); public static final Key<RemoteCredentialsHolder> PLAIN_SSH_CREDENTIALS = Key.create("PLAIN_SSH_CREDENTIALS"); public static final Key<UnknownCredentialsHolder> UNKNOWN_CREDENTIALS = Key.create("UNKNOWN_CREDENTIALS"); public static final CredentialsType<RemoteCredentialsHolder> SSH_HOST = new CredentialsType<RemoteCredentialsHolder>("SSH Credentials", RemoteCredentialsHolder.SSH_PREFIX) { @Override public Key<RemoteCredentialsHolder> getCredentialsKey() { return PLAIN_SSH_CREDENTIALS; } @Override public RemoteCredentialsHandler getHandler(RemoteCredentialsHolder credentials) { return new SshCredentialsHandler(credentials); } @Override public RemoteCredentialsHolder createCredentials() { return new RemoteCredentialsHolder(); } }; public static final CredentialsType<VagrantBasedCredentialsHolder> VAGRANT = new CredentialsType<VagrantBasedCredentialsHolder>("Vagrant", VAGRANT_PREFIX) { @Override public Key<VagrantBasedCredentialsHolder> getCredentialsKey() { return VAGRANT_BASED_CREDENTIALS; } @Override public RemoteCredentialsHandler getHandler(VagrantBasedCredentialsHolder credentials) { return new VagrantCredentialsHandler(credentials); } @Override public VagrantBasedCredentialsHolder createCredentials() { return new VagrantBasedCredentialsHolder(); } }; public static final CredentialsType<WebDeploymentCredentialsHolder> WEB_DEPLOYMENT = new CredentialsType<WebDeploymentCredentialsHolder>("Web Deployment", SFTP_DEPLOYMENT_PREFIX) { @Override public Key<WebDeploymentCredentialsHolder> getCredentialsKey() { return WEB_DEPLOYMENT_BASED_CREDENTIALS; } @Override public RemoteCredentialsHandler getHandler(WebDeploymentCredentialsHolder credentials) { return new WebDeploymentCredentialsHandler(credentials); } @Override public WebDeploymentCredentialsHolder createCredentials() { return new WebDeploymentCredentialsHolder(); } }; public static final CredentialsType<UnknownCredentialsHolder> UNKNOWN = new CredentialsType<UnknownCredentialsHolder>("Unknown", "") { @Override public Key<UnknownCredentialsHolder> getCredentialsKey() { return UNKNOWN_CREDENTIALS; } @Override public RemoteCredentialsHandler getHandler(UnknownCredentialsHolder credentials) { return new UnknownTypeRemoteCredentialHandler(credentials); } @Override public UnknownCredentialsHolder createCredentials() { return new UnknownCredentialsHolder(); } }; private final String myName; private final String myPrefix; protected CredentialsType(String name, String prefix) { myName = name; myPrefix = prefix; } public String getName() { return myName; } public T getCredentials(UserDataHolderBase dataHolder) { return dataHolder.getUserData(getCredentialsKey()); } public void putCredentials(UserDataHolderBase dataHolder, T credentials) { dataHolder.putUserData(getCredentialsKey(), credentials); } public abstract Key<T> getCredentialsKey(); public abstract RemoteCredentialsHandler getHandler(T credentials); public boolean hasPrefix(String path) { return path.startsWith(myPrefix); } public abstract T createCredentials(); public void saveCredentials(RemoteSdkAdditionalData data, CredentialsCase... cases) { for (CredentialsCase credentialsCase : cases) { if (credentialsCase.getType() == this) { T credentials = createCredentials(); credentialsCase.process(credentials); data.setCredentials(getCredentialsKey(), credentials); } } } }