/* * (C) Copyright 2015 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: * Nuxeo - initial API and implementation * */ package org.nuxeo.scim.server.mapper; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.NuxeoException; import org.nuxeo.usermapper.service.UserMapperService; import com.unboundid.scim.data.Entry; import com.unboundid.scim.data.Meta; import com.unboundid.scim.data.Name; import com.unboundid.scim.data.UserResource; import com.unboundid.scim.schema.CoreSchema; import com.unboundid.scim.sdk.SCIMConstants; /** * Static / Hardcoded Mapper implementation (in case {@link UserMapperService} is not available) * * @author tiry * @since 7.4 */ public class StaticUserMapper extends AbstractMapper { public StaticUserMapper(String baseUrl) { super(baseUrl); } @Override public UserResource getUserResourceFromNuxeoUser(DocumentModel userModel) throws Exception { UserResource userResource = new UserResource(CoreSchema.USER_DESCRIPTOR); String userId = (String) userModel.getProperty(um.getUserSchemaName(), um.getUserIdField()); userResource.setUserName(userId); userResource.setId(userId); userResource.setExternalId(userId); String fname = (String) userModel.getProperty(um.getUserSchemaName(), "firstName"); String lname = (String) userModel.getProperty(um.getUserSchemaName(), "lastName"); String email = (String) userModel.getProperty(um.getUserSchemaName(), "email"); String company = (String) userModel.getProperty(um.getUserSchemaName(), "company"); String displayName = fname + " " + lname; displayName = displayName.trim(); userResource.setDisplayName(displayName); Collection<Entry<String>> emails = new ArrayList<>(); if (email != null) { emails.add(new Entry<String>(email, "string")); userResource.setEmails(emails); } Name fullName = new Name(displayName, lname, "", fname, "", ""); userResource.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE, "name", Name.NAME_RESOLVER, fullName); URI location = new URI(baseUrl + "/" + userId); Meta meta = new Meta(null, null, location, "1"); userResource.setMeta(meta); // manage groups List<String> groupIds = um.getPrincipal(userId).getAllGroups(); Collection<Entry<String>> groups = new ArrayList<>(); for (String groupId : groupIds) { groups.add(new Entry<String>(groupId, "string")); } userResource.setGroups(groups); userResource.setActive(true); return userResource; } @Override public DocumentModel createNuxeoUserFromUserResource(UserResource user) throws NuxeoException { DocumentModel newUser = um.getBareUserModel(); String userId = user.getId(); if (userId == null || userId.isEmpty()) { userId = user.getUserName(); } newUser.setProperty(um.getUserSchemaName(), um.getUserIdField(), userId); updateUserModel(newUser, user); return um.createUser(newUser); } @Override public DocumentModel updateNuxeoUserFromUserResource(String uid, UserResource user) throws NuxeoException { DocumentModel userModel = um.getUserModel(uid); if (userModel == null) { return null; } updateUserModel(userModel, user); um.updateUser(userModel); return userModel; } protected void updateUserModel(DocumentModel userModel, UserResource userResouce) throws NuxeoException { if (userResouce.getEmails() != null && userResouce.getEmails().size() > 0) { userModel.setProperty(um.getUserSchemaName(), "email", userResouce.getEmails().iterator().next().getValue()); } String displayName = userResouce.getDisplayName(); if (displayName != null && !displayName.isEmpty()) { int idx = displayName.indexOf(" "); if (idx > 0) { userModel.setProperty(um.getUserSchemaName(), "firstName", displayName.substring(0, idx).trim()); userModel.setProperty(um.getUserSchemaName(), "lastName", displayName.substring(idx + 1).trim()); } else { userModel.setProperty(um.getUserSchemaName(), "firstName", displayName); userModel.setProperty(um.getUserSchemaName(), "lastName", ""); } } // XXX } }