com.ge.predix.acs.privilege.management.SubjectPrivilegeManagementController.java Source code

Java tutorial

Introduction

Here is the source code for com.ge.predix.acs.privilege.management.SubjectPrivilegeManagementController.java

Source

/*******************************************************************************
 * Copyright 2016 General Electric Company.
 *
 * 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.
 *******************************************************************************/
package com.ge.predix.acs.privilege.management;

import com.ge.predix.acs.commons.web.BaseRestApi;
import com.ge.predix.acs.commons.web.RestApiException;
import com.ge.predix.acs.commons.web.UriTemplateUtils;
import com.ge.predix.acs.rest.BaseSubject;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.net.URI;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static com.ge.predix.acs.commons.web.AcsApiUriTemplates.SUBJECTS_URL;
import static com.ge.predix.acs.commons.web.AcsApiUriTemplates.SUBJECT_URL;
import static com.ge.predix.acs.commons.web.AcsApiUriTemplates.V1;
import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.created;
import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.noContent;
import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.notFound;
import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.ok;
import static org.springframework.web.bind.annotation.RequestMethod.DELETE;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
import static org.springframework.web.bind.annotation.RequestMethod.PUT;

@RestController
public class SubjectPrivilegeManagementController extends BaseRestApi {
    @Autowired
    private PrivilegeManagementService service;

    private Boolean titanProfileActive = null;

    private Boolean getTitanProfileActive() {
        if (this.titanProfileActive == null) {
            this.titanProfileActive = Arrays.asList(this.getEnvironment().getActiveProfiles()).contains("titan");
        }

        return this.titanProfileActive;
    }

    private void failIfParentsSpecified(final List<BaseSubject> subjects) {
        if (this.getTitanProfileActive()) {
            return;
        }

        for (BaseSubject subject : subjects) {
            if (!CollectionUtils.isEmpty(subject.getParents())) {
                throw new RestApiException(HttpStatus.NOT_IMPLEMENTED, PARENTS_ATTR_NOT_SUPPORTED_MSG);
            }
        }
    }

    @ApiOperation(value = "Creates a list of subjects. Existing subjects will be updated with the provided values.", tags = {
            "Attribute Management" })
    @ApiResponses(value = { @ApiResponse(code = 204, message = "Subject objects added successfully."), })
    @RequestMapping(method = POST, value = { V1 + SUBJECTS_URL }, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> appendsubjects(@RequestBody final List<BaseSubject> subjects) {
        try {
            this.failIfParentsSpecified(subjects);

            this.service.appendSubjects(subjects);
            return noContent();
        } catch (RestApiException e) {
            // NOTE: This block is necessary to avoid accidentally
            // converting the HTTP status code to an unintended one
            throw e;
        } catch (Exception e) {
            throw new RestApiException(HttpStatus.UNPROCESSABLE_ENTITY, e);
        }
    }

    @ApiOperation(value = "Retrieves the list of subjects for the given zone.", tags = { "Attribute Management" })
    @RequestMapping(method = GET, value = { V1 + SUBJECTS_URL }, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<BaseSubject>> getSubjects() {
        List<BaseSubject> subjects = this.service.getSubjects();
        return ok(subjects);
    }

    @ApiOperation(value = "Retrieves the subject for the given zone. The subjectIdentifier must be URL encoded in "
            + "application/x-www-form-urlencoded format with UTF-8.", tags = { "Attribute Management" })
    @RequestMapping(method = GET, value = { V1 + SUBJECT_URL }, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> getSubject(@PathVariable("subjectIdentifier") final String subjectIdentifier,
            @RequestParam(name = "includeInheritedAttributes", defaultValue = "false") final boolean includeInheritedAttributes) {
        BaseSubject subject;
        if (includeInheritedAttributes) {
            subject = this.service.getBySubjectIdentifierWithInheritedAttributes(subjectIdentifier);
        } else {
            subject = this.service.getBySubjectIdentifier(subjectIdentifier);
        }

        if (subject == null) {
            return notFound();
        }
        return ok(subject);
    }

    @ApiOperation(value = "Creates/Updates a given Subject.", tags = { "Attribute Management" })
    @RequestMapping(method = PUT, value = V1 + SUBJECT_URL, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<BaseSubject> putSubject(@RequestBody final BaseSubject subject,
            @PathVariable("subjectIdentifier") final String subjectIdentifier) {
        try {
            this.failIfParentsSpecified(Collections.singletonList(subject));

            if (StringUtils.isEmpty(subject.getSubjectIdentifier())) {
                subject.setSubjectIdentifier(subjectIdentifier);
            }

            validSubjectIdentifierOrFail(subject, subjectIdentifier);

            boolean createdSubject = this.service.upsertSubject(subject);

            URI subjectUri = UriTemplateUtils.expand(SUBJECT_URL, "subjectIdentifier:" + subjectIdentifier);

            if (createdSubject) {
                return created(subjectUri.getRawPath(), false);
            }

            return created(subjectUri.getRawPath(), true);
        } catch (RestApiException e) {
            // NOTE: This block is necessary to avoid accidentally
            // converting the HTTP status code to an unintended one
            throw e;
        } catch (Exception e) {
            throw new RestApiException(HttpStatus.UNPROCESSABLE_ENTITY, e);
        }
    }

    @ApiOperation(value = "Deletes the subject for a given zone. The subjectIdentifier must be URL encoded in "
            + "application/x-www-form-urlencoded format with UTF-8.", tags = { "Attribute Management" })
    @RequestMapping(method = DELETE, value = { V1 + SUBJECT_URL })
    public ResponseEntity<Void> deleteSubject(@PathVariable("subjectIdentifier") final String subjectIdentifier) {
        this.service.deleteSubject(subjectIdentifier);
        return noContent();
    }

    private void validSubjectIdentifierOrFail(final BaseSubject subject, final String subjectIdentifier) {
        if (!subjectIdentifier.equals(subject.getSubjectIdentifier())) {
            throw new RestApiException(HttpStatus.UNPROCESSABLE_ENTITY,
                    String.format("Subject identifier = %s, does not match the one provided in URI = %s",
                            subject.getSubjectIdentifier(), subjectIdentifier));
        }
    }
}