/*******************************************************************************
* Copyright (c) 2011 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.identity.core.gravatar;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.identity.core.Account;
import org.eclipse.mylyn.commons.identity.core.IIdentity;
import org.eclipse.mylyn.commons.identity.core.spi.IdentityConnector;
import org.eclipse.mylyn.commons.identity.core.spi.Profile;
import org.eclipse.mylyn.commons.identity.core.spi.ProfileImage;
/**
* @author Steffen Pingel
*/
public class GravatarConnector extends IdentityConnector {
public static final String KIND = "org.eclipse.mylyn.commons.identity.gravatar"; //$NON-NLS-1$
private final GravatarStore store;
private final int DEFAULT_SIZE = 80;
private final Map<String, Long> noImageHashByTimeStamp = new ConcurrentHashMap<String, Long>();
public GravatarConnector() {
this.store = new GravatarStore();
}
@Override
public ProfileImage getImage(IIdentity identity, int preferredWidth, int preferredHeight, IProgressMonitor monitor)
throws CoreException {
String id = getHash(identity);
if (id == null) {
return null;
}
// avoid retrieving image again i
if (noImageHashByTimeStamp.containsKey(id)) {
return null;
}
// store id for future retrieval
identity.addAccount(Account.id(id).kind(KIND));
int size = getSize(preferredWidth);
Gravatar gravatar;
try {
gravatar = store.loadGravatarByHash(id, size, null);
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, KIND, e.getMessage(), e));
}
if (gravatar != null) {
return new ProfileImage(gravatar.getBytes(), size, size, "jpg"); //$NON-NLS-1$
} else {
noImageHashByTimeStamp.put(id, Long.valueOf(System.currentTimeMillis()));
}
return null;
}
private int getSize(int preferredSize) {
if (preferredSize < 1 && preferredSize > 512) {
return DEFAULT_SIZE;
}
return preferredSize;
}
@Override
public boolean supportsImageSize(int preferredWidth, int preferredHeight) {
return (preferredWidth >= 1 && preferredWidth <= 512 && preferredHeight >= 1 && preferredHeight <= 512 && preferredWidth == preferredHeight);
}
@Override
public void updateProfile(Profile profile, IProgressMonitor monitor) throws CoreException {
// TODO retrieve Gravatar profile information
}
private String getHash(IIdentity identity) {
Account account = identity.getAccountByKind(KIND);
if (account != null) {
if (GravatarUtils.isValidHash(account.getId())) {
return account.getId();
}
}
for (String alias : identity.getAliases()) {
if (GravatarUtils.isValidEmail(alias)) {
return GravatarUtils.getHash(alias);
}
}
return null;
}
}