View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.core.provisioning.java.propagation;
20  
21  import java.util.Optional;
22  import java.util.Set;
23  import org.apache.syncope.common.lib.types.ResourceOperation;
24  import org.apache.syncope.core.persistence.api.entity.task.PropagationData;
25  import org.apache.syncope.core.provisioning.api.propagation.PropagationActions;
26  import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskInfo;
27  import org.apache.syncope.core.spring.implementation.InstanceScope;
28  import org.apache.syncope.core.spring.implementation.SyncopeImplementation;
29  import org.identityconnectors.framework.common.objects.Attribute;
30  import org.identityconnectors.framework.common.objects.AttributeUtil;
31  import org.identityconnectors.framework.common.objects.Name;
32  import org.slf4j.Logger;
33  import org.slf4j.LoggerFactory;
34  import org.springframework.transaction.annotation.Transactional;
35  
36  /**
37   * This class is required during setup of an External Resource based on the ConnId
38   * <a href="https://github.com/Tirasa/ConnIdAzureBundle">Azure connector</a>.
39   *
40   * It ensures to send the configured e-mail address as {@code __NAME__}.
41   */
42  @SyncopeImplementation(scope = InstanceScope.PER_CONTEXT)
43  public class AzurePropagationActions implements PropagationActions {
44  
45      protected static final Logger LOG = LoggerFactory.getLogger(AzurePropagationActions.class);
46  
47      protected String getEmailAttrName() {
48          return "mailNickname";
49      }
50  
51      protected void setName(final PropagationTaskInfo taskInfo) {
52          PropagationData data = taskInfo.getPropagationData();
53          if (data.getAttributes() != null) {
54              Set<Attribute> attrs = data.getAttributes();
55  
56              if (AttributeUtil.find(getEmailAttrName(), attrs) == null) {
57                  LOG.warn("Can't find {} to set as {} attribute value, skipping...", getEmailAttrName(), Name.NAME);
58                  return;
59              }
60  
61              Optional.ofNullable(AttributeUtil.getNameFromAttributes(attrs)).ifPresent(attrs::remove);
62              attrs.add(new Name(AttributeUtil.find(getEmailAttrName(), attrs).getValue().get(0).toString()));
63          }
64      }
65  
66      @Transactional
67      @Override
68      public void before(final PropagationTaskInfo taskInfo) {
69          if (taskInfo.getOperation() == ResourceOperation.DELETE || taskInfo.getOperation() == ResourceOperation.NONE) {
70              return;
71          }
72  
73          switch (taskInfo.getAnyTypeKind()) {
74              case USER:
75                  setName(taskInfo);
76                  break;
77  
78              case GROUP:
79                  setName(taskInfo);
80                  break;
81  
82              default:
83                  LOG.debug("Not about user or group: not doing anything");
84          }
85      }
86  }