@Override public void loadRepository(RepositoryDefinition definition) throws RepositoryNotInitializedException, InstantiationException, IllegalAccessException, ClassNotFoundException { log.info("Loading JCR {}", definition.getName()); // create also mgnlVersion and mgnlSystem for each repository. Set<String> workspaces = new LinkedHashSet<>(definition.getWorkspaces()); workspaces.addAll(Arrays.asList(RepositoryConstants.SYSTEM, RepositoryConstants.VERSION_STORE)); definition.getWorkspaces().clear(); definition.getWorkspaces().addAll(workspaces); Class<? extends Provider> providerClass = Classes.getClassFactory().forName(definition.getProvider()); Provider provider = Components.getComponentProvider().newInstance(providerClass); provider.init(definition); Repository repository = provider.getUnderlyingRepository(); workspaceMapping.setRepository(definition.getName(), repository); workspaceMapping.setRepositoryProvider(definition.getName(), provider); if (definition.isLoadOnStartup()) { for (String workspaceId : workspaces) { registerNameSpacesAndNodeTypes(workspaceId, definition, provider); } } }
/** * Verify that workspace exists in clustered repository. * @param workspace The name of the workspace * @return {@code true} if workspace is a shared workspace that is configured in a clustered repository */ public boolean isClusteredWorkspace(String workspace) { String clusterConfigFile = magnoliaConfigurationProperties.getProperty(MagnoliaConfigurationProperties.MAGNOLIA_REPOSITORIES_CLUSTER_CONFIG); if (StringUtils.isBlank(clusterConfigFile)) { return false; } Collection<RepositoryDefinition> repoDefinitions = workspaceMapping.getRepositoryDefinitions(); for (RepositoryDefinition repoDefinition : repoDefinitions) { if (repoDefinition.getParameters().containsValue(clusterConfigFile) && repoDefinition.getWorkspaces().contains(workspace)) { return true; } } return false; }
String provider = repositoryElement.getAttributeValue(ATTRIBUTE_PROVIDER); RepositoryDefinition repository = new RepositoryDefinition(); repository.setName(name); repository.setProvider(provider); repository.setLoadOnStartup(BooleanUtils.toBoolean(loadOnStartup)); repository.setParameters(parameters); if (workspaces == null || workspaces.isEmpty()) { repository.addWorkspace(DEFAULT_WORKSPACE_NAME); } else { for (Element element : workspaces) { String workspaceName = element.getAttributeValue(ATTRIBUTE_NAME); repository.addWorkspace(workspaceName);
repositoryName = repositoryMapping.getName(); final Map<String, String> defaultParameters = defaultRepositoryMapping.getParameters(); rm = new info.magnolia.repository.definition.RepositoryDefinition(); rm.setName(repositoryName); rm.setProvider(defaultRepositoryMapping.getProvider()); rm.setLoadOnStartup(true); parameters.put("customNodeTypes", nodeTypeFile); rm.setParameters(parameters); if (!rm.getWorkspaces().contains(workspace)) { log.debug("Loading new workspace: {}", workspace);
@Test public void repositoryIsClusteredAndClusterMaster() throws Exception { // GIVEN MagnoliaConfigurationProperties properties = mock(MagnoliaConfigurationProperties.class); given(properties.getProperty(MagnoliaConfigurationProperties.MAGNOLIA_REPOSITORIES_CLUSTER_CONFIG)).willReturn("website"); given(properties.getBooleanProperty(MagnoliaConfigurationProperties.MAGNOLIA_REPOSITORIES_CLUSTER_MASTER)).willReturn(true); given(properties.hasProperty(MagnoliaConfigurationProperties.MAGNOLIA_REPOSITORIES_CLUSTER_MASTER)).willReturn(true); WorkspaceMapping workspaceMapping = new WorkspaceMapping(); RepositoryDefinition repositoryDefinition = mock(RepositoryDefinition.class); Map<String, String> definitionMap = newHashMap(); definitionMap.put("website", "website"); definitionMap.put("null-mgnlVersion", "mgnlVersion"); given(repositoryDefinition.getName()).willReturn("magnolia"); given(repositoryDefinition.getParameters()).willReturn(definitionMap); given(repositoryDefinition.getWorkspaces()).willReturn(newArrayList("website", "mgnlVersion")); workspaceMapping.addRepositoryDefinition(repositoryDefinition); workspaceMapping.addWorkspaceMapping(new WorkspaceMappingDefinition("magnolia-mgnlVersion", "magnolia", "mgnlVersion")); workspaceMapping.addWorkspaceMapping(new WorkspaceMappingDefinition("website", "magnolia", "website")); DefaultRepositoryManager repositoryManager = new DefaultRepositoryManager(properties, workspaceMapping); ComponentsTestUtil.setInstance(RepositoryManager.class, repositoryManager); // WHEN ModuleManagerImpl moduleManager = new TestModuleManagerImpl(moduleVersionHandlers, context, moduleDefinitionReader, moduleRegistry, repositoryManager); moduleManager.applyDeltas(moduleDefinition, newArrayList(delta), context); // THEN assertThat(websiteSession.hasPendingChanges(), is(false)); }
if (repositoryDefinition.getWorkspaces().isEmpty()) { repositoryDefinition.addWorkspace("default"); String repoName = repoDefinition.getName(); Provider provider = workspaceMapping.getRepositoryProvider(repoName); Session session = provider.getSystemSession("default");
public void addRepository(RepositoryDefinition repositoryDefinition) { this.repositories.put(repositoryDefinition.getName(), repositoryDefinition); }
/** * Adds workspace mapping, if the physical workspace doesn't exist it is added. */ public void addWorkspaceMapping(WorkspaceMappingDefinition mapping) { if (workspaceMappingDefinitions.containsKey(mapping.getLogicalWorkspaceName())) { return; } addWorkspaceMappingDefinition(mapping); RepositoryDefinition repositoryDefinition = getRepositoryDefinition(mapping.getRepositoryName()); if (!repositoryDefinition.getWorkspaces().contains(mapping.getPhysicalWorkspaceName())) { repositoryDefinition.addWorkspace(mapping.getPhysicalWorkspaceName()); } }
/** * @see info.magnolia.repository.Provider#registerNodeTypes(java.lang.String) */ @Override public void registerNodeTypes(String configuration) throws RepositoryException { if (StringUtils.isEmpty(configuration)) { configuration = this.repositoryMapping.getParameters().get(CUSTOM_NODETYPES); } InputStream xml = getNodeTypeDefinition(configuration); this.registerNodeTypes(xml); }
/** * Checks if all workspaces are present according to the repository mapping, creates any missing workspace. */ private void validateWorkspaces() throws RepositoryException { Iterator<String> configuredNames = repositoryMapping.getWorkspaces().iterator(); while (configuredNames.hasNext()) { registerWorkspace(configuredNames.next()); } }
public void addRepositoryDefinition(RepositoryDefinition repositoryDefinition) { repositoryDefinitions.put(repositoryDefinition.getName(), repositoryDefinition); }
Map params = this.repositoryMapping.getParameters(); String configFile = (String) params.get(CONFIG_FILENAME_KEY); configFile = fileSystemHelper.getAbsoluteFileSystemPath(configFile);
/** * Get default workspace name. * * @return default name if there are no workspaces defined or there is no workspace present with name "default", otherwise return same name as repository name. */ public static String getDefaultWorkspace(String repositoryId) { RepositoryDefinition mapping = getRepositoryMapping(repositoryId); if (mapping == null) { return DEFAULT_WORKSPACE; } Collection<String> workspaces = mapping.getWorkspaces(); if (workspaces.contains(getMappedWorkspaceName(repositoryId))) { return repositoryId; } return DEFAULT_WORKSPACE; }
assertEquals("magnolia", magnolia.getName()); assertEquals("provider-class", magnolia.getProvider()); assertTrue(magnolia.isLoadOnStartup()); assertEquals(2, magnolia.getParameters().size()); assertEquals("value1", magnolia.getParameters().get("parameter1")); assertEquals("value2", magnolia.getParameters().get("parameter2")); assertEquals(2, magnolia.getWorkspaces().size()); assertTrue(magnolia.getWorkspaces().contains("website")); assertTrue(magnolia.getWorkspaces().contains("config")); assertEquals("anotherRepository", anotherRepository.getName()); assertEquals("another-provider-class", anotherRepository.getProvider()); assertFalse(anotherRepository.isLoadOnStartup()); assertEquals(0, anotherRepository.getParameters().size()); assertEquals(1, anotherRepository.getWorkspaces().size()); assertTrue(anotherRepository.getWorkspaces().contains("physicalName")); assertEquals("repositoryWithoutWorkspaces", repositoryWithoutWorkspaces.getName()); assertEquals("third-provider-class", repositoryWithoutWorkspaces.getProvider()); assertFalse(repositoryWithoutWorkspaces.isLoadOnStartup()); assertEquals(0, repositoryWithoutWorkspaces.getParameters().size()); assertEquals(1, repositoryWithoutWorkspaces.getWorkspaces().size()); assertTrue(repositoryWithoutWorkspaces.getWorkspaces().contains("default"));
@Override @Before public void setUp() throws Exception { properties = mock(MagnoliaConfigurationProperties.class); WorkspaceMapping workspaceMapping = mock(WorkspaceMapping.class); given(workspaceMapping.getLogicalWorkspaceNames()).willReturn(newArrayList("website")); RepositoryDefinition repositoryDefinition = mock(RepositoryDefinition.class); Map<String, String> definitionMap = newHashMap(); definitionMap.put("website", "website"); given(repositoryDefinition.getParameters()).willReturn(definitionMap); given(repositoryDefinition.getWorkspaces()).willReturn(newArrayList("website")); given(workspaceMapping.getRepositoryDefinitions()).willReturn(newArrayList(repositoryDefinition)); FileSystemHelper fileSystemHelper = new FileSystemHelper(properties); DefaultRepositoryManager repositoryManager = new DefaultRepositoryManager(properties, workspaceMapping, fileSystemHelper); handler = new WebappVersionHandler(repositoryManager); context = mock(InstallContext.class); super.setUp(); Session session = MgnlContext.getJCRSession("website"); session.getRootNode().addNode("x"); }
@Inject public BaseVersionManager(SystemContext systemContext, RepositoryManager repositoryManager, CopyUtil copyUtil) { this.systemContext = systemContext; this.repositoryManager = repositoryManager; this.copyUtil = copyUtil; for (RepositoryDefinition repositoryDefinition : repositoryManager.getRepositoryDefinitions()) { String repositoryId = repositoryDefinition.getName(); String workspaceName = repositoryId + "-" + RepositoryConstants.VERSION_STORE; if (repositoryManager.getWorkspaceMapping(workspaceName) != null) { versionWorkspaces.add(workspaceName); } else { throw new RuntimeException(String.format("Something went wrong, version workspace for repository %s does not exist.", repositoryId)); } } }
@Override @Before public void setUp() throws Exception { super.setUp(); Session session = MgnlContext.getJCRSession(RepositoryConstants.WEBSITE); root = session.getRootNode(); properties = mock(MagnoliaConfigurationProperties.class); WorkspaceMapping workspaceMapping = mock(WorkspaceMapping.class); given(workspaceMapping.getLogicalWorkspaceNames()).willReturn(newArrayList("website")); Provider provider = mock(Provider.class); given(workspaceMapping.getRepositoryProvider(anyString())).willReturn(provider); RepositoryDefinition repositoryDefinition = mock(RepositoryDefinition.class); Map<String, String> definitionMap = newHashMap(); definitionMap.put("website", "website"); given(repositoryDefinition.getParameters()).willReturn(definitionMap); given(repositoryDefinition.getWorkspaces()).willReturn(newArrayList("website")); given(workspaceMapping.getRepositoryDefinitions()).willReturn(newArrayList(repositoryDefinition)); DefaultRepositoryManager repositoryManager = new DefaultRepositoryManager(properties, workspaceMapping); repoMan = Components.getComponent(RepositoryManager.class); ComponentsTestUtil.setInstance(RepositoryManager.class, repositoryManager); }
/** * @return InputStream of node type definition file */ private InputStream getNodeTypeDefinition(String configuration) { InputStream xml; if (StringUtils.isNotEmpty(configuration)) { // 1: try to load the configured file from the classpath xml = getClass().getResourceAsStream(configuration); if (xml != null) { log.info("Custom node types registered using {}", configuration); return xml; } // 2: try to load it from the file system File nodeTypeDefinition = new File(fileSystemHelper.getAbsoluteFileSystemPath(configuration)); if (nodeTypeDefinition.exists()) { try { return new FileInputStream(nodeTypeDefinition); } catch (FileNotFoundException e) { // should never happen log.error("File not found: {}", configuration); } } // 3: defaults to standard nodetypes log.error("Unable to find node type definition: {} for repository {}", configuration, this.repositoryMapping.getName()); } // initialize default magnolia nodetypes xml = getClass().getResourceAsStream(MGNL_NODETYPES); return xml; }
private void registerNameSpacesAndNodeTypes(String physicalWorkspaceName, RepositoryDefinition repositoryDefinition, Provider provider) { try { Session session = provider.getSystemSession(physicalWorkspaceName); try { provider.registerNamespace(RepositoryConstants.NAMESPACE_PREFIX, RepositoryConstants.NAMESPACE_URI, session.getWorkspace()); provider.registerNodeTypes(); } finally { session.logout(); } } catch (RepositoryException e) { log.error("Failed to initialize workspace {} in repository {}", physicalWorkspaceName, repositoryDefinition.getName(), e); } }
@Override public void shutdown() { log.info("Shutting down JCR"); for (RepositoryDefinition repositoryDefinition : workspaceMapping.getRepositoryDefinitions()) { Provider provider = workspaceMapping.getRepositoryProvider(repositoryDefinition.getName()); provider.shutdownRepository(); } workspaceMapping.clearAll(); }