com.screenslicer.webapp.WebAppConfig.java Source code

Java tutorial

Introduction

Here is the source code for com.screenslicer.webapp.WebAppConfig.java

Source

/* 
 * ScreenSlicer (TM) -- automatic, zero-config web scraping (TM)
 * Copyright (C) 2013-2014 Machine Publishers, LLC
 * ops@machinepublishers.com | screenslicer.com | machinepublishers.com
 * 717 Martin Luther King Dr W Ste I, Cincinnati, Ohio 45220
 *
 * You can redistribute this program and/or modify it under the terms of the
 * GNU Affero General Public License version 3 as published by the Free
 * Software Foundation. Additional permissions or commercial licensing may be
 * available--see LICENSE file or contact Machine Publishers, LLC for details.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License version 3
 * for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * version 3 along with this program. If not, see <http://www.gnu.org/licenses/>.
 * 
 * For general details about how to investigate and report license violations,
 * please see: https://www.gnu.org/licenses/gpl-violation.html
 * and email the author: ops@machinepublishers.com
 * Keep in mind that paying customers have more rights than the AGPL alone offers.
 */
package com.screenslicer.webapp;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.MediaType;

import org.apache.commons.io.FileUtils;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.process.Inflector;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.model.Resource;
import org.glassfish.jersey.server.model.ResourceMethod;
import org.reflections.Reflections;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;

public class WebAppConfig extends ResourceConfig {
    private final String[] mimeTypes;

    public WebAppConfig(boolean isClient) throws IOException {
        Collection<String> mimeTypeList = new HashSet<String>();
        mimeTypeList.add(MediaType.APPLICATION_FORM_URLENCODED);
        mimeTypeList.add(MediaType.APPLICATION_JSON);
        mimeTypeList.add(MediaType.APPLICATION_OCTET_STREAM);
        mimeTypeList.add(MediaType.APPLICATION_SVG_XML);
        mimeTypeList.add(MediaType.APPLICATION_XHTML_XML);
        mimeTypeList.add(MediaType.APPLICATION_XML);
        mimeTypeList.add(MediaType.MULTIPART_FORM_DATA);
        mimeTypeList.add(MediaType.TEXT_HTML);
        mimeTypeList.add(MediaType.TEXT_PLAIN);
        mimeTypeList.add(MediaType.TEXT_XML);
        if (new File("./htdocs").exists()) {
            Collection<File> files = FileUtils.listFiles(new File("./htdocs"), null, true);
            for (File file : files) {
                final byte[] contents = FileUtils.readFileToByteArray(file);
                Resource.Builder resourceBuilder = Resource.builder();
                resourceBuilder.path(file.getAbsolutePath().split("/htdocs/")[1]);
                final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET");
                String mimeType = MimeTypeFinder.probeContentType(Paths.get(file.toURI()));
                if (!mimeTypeList.contains(mimeType) && !file.getName().toLowerCase().endsWith(".jpg")
                        && !file.getName().toLowerCase().endsWith(".jpeg")
                        && !file.getName().toLowerCase().endsWith(".png")
                        && !file.getName().toLowerCase().endsWith(".gif")
                        && !file.getName().toLowerCase().endsWith(".ico")) {
                    mimeTypeList.add(mimeType);
                }
                final File myFile = file;
                methodBuilder.produces(mimeType).handledBy(new Inflector<ContainerRequestContext, byte[]>() {
                    @Override
                    public byte[] apply(ContainerRequestContext req) {
                        if (!WebApp.DEV) {
                            return contents;
                        }
                        try {
                            return FileUtils.readFileToByteArray(myFile);
                        } catch (IOException e) {
                            return contents;
                        }
                    }
                });
                registerResources(resourceBuilder.build());
            }
        }
        register(MultiPartFeature.class);
        Reflections reflections = new Reflections(
                new ConfigurationBuilder().setUrls(ClasspathHelper.forJavaClassPath())
                        .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("com.screenslicer"))));
        Set<Class<? extends WebResource>> webResourceClasses = reflections.getSubTypesOf(WebResource.class);
        if (!isClient) {
            for (Class<? extends WebResource> webpageClass : webResourceClasses) {
                registerResources(Resource.builder(webpageClass).build());
            }
        }
        if (isClient) {
            Set<Class<? extends ClientWebResource>> customWebAppClasses = reflections
                    .getSubTypesOf(ClientWebResource.class);
            for (Class<? extends ClientWebResource> customWebAppClass : customWebAppClasses) {
                registerResources(Resource.builder(customWebAppClass).build());
            }
        }
        register(ExceptionHandler.class);
        mimeTypes = mimeTypeList.toArray(new String[0]);
    }

    public String[] mimeTypes() {
        return mimeTypes;
    }
}