All Downloads are FREE. Search and download functionalities are using the official Maven repository.

guru.nidi.ramltester.core.Usage Maven / Gradle / Ivy

There is a newer version: 0.9.1
Show newest version
/*
 * Copyright (C) 2014 Stefan Niederhauser ([email protected])
 *
 * 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 guru.nidi.ramltester.core;

import java.util.*;

/**
 *
 */
public class Usage implements Iterable> {
    private final Map resources = new HashMap<>();

    private static  T getOrCreate(Class clazz, Map map, String name) {
        T res = map.get(name);
        if (res == null) {
            try {
                res = clazz.newInstance();
                map.put(name, res);
            } catch (Exception e) {
                throw new RamlCheckerException("Could not create instance of " + clazz, e);
            }
        }
        return res;
    }

    public Resource resource(String path) {
        return getOrCreate(Resource.class, resources, path);
    }

    public void add(Usage usage) {
        for (final Map.Entry resourceEntry : usage) {
            final Resource resource = resource(resourceEntry.getKey());
            resource.incUses(resourceEntry.getValue().getUses());
            for (final Map.Entry actionEntry : resourceEntry.getValue()) {
                final Action action = resource.action(actionEntry.getKey());
                final Action usageAction = actionEntry.getValue();
                action.incUses(usageAction.getUses());
                action.addQueryParameters(usageAction.getQueryParameters());
                action.addRequestHeaders(usageAction.getRequestHeaders());
                action.addResponseCodes(usageAction.getResponseCodes());
                for (final Map.Entry responseEntry : usageAction.responses()) {
                    final Response response = action.response(responseEntry.getKey());
                    response.addResponseHeaders(responseEntry.getValue().getResponseHeaders());
                }
                for (final Map.Entry mimeTypeEntry : usageAction.mimeTypes()) {
                    final MimeType mimeType = action.mimeType(mimeTypeEntry.getKey());
                    mimeType.addFormParameters(mimeTypeEntry.getValue().getFormParameters());
                }
            }
        }
    }

    @Override
    public String toString() {
        return "Usage" + resources;
    }

    @Override
    public Iterator> iterator() {
        return resources.entrySet().iterator();
    }

    public Set getUnusedResources() {
        final Set res = new HashSet<>();
        for (final Map.Entry resourceEntry : this) {
            if (resourceEntry.getValue().getUses() == 0 && !resourceEntry.getValue().actions.isEmpty()) {
                res.add(resourceEntry.getKey());
            }
        }
        return res;
    }

    public Set getUnusedActions() {
        return UsageCollector.ACTION.collect(this);
    }

    public Set getUnusedQueryParameters() {
        return UsageCollector.QUERY_PARAM.collect(this);
    }

    public Set getUnusedFormParameters() {
        return UsageCollector.FORM_PARAM.collect(this);
    }

    public Set getUnusedRequestHeaders() {
        return UsageCollector.REQUEST_HEADER.collect(this);
    }

    public Set getUnusedResponseHeaders() {
        return UsageCollector.RESPONSE_HEADER.collect(this);
    }

    public Set getUnusedResponseCodes() {
        return UsageCollector.RESPONSE_CODE.collect(this);
    }

    static class UsageBase {
        private int uses;

        public void incUses(int count) {
            uses += count;
        }

        public int getUses() {
            return uses;
        }
    }

    static class Resource extends UsageBase implements Iterable> {
        private final Map actions = new HashMap<>();

        public Action action(String name) {
            return getOrCreate(Action.class, actions, name);
        }

        @Override
        public String toString() {
            return "Resource" + actions;
        }

        @Override
        public Iterator> iterator() {
            return actions.entrySet().iterator();
        }
    }

    static class Action extends UsageBase {
        private final Map responses = new HashMap<>();
        private final Map mimeTypes = new HashMap<>();
        private final CountSet queryParameters = new CountSet<>();
        private final CountSet requestHeaders = new CountSet<>();
        private final CountSet responseCodes = new CountSet<>();

        public Response response(String name) {
            return getOrCreate(Response.class, responses, name);
        }

        public Iterable> responses() {
            return responses.entrySet();
        }

        public MimeType mimeType(String name) {
            return getOrCreate(MimeType.class, mimeTypes, name);
        }

        public Iterable> mimeTypes() {
            return mimeTypes.entrySet();
        }

        public void addQueryParameters(Set names) {
            queryParameters.addAll(names);
        }

        public void initQueryParameters(Set names) {
            queryParameters.addAll(names, 0);
        }

        public void addRequestHeaders(Set names) {
            requestHeaders.addAll(names);
        }

        public void initRequestHeaders(Set names) {
            requestHeaders.addAll(names, 0);
        }

        public void addResponseCode(String name) {
            responseCodes.add(name);
        }

        public void addResponseCodes(Set names) {
            responseCodes.addAll(names);
        }

        public void initResponseCodes(Set names) {
            responseCodes.addAll(names, 0);
        }

        public CountSet getQueryParameters() {
            return queryParameters;
        }

        public CountSet getRequestHeaders() {
            return requestHeaders;
        }

        public CountSet getResponseCodes() {
            return responseCodes;
        }

        @Override
        public String toString() {
            return "Action{" +
                    "responses=" + responses +
                    ", mimeTypes=" + mimeTypes +
                    ", queryParameters=" + queryParameters +
                    ", requestHeaders=" + requestHeaders +
                    ", responseCodes=" + responseCodes +
                    '}';
        }
    }

    static class Response {
        private final CountSet responseHeaders = new CountSet<>();

        public void addResponseHeaders(Set names) {
            responseHeaders.addAll(names);
        }

        public void initResponseHeaders(Set names) {
            responseHeaders.addAll(names, 0);
        }

        public CountSet getResponseHeaders() {
            return responseHeaders;
        }

        @Override
        public String toString() {
            return "Response{" +
                    "responseHeaders=" + responseHeaders +
                    '}';
        }
    }

    static class MimeType {
        private final CountSet formParameters = new CountSet<>();

        public void addFormParameters(Set names) {
            formParameters.addAll(names);
        }

        public void initFormParameters(Set names) {
            formParameters.addAll(names, 0);
        }

        public CountSet getFormParameters() {
            return formParameters;
        }

        @Override
        public String toString() {
            return "MimeType{" +
                    "formParameters=" + formParameters +
                    '}';
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy