/*
* Copyright (C) 2011 Rhegium Team
*
* 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 org.rhegium.api.mvc;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.rhegium.api.i18n.LanguageService;
import org.rhegium.api.security.Permission;
import org.rhegium.api.security.PermissionAllowed;
import org.rhegium.api.security.Principal;
import org.rhegium.api.security.SecurityService;
import org.rhegium.api.security.UserSession;
import org.rhegium.api.security.spi.PermissionResolver;
import org.rhegium.api.uibinder.UiBinderService;
import com.google.inject.Inject;
import com.google.inject.Injector;
public abstract class AbstractController<C, CC extends Controller<C, CC, V>, V extends View<C, CC, V>> implements
Controller<C, CC, V> {
@SuppressWarnings("unchecked")
private static final Collection<Class<? extends Permission>> VISIBLE_TO_ALL = Collections.unmodifiableCollection(Arrays
.<Class<? extends Permission>> asList(new Class[] { PermissionAllowed.class }));
@Inject
private SecurityService securityService;
@Inject
private ViewManager viewManager;
@Inject
private LanguageService languageService;
@Inject
private PermissionResolver permissionResolver;
@Inject
@SuppressWarnings("rawtypes")
private UiBinderService binderService;
@Inject
private Injector injector;
private final Collection<Class<? extends Permission>> permissions;
private final Class<? extends V> viewClass;
private final boolean multiViewCapable;
public AbstractController(Class<? extends V> viewClass) {
this.viewClass = viewClass;
this.permissions = VISIBLE_TO_ALL;
this.multiViewCapable = false;
}
public AbstractController(Class<? extends V> viewClass, boolean multiViewCapable) {
this.viewClass = viewClass;
this.permissions = VISIBLE_TO_ALL;
this.multiViewCapable = multiViewCapable;
}
public AbstractController(Class<? extends V> viewClass, Collection<Class<? extends Permission>> permissions) {
this.viewClass = viewClass;
this.permissions = permissions;
this.multiViewCapable = false;
}
public AbstractController(Class<? extends V> viewClass, Collection<Class<? extends Permission>> permissions,
boolean multiViewCapable) {
this.viewClass = viewClass;
this.permissions = permissions;
this.multiViewCapable = multiViewCapable;
}
@Override
public String getControllerName() {
String className = getClass().getSimpleName();
if (className.contains("$$EnhancerByGuice$$")) {
return className.substring(0, className.indexOf("$$"));
}
return className;
}
@Override
@SuppressWarnings("unchecked")
public V createView() {
V view = injector.getInstance(viewClass);
view.setComponentController((CC) this);
binderService.bindView(view, securityService.getUserSession().getLocale());
return view;
}
@Override
public boolean isPermitted(Principal principal) {
for (Class<? extends Permission> permission : permissions) {
Permission instance = permissionResolver.resolvePermission(permission);
if (!principal.isPermitted(instance.getName(), instance.isPermittedByDefault())) {
return false;
}
}
return true;
}
@Override
public boolean isMultiViewCapable() {
return multiViewCapable;
}
protected UserSession<?> getUserSession() {
return securityService.getUserSession();
}
protected ViewManager getViewManager() {
return viewManager;
}
protected LanguageService getLanguageService() {
return languageService;
}
}