/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.server.update; import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Workspace; import javax.jcr.nodetype.NodeDefinitionTemplate; import javax.jcr.nodetype.NodeTypeTemplate; import javax.jcr.version.OnParentVersionAction; import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl; import org.springframework.extensions.jcr.SessionFactoryUtils; import org.springframework.security.authentication.encoding.Md5PasswordEncoder; import org.springframework.security.authentication.encoding.PasswordEncoder; import ro.nextreports.server.StorageConstants; import ro.nextreports.server.domain.Folder; import ro.nextreports.server.domain.User; /** * Create system nodes. * * @author Decebal Suiu */ public class StorageUpdate0 extends StorageUpdate { @Override protected void executeUpdate() throws Exception { createNodeTypes(); createSystemNodes(); } @SuppressWarnings("unchecked") private void createNodeTypes() throws RepositoryException { Session session = SessionFactoryUtils.getSession(getTemplate().getSessionFactory(), false); Workspace workspace = session.getWorkspace(); LOG.info("Registering namespace 'next' -> http://nextreports.ro/jcr/2.0"); NamespaceRegistry namespaceRegistry = workspace.getNamespaceRegistry(); namespaceRegistry.registerNamespace("next", "http://nextreports.ro/jcr/2.0"); /* // check if the node type is registered already if (nodeTypeManager.hasNodeType(NEXT_REPORT_MIXIN)) { return; } */ LOG.info("Creating node type mixin '" + StorageConstants.NEXT_REPORT_MIXIN + "'"); NodeTypeManagerImpl nodeTypeManager = (NodeTypeManagerImpl) workspace.getNodeTypeManager(); NodeTypeTemplate nodeTypeTemplate = nodeTypeManager.createNodeTypeTemplate(); nodeTypeTemplate.setName(StorageConstants.NEXT_REPORT_MIXIN); nodeTypeTemplate.setMixin(true); nodeTypeTemplate.setOrderableChildNodes(false); nodeTypeTemplate.setPrimaryItemName("nt:unstructured"); nodeTypeTemplate.setDeclaredSuperTypeNames(new String[] { "mix:referenceable", "mix:versionable" }); /* PropertyDefinitionTemplate propertyDefinitionTemplate = nodeTypeManager.createPropertyDefinitionTemplate(); propertyDefinitionTemplate.setName("*"); propertyDefinitionTemplate.setRequiredType(PropertyType.UNDEFINED); propertyDefinitionTemplate.setAutoCreated(false); propertyDefinitionTemplate.setMandatory(false); propertyDefinitionTemplate.setOnParentVersion(OnParentVersionAction.COPY); propertyDefinitionTemplate.setProtected(false); propertyDefinitionTemplate.setMultiple(false); nodeTypeTemplate.getPropertyDefinitionTemplates().add(propertyDefinitionTemplate); */ NodeDefinitionTemplate nodeDefinitionTemplate = nodeTypeManager.createNodeDefinitionTemplate(); nodeDefinitionTemplate.setName("runHistory"); nodeDefinitionTemplate.setDefaultPrimaryTypeName("nt:unstructured"); nodeDefinitionTemplate.setRequiredPrimaryTypeNames(new String[] { "nt:unstructured" }); nodeDefinitionTemplate.setAutoCreated(true); nodeDefinitionTemplate.setMandatory(false); nodeDefinitionTemplate.setOnParentVersion(OnParentVersionAction.IGNORE); nodeDefinitionTemplate.setProtected(false); nodeDefinitionTemplate.setSameNameSiblings(false); nodeTypeTemplate.getNodeDefinitionTemplates().add(nodeDefinitionTemplate); LOG.info("Registering node type mixin '" + StorageConstants.NEXT_REPORT_MIXIN + "'"); nodeTypeManager.registerNodeType(nodeTypeTemplate, true); getTemplate().save(); } private void createSystemNodes() throws RepositoryException { LOG.info("Creating system nodes"); Node rootNode = getTemplate().getRootNode(); Node nextServerNode = rootNode.addNode(StorageConstants.NEXT_SERVER_FOLDER_NAME); nextServerNode.addMixin("mix:referenceable"); nextServerNode.setProperty("className", Folder.class.getName()); nextServerNode.setProperty("version", "-1"); Node reportsNode = nextServerNode.addNode(StorageConstants.REPORTS_FOLDER_NAME); reportsNode.addMixin("mix:referenceable"); reportsNode.setProperty("className", Folder.class.getName()); Node datasourcesNode = nextServerNode.addNode(StorageConstants.DATASOURCES_FOLDER_NAME); datasourcesNode.addMixin("mix:referenceable"); datasourcesNode.setProperty("className", Folder.class.getName()); Node schedulersNode = nextServerNode.addNode(StorageConstants.SCHEDULER_FOLDER_NAME); schedulersNode.addMixin("mix:referenceable"); schedulersNode.setProperty("className", Folder.class.getName()); Node securityNode = nextServerNode.addNode(StorageConstants.SECURITY_FOLDER_NAME); securityNode.addMixin("mix:referenceable"); securityNode.setProperty("className", Folder.class.getName()); Node usersNode = securityNode.addNode(StorageConstants.USERS_FOLDER_NAME); usersNode.addMixin("mix:referenceable"); usersNode.setProperty("className", Folder.class.getName()); Node groupsNode = securityNode.addNode(StorageConstants.GROUPS_FOLDER_NAME); groupsNode.addMixin("mix:referenceable"); groupsNode.setProperty("className", Folder.class.getName()); Node adminNode = usersNode.addNode(StorageConstants.ADMIN_USER_NAME); adminNode.addMixin("mix:referenceable"); adminNode.setProperty("className", User.class.getName()); adminNode.setProperty("admin", true); PasswordEncoder passwordEncoder = new Md5PasswordEncoder(); adminNode.setProperty("password", passwordEncoder.encodePassword("1", null)); getTemplate().save(); } }