// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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. package org.apache.cloudstack.annotation; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.component.PluggableService; import org.apache.cloudstack.annotation.dao.AnnotationDao; import org.apache.cloudstack.api.command.admin.annotation.AddAnnotationCmd; import org.apache.cloudstack.api.command.admin.annotation.ListAnnotationsCmd; import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd; import org.apache.cloudstack.api.response.AnnotationResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.context.CallContext; import org.apache.log4j.Logger; /** * @since 4.11 */ public final class AnnotationManagerImpl extends ManagerBase implements AnnotationService, PluggableService { public static final Logger LOGGER = Logger.getLogger(AnnotationManagerImpl.class); @Inject private AnnotationDao annotationDao; @Override public ListResponse searchForAnnotations(ListAnnotationsCmd cmd) { List annotations = getAnnotationsForApiCmd(cmd); List annotationResponses = convertAnnotationsToResponses(annotations); return createAnnotationsResponseList(annotationResponses); } @Override @ActionEvent(eventType = EventTypes.EVENT_ANNOTATION_CREATE, eventDescription = "creating an annotation on an entity") public AnnotationResponse addAnnotation(AddAnnotationCmd addAnnotationCmd) { return addAnnotation(addAnnotationCmd.getAnnotation(), addAnnotationCmd.getEntityType(), addAnnotationCmd.getEntityUuid()); } public AnnotationResponse addAnnotation(String text, EntityType type, String uuid) { CallContext ctx = CallContext.current(); String userUuid = ctx.getCallingUserUuid(); AnnotationVO annotation = new AnnotationVO(text, type, uuid); annotation.setUserUuid(userUuid); annotation = annotationDao.persist(annotation); return createAnnotationResponse(annotation); } @Override @ActionEvent(eventType = EventTypes.EVENT_ANNOTATION_REMOVE, eventDescription = "removing an annotation on an entity") public AnnotationResponse removeAnnotation(RemoveAnnotationCmd removeAnnotationCmd) { String uuid = removeAnnotationCmd.getUuid(); if(LOGGER.isDebugEnabled()) { LOGGER.debug("marking annotation removed: " + uuid); } AnnotationVO annotation = annotationDao.findByUuid(uuid); annotationDao.remove(annotation.getId()); return createAnnotationResponse(annotation); } private List getAnnotationsForApiCmd(ListAnnotationsCmd cmd) { List annotations; if(cmd.getUuid() != null) { annotations = new ArrayList<>(); String uuid = cmd.getUuid().toString(); if(LOGGER.isDebugEnabled()) { LOGGER.debug("getting single annotation by uuid: " + uuid); } annotations.add(annotationDao.findByUuid(uuid)); } else if( ! (cmd.getEntityType() == null || cmd.getEntityType().isEmpty()) ) { String type = cmd.getEntityType(); if(LOGGER.isDebugEnabled()) { LOGGER.debug("getting annotations for type: " + type); } if (cmd.getEntityUuid() != null) { String uuid = cmd.getEntityUuid().toString(); if(LOGGER.isDebugEnabled()) { LOGGER.debug("getting annotations for entity: " + uuid); } annotations = annotationDao.findByEntity(type,cmd.getEntityUuid().toString()); } else { annotations = annotationDao.findByEntityType(type); } } else { if(LOGGER.isDebugEnabled()) { LOGGER.debug("getting all annotations"); } annotations = annotationDao.listAll(); } return annotations; } private List convertAnnotationsToResponses(List annotations) { List annotationResponses = new ArrayList<>(); for (AnnotationVO annotation : annotations) { annotationResponses.add(createAnnotationResponse(annotation)); } return annotationResponses; } private ListResponse createAnnotationsResponseList(List annotationResponses) { ListResponse listResponse = new ListResponse<>(); listResponse.setResponses(annotationResponses); return listResponse; } public static AnnotationResponse createAnnotationResponse(AnnotationVO annotation) { AnnotationResponse response = new AnnotationResponse(); response.setUuid(annotation.getUuid()); response.setEntityType(annotation.getEntityType()); response.setEntityUuid(annotation.getEntityUuid()); response.setAnnotation(annotation.getAnnotation()); response.setUserUuid(annotation.getUserUuid()); response.setCreated(annotation.getCreated()); response.setRemoved(annotation.getRemoved()); response.setObjectName("annotation"); return response; } @Override public List> getCommands() { final List> cmdList = new ArrayList<>(); cmdList.add(AddAnnotationCmd.class); cmdList.add(ListAnnotationsCmd.class); cmdList.add(RemoveAnnotationCmd.class); return cmdList; } }