001/* 002 * (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * dmetzler 018 */ 019package org.nuxeo.ecm.restapi.test; 020 021import java.io.File; 022import java.io.IOException; 023import java.util.Arrays; 024import java.util.Calendar; 025import java.util.concurrent.TimeUnit; 026 027import org.apache.commons.logging.LogFactory; 028import org.nuxeo.common.utils.FileUtils; 029import org.nuxeo.ecm.automation.core.util.DocumentHelper; 030import org.nuxeo.ecm.core.api.Blob; 031import org.nuxeo.ecm.core.api.Blobs; 032import org.nuxeo.ecm.core.api.CoreSession; 033import org.nuxeo.ecm.core.api.DocumentModel; 034import org.nuxeo.ecm.core.api.NuxeoException; 035import org.nuxeo.ecm.core.api.NuxeoGroup; 036import org.nuxeo.ecm.core.api.NuxeoPrincipal; 037import org.nuxeo.ecm.core.api.PathRef; 038import org.nuxeo.ecm.core.test.annotations.RepositoryInit; 039import org.nuxeo.ecm.core.work.api.WorkManager; 040import org.nuxeo.ecm.platform.usermanager.UserManager; 041import org.nuxeo.ecm.platform.usermanager.exceptions.GroupAlreadyExistsException; 042import org.nuxeo.ecm.platform.usermanager.exceptions.UserAlreadyExistsException; 043import org.nuxeo.ecm.webengine.JsonFactoryManager; 044import org.nuxeo.runtime.api.Framework; 045import org.nuxeo.runtime.transaction.TransactionHelper; 046 047/** 048 * Repo init to test Rest API 049 * 050 * @since 5.7.2 051 */ 052public class RestServerInit implements RepositoryInit { 053 054 public static final int MAX_NOTE = 5; 055 056 /** 057 * 058 */ 059 private static final String POWER_USER_LOGIN = "user0"; 060 061 public static final String[] FIRSTNAMES = { "Steve", "John", "Georges", "Bill", "Bill" }; 062 063 public static final String[] LASTNAMES = { "Jobs", "Lennon", "Harrisson", "Gates", "Murray" }; 064 065 public static final String[] GROUPNAMES = { "Stark", "Lannister", "Targaryen", "Greyjoy" }; 066 067 @Override 068 public void populate(CoreSession session) { 069 JsonFactoryManager jsonFactoryManager = Framework.getService(JsonFactoryManager.class); 070 if (!jsonFactoryManager.isStackDisplay()) { 071 jsonFactoryManager.toggleStackDisplay(); 072 } 073 // try to prevent NXP-15404 074 // clearRepositoryCaches(session.getRepositoryName()); 075 // Create some docs 076 for (int i = 0; i < 5; i++) { 077 DocumentModel doc = session.createDocumentModel("/", "folder_" + i, "Folder"); 078 doc.setPropertyValue("dc:title", "Folder " + i); 079 if (i == 0) { 080 // set dc:issued value for queries on dates 081 Calendar cal = Calendar.getInstance(); 082 cal.set(Calendar.YEAR, 2007); 083 cal.set(Calendar.MONTH, 1); // 0-based 084 cal.set(Calendar.DAY_OF_MONTH, 17); 085 doc.setPropertyValue("dc:issued", cal); 086 } 087 Framework.doPrivileged(() -> session.createDocument(doc)); 088 } 089 090 for (int i = 0; i < MAX_NOTE; i++) { 091 DocumentModel doc = session.createDocumentModel("/folder_1", "note_" + i, "Note"); 092 doc.setPropertyValue("dc:title", "Note " + i); 093 doc.setPropertyValue("dc:source", "Source" + i); 094 doc.setPropertyValue("dc:nature", "Nature" + i % 2); 095 doc.setPropertyValue("dc:coverage", "Coverage" + i % 3); 096 doc.setPropertyValue("note:note", "Note " + i); 097 Framework.doPrivileged(() -> session.createDocument(doc)); 098 } 099 100 // Create a file 101 DocumentModel doc = session.createDocumentModel("/folder_2", "file", "File"); 102 doc.setPropertyValue("dc:title", "File"); 103 doc = session.createDocument(doc); 104 // upload file blob 105 File fieldAsJsonFile = FileUtils.getResourceFileFromContext("blob.json"); 106 try { 107 Blob fb = Blobs.createBlob(fieldAsJsonFile, "image/jpeg"); 108 DocumentHelper.addBlob(doc.getProperty("file:content"), fb); 109 } catch (IOException e) { 110 throw new NuxeoException(e); 111 } 112 session.saveDocument(doc); 113 114 TransactionHelper.commitOrRollbackTransaction(); 115 TransactionHelper.startTransaction(); 116 117 try { 118 Framework.getService(WorkManager.class).awaitCompletion(10, TimeUnit.SECONDS); 119 } catch (InterruptedException cause) { 120 LogFactory.getLog(RestServerInit.class).error("Cannot initialize the rest api test repo in 10 seconds", 121 cause); 122 Thread.currentThread().interrupt(); 123 } 124 125 UserManager um = Framework.getService(UserManager.class); 126 // Create some users 127 if (um != null) { 128 Framework.doPrivileged(() -> createUsersAndGroups(um)); 129 } 130 } 131 132 private void createUsersAndGroups(UserManager um) throws UserAlreadyExistsException, 133 GroupAlreadyExistsException { 134 135 // Create some groups 136 for (int idx = 0; idx < 4; idx++) { 137 String groupId = "group" + idx; 138 String groupLabel = GROUPNAMES[idx]; 139 createGroup(um, groupId, groupLabel); 140 } 141 142 for (int idx = 0; idx < 5; idx++) { 143 String userId = "user" + idx; 144 String firstName = FIRSTNAMES[idx]; 145 String lastName = LASTNAMES[idx]; 146 createUser(um, userId, firstName, lastName); 147 } 148 149 // Create the power user group 150 createGroup(um, "powerusers", "Power Users"); 151 152 // Add the power user group to user0 153 NuxeoPrincipal principal = um.getPrincipal(POWER_USER_LOGIN); 154 principal.setGroups(Arrays.asList("powerusers")); 155 um.updateUser(principal.getModel()); 156 157 createGroup(um, "foogroup", "foo group"); 158 createUser(um, "foouser", "Foo", "Foo"); 159 } 160 161 private void createGroup(UserManager um, String groupId, String groupLabel) throws 162 GroupAlreadyExistsException { 163 NuxeoGroup group = um.getGroup(groupId); 164 if (group != null) { 165 um.deleteGroup(groupId); 166 } 167 168 DocumentModel groupModel = um.getBareGroupModel(); 169 String schemaName = um.getGroupSchemaName(); 170 groupModel.setProperty(schemaName, "groupname", groupId); 171 groupModel.setProperty(schemaName, "grouplabel", groupLabel); 172 groupModel.setProperty(schemaName, "description", "description of " + groupId); 173 groupModel = um.createGroup(groupModel); 174 } 175 176 protected void createUser(UserManager um, String userId, String firstName, String lastName) { 177 NuxeoPrincipal principal = um.getPrincipal(userId); 178 179 if (principal != null) { 180 um.deleteUser(principal.getModel()); 181 } 182 183 DocumentModel userModel = um.getBareUserModel(); 184 String schemaName = um.getUserSchemaName(); 185 userModel.setProperty(schemaName, "username", userId); 186 userModel.setProperty(schemaName, "firstName", firstName); 187 userModel.setProperty(schemaName, "lastName", lastName); 188 userModel.setProperty(schemaName, "password", userId); 189 um.createUser(userModel); 190 principal = um.getPrincipal(userId); 191 principal.setGroups(Arrays.asList("group1")); 192 um.updateUser(principal.getModel()); 193 } 194 195 public static DocumentModel getFolder(int index, CoreSession session) { 196 return session.getDocument(new PathRef("/folder_" + index)); 197 } 198 199 public static DocumentModel getNote(int index, CoreSession session) { 200 return session.getDocument(new PathRef("/folder_1/note_" + index)); 201 } 202 203 public static DocumentModel getFile(int index, CoreSession session) { 204 return session.getDocument(new PathRef("/folder_2/file")); 205 } 206 207 public static NuxeoPrincipal getPowerUser() { 208 UserManager um = Framework.getService(UserManager.class); 209 return um.getPrincipal(POWER_USER_LOGIN); 210 } 211 212}