| /* |
| * 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.client.bindings.impl; |
| |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| |
| import org.apache.chemistry.opencmis.client.bindings.cache.TypeDefinitionCache; |
| import org.apache.chemistry.opencmis.client.bindings.spi.BindingSession; |
| import org.apache.chemistry.opencmis.client.bindings.spi.CmisSpi; |
| import org.apache.chemistry.opencmis.client.bindings.spi.http.HttpInvoker; |
| import org.apache.chemistry.opencmis.commons.SessionParameter; |
| import org.apache.chemistry.opencmis.commons.enums.CmisVersion; |
| import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException; |
| import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; |
| import org.apache.chemistry.opencmis.commons.impl.ClassLoaderUtil; |
| import org.apache.chemistry.opencmis.commons.spi.AuthenticationProvider; |
| |
| /** |
| * A collection of static methods that are used in multiple places within the |
| * bindings implementation. |
| */ |
| public final class CmisBindingsHelper { |
| |
| public static final String REPOSITORY_INFO_CACHE = "org.apache.chemistry.opencmis.binding.repositoryInfoCache"; |
| public static final String TYPE_DEFINTION_CACHE = "org.apache.chemistry.opencmis.binding.typeDefintionCache"; |
| public static final String SPI_OBJECT = "org.apache.chemistry.opencmis.binding.spi.object"; |
| public static final String HTTP_INVOKER_OBJECT = "org.apache.chemistry.opencmis.binding.httpinvoker.object"; |
| public static final String AUTHENTICATION_PROVIDER_OBJECT = "org.apache.chemistry.opencmis.binding.auth.object"; |
| public static final String ACCEPT_LANGUAGE = "org.apache.chemistry.opencmis.binding.acceptLanguage"; |
| public static final String FORCE_CMIS_VERSION = "org.apache.chemistry.opencmis.cmisversion"; |
| |
| /** |
| * Private constructor. |
| */ |
| private CmisBindingsHelper() { |
| } |
| |
| /** |
| * Gets the SPI object for the given session. If there is already a SPI |
| * object in the session it will be returned. If there is no SPI object it |
| * will be created and put into the session. |
| * |
| * @param session |
| * the session object |
| * |
| * @return the SPI object |
| */ |
| public static CmisSpi getSPI(BindingSession session) { |
| assert session != null; |
| |
| // fetch from session |
| CmisSpi spi = (CmisSpi) session.get(SPI_OBJECT); |
| if (spi != null) { |
| return spi; |
| } |
| |
| session.writeLock(); |
| try { |
| // try again |
| spi = (CmisSpi) session.get(SPI_OBJECT); |
| if (spi != null) { |
| return spi; |
| } |
| |
| // ok, we have to create it... |
| try { |
| String spiName = (String) session.get(SessionParameter.BINDING_SPI_CLASS); |
| Constructor<?> c = ClassLoaderUtil.loadClass(spiName).getConstructor(BindingSession.class); |
| spi = (CmisSpi) c.newInstance(session); |
| } catch (CmisBaseException e) { |
| throw e; |
| } catch (InvocationTargetException ite) { |
| throw new CmisRuntimeException("SPI cannot be initialized: " + ite.getCause().getMessage(), ite); |
| } catch (Exception e) { |
| throw new CmisRuntimeException("SPI cannot be initialized: " + e.getMessage(), e); |
| } |
| |
| // we have a SPI object -> put it into the session |
| session.put(SPI_OBJECT, spi, true); |
| } finally { |
| session.writeUnlock(); |
| } |
| |
| assert spi != null; |
| |
| return spi; |
| } |
| |
| /** |
| * Gets the HTTP Invoker object from the session. |
| */ |
| public static HttpInvoker getHttpInvoker(BindingSession session) { |
| assert session != null; |
| |
| HttpInvoker invoker = (HttpInvoker) session.get(HTTP_INVOKER_OBJECT); |
| |
| if (invoker != null) { |
| return invoker; |
| } |
| |
| session.writeLock(); |
| try { |
| // try again |
| invoker = (HttpInvoker) session.get(HTTP_INVOKER_OBJECT); |
| if (invoker != null) { |
| return invoker; |
| } |
| |
| // ok, we have to create it... |
| try { |
| String invokerName = (String) session.get(SessionParameter.HTTP_INVOKER_CLASS); |
| invoker = (HttpInvoker) ClassLoaderUtil.loadClass(invokerName).newInstance(); |
| } catch (CmisBaseException e) { |
| throw e; |
| } catch (Exception e) { |
| throw new CmisRuntimeException("HTTP invoker cannot be initialized: " + e.getMessage(), e); |
| } |
| |
| // we have an Invoker object -> put it into the session |
| session.put(HTTP_INVOKER_OBJECT, invoker, true); |
| } finally { |
| session.writeUnlock(); |
| } |
| |
| assert invoker != null; |
| |
| return invoker; |
| } |
| |
| /** |
| * Returns a CMIS version if the user set one, <code>null</code> otherwise. |
| */ |
| public static CmisVersion getForcedCmisVersion(BindingSession session) { |
| assert session != null; |
| |
| return (CmisVersion) session.get(FORCE_CMIS_VERSION); |
| } |
| |
| /** |
| * Returns the authentication provider from the session or <code>null</code> |
| * if no authentication provider is set. |
| */ |
| public static AuthenticationProvider getAuthenticationProvider(BindingSession session) { |
| assert session != null; |
| |
| return (AuthenticationProvider) session.get(AUTHENTICATION_PROVIDER_OBJECT); |
| } |
| |
| /** |
| * Returns the repository info cache from the session. |
| */ |
| public static RepositoryInfoCache getRepositoryInfoCache(BindingSession session) { |
| assert session != null; |
| |
| return (RepositoryInfoCache) session.get(REPOSITORY_INFO_CACHE); |
| } |
| |
| /** |
| * Returns the type definition cache from the session. |
| */ |
| public static TypeDefinitionCache getTypeDefinitionCache(BindingSession session) { |
| assert session != null; |
| |
| TypeDefinitionCache cache = (TypeDefinitionCache) session.get(TYPE_DEFINTION_CACHE); |
| |
| if (cache != null) { |
| return cache; |
| } |
| |
| session.writeLock(); |
| try { |
| // try again |
| cache = (TypeDefinitionCache) session.get(TYPE_DEFINTION_CACHE); |
| if (cache != null) { |
| return cache; |
| } |
| |
| // ok, we have to create it... |
| try { |
| String cacheName = (String) session.get(SessionParameter.TYPE_DEFINITION_CACHE_CLASS); |
| cache = (TypeDefinitionCache) ClassLoaderUtil.loadClass(cacheName).newInstance(); |
| cache.initialize(session); |
| } catch (CmisBaseException e) { |
| throw e; |
| } catch (Exception e) { |
| throw new CmisRuntimeException("Type definition cache cannot be initialized: " + e.getMessage(), e); |
| } |
| |
| // we have a cache object -> put it into the session |
| session.put(TYPE_DEFINTION_CACHE, cache); |
| } finally { |
| session.writeUnlock(); |
| } |
| |
| assert cache != null; |
| |
| return cache; |
| } |
| } |