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

org.opencms.jlan.CmsJlanRepository Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.jlan;

import org.opencms.configuration.CmsConfigurationException;
import org.opencms.configuration.CmsParameterConfiguration;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.wrapper.CmsObjectWrapper;
import org.opencms.file.wrapper.CmsSilentWrapperException;
import org.opencms.file.wrapper.I_CmsResourceWrapper;
import org.opencms.main.CmsContextInfo;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.repository.CmsRepositoryFilter;
import org.opencms.repository.CmsRepositoryManager;
import org.opencms.repository.I_CmsRepository;
import org.opencms.util.CmsStringUtil;
import org.opencms.xml.content.CmsXmlContent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.logging.Log;

import org.alfresco.jlan.server.SrvSession;
import org.alfresco.jlan.server.filesys.DiskDeviceContext;
import org.alfresco.jlan.server.filesys.DiskInterface;
import org.alfresco.jlan.server.filesys.DiskSharedDevice;
import org.alfresco.jlan.server.filesys.TreeConnection;

import com.google.common.collect.Lists;

/**
 * Repository class for configuring repositories for Alfresco JLAN.

*/ public class CmsJlanRepository implements I_CmsRepository { /** Parameter for controlling whether byte order marks should be added to plaintext files. */ public static final String PARAM_ADD_BOM = "addBOM"; /** The parameter for the project in which this repository should operate. */ public static final String PARAM_PROJECT = "project"; /** Name of the parameter to configure the root directory. */ public static final String PARAM_ROOT = "root"; /** Name of the parameter to configure resource wrappers. */ public static final String PARAM_WRAPPER = "wrapper"; /** The logger instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsJlanRepository.class); /** Flag which controls whether the CmsObjectWrapper should add byte order marks for plain files. */ private boolean m_addByteOrderMark; /** The CMS context. */ private CmsObject m_cms; /** The configuration for this repository. */ private CmsParameterConfiguration m_configuration = new CmsParameterConfiguration(); /** The shared disk device. */ private DiskSharedDevice m_device; /** The JLAN device context for this repository. */ private DiskDeviceContext m_deviceContext; /** The JLAN disk interface for this repository. */ private DiskInterface m_diskInterface; /** The name of the repository. */ private String m_name; /** The disk interface. */ private CmsJlanDiskInterface m_originalDiskInterface; /** The configured project. */ private CmsProject m_project; /** The name of the configured project. */ private String m_projectName; /** The root VFS directory of the repository. */ private String m_root; /** The list of wrappers configured for this repository. */ private List m_wrappers = Lists.newArrayList(); /** * Creates a new repository instance.

*/ public CmsJlanRepository() { m_deviceContext = new CmsJlanDeviceContext(this); m_deviceContext.enableChangeHandler(true); m_deviceContext.setFileServerNotifications(true); m_originalDiskInterface = new CmsJlanDiskInterface(); m_diskInterface = createLoggingProxy(m_originalDiskInterface); } /** * Creates a dynamic proxy for a disk interface which logs the method calls and their results.

* * @param impl the disk interface for which a logging proxy should be created * * @return the dynamic proxy which logs methods calls */ public static DiskInterface createLoggingProxy(final DiskInterface impl) { return (DiskInterface)Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), new Class[] {DiskInterface.class}, new InvocationHandler() { @SuppressWarnings("synthetic-access") public Object invoke(Object target, Method method, Object[] params) throws Throwable { // Just to be on the safe side performance-wise, we only log the parameters/result // if the info channel is enabled if (LOG.isInfoEnabled()) { List paramStrings = new ArrayList(); for (Object param : params) { paramStrings.add("" + param); } String paramsAsString = CmsStringUtil.listAsString(paramStrings, ", "); LOG.info("Call: " + method.getName() + " " + paramsAsString); } try { Object result = method.invoke(impl, params); if (LOG.isInfoEnabled()) { LOG.info("Returned from " + method.getName() + ": " + result); } return result; } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if ((cause != null) && (cause instanceof CmsSilentWrapperException)) { // not really an error LOG.info(cause.getCause().getLocalizedMessage(), cause.getCause()); } else { LOG.error(e.getLocalizedMessage(), e); } throw e.getCause(); } } }); } /** * @see org.opencms.configuration.I_CmsConfigurationParameterHandler#addConfigurationParameter(java.lang.String, java.lang.String) */ public void addConfigurationParameter(String paramName, String paramValue) { m_configuration.add(paramName, paramValue); } /** * Checks if a user may access this repository.

* * @param user the name of the user * * @return true if the user may access the repository */ public boolean allowAccess(String user) { try { return m_cms.getPermissions(m_root, user).requiresViewPermission(); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); return true; } } /** * Creates a CmsObjectWrapper for the current session.

* * @param session the current session * @param connection the tree connection * * @return the correctly configured CmsObjectWrapper for this session * * @throws CmsException if something goes wrong */ public CmsObjectWrapper getCms(SrvSession session, TreeConnection connection) throws CmsException { String userName = session.getClientInformation().getUserName(); userName = CmsJlanUsers.translateUser(userName); CmsContextInfo contextInfo = new CmsContextInfo(m_cms.getRequestContext()); contextInfo.setUserName(userName); CmsObject newCms = OpenCms.initCmsObject(m_cms, contextInfo); newCms.getRequestContext().setSiteRoot(getRoot()); newCms.getRequestContext().setCurrentProject(getProject()); CmsObjectWrapper result = new CmsObjectWrapper(newCms, getWrappers()); result.setAddByteOrderMark(m_addByteOrderMark); result.getRequestContext().setAttribute(CmsXmlContent.AUTO_CORRECTION_ATTRIBUTE, Boolean.TRUE); return result; } /** * @see org.opencms.configuration.I_CmsConfigurationParameterHandler#getConfiguration() */ public CmsParameterConfiguration getConfiguration() { return m_configuration; } /** * Gets the device context for this repository.

* * @return the device context */ public DiskDeviceContext getDeviceContext() { return m_deviceContext; } /** * Gets the disk interface for this repository.

* * @return the disk interface */ public DiskInterface getDiskInterface() { return m_diskInterface; } /** * @see org.opencms.repository.I_CmsRepository#getFilter() */ public CmsRepositoryFilter getFilter() { return null; } /** * @see org.opencms.repository.I_CmsRepository#getName() */ public String getName() { return m_name; } /** * Gets the configured project.

* * @return the configured project */ public CmsProject getProject() { return m_project; } /** * Gets the root directory configured for this repository.

* * @return the root directory */ public String getRoot() { return m_root; } /** * Gets the resource wrappers which have been configured for this repository.

* * @return the resource wrappers which have been configured */ public List getWrappers() { return m_wrappers; } /** * @see org.opencms.configuration.I_CmsConfigurationParameterHandler#initConfiguration() */ public void initConfiguration() throws CmsConfigurationException { List wrapperObjects = CmsRepositoryManager.createResourceWrappersFromConfiguration( getConfiguration(), PARAM_WRAPPER, LOG); m_wrappers = Collections.unmodifiableList(wrapperObjects); m_root = getConfiguration().getString(PARAM_ROOT, "").trim(); m_projectName = getConfiguration().getString(PARAM_PROJECT, "Offline").trim(); String addByteOrderMarkStr = getConfiguration().getString(PARAM_ADD_BOM, "" + true).trim(); m_addByteOrderMark = Boolean.parseBoolean(addByteOrderMarkStr); } /** * @see org.opencms.repository.I_CmsRepository#initializeCms(org.opencms.file.CmsObject) */ public void initializeCms(CmsObject cms) throws CmsException { m_cms = cms; m_project = m_cms.readProject(m_projectName); m_device = new DiskSharedDevice(getName(), getDiskInterface(), getDeviceContext(), 0); m_device.addAccessControl(new CmsRepositoryAccessControl(this)); } /** * @see org.opencms.repository.I_CmsRepository#setFilter(org.opencms.repository.CmsRepositoryFilter) */ public void setFilter(CmsRepositoryFilter filter) { // do nothing } /** * @see org.opencms.repository.I_CmsRepository#setName(java.lang.String) */ public void setName(String name) { // case sensitive share names don't work m_name = name.toUpperCase(); } /** * Gets the shared device for this repository.

* * @return the shared device */ DiskSharedDevice getSharedDevice() { return m_device; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy