package org.brixcms.plugin.demo; import java.util.ArrayList; import java.util.List; import javax.jcr.ImportUUIDBehavior; import org.apache.wicket.Page; import org.apache.wicket.request.cycle.RequestCycle; import org.brixcms.Brix; import org.brixcms.Path; import org.brixcms.config.BrixConfig; import org.brixcms.config.PrefixUriMapper; import org.brixcms.config.UriMapper; import org.brixcms.jcr.JcrSessionFactory; import org.brixcms.jcr.api.JcrSession; import org.brixcms.plugin.content.ContentPlugin; import org.brixcms.plugin.demo.web.AbstractWicketApplication; import org.brixcms.plugin.demo.web.DemoBrix; import org.brixcms.plugin.demo.web.admin.AdminPage; import org.brixcms.plugin.demo.web.signin.BrixSignInPage; import org.brixcms.plugin.demo.web.signin.BrixSignOutPage; import org.brixcms.plugin.jpa.auth.AccessJpaPluginAction; import org.brixcms.plugin.menu.auth.AccessMenuPluginAction; import org.brixcms.plugin.prototype.auth.AccessPrototypePluginAction; import org.brixcms.plugin.site.SitePlugin; import org.brixcms.plugin.site.auth.AccessSitePluginAction; import org.brixcms.plugin.snapshot.auth.AccessSnapshotPluginAction; import org.brixcms.plugin.usermgmt.role.Permission; import org.brixcms.plugin.usermgmt.role.PermissionRepository; import org.brixcms.plugin.usermgmt.role.Role; import org.brixcms.plugin.usermgmt.role.RoleRepository; import org.brixcms.plugin.usermgmt.user.User; import org.brixcms.plugin.usermgmt.user.UserRepository; import org.brixcms.plugin.webdavurl.AccessWebDavUrlPluginAction; import org.brixcms.web.BrixRequestMapper; import org.brixcms.workspace.Workspace; import org.brixcms.workspace.WorkspaceManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import static org.brixcms.plugin.demo.web.DemoAuthorizationStrategy.ViewSiteWorkspaceAction; import static org.brixcms.plugin.demo.web.DemoAuthorizationStrategy.ViewContentWorkspaceAction; /** * Application object for your web application. */ @SpringBootApplication @ComponentScan({ "org.brixcms.plugin.*" }) @EntityScan("org.brixcms.plugin.*") @EnableJpaRepositories("org.brixcms.plugin.*") public class BrixApplication extends AbstractWicketApplication { private static final Logger logger = LoggerFactory.getLogger(BrixApplication.class); /** * brix instance */ private Brix brix; public Brix getBrix() { return brix; } /** * A main() so we can easily run this app in our IDE */ public static void main(String[] args) { SpringApplication.run(BrixApplication.class, args); } /** * {@inheritDoc} */ @Override public Class<? extends Page> getHomePage() { // use special class so that the URL coding strategy knows we want to go // home // it is not possible to just return null here because some pages (e.g. // expired page) // rely on knowing the home page return BrixRequestMapper.HomePage.class; } /** * {@inheritDoc} */ @Override protected void init() { super.init(); final JcrSessionFactory sf = getJcrSessionFactory(); final WorkspaceManager wm = getWorkspaceManager(); getDebugSettings().setOutputMarkupContainerClassName(true); try { // create uri mapper for the cms // we are mounting the cms on the root, and getting the workspace // name from the // application properties UriMapper mapper = new PrefixUriMapper(Path.ROOT) { @Override public Workspace getWorkspaceForRequest(RequestCycle requestCycle, Brix brix) { final String name = getProperties().getJcrDefaultWorkspace(); SitePlugin sitePlugin = SitePlugin.get(brix); return sitePlugin.getSiteWorkspace(name, getProperties().getWorkspaceDefaultState()); } }; // create brix configuration BrixConfig config = new BrixConfig(sf, wm, mapper); config.setHttpPort(getProperties().getHttpPort()); config.setHttpsPort(getProperties().getHttpsPort()); // setRootRequestMapper(new HttpsMapper(new SystemMapper(this), new // HttpsConfig(config.getHttpPort(), config.getHttpsPort()))); // create brix instance and attach it to this application brix = new DemoBrix(config, getApplicationContext()); brix.attachTo(this); initializeRepository(); initDefaultWorkspaces(); } catch (Exception e) { logger.error("Exception in WicketApplication init()", e); } finally { // since we accessed session factory we also have to perform cleanup cleanupSessionFactory(); } // mount admin page mountPage("/admin", AdminPage.class); mountPage("/signin", BrixSignInPage.class); mountPage("/signout", BrixSignOutPage.class); } /** * Allow Brix to perform repository initialization */ private void initializeRepository() { try { brix.initRepository(); } finally { // cleanup any sessions we might have created cleanupSessionFactory(); } } private void initDefaultWorkspaces() { try { final String defaultState = getProperties().getWorkspaceDefaultState(); final String wn = getProperties().getJcrDefaultWorkspace(); final SitePlugin sp = SitePlugin.get(brix); if (!sp.siteExists(wn, defaultState)) { Workspace w = sp.createSite(wn, defaultState); JcrSession session = brix.getCurrentSession(w.getId()); session.importXML("/", getClass().getResourceAsStream("/org/brixcms/demo/web/workspace.xml"), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); brix.initWorkspace(w, session); session.save(); } initContentPluginWorkspace(wn, defaultState); } catch (Exception e) { throw new RuntimeException("Could not initialize jackrabbit workspace with Brix", e); } } private void initContentPluginWorkspace(String siteWorkspaceName, String defaultState) { try { final String wn = siteWorkspaceName + ".ContenPlugin"; final ContentPlugin cp = ContentPlugin.get(brix); if (!cp.contentExists(wn, defaultState)) { Workspace w = cp.createContent(wn, defaultState); JcrSession session = brix.getCurrentSession(w.getId()); session.importXML("/", getClass().getResourceAsStream("/org/brixcms/demo/web/workspace_content.xml"), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); brix.initWorkspace(w, session); session.save(); } } catch (Exception e) { throw new RuntimeException("Could not initialize jackrabbit workspace with Brix", e); } } @Bean public CommandLineRunner initUserManagement(UserRepository userRepository, RoleRepository roleRepository, PermissionRepository permissionRepository) { return (args) -> { List<Permission> permissions = new ArrayList<>(); permissions.add(createPermission(ViewContentWorkspaceAction, permissionRepository)); Role editorRole = roleRepository.save(createRole("editor", permissions)); permissions.add(createPermission(ViewSiteWorkspaceAction, permissionRepository)); permissions.add(createPermission(AccessMenuPluginAction.class.getSimpleName(), permissionRepository)); permissions.add(createPermission(AccessSitePluginAction.class.getSimpleName(), permissionRepository)); permissions.add(createPermission(AccessPrototypePluginAction.class.getSimpleName(), permissionRepository)); permissions.add(createPermission(AccessSnapshotPluginAction.class.getSimpleName(), permissionRepository)); permissions.add(createPermission(AccessWebDavUrlPluginAction.class.getSimpleName(), permissionRepository)); permissions.add(createPermission(AccessJpaPluginAction.class.getSimpleName(), permissionRepository)); Role adminRole = roleRepository.save(createRole("admin", permissions)); userRepository.save(createUser("admin", "admin", "admin@brixcms.org", true, adminRole)); userRepository.save(createUser("editor", "editor", "editor@brixcms.org", true, editorRole)); }; } private Permission createPermission(String name, PermissionRepository permissionRepository) { logger.info("Creating permission '{}'", name); Permission permission = new Permission(); permission.setName(name); return permissionRepository.save(permission); } private User createUser(String username, String password, String email, boolean verified, Role role) { logger.info("Creating user '{}' with email '{}'.", username, email); User user = new User(); user.setUsername(username); user.setPassword(password); user.setEmail(email); user.setVerified(verified); user.getRoles().add(role); return user; } private Role createRole(String name, List<Permission> permissions) { logger.info("Creating role '{}'", name); Role role = new Role(); role.setName(name); role.getPermissions().addAll(permissions); return role; } }