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

org.apache.chemistry.opencmis.server.impl.CallContextImpl Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.chemistry.opencmis.server.impl;

import java.io.File;
import java.io.Serializable;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
import org.apache.chemistry.opencmis.commons.server.CallContext;
import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
import org.apache.chemistry.opencmis.commons.server.MutableCallContext;
import org.apache.chemistry.opencmis.server.shared.TempStoreOutputStreamFactory;

/**
 * Implementation of the {@link CallContext} interface.
 */
public class CallContextImpl implements MutableCallContext, Serializable {

    private static final long serialVersionUID = 1L;

    private final String binding;
    private final boolean objectInfoRequired;
    private final Map parameter = new HashMap();

    public CallContextImpl(String binding, CmisVersion cmisVersion, String repositoryId, ServletContext servletContext,
            HttpServletRequest request, HttpServletResponse response, CmisServiceFactory factory,
            TempStoreOutputStreamFactory streamFactory) {
        this.binding = binding;
        this.objectInfoRequired = BINDING_ATOMPUB.equals(binding);
        put(REPOSITORY_ID, repositoryId);

        // CMIS version
        if (cmisVersion == null) {
            throw new IllegalArgumentException("CMIS version must be set!");
        }
        put(CallContext.CMIS_VERSION, cmisVersion);

        // servlet context and HTTP servlet request and response
        put(CallContext.SERVLET_CONTEXT, servletContext);
        put(CallContext.HTTP_SERVLET_REQUEST, request);
        put(CallContext.HTTP_SERVLET_RESPONSE, response);

        if (factory != null) {
            put(TEMP_DIR, factory.getTempDirectory());
            put(MEMORY_THRESHOLD, factory.getMemoryThreshold());
            put(MAX_CONTENT_SIZE, factory.getMaxContentSize());
            put(ENCRYPT_TEMP_FILE, factory.encryptTempFiles());
            put(STREAM_FACTORY, streamFactory);
        }
    }

    public void setRange(String rangeHeader) {
        if (rangeHeader == null) {
            return;
        }

        remove(OFFSET);
        remove(LENGTH);

        rangeHeader = rangeHeader.replaceAll("\\s", "").toLowerCase(Locale.ENGLISH);

        if (rangeHeader.length() > 6 && rangeHeader.startsWith("bytes=") && rangeHeader.indexOf(',') == -1
                && rangeHeader.charAt(6) != '-') {
            BigInteger offset = null;
            BigInteger length = null;

            int ds = rangeHeader.indexOf('-');
            if (ds > 6) {
                try {
                    String firstBytePosStr = rangeHeader.substring(6, ds);
                    if (firstBytePosStr.length() > 0) {
                        offset = new BigInteger(firstBytePosStr);
                    }

                    if (!rangeHeader.endsWith("-")) {
                        String lastBytePosStr = rangeHeader.substring(ds + 1);
                        if (offset == null) {
                            length = (new BigInteger(lastBytePosStr)).add(BigInteger.ONE);
                        } else {
                            length = (new BigInteger(lastBytePosStr)).subtract(offset).add(BigInteger.ONE);
                        }
                    }

                    if (offset != null) {
                        put(OFFSET, offset);
                    }
                    if (length != null) {
                        put(LENGTH, length);
                    }
                } catch (NumberFormatException e) {
                    // invalid Range header must be ignored
                }
            }
        }
    }

    public void setAcceptLanguage(String acceptLanguageHeader) {
        if (acceptLanguageHeader == null) {
            return;
        }

        remove(LOCALE_ISO639_LANGUAGE);
        remove(LOCALE_ISO3166_COUNTRY);
        remove(LOCALE);

        double lastQ = 0;
        String language = null;
        String country = null;

        String[] languageHeader = acceptLanguageHeader.split(",");
        for (String languageRange : languageHeader) {
            String langRange = languageRange.trim();
            double currentQ = 0;

            int x = langRange.indexOf(';');
            if (x > -1) {
                String qStr = langRange.substring(x + 1).replaceAll("\\s", "").toLowerCase(Locale.ENGLISH);
                if (!qStr.startsWith("q=") && qStr.length() < 3) {
                    continue;
                }
                currentQ = Double.parseDouble(qStr.substring(2));
                langRange = langRange.substring(0, x);
            } else {
                currentQ = 1;
            }

            if (currentQ <= lastQ) {
                continue;
            } else {
                lastQ = currentQ;
            }

            String[] locale = langRange.split("-");
            String locale0 = locale[0].trim();

            language = null;
            country = null;

            if (!locale0.equals("*")) {
                language = locale0;
                if (locale.length > 1) {
                    String locale1 = locale[1].trim();
                    if (!locale1.equals("*")) {
                        country = locale1;
                    }
                }
            }

            if (currentQ >= 1) {
                break;
            }
        }

        if (language != null) {
            put(LOCALE_ISO639_LANGUAGE, language);
            put(LOCALE, language);
        }

        if (country != null) {
            put(LOCALE_ISO3166_COUNTRY, country);
            put(LOCALE, language + "-" + country);
        }
    }

    @Override
    public String getBinding() {
        return binding;
    }

    @Override
    public boolean isObjectInfoRequired() {
        return objectInfoRequired;
    }

    @Override
    public Object get(String key) {
        return parameter.get(key);
    }

    @Override
    public CmisVersion getCmisVersion() {
        return (CmisVersion) get(CMIS_VERSION);
    }

    @Override
    public String getRepositoryId() {
        return (String) get(REPOSITORY_ID);
    }

    @Override
    public String getUsername() {
        return (String) get(USERNAME);
    }

    @Override
    public String getPassword() {
        return (String) get(PASSWORD);
    }

    @Override
    public String getLocale() {
        return (String) get(LOCALE);
    }

    @Override
    public BigInteger getOffset() {
        return (BigInteger) get(OFFSET);
    }

    @Override
    public BigInteger getLength() {
        return (BigInteger) get(LENGTH);
    }

    @Override
    public File getTempDirectory() {
        return (File) get(TEMP_DIR);
    }

    @Override
    public boolean encryptTempFiles() {
        return Boolean.TRUE.equals(get(ENCRYPT_TEMP_FILE));
    }

    @Override
    public int getMemoryThreshold() {
        return (Integer) get(MEMORY_THRESHOLD);
    }

    @Override
    public long getMaxContentSize() {
        return (Long) get(MAX_CONTENT_SIZE);
    }

    @Override
    public final void put(String key, Object value) {
        parameter.put(key, value);
    }

    @Override
    public final Object remove(String key) {
        return parameter.remove(key);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy