Support_Resources.java revision a0696ae076ed7ea66387057c7a1b34d42e10f140
16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Licensed to the Apache Software Foundation (ASF) under one or more
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * contributor license agreements.  See the NOTICE file distributed with
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * this work for additional information regarding copyright ownership.
56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * The ASF licenses this file to You under the Apache License, Version 2.0
66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (the "License"); you may not use this file except in compliance with
76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the License.  You may obtain a copy of the License at
86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *     http://www.apache.org/licenses/LICENSE-2.0
106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Unless required by applicable law or agreed to in writing, software
126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * distributed under the License is distributed on an "AS IS" BASIS,
136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * See the License for the specific language governing permissions and
156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * limitations under the License.
166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgpackage tests.support.resource;
196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.io.File;
216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.io.FileNotFoundException;
226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.io.FileOutputStream;
236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.io.IOException;
246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.io.InputStream;
256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.net.MalformedURLException;
266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.net.URISyntaxException;
276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport java.net.URL;
286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgimport tests.support.Support_Configuration;
306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgpublic class Support_Resources {
326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static final String RESOURCE_PACKAGE = "/tests/resources/";
346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static final String RESOURCE_PACKAGE_NAME = "tests.resources";
366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static InputStream getStream(String name) {
386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        // System.err.println("getResourceAsStream(" + RESOURCE_PACKAGE + name + ")");
396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        return Support_Resources.class.getResourceAsStream(RESOURCE_PACKAGE + name);
406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static String getURL(String name) {
436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        String folder = null;
446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        String fileName = name;
456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        File resources = createTempFolder();
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        int index = name.lastIndexOf("/");
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        if (index != -1) {
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            folder = name.substring(0, index);
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            name = name.substring(index + 1);
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        }
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        copyFile(resources, folder, name);
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        URL url = null;
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        String resPath = resources.toString();
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') {
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            resPath = resPath.substring(1);
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        }
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        try {
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            url = new URL("file:/" + resPath + "/" + fileName);
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        } catch (MalformedURLException e) {
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            throw new RuntimeException(e);
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        }
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        return url.toString();
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static File createTempFolder() {
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        File folder = null;
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        try {
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            folder = File.createTempFile("hyts_resources", "", null);
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            folder.delete();
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            folder.mkdirs();
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        } catch (IOException e) {
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            throw new RuntimeException(e);
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        }
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        folder.deleteOnExit();
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        return folder;
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    public static void copyFile(File root, String folder, String file) {
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        File f;
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        if (folder != null) {
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            f = new File(root.toString() + "/" + folder);
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            if (!f.exists()) {
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                f.mkdirs();
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                f.deleteOnExit();
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            }
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        } else {
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org            f = root;
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        }
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        String src = folder == null ? file : folder + "/" + file;
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        InputStream in = Support_Resources.getStream(src);
92        try {
93            File dst = new File(f.toString() + "/" + file);
94            copyLocalFileTo(dst, in);
95        } catch (Exception e) {
96            throw new RuntimeException("copyFile failed: root=" + root + " folder=" + folder + " file=" + file + " (src=" + src + ")", e);
97        }
98    }
99
100    public static File createTempFile(String suffix) throws IOException {
101        return File.createTempFile("hyts_", suffix, null);
102    }
103
104    public static void copyLocalFileTo(File dest, InputStream in) throws IOException {
105        if (!dest.exists()) {
106            FileOutputStream out = new FileOutputStream(dest);
107            int result;
108            byte[] buf = new byte[4096];
109            while ((result = in.read(buf)) != -1) {
110                out.write(buf, 0, result);
111            }
112            in.close();
113            out.close();
114            dest.deleteOnExit();
115        }
116    }
117
118    public static File getExternalLocalFile(String url) throws IOException, MalformedURLException {
119        File resources = createTempFolder();
120        InputStream in = new URL(url).openStream();
121        File temp = new File(resources.toString() + "/local.tmp");
122        copyLocalFileTo(temp, in);
123        return temp;
124    }
125
126    public static String getResourceURL(String resource) {
127        return "http://" + Support_Configuration.TestResources + resource;
128    }
129
130    /**
131     * Util method to load resource files
132     *
133     * @param name - name of resource file
134     * @return - resource input stream
135     */
136    public static InputStream getResourceStream(String name) {
137        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(name);
138        if (is == null) {
139            throw new RuntimeException("Failed to load resource: " + name);
140        }
141        return is;
142    }
143
144    /**
145     * Util method to get absolute path to resource file
146     *
147     * @param name - name of resource file
148     * @return - path to resource
149     */
150    public static String getAbsoluteResourcePath(String name) {
151        URL url = ClassLoader.getSystemClassLoader().getResource(name);
152        if (url == null) {
153            throw new RuntimeException("Failed to load resource: " + name);
154        }
155
156        try {
157            return new File(url.toURI()).getAbsolutePath();
158        } catch (URISyntaxException e) {
159            throw new RuntimeException("Failed to load resource: " + name);
160        }
161    }
162}
163