aboutsummaryrefslogtreecommitdiffstats
path: root/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
blob: cca6e62681dcc60da22aea5a370539b60f4af053 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*-
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2018 Ericsson. All rights reserved.
 * ================================================================================
 * 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.
 * 
 * SPDX-License-Identifier: Apache-2.0
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.common.utils.resources;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This is common utility class with static methods for handling Java resources on the class path. It is an abstract
 * class to prevent any direct instantiation and private constructor to prevent extending this class.
 */
public abstract class ResourceUtils {
    // Get a reference to the logger
    private static final Logger LOGGER = LoggerFactory.getLogger(ResourceUtils.class);

    // The length of byte buffers used to read resources into strings
    private static final int BYTE_BUFFER_LENGH = 1024;

    /**
     * Private constructor used to prevent sub class instantiation.
     */
    private ResourceUtils() {
        // Prevent construction of this class
    }

    /**
     * Method to resolve a resource; the local file system is checked first and then the class path is checked.
     *
     * @param resourceName The resource name
     * @return A URL to a resource
     */
    public static URL getUrl4Resource(final String resourceName) {
        // Check the local fine system first
        final URL urlToResource = getLocalFile(resourceName);

        // Check if this is a local file
        if (urlToResource != null) {
            return urlToResource;
        } else {
            // Resort to the class path
            return getUrlResource(resourceName);
        }
    }

    /**
     * Method to return a resource as a string. The resource can be on the local file system or in the class path. The
     * resource is resolved and loaded into a string.
     *
     * @param resourceName The resource name
     * @return A string containing the resource
     */
    public static String getResourceAsString(final String resourceName) {
        // Get the resource as a stream, we'll convert it to a string then
        final InputStream resourceStream = getResourceAsStream(resourceName);
        if (resourceStream == null) {
            return null;
        }

        // Read the stream contents in to an output stream
        final ByteArrayOutputStream resourceOutputStreamBuffer = new ByteArrayOutputStream();
        final byte[] resourceBuffer = new byte[BYTE_BUFFER_LENGH];
        int length;
        try {
            while ((length = resourceStream.read(resourceBuffer)) != -1) {
                resourceOutputStreamBuffer.write(resourceBuffer, 0, length);
            }
        } catch (final IOException e) {
            LOGGER.debug("error reading resource stream \"{}\" : " + e.getMessage(), resourceName, e);
            return null;
        }

        return resourceOutputStreamBuffer.toString();
    }

    /**
     * Method to return a resource as a stream. The resource can be on the local file system or in the class path. The
     * resource is resolved and returned as a stream.
     *
     * @param resourceName The resource name
     * @return A stream attached to the resource
     */
    public static InputStream getResourceAsStream(final String resourceName) {
        // Find a URL to the resource first
        final URL urlToResource = getUrl4Resource(resourceName);

        // Check if the resource exists
        if (urlToResource == null) {
            // No resource found
            LOGGER.debug("cound not find resource \"{}\" : ", resourceName);
            return null;
        }

        // Read the resource into a string
        try {
            return urlToResource.openStream();
        } catch (final IOException e) {
            // Any of many IO exceptions such as the resource is a directory
            LOGGER.debug("error attaching resource \"{}\" to stream : " + e.getMessage(), resourceName, e);
            return null;
        }
    }

    /**
     * Method to get a URL resource from the class path.
     *
     * @param resourceName The resource name
     * @return The URL to the resource
     */
    public static URL getUrlResource(final String resourceName) {
        try {
            final ClassLoader classLoader = ResourceUtils.class.getClassLoader();

            final String[] fileParts = resourceName.split("/");
            // Read the resource
            URL url = classLoader.getResource(resourceName);

            // Check if the resource is defined
            if (url != null) {
                // Return the resource as a file name
                LOGGER.debug("found URL resource \"{}\" : ", url);
                return url;
            } else {
                url = classLoader.getResource(fileParts[fileParts.length - 1]);
                if (url == null) {
                    LOGGER.debug("cound not find URL resource \"{}\" : ", resourceName);
                    return null;
                }
                LOGGER.debug("found URL resource \"{}\" : ", url);
                return url;
            }
        } catch (final Exception e) {
            LOGGER.debug("error getting URL resource \"{}\" : " + e.getMessage(), e);
            return null;
        }
    }

    /**
     * Method to get a URL resource from the local machine.
     *
     * @param resourceName The resource name
     * @return The URL to the resource
     */
    public static URL getLocalFile(final String resourceName) {
        try {
            // Input might already be in URL format
            final URL ret = new URL(resourceName);
            final File f = new File(ret.toURI());
            if (f.exists()) {
                return ret;
            }
        } catch (final Exception ignore) {
            // We ignore exceptions here and catch them below
        }

        try {
            final File f = new File(resourceName);
            // Check if the file exists
            if (f.exists()) {
                final URL urlret = f.toURI().toURL();
                LOGGER.debug("resource \"{}\" was found on the local file system", f.toURI().toURL());
                return urlret;
            } else {
                LOGGER.debug("resource \"{}\" does not exist on the local file system", resourceName);
                return null;
            }
        } catch (final Exception e) {
            LOGGER.debug("error finding resource \"{}\" : " + e.getMessage(), e);
            return null;
        }
    }

    /**
     * Gets the file path for a resource on the local file system or on the class path.
     *
     * @param resource the resource to the get the file path for
     * @return the resource file path
     */
    public static String getFilePath4Resource(final String resource) {
        if (resource == null) {
            return null;
        }

        URL modelFileUrl = getUrl4Resource(resource);
        if (modelFileUrl != null) {
            return modelFileUrl.getPath();
        } else {
            return resource;
        }
    }
}