/*
* (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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.
*
* Contributors:
* dmetzler
*/
package org.nuxeo.ecm.restapi.test;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.common.utils.FileUtils;
import org.nuxeo.ecm.automation.core.util.DocumentHelper;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.Blobs;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.NuxeoException;
import org.nuxeo.ecm.core.api.NuxeoGroup;
import org.nuxeo.ecm.core.api.NuxeoPrincipal;
import org.nuxeo.ecm.core.api.PathRef;
import org.nuxeo.ecm.core.test.annotations.RepositoryInit;
import org.nuxeo.ecm.core.work.api.WorkManager;
import org.nuxeo.ecm.platform.usermanager.UserManager;
import org.nuxeo.ecm.platform.usermanager.exceptions.GroupAlreadyExistsException;
import org.nuxeo.ecm.platform.usermanager.exceptions.UserAlreadyExistsException;
import org.nuxeo.ecm.webengine.JsonFactoryManager;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.transaction.TransactionHelper;
/**
* Repo init to test Rest API
*
* @since 5.7.2
*/
public class RestServerInit implements RepositoryInit {
public static final int MAX_NOTE = 5;
/**
*
*/
private static final String POWER_USER_LOGIN = "user0";
public static final String[] FIRSTNAMES = { "Steve", "John", "Georges", "Bill", "Bill" };
public static final String[] LASTNAMES = { "Jobs", "Lennon", "Harrisson", "Gates", "Murray" };
public static final String[] GROUPNAMES = { "Stark", "Lannister", "Targaryen", "Greyjoy" };
@Override
public void populate(CoreSession session) {
JsonFactoryManager jsonFactoryManager = Framework.getLocalService(JsonFactoryManager.class);
if (!jsonFactoryManager.isStackDisplay()) {
jsonFactoryManager.toggleStackDisplay();
}
// try to prevent NXP-15404
// clearRepositoryCaches(session.getRepositoryName());
// Create some docs
for (int i = 0; i < 5; i++) {
DocumentModel doc = session.createDocumentModel("/", "folder_" + i, "Folder");
doc.setPropertyValue("dc:title", "Folder " + i);
if (i == 0) {
// set dc:issued value for queries on dates
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2007);
cal.set(Calendar.MONTH, 1); // 0-based
cal.set(Calendar.DAY_OF_MONTH, 17);
doc.setPropertyValue("dc:issued", cal);
}
doc = session.createDocument(doc);
}
for (int i = 0; i < MAX_NOTE; i++) {
DocumentModel doc = session.createDocumentModel("/folder_1", "note_" + i, "Note");
doc.setPropertyValue("dc:title", "Note " + i);
doc.setPropertyValue("dc:source", "Source" + i);
doc.setPropertyValue("dc:nature", "Nature" + i % 2);
doc.setPropertyValue("dc:coverage", "Coverage" + i % 3);
doc.setPropertyValue("note:note", "Note " + i);
doc = session.createDocument(doc);
}
// Create a file
DocumentModel doc = session.createDocumentModel("/folder_2", "file", "File");
doc.setPropertyValue("dc:title", "File");
doc = session.createDocument(doc);
// upload file blob
File fieldAsJsonFile = FileUtils.getResourceFileFromContext("blob.json");
try {
Blob fb = Blobs.createBlob(fieldAsJsonFile, "image/jpeg");
DocumentHelper.addBlob(doc.getProperty("file:content"), fb);
} catch (IOException e) {
throw new NuxeoException(e);
}
session.saveDocument(doc);
TransactionHelper.commitOrRollbackTransaction();
TransactionHelper.startTransaction();
try {
Framework.getService(WorkManager.class).awaitCompletion(10, TimeUnit.SECONDS);
} catch (InterruptedException cause) {
LogFactory.getLog(RestServerInit.class).error("Cannot initialize the rest api test repo in 10 seconds",
cause);
Thread.currentThread().interrupt();
}
UserManager um = Framework.getLocalService(UserManager.class);
// Create some users
if (um != null) {
createUsersAndGroups(um);
}
}
private void createUsersAndGroups(UserManager um) throws UserAlreadyExistsException,
GroupAlreadyExistsException {
// Create some groups
for (int idx = 0; idx < 4; idx++) {
String groupId = "group" + idx;
String groupLabel = GROUPNAMES[idx];
createGroup(um, groupId, groupLabel);
}
for (int idx = 0; idx < 5; idx++) {
String userId = "user" + idx;
NuxeoPrincipal principal = um.getPrincipal(userId);
if (principal != null) {
um.deleteUser(principal.getModel());
}
DocumentModel userModel = um.getBareUserModel();
String schemaName = um.getUserSchemaName();
userModel.setProperty(schemaName, "username", userId);
userModel.setProperty(schemaName, "firstName", FIRSTNAMES[idx]);
userModel.setProperty(schemaName, "lastName", LASTNAMES[idx]);
userModel.setProperty(schemaName, "password", userId);
userModel = um.createUser(userModel);
principal = um.getPrincipal(userId);
principal.setGroups(Arrays.asList(new String[] { "group1" }));
um.updateUser(principal.getModel());
}
// Create the power user group
createGroup(um, "powerusers", "Power Users");
// Add the power user group to user0
NuxeoPrincipal principal = um.getPrincipal(POWER_USER_LOGIN);
principal.setGroups(Arrays.asList(new String[] { "powerusers" }));
um.updateUser(principal.getModel());
}
private void createGroup(UserManager um, String groupId, String groupLabel) throws
GroupAlreadyExistsException {
NuxeoGroup group = um.getGroup(groupId);
if (group != null) {
um.deleteGroup(groupId);
}
DocumentModel groupModel = um.getBareGroupModel();
String schemaName = um.getGroupSchemaName();
groupModel.setProperty(schemaName, "groupname", groupId);
groupModel.setProperty(schemaName, "grouplabel", groupLabel);
groupModel = um.createGroup(groupModel);
}
public static DocumentModel getFolder(int index, CoreSession session) {
return session.getDocument(new PathRef("/folder_" + index));
}
public static DocumentModel getNote(int index, CoreSession session) {
return session.getDocument(new PathRef("/folder_1/note_" + index));
}
public static DocumentModel getFile(int index, CoreSession session) {
return session.getDocument(new PathRef("/folder_2/file"));
}
public static NuxeoPrincipal getPowerUser() {
UserManager um = Framework.getLocalService(UserManager.class);
return um.getPrincipal(POWER_USER_LOGIN);
}
}