/* * Copyright 2010 the original author or authors. * * 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.springsource.greenhouse.activity.badge; import java.util.HashMap; import java.util.Map; import org.springframework.core.GenericTypeResolver; import com.springsource.greenhouse.activity.action.Action; import com.springsource.greenhouse.activity.action.SimpleAction; /** * Standard implementation of the BadgeSystem. * @author Keith Donald */ class StandardBadgeSystem implements BadgeSystem { private final Map<Class<? extends Action>, BadgeAwarder<? extends Action>> badgeAwarders = new HashMap<Class<? extends Action>, BadgeAwarder<? extends Action>>(); private final Map<String, SimpleBadgeAwarder> simpleActionBadgeAwarders = new HashMap<String, SimpleBadgeAwarder>(); public void add(BadgeAwarder<? extends Action> badgeAwarder) { Class<? extends Action> actionType = (Class<? extends Action>) GenericTypeResolver.resolveTypeArgument(badgeAwarder.getClass(), BadgeAwarder.class); badgeAwarders.put(actionType, badgeAwarder); } public void add(SimpleBadgeAwarder badgeAwarder, String simpleActionType) { simpleActionBadgeAwarders.put(simpleActionType, badgeAwarder); } public void add(BadgeAwarder<? extends Action> badgeAwarder, BadgeAwarderMatcher matcher) { throw new UnsupportedOperationException("Not yet implemented"); } public AwardedBadge awardBadgeForAction(Action action) { if (action instanceof SimpleAction) { String simpleActionType = ((SimpleAction)action).getType(); return invokeBadgeAwarder(simpleActionBadgeAwarders.get(simpleActionType), action); } else { return invokeBadgeAwarder(badgeAwarders.get(action.getClass()), action); } } private AwardedBadge invokeBadgeAwarder(BadgeAwarder awarder, Action action) { if (awarder == null) { return null; } return awarder.awardBadgeForAction(action); } public interface BadgeAwarderMatcher { boolean matches(Action action); } private final class SimpleActionTypeMatcher implements BadgeAwarderMatcher { private final String type; public SimpleActionTypeMatcher(String type) { this.type = type; } public boolean matches(Action action) { if (!(action instanceof SimpleAction)) { return false; } SimpleAction simple = (SimpleAction) action; return simple.getType().equals(type); } } private final class ActionClassMatcher implements BadgeAwarderMatcher { private final Class<? extends Action> actionClass; public ActionClassMatcher(Class<? extends Action> actionClass) { this.actionClass = actionClass; } public boolean matches(Action action) { return actionClass.isInstance(action); } } }