Reformat openecomp-be
[sdc.git] / openecomp-be / api / openecomp-sdc-rest-webapp / item-rest / item-rest-services / src / main / java / org / openecomp / sdcrests / item / rest / services / ItemsImpl.java
index b00e459..f18de66 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.openecomp.sdcrests.item.rest.services;
 
-import org.openecomp.sdc.activitylog.ActivityLogManager;
-import org.openecomp.sdc.activitylog.ActivityLogManagerFactory;
+import static org.openecomp.sdc.itempermissions.notifications.NotificationConstants.PERMISSION_USER;
+import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_ID;
+import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_NAME;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.PostConstruct;
+import javax.inject.Named;
+import javax.ws.rs.core.Response;
 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
 import org.openecomp.sdc.activitylog.dao.type.ActivityType;
 import org.openecomp.sdc.datatypes.model.ItemType;
-import org.openecomp.sdc.itempermissions.PermissionsManager;
-import org.openecomp.sdc.itempermissions.PermissionsManagerFactory;
 import org.openecomp.sdc.itempermissions.impl.types.PermissionTypes;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.sdc.notification.dtos.Event;
-import org.openecomp.sdc.notification.factories.NotificationPropagationManagerFactory;
-import org.openecomp.sdc.notification.services.NotificationPropagationManager;
-import org.openecomp.sdc.versioning.ItemManager;
-import org.openecomp.sdc.versioning.ItemManagerFactory;
-import org.openecomp.sdc.versioning.VersioningManager;
-import org.openecomp.sdc.versioning.VersioningManagerFactory;
 import org.openecomp.sdc.versioning.dao.types.Version;
 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
 import org.openecomp.sdc.versioning.types.Item;
@@ -40,6 +48,9 @@ import org.openecomp.sdc.versioning.types.ItemStatus;
 import org.openecomp.sdc.versioning.types.NotificationEventTypes;
 import org.openecomp.sdcrests.item.rest.Items;
 import org.openecomp.sdcrests.item.rest.mapping.MapItemToDto;
+import org.openecomp.sdcrests.item.rest.models.SyncEvent;
+import org.openecomp.sdcrests.item.rest.services.catalog.notification.Notifier;
+import org.openecomp.sdcrests.item.rest.services.catalog.notification.NotifierFactory;
 import org.openecomp.sdcrests.item.types.ItemAction;
 import org.openecomp.sdcrests.item.types.ItemActionRequestDto;
 import org.openecomp.sdcrests.item.types.ItemDto;
@@ -48,187 +59,71 @@ import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
-import javax.annotation.PostConstruct;
-import javax.inject.Named;
-import javax.ws.rs.core.Response;
-import java.util.*;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import static org.openecomp.sdc.itempermissions.notifications.NotificationConstants.PERMISSION_USER;
-import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_ID;
-import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_NAME;
-
 @Named
 @Service("items")
 @Scope(value = "prototype")
 @Validated
 public class ItemsImpl implements Items {
 
-    private ItemManager itemManager = ItemManagerFactory.getInstance().createInterface();
-
-    private static ActivityLogManager activityLogManager = ActivityLogManagerFactory.getInstance().createInterface();
-
-    private VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface();
-
-    private final PermissionsManager permissionsManager = PermissionsManagerFactory.getInstance().createInterface();
-
+    private static final String ONBOARDING_METHOD = "onboardingMethod";
     private static final Logger LOGGER = LoggerFactory.getLogger(ItemsImpl.class);
-
-    private NotificationPropagationManager notifier =
-            NotificationPropagationManagerFactory.getInstance().createInterface();
-
-
-
     private Map<ItemAction, ActionSideAffects> actionSideAffectsMap = new EnumMap<>(ItemAction.class);
+    private ManagersProvider managersProvider;
 
     @PostConstruct
     public void initActionSideAffectsMap() {
-        actionSideAffectsMap
-                .put(ItemAction.ARCHIVE, new ActionSideAffects(ActivityType.Archive, NotificationEventTypes.ARCHIVE));
-        actionSideAffectsMap
-                .put(ItemAction.RESTORE, new ActionSideAffects(ActivityType.Restore, NotificationEventTypes.RESTORE));
+        actionSideAffectsMap.put(ItemAction.ARCHIVE, new ActionSideAffects(ActivityType.Archive, NotificationEventTypes.ARCHIVE));
+        actionSideAffectsMap.put(ItemAction.RESTORE, new ActionSideAffects(ActivityType.Restore, NotificationEventTypes.RESTORE));
     }
 
-    private static final String ONBOARDING_METHOD = "onboardingMethod";
-
-
     @Override
     public Response actOn(ItemActionRequestDto request, String itemId, String user) {
-
-        Item item = itemManager.get(itemId);
+        Item item = getManagersProvider().getItemManager().get(itemId);
         if (item == null) {
             return Response.status(Response.Status.NOT_FOUND).entity(new Exception("Item does not exist.")).build();
         }
-
         switch (request.getAction()) {
             case ARCHIVE:
-                itemManager.archive(item);
+                getManagersProvider().getItemManager().archive(item);
                 break;
             case RESTORE:
-                itemManager.restore(item);
+                getManagersProvider().getItemManager().restore(item);
                 break;
             default:
         }
-
         actionSideAffectsMap.get(request.getAction()).execute(item, user);
         try {
-            CatalogNotifier catalogNotifier = new CatalogNotifier();
-            catalogNotifier.execute(Collections.singleton(itemId), request.getAction(), 2);
-        } catch (Exception e){
-            LOGGER.error("Failed to send catalog notification on item " + itemId + " Error: " + e.getMessage());
+            Notifier catalogNotifier = NotifierFactory.getInstance();
+            catalogNotifier.execute(Collections.singleton(itemId), request.getAction());
+        } catch (Exception e) {
+            LOGGER.error("Failed to send catalog notification on item {}", itemId, e);
         }
-
         return Response.ok().build();
     }
 
     @Override
-    public Response list(String itemStatusFilter, String versionStatusFilter, String itemTypeFilter,
-            String permissionFilter, String onboardingMethodFilter, String user) {
-
-        Predicate<Item> itemPredicate =
-                createItemPredicate(itemStatusFilter, versionStatusFilter, itemTypeFilter, onboardingMethodFilter,
-                        permissionFilter, user);
-
+    public Response list(String itemStatusFilter, String versionStatusFilter, String itemTypeFilter, String permissionFilter,
+                         String onboardingMethodFilter, String user) {
+        Predicate<Item> itemPredicate = createItemPredicate(itemStatusFilter, versionStatusFilter, itemTypeFilter, onboardingMethodFilter,
+            permissionFilter, user);
         GenericCollectionWrapper<ItemDto> results = new GenericCollectionWrapper<>();
         MapItemToDto mapper = new MapItemToDto();
-        itemManager.list(itemPredicate).stream()
-                   .sorted((o1, o2) -> o2.getModificationTime().compareTo(o1.getModificationTime()))
-                   .forEach(item -> results.add(mapper.applyMapping(item, ItemDto.class)));
-
+        getManagersProvider().getItemManager().list(itemPredicate).stream()
+            .sorted((o1, o2) -> o2.getModificationTime().compareTo(o1.getModificationTime()))
+            .forEach(item -> results.add(mapper.applyMapping(item, ItemDto.class)));
         return Response.ok(results).build();
-
     }
 
     @Override
     public Response getItem(String itemId, String user) {
-        Item item = itemManager.get(itemId);
+        Item item = getManagersProvider().getItemManager().get(itemId);
         ItemDto itemDto = new MapItemToDto().applyMapping(item, ItemDto.class);
-
         return Response.ok(itemDto).build();
     }
 
-    private class SyncEvent implements Event {
-
-        private String eventType;
-        private String originatorId;
-        private Map<String, Object> attributes;
-        private String entityId;
-
-        SyncEvent(String eventType, String originatorId, Map<String, Object> attributes, String entityId) {
-            this.eventType = eventType;
-            this.originatorId = originatorId;
-            this.attributes = attributes;
-            this.entityId = entityId;
-        }
-
-        @Override
-        public String getEventType() {
-            return eventType;
-        }
-
-        @Override
-        public String getOriginatorId() {
-            return originatorId;
-        }
-
-        @Override
-        public Map<String, Object> getAttributes() {
-            return attributes;
-        }
-
-        @Override
-        public String getEntityId() {
-            return entityId;
-        }
-
-    }
-
-    private class ActionSideAffects {
-
-        private ActivityType activityType;
-        private NotificationEventTypes notificationType;
-
-        private ActionSideAffects(ActivityType activityType, NotificationEventTypes notificationType) {
-            this.activityType = activityType;
-            this.notificationType = notificationType;
-
-        }
-
-        private Version getLatestVersion(String itemId) {
-            List<Version> list = versioningManager.list(itemId);
-            Optional<Version> max = list.stream().max(Version::compareTo);
-
-            return max.orElse(null);
-        }
-
-        private void execute(Item item, String user) {
-            notifyUsers(item.getId(), item.getName(), user, this.notificationType);
-            activityLogManager.logActivity(
-                    new ActivityLogEntity(item.getId(), getLatestVersion(item.getId()), this.activityType, user, true,
-                            "", ""));
-        }
-
-        private void notifyUsers(String itemId, String itemName, String userName, NotificationEventTypes eventType) {
-            Map<String, Object> eventProperties = new HashMap<>();
-            eventProperties.put(ITEM_NAME, itemName == null ? itemManager.get(itemId).getName() : itemName);
-            eventProperties.put(ITEM_ID, itemId);
-
-            eventProperties.put(PERMISSION_USER, userName);
-
-            Event syncEvent = new SyncEvent(eventType.getEventName(), itemId, eventProperties, itemId);
-            try {
-                notifier.notifySubscribers(syncEvent, userName);
-            } catch (Exception e) {
-                LOGGER.error("Failed to send sync notification to users subscribed to item '" + itemId);
-            }
-        }
-    }
-
-    private Predicate<Item> createItemPredicate(String itemStatusFilter, String versionStatusFilter,
-            String itemTypeFilter, String onboardingMethodFilter, String permissionsFilter, String user) {
+    private Predicate<Item> createItemPredicate(String itemStatusFilter, String versionStatusFilter, String itemTypeFilter,
+                                                String onboardingMethodFilter, String permissionsFilter, String user) {
         Predicate<Item> itemPredicate = item -> true;
-
         if (itemStatusFilter != null) {
             validateItemStatusValue(itemStatusFilter);
             itemPredicate = itemPredicate.and(createItemStatusPredicate(itemStatusFilter));
@@ -261,8 +156,7 @@ public class ItemsImpl implements Items {
     }
 
     private Predicate<Item> createVersionStatusPredicate(String filterValue) {
-        Set<VersionStatus> versionStatuses =
-                Arrays.stream(filterValue.split(",")).map(VersionStatus::valueOf).collect(Collectors.toSet());
+        Set<VersionStatus> versionStatuses = Arrays.stream(filterValue.split(",")).map(VersionStatus::valueOf).collect(Collectors.toSet());
         return item -> item.getVersionStatusCounters().keySet().stream().anyMatch(versionStatuses::contains);
     }
 
@@ -271,16 +165,15 @@ public class ItemsImpl implements Items {
     }
 
     private Predicate<Item> createOnboardingMethodPredicate(String filterValue) {
-        return item -> !ItemType.vsp.name().equals(item.getType()) || ((String) item.getProperties()
-                                                                                    .get(ONBOARDING_METHOD))
-                                                                              .matches(formatFilter(filterValue));
+        return item -> !ItemType.vsp.name().equals(item.getType()) || ((String) item.getProperties().get(ONBOARDING_METHOD))
+            .matches(formatFilter(filterValue));
     }
 
     private Predicate<Item> createPermissionsPredicate(String user, String filterValue) {
         String[] permissions = filterValue.split(",");
         Set<String> itemIds = new HashSet<>();
         for (String permission : permissions) {
-            itemIds.addAll(permissionsManager.listUserPermittedItems(user, permission));
+            itemIds.addAll(getManagersProvider().getPermissionsManager().listUserPermittedItems(user, permission));
         }
         return item -> itemIds.contains(item.getId());
     }
@@ -297,7 +190,6 @@ public class ItemsImpl implements Items {
         for (String value : values) {
             VersionStatus.valueOf(value);
         }
-
     }
 
     private void validateItemTypeValue(String itemTypeFilter) {
@@ -321,8 +213,59 @@ public class ItemsImpl implements Items {
         }
     }
 
+    @VisibleForTesting
+    Map<ItemAction, ActionSideAffects> getActionSideAffectsMap() {
+        return actionSideAffectsMap;
+    }
+
+    private ManagersProvider getManagersProvider() {
+        if (managersProvider == null) {
+            managersProvider = new ManagersProvider();
+        }
+        return managersProvider;
+    }
+
+    @VisibleForTesting
+    void setManagersProvider(ManagersProvider managersProvider) {
+        this.managersProvider = managersProvider;
+    }
+
     //Do not delete - is in use, duplicates code to prevent dependency on openecomp-sdc-vendor-software-product-api
-    private enum OnboardingMethod {
-        NetworkPackage, Manual;
+    private enum OnboardingMethod {NetworkPackage, Manual}
+
+    private class ActionSideAffects {
+
+        private ActivityType activityType;
+        private NotificationEventTypes notificationType;
+
+        private ActionSideAffects(ActivityType activityType, NotificationEventTypes notificationType) {
+            this.activityType = activityType;
+            this.notificationType = notificationType;
+        }
+
+        private Version getLatestVersion(String itemId) {
+            List<Version> list = getManagersProvider().getVersioningManager().list(itemId);
+            Optional<Version> max = list.stream().max(Version::compareTo);
+            return max.orElse(null);
+        }
+
+        private void execute(Item item, String user) {
+            notifyUsers(item.getId(), item.getName(), user, this.notificationType);
+            getManagersProvider().getActivityLogManager()
+                .logActivity(new ActivityLogEntity(item.getId(), getLatestVersion(item.getId()), this.activityType, user, true, "", ""));
+        }
+
+        private void notifyUsers(String itemId, String itemName, String userName, NotificationEventTypes eventType) {
+            Map<String, Object> eventProperties = new HashMap<>();
+            eventProperties.put(ITEM_NAME, itemName == null ? getManagersProvider().getItemManager().get(itemId).getName() : itemName);
+            eventProperties.put(ITEM_ID, itemId);
+            eventProperties.put(PERMISSION_USER, userName);
+            Event syncEvent = new SyncEvent(eventType.getEventName(), itemId, eventProperties, itemId);
+            try {
+                getManagersProvider().getNotificationPropagationManager().notifySubscribers(syncEvent, userName);
+            } catch (Exception e) {
+                LOGGER.error("Failed to send sync notification to users subscribed to item '{}'", itemId, e);
+            }
+        }
     }
-}
\ No newline at end of file
+}