/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is part of dcm4che, an implementation of DICOM(TM) in * Java(TM), hosted at https://github.com/dcm4che. * * The Initial Developer of the Original Code is * Agfa Healthcare. * Portions created by the Initial Developer are Copyright (C) 2012 * the Initial Developer. All Rights Reserved. * * Contributor(s): * See @authors listed below * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ package org.dcm4chee.wizard.common.component.secure; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.apache.wicket.Session; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.resource.loader.ClassStringResourceLoader; import org.apache.wicket.resource.loader.PackageStringResourceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wicketstuff.security.extensions.markup.html.tabs.ISecureTab; /** * @author Robert David <robert.david@agfa.com> */ public class SecureTab implements ISecureTab { private static final long serialVersionUID = 1L; private static Logger log = LoggerFactory.getLogger(SecureTab.class); private transient ClassStringResourceLoader classStringLoader; private transient PackageStringResourceLoader pkgStringLoader; private static final String TAB_TITLE_EXT = ".tabTitle"; private Class<? extends Panel> clazz; private String clazzName; private String tabTitlePropertyName; private Panel panel; private IModel<String> titleModel; public SecureTab(Class<? extends Panel> clazz2) { clazz = clazz2; initialize(); } public SecureTab(Class<? extends Panel> clazz2, IModel<String> titleModel) { clazz = clazz2; this.titleModel = titleModel; initialize(); } public SecureTab(Panel instance, IModel<String> titleModel) { clazz = instance.getClass(); panel = instance; this.titleModel = titleModel; if (titleModel == null) initialize(); } private void initialize() { clazzName = clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1); pkgStringLoader = new PackageStringResourceLoader(); try { Method m = clazz.getDeclaredMethod("getModuleName"); tabTitlePropertyName = m.invoke(null) + TAB_TITLE_EXT; } catch (Exception e) { log.warn("Panel class " + clazz + " has no static getModuleName() method declared! use classname instead!:" + clazzName); tabTitlePropertyName = clazzName + TAB_TITLE_EXT; } } private ClassStringResourceLoader getClassStringLoader() { if (classStringLoader == null) classStringLoader = new ClassStringResourceLoader(clazz); return classStringLoader; } private PackageStringResourceLoader getPackageStringLoader() { if (pkgStringLoader == null) pkgStringLoader = new PackageStringResourceLoader(); return pkgStringLoader; } public Class<? extends Panel> getPanel() { return clazz; } public Panel getPanel(String panelId) { try { if (panel == null) { Constructor<? extends Panel> c = clazz.getConstructor(String.class); panel = c.newInstance(panelId); } return panel; } catch (Exception x) { log.error("Can't instantiate Panel for " + panelId, x); return null; } } /** * Get title of the tab. Use ClassStringResourceLoader and * PackageStringResourceLoader to get the title String. Using a * ResourceModel at this point would fail because the panel isn't * instantiated by the TabbedPane. Therefore the title must be either * configured in package.properties or <clazz>.properties! Other * ResourceLoaders will be ignored! */ public IModel<String> getTitle() { if (titleModel == null) { String t = getClassStringLoader().loadStringResource(clazz, tabTitlePropertyName, Session.get().getLocale(), null, null); if (t == null) t = getPackageStringLoader().loadStringResource(clazz, tabTitlePropertyName, Session.get().getLocale(), null, null); return new Model<String>(t == null ? clazzName : t); } else return titleModel; } public boolean isVisible() { return true; } }