CCM NG: Administration UI basic structure

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3867 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2016-02-17 19:00:18 +00:00
parent dd1556afbb
commit 8e05fe06af
27 changed files with 1453 additions and 256 deletions

View File

@ -0,0 +1,53 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.kernel.security.SecurityConfig;
import com.arsdigita.web.Web;
import com.arsdigita.xml.Element;
import static com.arsdigita.ui.UI.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class SiteBanner extends SimpleComponent {
@Override
public void generateXML(final PageState state, final Element parentElem) {
final Element contentElem = parentElem.newChildElement("ui:siteBanner",
UI_XML_NS);
exportAttributes(contentElem);
contentElem.addAttribute("hostname", getHostname());
contentElem.addAttribute("sitename", getSiteName());
}
protected String getHostname() {
return Web.getConfig().getServer();
}
protected String getSiteName() {
return Web.getConfig().getSiteName();
}
}

View File

@ -15,7 +15,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
*/ */
package com.arsdigita.ui; package com.arsdigita.ui;
import com.arsdigita.ui.login.LoginConstants; import com.arsdigita.ui.login.LoginConstants;
@ -26,29 +25,42 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
* <p>A central location for commonly used UI services and their accessories.</p> * <p>
* A central location for commonly used UI services and their accessories.</p>
* *
* *
* @author pb * @author pb
*/ */
public abstract class UI { public abstract class UI {
/** Private loggin instance. */ /**
* Private loggin instance.
*/
private static final Logger s_log = Logger.getLogger(UI.class); private static final Logger s_log = Logger.getLogger(UI.class);
/** The UI XML namespace. */ /**
* The UI XML namespace.
*/
public static final String UI_XML_NS = "http://www.arsdigita.com/ui/1.0"; public static final String UI_XML_NS = "http://www.arsdigita.com/ui/1.0";
public static final String UI_BUNDLE_NAME = "com.arsdigita.ui.UIResources";
private static final UIConfig s_config = UIConfig.getConfig(); private static final UIConfig s_config = UIConfig.getConfig();
/** URL for systems public top level page (entry or start page). */ /**
* URL for systems public top level page (entry or start page).
*/
private static final String s_rootPageURL = s_config.getRootPageUrl(); private static final String s_rootPageURL = s_config.getRootPageUrl();
/** URL to page a user should be redirected to after login. */ /**
private static final String s_userRedirectURL = s_config.getUserRedirectUrl(); * URL to page a user should be redirected to after login.
/** (Absolute) URL for workspace page. */ */
private static final String s_userRedirectURL = s_config
.getUserRedirectUrl();
/**
* (Absolute) URL for workspace page.
*/
private static final String s_workspaceURL = s_config.getWorkspaceUrl(); private static final String s_workspaceURL = s_config.getWorkspaceUrl();
/** /**
* Provides a handle to the UI config record. * Provides a handle to the UI config record.
* *
@ -68,8 +80,8 @@ public abstract class UI {
* Currently just a wrapper script to getRootPageURL() because req is * Currently just a wrapper script to getRootPageURL() because req is
* currently ignored. * currently ignored.
* *
* @param req HttpServletRequest, may be used to determin the context of * @param req HttpServletRequest, may be used to determin the context of the
* the current thread (application), currently not used and * current thread (application), currently not used and
* introduced here for backwards compatibility * introduced here for backwards compatibility
* *
* @return URL for top-level page as String * @return URL for top-level page as String
@ -100,8 +112,8 @@ public abstract class UI {
* constant prefix if there is one configured. * constant prefix if there is one configured.
* *
* It is typically used after login to redirect to an appropriate page, by * It is typically used after login to redirect to an appropriate page, by
* default to /peremissions/. A site should configure an application * default to /peremissions/. A site should configure an application to
* to their specific purposes. e.g ccm-cms provides a page * their specific purposes. e.g ccm-cms provides a page
* content-center/redirect.jsp which redirects a user to the content-center * content-center/redirect.jsp which redirects a user to the content-center
* if logged in. * if logged in.
* *
@ -112,14 +124,17 @@ public abstract class UI {
} }
/** /**
* Wrapper method for {@see getUserRedirectURL()} * Wrapper method for {
* which redirects a user to the content-center if logged in. *
* @see getUserRedirectURL()} which redirects a user to the content-center
* if logged in.
* *
* Method is specifically used by various redirect JSP's. * Method is specifically used by various redirect JSP's.
* *
* @param req HttpServletRequest, may be used to determin the context of * @param req HttpServletRequest, may be used to determin the context of the
* the current thread (application), currently not used and * current thread (application), currently not used and
* introduced here for backwards compatibility * introduced here for backwards compatibility
*
* @return full URL of a user redirect page, may be null * @return full URL of a user redirect page, may be null
*/ */
public static String getUserRedirectURL(HttpServletRequest req) { public static String getUserRedirectURL(HttpServletRequest req) {
@ -144,17 +159,17 @@ public abstract class UI {
} }
/** /**
* Provides the absolute URL for the system workspace page. * Provides the absolute URL for the system workspace page. It is relative
* It is relative to document root including leading slash but without any * to document root including leading slash but without any constant prefix
* constant prefix if there is one configured. * if there is one configured.
* *
* Method is typically called by servlets and especially by JSP's. * Method is typically called by servlets and especially by JSP's.
* *
* Currently just a wrapper script to getWorkspaceURL() because req is * Currently just a wrapper script to getWorkspaceURL() because req is
* currently ignored. * currently ignored.
* *
* @param req HttpServletRequest, may be used to determin the context of * @param req HttpServletRequest, may be used to determin the context of the
* the current thread (application), currently not used and * current thread (application), currently not used and
* introduced here for backwards compatibility * introduced here for backwards compatibility
* *
* @return URL for workspace page as String * @return URL for workspace page as String
@ -165,19 +180,17 @@ public abstract class UI {
return getWorkspaceURL(); return getWorkspaceURL();
} }
// //////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
// Various deprfecated methods, to be removed as soon as invoking code is // Various deprfecated methods, to be removed as soon as invoking code is
// refactored. // refactored.
// //////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
/** /**
* Provides an absolute URL (leading slash) into the system login page. * Provides an absolute URL (leading slash) into the system login page. It
* It is relative to document root without any constant prefix if there is * is relative to document root without any constant prefix if there is one
* one configured. * configured.
* *
* @return URL for login page as String * @return URL for login page as String
*
* @deprecated use Login.getLoginPageURL()() instead * @deprecated use Login.getLoginPageURL()() instead
*/ */
public static String getLoginPageURL() { public static String getLoginPageURL() {
@ -190,6 +203,7 @@ public abstract class UI {
* one configured. * one configured.
* *
* @return url String for new user registration page as String * @return url String for new user registration page as String
*
* @deprecated use LoginServlet.getCookiesExplainPageURL() instead * @deprecated use LoginServlet.getCookiesExplainPageURL() instead
*/ */
public static String getCookiesExplainPageURL() { public static String getCookiesExplainPageURL() {
@ -197,11 +211,12 @@ public abstract class UI {
} }
/** /**
* Provides an absolute URL (leading slash) for a password recovery page. * Provides an absolute URL (leading slash) for a password recovery page. It
* It is relative to document root without any constant prefix if there is * is relative to document root without any constant prefix if there is one
* one configured. * configured.
* *
* @return url String for new user registration page as String * @return url String for new user registration page as String
*
* @deprecated use LoginServlet.getRecoverPasswordPageURL() instead * @deprecated use LoginServlet.getRecoverPasswordPageURL() instead
*/ */
public static String getRecoverPasswordPageURL() { public static String getRecoverPasswordPageURL() {
@ -214,6 +229,7 @@ public abstract class UI {
* one configured. * one configured.
* *
* @return url String for new user registration page as String * @return url String for new user registration page as String
*
* @deprecated use LoginServlet.getEditUserProfilePageURL() instead * @deprecated use LoginServlet.getEditUserProfilePageURL() instead
*/ */
public static String getEditUserProfilePageURL() { public static String getEditUserProfilePageURL() {
@ -226,6 +242,7 @@ public abstract class UI {
* configured. * configured.
* *
* @return URL for logout page as String * @return URL for logout page as String
*
* @deprecated use LoginServlet.getLogoutPageURL() instead * @deprecated use LoginServlet.getLogoutPageURL() instead
*/ */
public static String getLogoutPageURL() { public static String getLogoutPageURL() {

View File

@ -18,8 +18,11 @@
*/ */
package com.arsdigita.ui; package com.arsdigita.ui;
import com.arsdigita.bebop.Component;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.Configuration; import org.libreccm.configuration.Configuration;
import org.libreccm.configuration.ConfigurationException;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.configuration.Setting; import org.libreccm.configuration.Setting;
@ -73,6 +76,31 @@ public final class UIConfig {
this.defaultLayout = defaultLayout; this.defaultLayout = defaultLayout;
} }
public SimplePageLayout buildDefaultLayout() {
final SimplePageLayout layout = new SimplePageLayout();
defaultLayout.forEach(c -> {
final String[] tokens = c.split(":");
if (tokens.length != 2) {
throw new ConfigurationException(
"Default layout not provided in the correct format.");
}
Class<?> clazz;
try {
clazz = Class.forName(tokens[1]);
} catch (ClassNotFoundException ex) {
throw new ConfigurationException(String.format(
"Component \"%s\" not found.", tokens[1]),
ex);
}
layout.addComponent(clazz, tokens[0]);
});
return layout;
}
public String getRootPageUrl() { public String getRootPageUrl() {
return rootPageUrl; return rootPageUrl;
} }

View File

@ -0,0 +1,37 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UiInitializer {
public UiInitializer() {
}
public void init() {
final UIConfig uiConfig = UIConfig.getConfig();
SimplePage.setDefaultLayout(uiConfig.buildDefaultLayout());
}
}

View File

@ -0,0 +1,134 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.ui.login.LoginConstants;
import com.arsdigita.ui.login.LoginServlet;
import com.arsdigita.web.URL;
import com.arsdigita.xml.Element;
import org.apache.shiro.subject.Subject;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
import javax.servlet.http.HttpServletRequest;
import static com.arsdigita.ui.UI.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UserBanner extends SimpleComponent {
@Override
public void generateXML(final PageState state,
final Element parentElem) {
super.generateXML(state, parentElem);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final Subject subject = cdiUtil.findBean(Subject.class);
final Element contentElem = parentElem.newChildElement("ui:userBanner",
UI_XML_NS);
exportAttributes(contentElem);
if (subject.isAuthenticated()) {
final KernelConfig config = KernelConfig.getConfig();
final UserRepository userRepository = cdiUtil.findBean(
UserRepository.class);
final User user;
if ("email".equals(config.getPrimaryUserIdentifier())) {
user = userRepository.findByEmailAddress(
(String) subject.getPrincipal());
} else {
user = userRepository
.findByName((String) subject.getPrincipal());
}
if (user != null) {
contentElem.addAttribute("givenName", user.getGivenName());
contentElem.addAttribute("familyName", user.getFamilyName());
contentElem.addAttribute("screenName", user.getName());
contentElem.addAttribute("primaryEmail",
user.getPrimaryEmailAddress()
.toString());
contentElem.addAttribute("userID",
Long.toString(user.getPartyId()));
}
}
final HttpServletRequest request = state.getRequest();
contentElem.addAttribute("changePasswordLabel",
(String) new GlobalizedMessage(
"ui.admin.change_password",
UI_BUNDLE_NAME).localize(request));
contentElem.addAttribute("helpLabel",
(String) new GlobalizedMessage(
"ui.admin.help",
UI_BUNDLE_NAME).localize(request));
contentElem.addAttribute("portalLabel",
(String) new GlobalizedMessage(
"ui.admin.portal",
UI_BUNDLE_NAME).localize(request));
contentElem.addAttribute("signoutLabel",
(String) new GlobalizedMessage(
"ui.admin.signout",
UI_BUNDLE_NAME).localize(request));
contentElem.addAttribute("greeting",
(String) new GlobalizedMessage(
"ui.admin.greeting",
UI_BUNDLE_NAME).localize(request));
contentElem.addAttribute("workspaceURL",
URL.there(state.getRequest(),
UI.getWorkspaceURL()).toString());
contentElem.addAttribute("loginURL",
URL.there(state.getRequest(),
LoginConstants.LOGIN_PAGE_URL)
.toString());
contentElem.addAttribute("logoutURL",
URL.there(state.getRequest(),
LoginServlet.getLogoutPageURL())
.toString());
contentElem.addAttribute("changePasswordURL",
URL.there(state.getRequest(),
LoginServlet
.getChangePasswordPageURL())
.toString());
}
}

View File

@ -23,11 +23,11 @@ import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
/** /**
* Centralize place for all constants used in the admin UI. * Centralised place for all constants used in the administration UI.
* *
* @author David Dao * @author David Dao
* @version $Revision$ $Date$
*/ */
@Deprecated
interface AdminConstants { interface AdminConstants {
/** /**
@ -61,6 +61,8 @@ interface AdminConstants {
Label USER_TAB_TITLE = new Label(new GlobalizedMessage("ui.admin.tab.user", Label USER_TAB_TITLE = new Label(new GlobalizedMessage("ui.admin.tab.user",
BUNDLE_NAME)); BUNDLE_NAME));
Label GROUP_TAB_TITLE = new Label(new GlobalizedMessage("ui.admin.tab.group", Label GROUP_TAB_TITLE = new Label(new GlobalizedMessage("ui.admin.tab.group",
BUNDLE_NAME)); BUNDLE_NAME));

View File

@ -24,8 +24,10 @@ import com.arsdigita.bebop.PageFactory;
import com.arsdigita.bebop.TabbedPane; import com.arsdigita.bebop.TabbedPane;
import com.arsdigita.dispatcher.AccessDeniedException; import com.arsdigita.dispatcher.AccessDeniedException;
import com.arsdigita.dispatcher.DispatcherHelper; import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.templating.Templating; import com.arsdigita.templating.Templating;
import com.arsdigita.util.Assert; import com.arsdigita.ui.SiteBanner;
import com.arsdigita.ui.UserBanner;
import com.arsdigita.web.BaseApplicationServlet; import com.arsdigita.web.BaseApplicationServlet;
import com.arsdigita.web.LoginSignal; import com.arsdigita.web.LoginSignal;
import com.arsdigita.xml.Document; import com.arsdigita.xml.Document;
@ -37,8 +39,6 @@ import org.libreccm.security.PermissionChecker;
import org.libreccm.web.CcmApplication; import org.libreccm.web.CcmApplication;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.enterprise.inject.spi.CDI; import javax.enterprise.inject.spi.CDI;
@ -50,7 +50,7 @@ import javax.servlet.http.HttpServletResponse;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import static com.arsdigita.ui.admin.AdminConstants.*; import static com.arsdigita.ui.admin.AdminUiConstants.*;
/** /**
* Web Developer Support Application Servlet class, central entry point to * Web Developer Support Application Servlet class, central entry point to
@ -74,7 +74,8 @@ public class AdminServlet
private static final long serialVersionUID = -3912367600768871630L; private static final long serialVersionUID = -3912367600768871630L;
private static final Logger LOGGER = LogManager.getLogger(AdminServlet.class); private static final Logger LOGGER = LogManager
.getLogger(AdminServlet.class);
/** /**
* Logger instance for debugging * Logger instance for debugging
@ -84,7 +85,8 @@ public class AdminServlet
* URL (pathinfo) -> Page object mapping. Based on it (and the http request * URL (pathinfo) -> Page object mapping. Based on it (and the http request
* url) the doService method to selects a page to display * url) the doService method to selects a page to display
*/ */
private final Map<String, Page> pages = new HashMap<String, Page>(); // private final Map<String, Page> pages = new HashMap<String, Page>();
private Page adminPage;
/** /**
* User extension point, overwrite this method to setup a URL - page mapping * User extension point, overwrite this method to setup a URL - page mapping
@ -96,6 +98,49 @@ public class AdminServlet
//addPage("/", buildAdminIndexPage()); // index page at address ~/ds //addPage("/", buildAdminIndexPage()); // index page at address ~/ds
// addPage("/index.jsp", buildIndexPage()); // index page at address ~/ds // addPage("/index.jsp", buildIndexPage()); // index page at address ~/ds
adminPage = PageFactory.buildPage("admin", "LibreCCM NG Admin");
adminPage.addGlobalStateParam(USER_ID_PARAM);
adminPage.addGlobalStateParam(GROUP_ID_PARAM);
adminPage.addGlobalStateParam(APPLICATIONS_ID_PARAM);
adminPage.add(new UserBanner());
adminPage.add(new SiteBanner());
//Create tab bar
final TabbedPane tabbedPane = new TabbedPane();
tabbedPane.setIdAttr("page-body");
tabbedPane.addTab(
new Label(new GlobalizedMessage("ui.admin.tab.applications",
BUNDLE_NAME)),
new ApplicationsAdminTab());
tabbedPane.addTab(
new Label(new GlobalizedMessage(
"ui.admin.tab.users_groups_roles.title",
BUNDLE_NAME)),
new UsersGroupsRolesTab());
tabbedPane.addTab(
new Label(new GlobalizedMessage("ui.admin.tab.categories.title",
BUNDLE_NAME)),
new CategoriesAdminTab());
tabbedPane.addTab(
new Label(new GlobalizedMessage("ui.admin.tab.registry.title",
BUNDLE_NAME)),
new RegistryAdminTab());
tabbedPane.addTab(
new Label(new GlobalizedMessage("ui.admin.tab.sysinfo.title",
BUNDLE_NAME)),
new SystemInformationTab());
//page.add(new Label("admin"));
adminPage.add(tabbedPane);
adminPage.lock();
} }
/** /**
@ -121,7 +166,8 @@ public class AdminServlet
final PermissionChecker permissionChecker = cdiUtil.findBean( final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); PermissionChecker.class);
final ConfigurationManager confManager = CDI.current().select(ConfigurationManager.class).get(); final ConfigurationManager confManager = CDI.current().select(
ConfigurationManager.class).get();
if (confManager == null) { if (confManager == null) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@ -132,36 +178,36 @@ public class AdminServlet
LOGGER.debug("Current Shiro session is {}", LOGGER.debug("Current Shiro session is {}",
subject.getSession().getId().toString()); subject.getSession().getId().toString());
if (!subject.isAuthenticated()) { if (!subject.isAuthenticated()) {
LOGGER.debug("Subject {} is not authenticated, redirecting to login...", LOGGER.debug(
subject.toString()); "Subject {} is not authenticated, redirecting to login...",
subject.toString());
throw new LoginSignal(sreq); throw new LoginSignal(sreq);
} }
/* Determine access privilege: Admin privileges must be granted */ /* Determine access privilege: Admin privileges must be granted */
LOGGER.debug("Subject is loggedin, checking if subject has required permissions..."); LOGGER.debug(
"Subject is loggedin, checking if subject has required permissions...");
if (!permissionChecker.isPermitted("admin")) { if (!permissionChecker.isPermitted("admin")) {
LOGGER.debug("Subject does *not* have required permissions. " LOGGER.debug("Subject does *not* have required permissions. "
+ "Access denied."); + "Access denied.");
throw new AccessDeniedException("User is not an administrator"); throw new AccessDeniedException("User is not an administrator");
} }
LOGGER.debug("Serving admin page..."); LOGGER.debug("Serving admin page...");
/* Want admin to always show the latest stuff... */ /* Want admin to always show the latest stuff... */
DispatcherHelper.cacheDisable(sresp); DispatcherHelper.cacheDisable(sresp);
// /////// Everything OK here - DO IT /////////////// // /////// Everything OK here - DO IT ///////////////
String pathInfo = sreq.getPathInfo(); // String pathInfo = sreq.getPathInfo();
Assert.exists(pathInfo, "String pathInfo"); // Assert.exists(pathInfo, "String pathInfo");
if (pathInfo.length() > 1 && pathInfo.endsWith("/")) { // if (pathInfo.length() > 1 && pathInfo.endsWith("/")) {
/* NOTE: ServletAPI specifies, pathInfo may be empty or will // /* NOTE: ServletAPI specifies, pathInfo may be empty or will
* start with a '/' character. It currently carries a // * start with a '/' character. It currently carries a
* trailing '/' if a "virtual" page, i.e. not a real jsp, but // * trailing '/' if a "virtual" page, i.e. not a real jsp, but
* result of a servlet mapping. But Application requires url // * result of a servlet mapping. But Application requires url
* NOT to end with a trailing '/' for legacy free applications. */ // * NOT to end with a trailing '/' for legacy free applications. */
pathInfo = pathInfo.substring(0, pathInfo.length() - 1); // pathInfo = pathInfo.substring(0, pathInfo.length() - 1);
} // }
// final Page page = pages.get(pathInfo); // final Page page = pages.get(pathInfo);
// if (page == null) { // if (page == null) {
// sresp.sendError(404, "No such page for path " + pathInfo); // sresp.sendError(404, "No such page for path " + pathInfo);
@ -169,12 +215,7 @@ public class AdminServlet
// final Document doc = page.buildDocument(sreq, sresp); // final Document doc = page.buildDocument(sreq, sresp);
// Templating.getPresentationManager().servePage(doc, sreq, sresp); // Templating.getPresentationManager().servePage(doc, sreq, sresp);
// } // }
final Page page = PageFactory.buildPage("admin", "LibreCCM NG Admin"); final Document doc = adminPage.buildDocument(sreq, sresp);
page.add(new Label("admin"));
page.lock();
final Document doc = page.buildDocument(sreq, sresp);
Templating.getPresentationManager().servePage(doc, sreq, sresp); Templating.getPresentationManager().servePage(doc, sreq, sresp);
} }
@ -184,70 +225,68 @@ public class AdminServlet
* @param pathInfo url stub for a page to display * @param pathInfo url stub for a page to display
* @param page Page object to display * @param page Page object to display
*/ */
private void addPage(final String pathInfo, final Page page) { // private void addPage(final String pathInfo, final Page page) {
Assert.exists(pathInfo, String.class); // Assert.exists(pathInfo, String.class);
Assert.exists(page, Page.class); // Assert.exists(page, Page.class);
// Current Implementation requires pathInfo to start with a leading '/' // // Current Implementation requires pathInfo to start with a leading '/'
// SUN Servlet API specifies: "PathInfo *may be empty* or will start // // SUN Servlet API specifies: "PathInfo *may be empty* or will start
// with a '/' character." // // with a '/' character."
Assert.isTrue(pathInfo.charAt(0) == '/', "path starts not with '/'"); // Assert.isTrue(pathInfo.charAt(0) == '/', "path starts not with '/'");
//
pages.put(pathInfo, page); // pages.put(pathInfo, page);
} // }
/** /**
* Index page for the admin section * Index page for the admin section
*/ */
private Page buildAdminIndexPage() { // private Page buildAdminIndexPage() {
//
final Page page = PageFactory.buildPage("admin", PAGE_TITLE_LABEL); // final Page page = PageFactory.buildPage("admin", PAGE_TITLE_LABEL);
page.addGlobalStateParam(USER_ID_PARAM); // page.addGlobalStateParam(USER_ID_PARAM);
page.addGlobalStateParam(GROUP_ID_PARAM); // page.addGlobalStateParam(GROUP_ID_PARAM);
page.addGlobalStateParam(APPLICATIONS_ID_PARAM); // page.addGlobalStateParam(APPLICATIONS_ID_PARAM);
//
/* // /*
* Create User split panel. // * Create User split panel.
* Note: Will change soon. // * Note: Will change soon.
*/ // */
//final AdminSplitPanel userSplitPanel = new AdminSplitPanel(USER_NAVBAR_TITLE); // //final AdminSplitPanel userSplitPanel = new AdminSplitPanel(USER_NAVBAR_TITLE);
// final UserBrowsePane browsePane = new UserBrowsePane(); //// final UserBrowsePane browsePane = new UserBrowsePane();
// userSplitPanel.addTab(USER_TAB_SUMMARY, new UserSummaryPane(userSplitPanel, browsePane)); //// userSplitPanel.addTab(USER_TAB_SUMMARY, new UserSummaryPane(userSplitPanel, browsePane));
// userSplitPanel.addTab(USER_TAB_BROWSE, browsePane); //// userSplitPanel.addTab(USER_TAB_BROWSE, browsePane);
// userSplitPanel.addTab(USER_TAB_SEARCH, new UserSearchPane(userSplitPanel, browsePane)); //// userSplitPanel.addTab(USER_TAB_SEARCH, new UserSearchPane(userSplitPanel, browsePane));
// userSplitPanel.addTab(USER_TAB_CREATE_USER, new CreateUserPane(userSplitPanel)); //// userSplitPanel.addTab(USER_TAB_CREATE_USER, new CreateUserPane(userSplitPanel));
// Create the Admin's page tab bar // // Create the Admin's page tab bar
final TabbedPane tabbedPane = new TabbedPane(); // final TabbedPane tabbedPane = new TabbedPane();
tabbedPane.setIdAttr("page-body"); // tabbedPane.setIdAttr("page-body");
//
/** // /**
* Create and add info tab // * Create and add info tab
*/ // */
//tabbedPane.addTab(INFO_TAB_TITLE, new AdminInfoTab()); // //tabbedPane.addTab(INFO_TAB_TITLE, new AdminInfoTab());
/* // /*
* Create and add the user and group tabs. // * Create and add the user and group tabs.
*/ // */
//tabbedPane.addTab(USER_TAB_TITLE, userSplitPanel); // //tabbedPane.addTab(USER_TAB_TITLE, userSplitPanel);
final GroupAdministrationTab groupAdminTab // final GroupAdministrationTab groupAdminTab
= new GroupAdministrationTab(); // = new GroupAdministrationTab();
tabbedPane.addTab(USER_TAB_TITLE, new UserAdministrationTab(tabbedPane, // tabbedPane.addTab(USER_TAB_TITLE, new UserAdministrationTab(tabbedPane,
groupAdminTab)); // groupAdminTab));
tabbedPane.addTab(GROUP_TAB_TITLE, groupAdminTab); // tabbedPane.addTab(GROUP_TAB_TITLE, groupAdminTab);
//
/* // /*
* Create application administration panel // * Create application administration panel
*/ // */
tabbedPane.addTab(APPLICATIONS_TAB_TITLE, // tabbedPane.addTab(APPLICATIONS_TAB_TITLE,
new ApplicationsAdministrationTab()); // new ApplicationsAdministrationTab());
//
// browsePane.setTabbedPane(tabbedPane); //// browsePane.setTabbedPane(tabbedPane);
// browsePane.setGroupAdministrationTab(groupAdminTab); //// browsePane.setGroupAdministrationTab(groupAdminTab);
//Add System information tab // //Add System information tab
tabbedPane.addTab(SYSINFO_TAB_TITLE, new SystemInformationTab()); // tabbedPane.addTab(SYSINFO_TAB_TITLE, new SystemInformationTab());
//
page.add(tabbedPane); // page.add(tabbedPane);
page.lock(); // page.lock();
//
return page; // return page;
} // }
} }

View File

@ -0,0 +1,499 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.globalization.GlobalizedMessage;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public final class AdminUiConstants {
/**
* The XML namespace used by administration components.
*/
public static final String ADMIN_XML_NS
= "http://www.arsdigita.com/admin-ui/1.0";
/**
* Globalisation resource for administration UI.
*/
public static final String BUNDLE_NAME
= "com.arsdigita.ui.admin.AdminResources";
/**
* Navigational dimension bar labels.
*/
// Label MY_WORKSPACE_LABEL = new Label
// (new GlobalizedMessage("ui.admin.nav.workspace",
// BUNDLE_NAME));
// Label LOG_OUT_LABEL = new Label
// (new GlobalizedMessage("ui.admin.nav.logout",
// BUNDLE_NAME));
/**
* Administration page title
*/
public static final Label PAGE_TITLE_LABEL = new Label(
new GlobalizedMessage("ui.admin.dispatcher.title",
BUNDLE_NAME));
/**
* Administration main tab names.
*/
public static final Label USER_TAB_TITLE = new Label(new GlobalizedMessage(
"ui.admin.tab.user",
BUNDLE_NAME));
public static final Label GROUP_TAB_TITLE = new Label(new GlobalizedMessage(
"ui.admin.tab.group",
BUNDLE_NAME));
public static final Label APPLICATIONS_TAB_TITLE = new Label(
new GlobalizedMessage("ui.admin.tab.applications",
BUNDLE_NAME));
public static final Label SYSINFO_TAB_TITLE = new Label(
new GlobalizedMessage("ui.admin.tab.sysinfo.title", BUNDLE_NAME));
public static final GlobalizedMessage USER_NAVBAR_TITLE
= new GlobalizedMessage(
"ui.admin.tab.user.navbartitle",
BUNDLE_NAME);
/**
* Tabbed pane indices
*/
public static final int USER_TAB_INDEX = 2;
public static final int GROUP_TAB_INDEX = 3;
/**
* User tab name
*/
public static final Label USER_TAB_SUMMARY = new Label(
new GlobalizedMessage("ui.admin.tab.user.summary",
BUNDLE_NAME));
public static final Label USER_TAB_BROWSE = new Label(new GlobalizedMessage(
"ui.admin.tab.user.browse",
BUNDLE_NAME));
public static final Label USER_TAB_SEARCH = new Label(new GlobalizedMessage(
"ui.admin.tab.user.search",
BUNDLE_NAME));
public static final Label USER_TAB_CREATE_USER = new Label(
new GlobalizedMessage("ui.admin.tab.user.createuser",
BUNDLE_NAME));
public static final int USER_TAB_SUMMARY_INDEX = 0;
public static final int USER_TAB_BROWSE_INDEX = 1;
public static final int USER_TAB_SEARCH_INDEX = 2;
public static final int USER_TAB_CREATE_USER_INDEX = 3;
/**
* Global state parameters.
*/
public static final BigDecimalParameter GROUP_ID_PARAM
= new BigDecimalParameter("group_id");
public static final BigDecimalParameter APPLICATIONS_ID_PARAM
= new BigDecimalParameter(
"application_id");
public static final BigDecimalParameter USER_ID_PARAM
= new BigDecimalParameter("user_id");
/**
* User summary panel.
*/
public static final Label SUMMARY_PANEL_HEADER = new Label(
new GlobalizedMessage("ui.admin.user.summarypanel.header", BUNDLE_NAME));
public static final Label CREATE_USER_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.user.summarypanel.createUser", BUNDLE_NAME));
public static final Label TOTAL_USERS_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.user.summarypanel.totalusers", BUNDLE_NAME));
/**
* User browse panel.
*/
public static final Label BROWSE_USER_PANEL_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.user.browsepanel.header",
BUNDLE_NAME));
public static final Label USER_INFO_LABEL = new Label(new GlobalizedMessage(
"ui.admin.user.userinfo.header",
BUNDLE_NAME));
public static final Label USER_EDIT_PANEL_HEADER = new Label(
new GlobalizedMessage("ui.admin.user.useredit.header",
BUNDLE_NAME));
public static final Label USER_GROUP_PANEL_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.user.groupmembership.header",
BUNDLE_NAME));
public static final Label USER_DELETE_FAILED_PANEL_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.user.action.delete.failed.header",
BUNDLE_NAME));
public static final Label USER_PASSWORD_PANEL_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.user.password.header",
BUNDLE_NAME));
public static final Label USER_ACTION_PANEL_HEADER = new Label(
new GlobalizedMessage("ui.admin.user.action.header",
BUNDLE_NAME));
public static final Label USER_ACTION_CONTINUE = new Label(
new GlobalizedMessage("ui.admin.user.action.continue",
BUNDLE_NAME));
public static final Label USER_DELETE_LABEL = new Label(
new GlobalizedMessage("ui.admin.user.delete.label",
BUNDLE_NAME));
public static final Label USER_BAN_LABEL = new Label(new GlobalizedMessage(
"ui.admin.user.ban.label",
BUNDLE_NAME));
public static final Label USER_UNBAN_LABEL = new Label(
new GlobalizedMessage("ui.admin.user.unban.label",
BUNDLE_NAME));
public static final GlobalizedMessage USER_DELETE_CONFIRMATION
= new GlobalizedMessage(
"ui.admin.user.delete.confirm", BUNDLE_NAME);
public static final GlobalizedMessage USER_BAN_CONFIRMATION
= new GlobalizedMessage(
"ui.admin.user.ban.confirm",
BUNDLE_NAME);
public static final GlobalizedMessage USER_UNBAN_CONFIRMATION
= new GlobalizedMessage(
"ui.admin.user.unban.confirm",
BUNDLE_NAME);
public static final GlobalizedMessage USER_DELETE_FAILED_MSG
= new GlobalizedMessage(
"ui.admin.user.delete.failed.label", BUNDLE_NAME);
public static final Label USER_TAB_EXTREME_ACTION_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.user.browsepanel.extremeaction",
BUNDLE_NAME));
public static final Label UPDATE_USER_PASSWORD_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.user.browsepanel.updatePassword",
BUNDLE_NAME));
public static final Label BECOME_USER_LABEL = new Label(
new GlobalizedMessage("ui.admin.user.browsepanel.becomeUser",
BUNDLE_NAME));
/**
* Create new user panel.
*/
public static final Label CREATE_USER_PANEL_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.user.createpanel.header",
BUNDLE_NAME));
/**
* User search panel.
*/
public static final Label SEARCH_PANEL_HEADER = new Label(
new GlobalizedMessage("ui.admin.user.search.header",
BUNDLE_NAME));
public static final Label PASSWORD_FORM_LABEL_PASSWORD = new Label(
new GlobalizedMessage(
"ui.admin.user.userpasswordform.passwordlabel",
BUNDLE_NAME));
public static final Label PASSWORD_FORM_LABEL_CONFIRMATION_PASSWORD
= new Label(new GlobalizedMessage(
"ui.admin.user.userpasswordform.confirmpasswordlabel",
BUNDLE_NAME));
public static final Label PASSWORD_FORM_LABEL_QUESTION = new Label(
new GlobalizedMessage(
"ui.admin.user.userpasswordform.question",
BUNDLE_NAME), false);
public static final Label PASSWORD_FORM_LABEL_ANSWER = new Label(
new GlobalizedMessage(
"ui.admin.user.userpasswordform.answer",
BUNDLE_NAME), false);
public static final GlobalizedMessage PASSWORD_FORM_SUBMIT
= new GlobalizedMessage(
"ui.admin.user.userpasswordform.submit",
BUNDLE_NAME);
/**
* Constants for user add/edit form.
*/
public static final String USER_FORM_ADD = "user-add-form";
public static final String USER_FORM_EDIT = "user-edit-form";
public static final String USER_FORM_INPUT_FIRST_NAME = "firstname";
public static final String USER_FORM_INPUT_LAST_NAME = "lastname";
public static final String USER_FORM_INPUT_PASSWORD = "password";
public static final String USER_FORM_INPUT_PASSWORD_CONFIRMATION
= "password_confirmation";
public static final String USER_FORM_INPUT_QUESTION = "question";
public static final String USER_FORM_INPUT_ANSWER = "answer";
public static final String USER_FORM_INPUT_PRIMARY_EMAIL = "email";
public static final String USER_FORM_INPUT_ADDITIONAL_EMAIL
= "additional_email";
public static final String USER_FORM_INPUT_SCREEN_NAME = "screenname";
public static final String USER_FORM_INPUT_SSO = "sso_login";
public static final String USER_FORM_INPUT_URL = "url";
public static final String USER_FORM_INPUT_URL_DEFAULT = "http://";
public static final Label USER_FORM_LABEL_FIRST_NAME = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.firstname",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_LAST_NAME = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.lastname",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_PASSWORD = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.password",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_PASSWORD_CONFIRMATION = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.confirmation",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_QUESTION = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.question",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_ANSWER = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.answer",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_PRIMARY_EMAIL = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.primaryemail",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_ADDITIONAL_EMAIL = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.additionalemail",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_ADDITIONAL_EMAIL_LIST = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.additionalemaillist",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_SCREEN_NAME = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.screenname",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_SSO = new Label(
new GlobalizedMessage(
"ui.admin.user.addeditform.ssologinname",
BUNDLE_NAME));
public static final Label USER_FORM_LABEL_URL = new Label(
new GlobalizedMessage("ui.admin.user.addeditform.url",
BUNDLE_NAME));
public static final Label USER_FORM_DELETE_ADDITIONAL_EMAIL = new Label(
new GlobalizedMessage("ui.admin.user.addeditform.deleteemail",
BUNDLE_NAME));
public static final GlobalizedMessage USER_FORM_SUBMIT
= new GlobalizedMessage(
"ui.admin.user.addeditform.submit",
BUNDLE_NAME);
public static final GlobalizedMessage USER_FORM_ERROR_SCREEN_NAME_NOT_UNIQUE
= new GlobalizedMessage(
"ui.admin.user.addeditform.error.screenname.notunique",
BUNDLE_NAME);
public static final GlobalizedMessage USER_FORM_ERROR_PRIMARY_EMAIL_NOT_UNIQUE
= new GlobalizedMessage(
"ui.admin.user.addeditform.error.primaryemail.notunique",
BUNDLE_NAME);
public static final GlobalizedMessage USER_FORM_ERROR_PASSWORD_NOT_MATCH
= new GlobalizedMessage(
"ui.admin.user.addeditform.error.password.notmatch",
BUNDLE_NAME);
public static final GlobalizedMessage USER_FORM_ERROR_ANSWER_NULL
= new GlobalizedMessage(
"ui.admin.user.addeditform.error.answer.null",
BUNDLE_NAME);
public static final GlobalizedMessage USER_FORM_ERROR_ANSWER_WHITESPACE
= new GlobalizedMessage(
"ui.admin.user.addeditform.error.answer.whitespace",
BUNDLE_NAME);
/**
* Constants for group add/edit form.
*/
public static final String GROUP_FORM_ADD = "group-add-form";
public static final String GROUP_FORM_EDIT = "group-edit-form";
public static final String GROUP_FORM_INPUT_NAME = "name";
public static final String GROUP_FORM_INPUT_PRIMARY_EMAIL = "email";
public static final Label GROUP_FORM_LABEL_NAME = new Label(
new GlobalizedMessage(
"ui.admin.groups.addeditform.namelabel",
BUNDLE_NAME));
public static final Label GROUP_FORM_LABEL_PRIMARY_EMAIL = new Label(
new GlobalizedMessage(
"ui.admin.groups.addeditform.primaryemaillabel",
BUNDLE_NAME));
public static final GlobalizedMessage GROUP_FORM_SUBMIT
= new GlobalizedMessage(
"ui.admin.groups.addeditform.submit", BUNDLE_NAME);
/**
* Constants for group administration tab.
*/
public static final Label GROUP_ACTION_CONTINUE = new Label(
new GlobalizedMessage("ui.admin.groups.actioncontinue",
BUNDLE_NAME));
public static final GlobalizedMessage GROUP_DELETE_FAILED_MSG
= new GlobalizedMessage(
"ui.admin.groups.groupdeletefailed",
BUNDLE_NAME);
public static final Label GROUP_INFORMATION_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.groups.groupinformation",
BUNDLE_NAME));
public static final Label SUBGROUP_HEADER = new Label(new GlobalizedMessage(
"ui.admin.groups.subgroups",
BUNDLE_NAME));
public static final Label GROUP_EDIT_HEADER = new Label(
new GlobalizedMessage("ui.admin.groups.groupedit",
BUNDLE_NAME));
public static final Label ADD_SUBGROUP_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.add",
BUNDLE_NAME));
public static final Label SUBMEMBER_HEADER = new Label(
new GlobalizedMessage("ui.admin.groups.submembers",
BUNDLE_NAME));
public static final Label DELETE_GROUP_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.delete",
BUNDLE_NAME));
public static final Label GROUP_EXTREME_ACTIONS_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.groups.extremeaction",
BUNDLE_NAME));
public static final Label GROUP_DELETE_FAILED_HEADER = new Label(
new GlobalizedMessage(
"ui.admin.groups.deletefailed",
BUNDLE_NAME));
public static final Label ADD_GROUP_LABEL = new Label(new GlobalizedMessage(
"ui.admin.groups.addgrouplabel",
BUNDLE_NAME));
public static final Label EDIT_GROUP_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.edit",
BUNDLE_NAME));
public static final Label SUBGROUP_COUNT_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.groups.subgroupcountlabel",
BUNDLE_NAME));
public static final String GROUP_DELETE_CONFIRMATION
= "Are you sure you want to delete this group?";
public static final Label ADD_SUBMEMBER_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.addsubmemberlabel",
BUNDLE_NAME));
public static final Label REMOVE_SUBMEMBER_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.groups.removesubmemberlabel",
BUNDLE_NAME));
public static final Label ADD_EXISTING_GROUP_TO_SUBGROUPS_LABEL = new Label(
new GlobalizedMessage(
"ui.admin.groups.addExisting",
BUNDLE_NAME));
public static final Label REMOVE_SUBGROUP_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.removeExisting",
BUNDLE_NAME));
public static final Label GROUP_SEARCH_LABEL = new Label(
new GlobalizedMessage("ui.admin.groups.search", BUNDLE_NAME));
public static final GlobalizedMessage SEARCH_BUTTON = new GlobalizedMessage(
"ui.admin.groups.button.search",
BUNDLE_NAME);
public static final Label GROUP_NO_RESULTS = new Label(
new GlobalizedMessage("ui.admin.groups.searchForm.noResults",
BUNDLE_NAME));
public static final Label FOUND_GROUPS_TITLE = new Label(
new GlobalizedMessage("ui.admin.groups.found.title",
BUNDLE_NAME));
public static final Label PICK_GROUPS = new Label(new GlobalizedMessage(
"ui.admin.groups.select.explanation",
BUNDLE_NAME));
public static final GlobalizedMessage SAVE_BUTTON = new GlobalizedMessage(
"ui.admin.save", BUNDLE_NAME);
public static final String SEARCH_QUERY = "query";
public final static String ADMIN_PAGE_URL = "/admin/";
public final static String ADMIN_SERVLET_PATH = "/admin/*";
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.Label;
import com.arsdigita.toolbox.ui.LayoutPanel;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ApplicationsAdminTab extends LayoutPanel {
public ApplicationsAdminTab() {
super();
setLeft(new Label("Applications Admin Tab Left"));
setBody(new Label("Applications Admin Tab Body"));
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.Label;
import com.arsdigita.toolbox.ui.LayoutPanel;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class CategoriesAdminTab extends LayoutPanel {
public CategoriesAdminTab() {
super();
setLeft(new Label("Categories Admin Tab Left"));
setBody(new Label("Categories Admin Tab Body"));
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.Label;
import com.arsdigita.toolbox.ui.LayoutPanel;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class RegistryAdminTab extends LayoutPanel {
public RegistryAdminTab() {
super();
setLeft(new Label("Registry Admin Tab Left"));
setBody(new Label("Registry Admin Tab Body"));
}
}

View File

@ -0,0 +1,37 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.Label;
import com.arsdigita.toolbox.ui.LayoutPanel;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class UsersGroupsRolesTab extends LayoutPanel {
public UsersGroupsRolesTab() {
super();
setLeft(new Label("Users Groups Roles Left"));
setBody(new Label("Users Groups Roles Body"));
}
}

View File

@ -0,0 +1,67 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.configuration;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ConfigurationException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* Creates a new instance of <code>ConfigurationException</code> without detail message.
*/
public ConfigurationException() {
super();
}
/**
* Constructs an instance of <code>ConfigurationException</code> with the specified detail message.
*
* @param msg The detail message.
*/
public ConfigurationException(final String msg) {
super(msg);
}
/**
* Constructs an instance of <code>ConfigurationException</code> which wraps the
* specified exception.
*
* @param exception The exception to wrap.
*/
public ConfigurationException(final Exception exception) {
super(exception);
}
/**
* Constructs an instance of <code>ConfigurationException</code> with the specified message which also wraps the
* specified exception.
*
* @param msg The detail message.
* @param exception The exception to wrap.
*/
public ConfigurationException(final String msg, final Exception exception) {
super(msg, exception);
}
}

View File

@ -18,6 +18,9 @@
*/ */
package org.libreccm.core; package org.libreccm.core;
import com.arsdigita.ui.SimplePage;
import com.arsdigita.ui.UIConfig;
import com.arsdigita.ui.UiInitializer;
import com.arsdigita.ui.admin.AdminApplicationCreator; import com.arsdigita.ui.admin.AdminApplicationCreator;
import com.arsdigita.ui.admin.AdminServlet; import com.arsdigita.ui.admin.AdminServlet;
import com.arsdigita.ui.admin.AdminApplicationSetup; import com.arsdigita.ui.admin.AdminApplicationSetup;
@ -116,7 +119,6 @@ public class CcmCore implements CcmModule {
@Override @Override
public void init(final InitEvent event) { public void init(final InitEvent event) {
//Nothing
} }
@Override @Override

View File

@ -28,6 +28,7 @@ import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.libreccm.cdi.utils.CdiUtil;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -37,6 +38,7 @@ import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI; import javax.enterprise.inject.spi.CDI;
import javax.naming.InitialContext;
/** /**
* Implementation of Shiro's {@link AuthorizingRealm} to provide Shiro with the * Implementation of Shiro's {@link AuthorizingRealm} to provide Shiro with the
@ -70,26 +72,34 @@ public class CcmShiroRealm extends AuthorizingRealm {
if ("system-user".equals(userIdentifier)) { if ("system-user".equals(userIdentifier)) {
// The system user is a virtual user which has all roles and all // The system user is a virtual user which has all roles and all
// privileges // privileges
// final RoleRepository roleRepository;
// final BeanManager beanManager = CDI.current().getBeanManager();
// final Set<Bean<?>> beans = beanManager.
// getBeans(RoleRepository.class);
// final Iterator<Bean<?>> iterator = beans.iterator();
// if (iterator.hasNext()) {
// @SuppressWarnings("unchecked")
// final Bean<RoleRepository> bean
// = (Bean<RoleRepository>) iterator
// .next();
// final CreationalContext<RoleRepository> ctx = beanManager.
// createCreationalContext(bean);
//
// roleRepository = (RoleRepository) beanManager.getReference(
// bean, RoleRepository.class, ctx);
// } else {
// throw new AuthenticationException(
// "Failed to retrieve RoleRepository");
// }
final RoleRepository roleRepository; final RoleRepository roleRepository;
final BeanManager beanManager = CDI.current().getBeanManager(); try {
final Set<Bean<?>> beans = beanManager. roleRepository = CdiUtil.createCdiUtil()
getBeans(RoleRepository.class); .findBean(RoleRepository.class);
final Iterator<Bean<?>> iterator = beans.iterator(); } catch (IllegalStateException ex) {
if (iterator.hasNext()) {
@SuppressWarnings("unchecked")
final Bean<RoleRepository> bean
= (Bean<RoleRepository>) iterator.
next();
final CreationalContext<RoleRepository> ctx = beanManager.
createCreationalContext(bean);
roleRepository = (RoleRepository) beanManager.getReference(
bean, RoleRepository.class, ctx);
} else {
throw new AuthenticationException( throw new AuthenticationException(
"Failed to retrieve RoleRepository"); "Failed to retrieve RoleRepository", ex);
} }
final List<Role> roles = roleRepository.findAll(); final List<Role> roles = roleRepository.findAll();
final SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); final SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
@ -182,28 +192,36 @@ public class CcmShiroRealm extends AuthorizingRealm {
// For some reason we can't use the the CdiUtil class here, therefore // For some reason we can't use the the CdiUtil class here, therefore
// we have to do the lookup for the UserRepository be ourself. // we have to do the lookup for the UserRepository be ourself.
final UserRepository userRepository; final UserRepository userRepository;
final BeanManager beanManager = CDI.current().getBeanManager(); // final BeanManager beanManager = CDI.current().getBeanManager();
final Set<Bean<?>> beans = beanManager.getBeans( // final Set<Bean<?>> beans = beanManager.getBeans(
UserRepository.class); // UserRepository.class);
final Iterator<Bean<?>> iterator = beans.iterator(); // final Iterator<Bean<?>> iterator = beans.iterator();
if (iterator.hasNext()) { // if (iterator.hasNext()) {
@SuppressWarnings("unchecked") // @SuppressWarnings("unchecked")
final Bean<UserRepository> bean = (Bean<UserRepository>) iterator // final Bean<UserRepository> bean = (Bean<UserRepository>) iterator
.next(); // .next();
final CreationalContext<UserRepository> ctx = beanManager // final CreationalContext<UserRepository> ctx = beanManager
.createCreationalContext(bean); // .createCreationalContext(bean);
//
userRepository = (UserRepository) beanManager.getReference( // userRepository = (UserRepository) beanManager.getReference(
bean, UserRepository.class, ctx); // bean, UserRepository.class, ctx);
} else { try {
userRepository = CdiUtil.createCdiUtil().findBean(
UserRepository.class);
} catch (IllegalStateException ex) {
throw new AuthenticationException( throw new AuthenticationException(
"Failed to retrieve UserRepository."); "Failed to retrieve UserRepository.", ex);
} }
// } else {
// throw new AuthenticationException(
// "Failed to retrieve UserRepository.");
// }
// Depending of the configuration of CCM use the appropriate method // Depending of the configuration of CCM use the appropriate method
// for finding the user in the database. // for finding the user in the database.
final KernelConfig config = KernelConfig.getConfig(); final KernelConfig config = KernelConfig.getConfig();
final User user; final User user;
if ("email".equals(config.getPrimaryUserIdentifier())) { if ("email".equals(config.getPrimaryUserIdentifier())) {
user = userRepository.findByEmailAddress(userIdentifier); user = userRepository.findByEmailAddress(userIdentifier);
} else { } else {
@ -211,7 +229,8 @@ public class CcmShiroRealm extends AuthorizingRealm {
} }
// If no matching user is found throw an AuthenticationException // If no matching user is found throw an AuthenticationException
if (user == null) { if (user
== null) {
throw new AuthenticationException(String.format( throw new AuthenticationException(String.format(
"No user identified by principal \"%s\" was found. Primary user " "No user identified by principal \"%s\" was found. Primary user "
+ "identifier is \"%s\".", + "identifier is \"%s\".",
@ -219,6 +238,7 @@ public class CcmShiroRealm extends AuthorizingRealm {
} }
return user; return user;
} }
/** /**

View File

@ -0,0 +1,31 @@
ui.admin.access_denied=Access Denied
ui.admin.nusers=nUsers
ui.admin.help=Help
ui.admin.signout=Sign out
ui.admin.portal=My Portal
ui.admin.greeting=Welcome
ui.sitemap.site_node=Site Node:
ui.sitemap.mounted_instance=Mounted Instance:
ui.sitemap.enter_new_node_name_in_text_field=Enter new Node name in text field.
ui.sitemap.are_you_sure_you_want_to_remove_this_node=Are you sure you want to remove this node?
ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Are you sure you want to umount this instance?
ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list.
ui.sitemap.h4sitemap_treeh4=<h4>SiteMap Tree</h4>
ui.sitemap.configure_sitemap_admin_page=Configure SiteMap Admin Page
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=<h4><em>Select SiteNode to View Details</em></h4>
ui.sitemap.configuration_menu_placeholder=Configuration Menu Placeholder
ui.sitemap.access_denied_to_sitemap=Access Denied to SiteMap
ui.debug.transform.on=Display transformation
ui.debug.transform.off=Hide transformation
ui.debug.xml=View document XML
ui.debug.xsl=Download XSL files
com.arsdigita.ui.admin.applications.tree.heading=Applications
com.arsdigita.ui.admin.applications.url.validation.not_blank=The URL of an application instance can is mandatory.
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=The length of an URL of an application instance must be between 1 and 100 characters.
com.arsdigita.ui.admin.applications.title.validation.not_blank=Title is mandatory for an application instance.
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=The minimum length of the title of an applicatio instance is one character, the maximum length are 200 characters
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=The maximum length of a descrption of an application instance are 4000 characters.
com.arsdigita.ui.admin.applications.url.label=URL
com.arsdigita.ui.admin.applications.title.label=Title
com.arsdigita.ui.admin.applications.desc.label=Description
ui.change_password=Change password

View File

@ -0,0 +1,31 @@
ui.admin.access_denied=Zugang abgelehnt
ui.admin.nusers=nUsers
ui.admin.help=Hilfe
ui.admin.signout=Abmelden
ui.admin.portal=Meine Startseite
ui.admin.greeting=Willkommen
ui.sitemap.site_node=Site Node:
ui.sitemap.mounted_instance=Verf\u00fcgbare Instanz\:
ui.sitemap.enter_new_node_name_in_text_field=Tragen Sie einen neuen Namen im Textfeld ein.
ui.sitemap.are_you_sure_you_want_to_remove_this_node=Sind Sie sicher, diesen Knoten zu entfernen?
ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Sind Sie sicher, diese Instanz auszuh\u00e4ngen?
ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list.
ui.sitemap.h4sitemap_treeh4=<h4>SiteMap Tree</h4>
ui.sitemap.configure_sitemap_admin_page=Configure SiteMap Admin Page
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=<h4><em>Knoten f\u00fcr die Detailansicht w\u00e4hlen</em></h4>
ui.sitemap.configuration_menu_placeholder=Configuration Menu Placeholder
ui.sitemap.access_denied_to_sitemap=Zugang zur SiteMap abgelehnt.
ui.debug.transform.on=Transformation anzeigen
ui.debug.transform.off=Transformation verbergen
ui.debug.xml=XML Dokument ansehen
ui.debug.xsl=Download XSL Dateien
com.arsdigita.ui.admin.applications.tree.heading=Applikationen
com.arsdigita.ui.admin.applications.url.validation.not_blank=Die Angabe einer URL ist erforderlich
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=Die URL einer Applikations-Instanz muss zwischen einem und 100 Zeichen lang sein
com.arsdigita.ui.admin.applications.title.validation.not_blank=Der Titel ist f\u00fcr das Anlegen einer Applikations-Instanz erforderlich
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=Der Titel einer Applikations-Instanz muss zwischen einem und 200 Zeichen lang sein.
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=Die Beschreibung einer Applikations-Instanz darf max. 4000 Zeichen lang sein
com.arsdigita.ui.admin.applications.url.label=URL
com.arsdigita.ui.admin.applications.title.label=Bezeichnung
com.arsdigita.ui.admin.applications.desc.label=Beschreibung
ui.change_password=Passwort \u00e4ndern

View File

@ -0,0 +1,31 @@
ui.admin.access_denied=Access Denied
ui.admin.nusers=nUsers
ui.admin.help=Help
ui.admin.signout=Sign out
ui.admin.portal=My Portal
ui.admin.greeting=Welcome
ui.sitemap.site_node=Site Node:
ui.sitemap.mounted_instance=Mounted Instance:
ui.sitemap.enter_new_node_name_in_text_field=Enter new Node name in text field.
ui.sitemap.are_you_sure_you_want_to_remove_this_node=Are you sure you want to remove this node?
ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Are you sure you want to umount this instance?
ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list.
ui.sitemap.h4sitemap_treeh4=<h4>SiteMap Tree</h4>
ui.sitemap.configure_sitemap_admin_page=Configure SiteMap Admin Page
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=<h4><em>Select SiteNode to View Details</em></h4>
ui.sitemap.configuration_menu_placeholder=Configuration Menu Placeholder
ui.sitemap.access_denied_to_sitemap=Access Denied to SiteMap
ui.debug.transform.on=Display transformation
ui.debug.transform.off=Hide transformation
ui.debug.xml=View document XML
ui.debug.xsl=Download XSL files
com.arsdigita.ui.admin.applications.tree.heading=Applications
com.arsdigita.ui.admin.applications.url.validation.not_blank=
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.title.validation.not_blank=
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.url.label=
com.arsdigita.ui.admin.applications.title.label=
com.arsdigita.ui.admin.applications.desc.label=
ui.change_password=

View File

@ -0,0 +1,27 @@
ui.admin.access_denied=Acc\u00e8s refus\u00e9
ui.admin.help=Aide
ui.admin.signout=se deconnecter
ui.admin.portal=Ma Porte
ui.admin.greeting=Bienvenue
ui.admin.nusers=TRANSLATE THIS: nUsers (ui.admin.nusers)
ui.sitemap.site_node=TRANSLATE THIS: Site Node: (ui.sitemap.site_node)
ui.sitemap.mounted_instance=TRANSLATE THIS: Mounted Instance: (ui.sitemap.mounted_instance)
ui.sitemap.enter_new_node_name_in_text_field=TRANSLATE THIS: Enter new Node name in text field. (ui.sitemap.enter_new_node_name_in_text_field)
ui.sitemap.are_you_sure_you_want_to_remove_this_node=TRANSLATE THIS: Are you sure you want to remove this node? (ui.sitemap.are_you_sure_you_want_to_remove_this_node)
ui.sitemap.are_you_sure_you_want_to_umount_this_instance=TRANSLATE THIS: Are you sure you want to umount this instance? (ui.sitemap.are_you_sure_you_want_to_umount_this_instance)
ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=TRANSLATE THIS: Enter name for new package instance in text field, then select a package to mount from list. (ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list)
ui.sitemap.h4sitemap_treeh4=<h4>Plan du site</h4>
ui.sitemap.configure_sitemap_admin_page=TRANSLATE THIS: Configure SiteMap Admin Page (ui.sitemap.configure_sitemap_admin_page)
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=TRANSLATE THIS: <h4><em>Select SiteNode to View Details</em></h4> (ui.sitemap.h4emselect_sitenode_to_view_detailsemh4)
ui.sitemap.configuration_menu_placeholder=TRANSLATE THIS: Configuration Menu Placeholder (ui.sitemap.configuration_menu_placeholder)
ui.sitemap.access_denied_to_sitemap=Vous n'avez pas acc\u00e8s au plan du site
com.arsdigita.ui.admin.applications.tree.heading=
com.arsdigita.ui.admin.applications.url.validation.not_blank=
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.title.validation.not_blank=
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.url.label=
com.arsdigita.ui.admin.applications.title.label=
com.arsdigita.ui.admin.applications.desc.label=
ui.change_password=

View File

@ -152,3 +152,6 @@ ui.admin.sysinfo.xml_config=XML config
ui.admin.groups.ID_is_null=ID is null ui.admin.groups.ID_is_null=ID is null
ui.admin.user.userpasswordform.retrieving_user_failed=Failed to retrieve user ui.admin.user.userpasswordform.retrieving_user_failed=Failed to retrieve user
ui.admin.groups.couldnt_find_specified_group=Couldn't find the specified group ui.admin.groups.couldnt_find_specified_group=Couldn't find the specified group
ui.admin.tab.users_groups_roles.title=Users/Groups/Roles
ui.admin.tab.categories.title=Categories
ui.admin.tab.registry.title=Registry

View File

@ -152,3 +152,6 @@ ui.admin.sysinfo.xml_config=XML Konfiguration
ui.admin.groups.ID_is_null=ID is null ui.admin.groups.ID_is_null=ID is null
ui.admin.user.userpasswordform.retrieving_user_failed=Konnte Benutzer nicht abrufen ui.admin.user.userpasswordform.retrieving_user_failed=Konnte Benutzer nicht abrufen
ui.admin.groups.couldnt_find_specified_group=Konnte die spezifische Gruppe nicht finden ui.admin.groups.couldnt_find_specified_group=Konnte die spezifische Gruppe nicht finden
ui.admin.tab.users_groups_roles.title=Benutzer/Gruppen/Rollen
ui.admin.tab.categories.title=Kategorien
ui.admin.tab.registry.title=Registry

View File

@ -110,3 +110,6 @@ ui.admin.cancel_msg=Submission cancelled
ui.admin.groups.ID_is_null=ID is null ui.admin.groups.ID_is_null=ID is null
ui.admin.user.userpasswordform.retrieving_user_failed=Failed to retrieve user ui.admin.user.userpasswordform.retrieving_user_failed=Failed to retrieve user
ui.admin.groups.couldnt_find_specified_group=Couldn't find the specified group ui.admin.groups.couldnt_find_specified_group=Couldn't find the specified group
ui.admin.tab.users_groups_roles.title=Users/Groups/Roles
ui.admin.tab.categories.title=Categories
ui.admin.tab.registry.title=Registry

View File

@ -95,3 +95,6 @@ ui.admin.cancel_msg=Submission cancelled
ui.admin.groups.ID_is_null= ui.admin.groups.ID_is_null=
ui.admin.user.userpasswordform.retrieving_user_failed=Impossible de retrouver l'utilisateur ui.admin.user.userpasswordform.retrieving_user_failed=Impossible de retrouver l'utilisateur
ui.admin.groups.couldnt_find_specified_group=Impossible de trouver le groupe sp\u00e9cifi\u00e9 ui.admin.groups.couldnt_find_specified_group=Impossible de trouver le groupe sp\u00e9cifi\u00e9
ui.admin.tab.users_groups_roles.title=
ui.admin.tab.categories.title=
ui.admin.tab.registry.title=

View File

@ -18,7 +18,6 @@
*/ */
package org.libreccm.docrepo; package org.libreccm.docrepo;
import org.libreccm.auditing.AbstractAuditedEntityRepository; import org.libreccm.auditing.AbstractAuditedEntityRepository;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
@ -32,13 +31,15 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* Repository class for retrieving, storing and deleting {@code AbstractResource}s. * Repository class for retrieving, storing and deleting
* {@code AbstractResource}s.
* *
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a> * @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
* @version 01/10/2015 * @version 01/10/2015
*/ */
public abstract class AbstractResourceRepository<T extends AbstractResource> extends public abstract class AbstractResourceRepository<T extends AbstractResource>
AbstractAuditedEntityRepository<Long, T> { extends
AbstractAuditedEntityRepository<Long, T> {
protected Class classOfT; protected Class classOfT;
@ -64,29 +65,33 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
} }
/** /**
* Checks if the current subject has permissions grating him the * Checks if the current subject has permissions grating him the privilege
* privilege to read the requested {@link AbstractResource}(s) and removes the * to read the requested {@link AbstractResource}(s) and removes the ones he
* ones he is not allowed to access. * is not allowed to access.
* *
* @param resources The requested {@link AbstractResource}s, found in the database * @param resources The requested {@link AbstractResource}s, found in the
* @return A list of {@link AbstractResource}s the subject is allowed to access * database
*
* @return A list of {@link AbstractResource}s the subject is allowed to
* access
*/ */
private List<T> permissionFilter(List<T> resources) { private List<T> permissionFilter(List<T> resources) {
final CdiUtil cdiUtil = new CdiUtil(); final PermissionChecker permissionChecker = CdiUtil.createCdiUtil()
final PermissionChecker permissionChecker = cdiUtil.findBean( .findBean(PermissionChecker.class);
PermissionChecker.class);
return resources.stream().filter(resource -> permissionChecker return resources.stream().filter(resource -> permissionChecker
.isPermitted("read", resource)).collect(Collectors.toList()); .isPermitted("read", resource)).collect(Collectors.toList());
} }
/** /**
* Checks if the current subject has permissions grating him the * Checks if the current subject has permissions grating him the privilege
* privilege to read the one requested {@link AbstractResource} and removes it if * to read the one requested {@link AbstractResource} and removes it if he
* he is not allowed to access. * is not allowed to access.
* *
* @param resource The requested {@link AbstractResource}, found in the database * @param resource The requested {@link AbstractResource}, found in the
* @return A list of at most one {@link AbstractResource} the subject is allowed to * database
* access *
* @return A list of at most one {@link AbstractResource} the subject is
* allowed to access
*/ */
private T permissionFilter(T resource) { private T permissionFilter(T resource) {
return permissionFilter(Collections.singletonList(resource)).get(0); return permissionFilter(Collections.singletonList(resource)).get(0);
@ -96,19 +101,20 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
* Retrieve all {@link AbstractResource}s with the given name. * Retrieve all {@link AbstractResource}s with the given name.
* *
* @param name The name for the searched {@link AbstractResource} * @param name The name for the searched {@link AbstractResource}
* @return The {@link AbstractResource}s with the given name, if there aren't *
* any an {@code EmptyList} * @return The {@link AbstractResource}s with the given name, if there
* aren't any an {@code EmptyList}
*/ */
public List<T> findByName(final String name) { public List<T> findByName(final String name) {
final TypedQuery<T> query = getFindByNameQuery(); final TypedQuery<T> query = getFindByNameQuery();
query.setParameter("name", name); query.setParameter("name", name);
return permissionFilter(query.getResultList()); return permissionFilter(query.getResultList());
} }
/** /**
* Abstract method to get a {@link TypedQuery}, specifically implemented * Abstract method to get a {@link TypedQuery}, specifically implemented in
* in the subclasses matching their own database requests, finding the * the subclasses matching their own database requests, finding the
* {@code T}-typed objects by name. * {@code T}-typed objects by name.
* *
* @return A {@link TypedQuery} to find objects by name * @return A {@link TypedQuery} to find objects by name
@ -118,10 +124,11 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
/** /**
* Retrieve a {@code AbstractResource} by its {@code path}. * Retrieve a {@code AbstractResource} by its {@code path}.
* *
* @param pathName The {@code path} to the {@code AbstractResource}. * @param pathName The {@code path} to the {@code AbstractResource}.
* *
* @return The {@code AbstractResource} identified by the given {@code path}, if * @return The {@code AbstractResource} identified by the given
* there is such a {@code AbstractResource}, {@code null} if not. * {@code path}, if there is such a {@code AbstractResource},
* {@code null} if not.
*/ */
public T findByPathName(final String pathName) { public T findByPathName(final String pathName) {
final TypedQuery<T> query = getFindByPathNameQuery(); final TypedQuery<T> query = getFindByPathNameQuery();
@ -131,8 +138,8 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
} }
/** /**
* Abstract method to get a {@link TypedQuery}, specifically implemented * Abstract method to get a {@link TypedQuery}, specifically implemented in
* in the subclasses matching their own database requests, finding the * the subclasses matching their own database requests, finding the
* {@code T}-typed objects by path name. * {@code T}-typed objects by path name.
* *
* @return A {@link TypedQuery} to find objects by path name * @return A {@link TypedQuery} to find objects by path name
@ -142,10 +149,12 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
/** /**
* Retrieve the {@code AbstractResource}s, a given {@link User} created. * Retrieve the {@code AbstractResource}s, a given {@link User} created.
* *
* @param creator The {@link User}, who created the {@code AbstractResource}s. * @param creator The {@link User}, who created the
* {@code AbstractResource}s.
* *
* @return The {@code AbstractResource}s, created by the given {@link User}, if * @return The {@code AbstractResource}s, created by the given {@link User},
* there are such {@code AbstractResource}s, {@code EmptyList} if not. * if there are such {@code AbstractResource}s, {@code EmptyList} if
* not.
*/ */
public List<T> findForCreator(final User creator) { public List<T> findForCreator(final User creator) {
final TypedQuery<T> query = getFindForCreatorQuery(); final TypedQuery<T> query = getFindForCreatorQuery();
@ -155,8 +164,8 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
} }
/** /**
* Abstract method to get a {@link TypedQuery}, specifically implemented * Abstract method to get a {@link TypedQuery}, specifically implemented in
* in the subclasses matching their own database requests, finding the * the subclasses matching their own database requests, finding the
* {@code T}-typed objects created by a given/set {@link User}. * {@code T}-typed objects created by a given/set {@link User}.
* *
* @return A {@link TypedQuery} to find objects for creator. * @return A {@link TypedQuery} to find objects for creator.
@ -164,12 +173,15 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
protected abstract TypedQuery<T> getFindForCreatorQuery(); protected abstract TypedQuery<T> getFindForCreatorQuery();
/** /**
* Retrieve the {@code AbstractResource}s, a given {@link User} last modified. * Retrieve the {@code AbstractResource}s, a given {@link User} last
* modified.
* *
* @param modifier The {@link User} who last modified the {@code AbstractResource}s. * @param modifier The {@link User} who last modified the
* {@code AbstractResource}s.
* *
* @return The {@code AbstractResource}s, last modified by the given {@link User}, * @return The {@code AbstractResource}s, last modified by the given
* if there are such {@code AbstractResource}s, {@code EmptyList} if not. * {@link User}, if there are such {@code AbstractResource}s,
* {@code EmptyList} if not.
*/ */
public List<T> findForModifier(final User modifier) { public List<T> findForModifier(final User modifier) {
final TypedQuery<T> query = getFindForModifierQuery(); final TypedQuery<T> query = getFindForModifierQuery();
@ -179,11 +191,12 @@ public abstract class AbstractResourceRepository<T extends AbstractResource> ext
} }
/** /**
* Abstract method to get a {@link TypedQuery}, specifically implemented * Abstract method to get a {@link TypedQuery}, specifically implemented in
* in the subclasses matching their own database requests, finding the * the subclasses matching their own database requests, finding the
* {@code T}-typed objects last modified for a given/set {@link User}. * {@code T}-typed objects last modified for a given/set {@link User}.
* *
* @return A {@link TypedQuery} to find objects for last modifier. * @return A {@link TypedQuery} to find objects for last modifier.
*/ */
protected abstract TypedQuery<T> getFindForModifierQuery(); protected abstract TypedQuery<T> getFindForModifierQuery();
} }

View File

@ -38,7 +38,7 @@ import java.util.stream.Collectors;
*/ */
@RequestScoped @RequestScoped
public class RepositoryRepository extends public class RepositoryRepository extends
AbstractAuditedEntityRepository<Long, Repository> { AbstractAuditedEntityRepository<Long, Repository> {
@Inject @Inject
private EntityManager entityManager; private EntityManager entityManager;
@ -62,19 +62,21 @@ public class RepositoryRepository extends
} }
/** /**
* Checks if the current subject has permissions grating him the * Checks if the current subject has permissions grating him the privilege
* privilege to read the requested {@link Repository}(s) and removes the * to read the requested {@link Repository}(s) and removes the ones he is
* ones he is not allowed to access. * not allowed to access.
* *
* @param repositories The requested {@link AbstractResource}s, found in the database * @param repositories The requested {@link AbstractResource}s, found in the
* @return A list of {@link AbstractResource}s the subject is allowed to access * database
*
* @return A list of {@link AbstractResource}s the subject is allowed to
* access
*/ */
private List<Repository> permissionFilter(List<Repository> repositories) { private List<Repository> permissionFilter(List<Repository> repositories) {
final CdiUtil cdiUtil = new CdiUtil(); final PermissionChecker permissionChecker = CdiUtil.createCdiUtil()
final PermissionChecker permissionChecker = cdiUtil.findBean( .findBean(PermissionChecker.class);
PermissionChecker.class);
return repositories.stream().filter(repository -> permissionChecker return repositories.stream().filter(repository -> permissionChecker
.isPermitted("read", repository)).collect(Collectors.toList()); .isPermitted("read", repository)).collect(Collectors.toList());
} }
/** /**
@ -86,7 +88,7 @@ public class RepositoryRepository extends
*/ */
public List<Repository> findForOwner(User owner) { public List<Repository> findForOwner(User owner) {
final TypedQuery<Repository> query = entityManager.createNamedQuery( final TypedQuery<Repository> query = entityManager.createNamedQuery(
"DocRepo.findRepositoriesForOwner", Repository.class); "DocRepo.findRepositoriesForOwner", Repository.class);
query.setParameter("owner", owner); query.setParameter("owner", owner);
return permissionFilter(query.getResultList()); return permissionFilter(query.getResultList());

View File

@ -161,8 +161,8 @@ public class ShortcutForm extends Form {
@Override @Override
public void init(FormSectionEvent ev) throws FormProcessException { public void init(FormSectionEvent ev) throws FormProcessException {
final PageState state = ev.getPageState(); final PageState state = ev.getPageState();
final CdiUtil cdiUtil = new CdiUtil(); final ShortcutRepository shortcutsRepo = CdiUtil.createCdiUtil()
final ShortcutRepository shortcutsRepo = cdiUtil.findBean(ShortcutRepository.class); .findBean(ShortcutRepository.class);
Long shortcutKey = (Long) m_selected_shortcut Long shortcutKey = (Long) m_selected_shortcut
.getSelectedKey(state); .getSelectedKey(state);
@ -222,8 +222,8 @@ public class ShortcutForm extends Form {
public void process(FormSectionEvent e) throws FormProcessException { public void process(FormSectionEvent e) throws FormProcessException {
ShortcutManager shortcutMgr = new ShortcutManager(); ShortcutManager shortcutMgr = new ShortcutManager();
PageState state = e.getPageState(); PageState state = e.getPageState();
final CdiUtil cdiUtil = new CdiUtil(); final ShortcutRepository shortcutsRepo = CdiUtil.createCdiUtil()
final ShortcutRepository shortcutsRepo = cdiUtil.findBean(ShortcutRepository.class); .findBean(ShortcutRepository.class);
Long shortcutKey = (Long) m_selected_shortcut.getSelectedKey(state); Long shortcutKey = (Long) m_selected_shortcut.getSelectedKey(state);

View File

@ -56,9 +56,8 @@ public class ShortcutsTable extends Table {
public ShortcutsTable(final ParameterSingleSelectionModel selected_shortcut) { public ShortcutsTable(final ParameterSingleSelectionModel selected_shortcut) {
super(new ShortcutsModelBuilder(), headers); super(new ShortcutsModelBuilder(), headers);
setDefaultCellRenderer(new ShortcutsCellRenderer()); setDefaultCellRenderer(new ShortcutsCellRenderer());
final CdiUtil cdiUtil = new CdiUtil(); final ShortcutRepository shortcutsRepo = CdiUtil.createCdiUtil()
final ShortcutRepository shortcutsRepo = cdiUtil.findBean( .findBean(ShortcutRepository.class);
ShortcutRepository.class);
addTableActionListener(new TableActionListener() { addTableActionListener(new TableActionListener() {