// (C) Copyright 2003-2014 Hewlett-Packard Development Company, L.P.
package com.hp.alm.ali.idea.action;
import com.hp.alm.ali.idea.model.Entity;
import com.hp.alm.ali.idea.model.HorizonStrategy;
import com.hp.alm.ali.idea.rest.RestService;
import com.hp.alm.ali.idea.rest.ServerType;
import com.hp.alm.ali.idea.services.AgmUrlService;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ide.CopyPasteManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import java.awt.datatransfer.StringSelection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CopyUrlToClipboardAction extends EntityAction {
private static Map<String, UrlCopy> entityTypes;
static {
entityTypes = new HashMap<String, UrlCopy>();
entityTypes.put("defect", new BacklogUrlCopy());
entityTypes.put("requirement", new BacklogUrlCopy());
entityTypes.put("build-instance", new BuildDetailUrlCopy());
entityTypes.put("changeset", new ChangesetDetailUrlCopy());
}
public CopyUrlToClipboardAction() {
super("Copy Web URL", "Copy Web URL to Clipboard", IconLoader.getIcon("/actions/copy.png"));
}
@Override
protected Set<String> getSupportedEntityTypes() {
return entityTypes.keySet();
}
@Override
protected void update(AnActionEvent event, Project project, Entity entity) {
boolean enabled = entityTypes.get(entity.getType()).isEnabled(project);
event.getPresentation().setEnabled(enabled);
}
@Override
protected void actionPerformed(AnActionEvent event, Project project, Entity entity) {
entityTypes.get(entity.getType()).copyURL(project, entity);
}
private static class ChangesetDetailUrlCopy extends AgmUrlCopy {
@Override
protected String getUrl(Project project, Entity entity, String tenantId) {
return project.getComponent(AgmUrlService.class).getChangesetDetailUrl(entity, tenantId);
}
}
private static class BuildDetailUrlCopy extends AgmUrlCopy {
@Override
protected String getUrl(Project project, Entity entity, String tenantId) {
return project.getComponent(AgmUrlService.class).getBuildDetailUrl(entity, tenantId);
}
}
private static class BacklogUrlCopy extends AgmUrlCopy {
@Override
protected String getUrl(Project project, Entity entity, String tenantId) {
return project.getComponent(AgmUrlService.class).getBacklogUrl(entity, tenantId);
}
}
private abstract static class AgmUrlCopy implements UrlCopy {
@Override
public void copyURL(Project project, Entity entity) {
String tenantId = getTenantId(project);
if (tenantId != null) {
String entityUrl = getUrl(project, entity, tenantId);
CopyPasteManager.getInstance().setContents(new StringSelection(entityUrl));
}
}
@Override
public boolean isEnabled(Project project) {
return project.getComponent(RestService.class).getServerTypeIfAvailable() == ServerType.AGM &&
getTenantId(project) != null;
}
protected abstract String getUrl(Project project, Entity entity, String tenantId);
private String getTenantId(Project project) {
return project.getComponent(HorizonStrategy.class).getTenantId();
}
}
private interface UrlCopy {
void copyURL(Project project, Entity entity);
boolean isEnabled(Project project);
}
}