📄 abstractresource.java
字号:
*/ public void addLockManager(LockManager lockMgr) { if (lockMgr instanceof TxLockManagerImpl) { txMgr = (TxLockManagerImpl) lockMgr; } } /** * @see org.apache.jackrabbit.webdav.DavResource#getFactory() */ public DavResourceFactory getFactory() { return factory; } //-------------------------------------------------------------------------- /** * @see org.apache.jackrabbit.webdav.transaction.TransactionResource#getSession() * @see org.apache.jackrabbit.webdav.observation.ObservationResource#getSession() */ public DavSession getSession() { return session; } //--------------------------------------< TransactionResource interface >--- /** * @see TransactionResource#init(TxLockManager, String) */ public void init(TxLockManager txMgr, String transactionId) { this.txMgr = (TxLockManagerImpl) txMgr; this.transactionId = transactionId; } /** * @see TransactionResource#unlock(String, org.apache.jackrabbit.webdav.transaction.TransactionInfo) */ public void unlock(String lockToken, TransactionInfo tInfo) throws DavException { txMgr.releaseLock(tInfo, lockToken, this); } /** * @see TransactionResource#getTransactionId() */ public String getTransactionId() { return transactionId; } //-------------------------------------------< DeltaVResource interface >--- /** * @param optionsInfo * @return object to be used in the OPTIONS response body or <code>null</code> * @see DeltaVResource#getOptionResponse(org.apache.jackrabbit.webdav.version.OptionsInfo) */ public OptionsResponse getOptionResponse(OptionsInfo optionsInfo) { OptionsResponse oR = null; if (optionsInfo != null) { oR = new OptionsResponse(); // currently only DAV:version-history-collection-set and // DAV:workspace-collection-set is supported. if (optionsInfo.containsElement(DeltaVConstants.XML_VH_COLLECTION_SET, DeltaVConstants.NAMESPACE)) { String[] hrefs = new String[] { getLocatorFromItemPath(ItemResourceConstants.VERSIONSTORAGE_PATH).getHref(true) }; oR.addEntry(DeltaVConstants.XML_VH_COLLECTION_SET, DeltaVConstants.NAMESPACE, hrefs); } if (optionsInfo.containsElement(DeltaVConstants.XML_WSP_COLLECTION_SET, DeltaVConstants.NAMESPACE)) { // workspaces cannot be created anywhere. oR.addEntry(DeltaVConstants.XML_WSP_COLLECTION_SET, DeltaVConstants.NAMESPACE, new String[0]); } } return oR; } /** * @param reportInfo * @return the requested report * @throws DavException * @see DeltaVResource#getReport(org.apache.jackrabbit.webdav.version.report.ReportInfo) */ public Report getReport(ReportInfo reportInfo) throws DavException { if (reportInfo == null) { throw new DavException(DavServletResponse.SC_BAD_REQUEST, "A REPORT request must provide a valid XML request body."); } if (!exists()) { throw new DavException(DavServletResponse.SC_NOT_FOUND); } if (supportedReports.isSupportedReport(reportInfo)) { Report report = ReportType.getType(reportInfo).createReport(this, reportInfo); return report; } else { throw new DavException(DavServletResponse.SC_UNPROCESSABLE_ENTITY, "Unkown report "+ reportInfo.getReportName() +"requested."); } } /** * The JCR api does not provide methods to create new workspaces. Calling * <code>addWorkspace</code> on this resource will always fail. * * @param workspace * @throws DavException Always throws. * @see DeltaVResource#addWorkspace(org.apache.jackrabbit.webdav.DavResource) */ public void addWorkspace(DavResource workspace) throws DavException { throw new DavException(DavServletResponse.SC_FORBIDDEN); } /** * Return an array of <code>DavResource</code> objects that are referenced * by the property with the specified name. * * @param hrefPropertyName * @return array of <code>DavResource</code>s * @throws DavException * @see DeltaVResource#getReferenceResources(org.apache.jackrabbit.webdav.property.DavPropertyName) */ public DavResource[] getReferenceResources(DavPropertyName hrefPropertyName) throws DavException { DavProperty prop = getProperty(hrefPropertyName); if (prop == null || !(prop instanceof HrefProperty)) { throw new DavException(DavServletResponse.SC_CONFLICT, "Unknown Href-Property '"+hrefPropertyName+"' on resource "+getResourcePath()); } List hrefs = ((HrefProperty)prop).getHrefs(); DavResource[] refResources = new DavResource[hrefs.size()]; Iterator hrefIter = hrefs.iterator(); int i = 0; while (hrefIter.hasNext()) { refResources[i] = getResourceFromHref((String)hrefIter.next()); i++; } return refResources; } /** * Retrieve the <code>DavResource</code> object that is represented by * the given href String. * * @param href * @return <code>DavResource</code> object */ private DavResource getResourceFromHref(String href) throws DavException { // build a new locator: remove trailing prefix DavResourceLocator locator = getLocator(); String prefix = locator.getPrefix(); DavResourceLocator loc = locator.getFactory().createResourceLocator(prefix, href); // create a new resource object try { DavResource res; if (getRepositorySession().itemExists(loc.getRepositoryPath())) { res = createResourceFromLocator(loc); } else { throw new DavException(DavServletResponse.SC_NOT_FOUND); } return res; } catch (RepositoryException e) { throw new JcrDavException(e); } } //-------------------------------------------< SearchResource interface >--- /** * @return * @see org.apache.jackrabbit.webdav.search.SearchResource#getQueryGrammerSet() */ public QueryGrammerSet getQueryGrammerSet() { return new SearchResourceImpl(getLocator(), session).getQueryGrammerSet(); } /** * @param sInfo * @return * @throws DavException * @see SearchResource#search(org.apache.jackrabbit.webdav.search.SearchInfo) */ public MultiStatus search(SearchInfo sInfo) throws DavException { return new SearchResourceImpl(getLocator(), session).search(sInfo); } //-------------------------------------------------------------------------- /** * Fill the set of default properties */ protected void initProperties() { if (getDisplayName() != null) { properties.add(new DefaultDavProperty(DavPropertyName.DISPLAYNAME, getDisplayName())); } if (isCollection()) { properties.add(new ResourceType(ResourceType.COLLECTION)); // Windows XP support properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "1")); } else { properties.add(new ResourceType(ResourceType.DEFAULT_RESOURCE)); // Windows XP support properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "0")); } // todo: add etag // default last modified String lastModified = IOUtil.getLastModified(getModificationTime()); properties.add(new DefaultDavProperty(DavPropertyName.GETLASTMODIFIED, lastModified)); // default creation time properties.add(new DefaultDavProperty(DavPropertyName.CREATIONDATE, DavConstants.creationDateFormat.format(new Date(0)))); // supported lock property properties.add(supportedLock); // set current lock information. If no lock is applied to this resource, // an empty lockdiscovery will be returned in the response. properties.add(new LockDiscovery(getLocks())); properties.add(new SupportedMethodSetProperty(getSupportedMethods().split(",\\s"))); // DeltaV properties properties.add(supportedReports); // creator-displayname, comment: not value available from jcr properties.add(new DefaultDavProperty(DeltaVConstants.CREATOR_DISPLAYNAME, null, true)); properties.add(new DefaultDavProperty(DeltaVConstants.COMMENT, null, true)); // 'workspace' property as defined by RFC 3253 String workspaceHref = getWorkspaceHref(); if (workspaceHref != null) { properties.add(new HrefProperty(DeltaVConstants.WORKSPACE, workspaceHref, true)); } // TODO: required supported-live-property-set } /** * Create a new <code>DavResource</code> from the given locator. * @param loc * @return new <code>DavResource</code> */ protected DavResource createResourceFromLocator(DavResourceLocator loc) throws DavException { DavResource res = factory.createResource(loc, session); if (res instanceof AbstractResource) { ((AbstractResource)res).transactionId = this.transactionId; } return res; } /** * Build a <code>DavResourceLocator</code> from the given itemPath path. * * @param itemPath * @return a new <code>DavResourceLocator</code> * @see DavLocatorFactory#createResourceLocator(String, String, String) */ protected DavResourceLocator getLocatorFromItemPath(String itemPath) { DavResourceLocator loc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), itemPath, false); return loc; } /** * Build a new {@link DavResourceLocator} from the given repository item. * * @param repositoryItem * @return a new locator for the specified item. * @see #getLocatorFromItemPath(String) */ protected DavResourceLocator getLocatorFromItem(Item repositoryItem) { String itemPath = null; try { if (repositoryItem != null) { itemPath = repositoryItem.getPath(); } } catch (RepositoryException e) { // ignore: should not occur log.warn(e.getMessage()); } return getLocatorFromItemPath(itemPath); } /** * Shortcut for <code>getSession().getRepositorySession()</code> * * @return repository session present in the {@link AbstractResource#session}. */ protected Session getRepositorySession() { return session.getRepositorySession(); } /** * Define the set of locks supported by this resource. * * @see org.apache.jackrabbit.webdav.lock.SupportedLock */ abstract protected void initLockSupport(); /** * Define the set of reports supported by this resource. * * @see org.apache.jackrabbit.webdav.version.report.SupportedReportSetProperty */ /** * Define the set of reports supported by this resource. * * @see org.apache.jackrabbit.webdav.version.report.SupportedReportSetProperty * @see AbstractResource#initSupportedReports() */ protected void initSupportedReports() { if (exists()) { supportedReports = new SupportedReportSetProperty(new ReportType[] { ReportType.EXPAND_PROPERTY, NodeTypesReport.NODETYPES_REPORT, LocateByUuidReport.LOCATE_BY_UUID_REPORT, RegisteredNamespacesReport.REGISTERED_NAMESPACES_REPORT, RepositoryDescriptorsReport.REPOSITORY_DESCRIPTORS_REPORT }); } } /** * Retrieve the href of the workspace the current session belongs to. * * @return href of the workspace */ abstract protected String getWorkspaceHref(); //-------------------------------------------------------------------------- /** * Register the specified event listener with the observation manager present * the repository session. * * @param listener * @param nodePath * @throws javax.jcr.RepositoryException */ void registerEventListener(EventListener listener, String nodePath) throws RepositoryException { getRepositorySession().getWorkspace().getObservationManager().addEventListener(listener, EListener.ALL_EVENTS, nodePath, true, null, null, false); } /** * Unregister the specified event listener with the observation manager present * the repository session. * * @param listener * @throws javax.jcr.RepositoryException */ void unregisterEventListener(EventListener listener) throws RepositoryException { getRepositorySession().getWorkspace().getObservationManager().removeEventListener(listener); } //------------------------------------------------------< inner classes >--- /** * Simple EventListener that creates a new {@link org.apache.jackrabbit.webdav.MultiStatusResponse} object * for each event and adds it to the specified {@link org.apache.jackrabbit.webdav.MultiStatus}. */ class EListener implements EventListener { private static final int ALL_EVENTS = Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED; private final DavPropertyNameSet propNameSet; private MultiStatus ms; EListener(DavPropertyNameSet propNameSet, MultiStatus ms) { this.propNameSet = propNameSet; this.ms = ms; } /** * @see EventListener#onEvent(javax.jcr.observation.EventIterator) */ public void onEvent(EventIterator events) { while (events.hasNext()) { try { Event e = events.nextEvent(); DavResourceLocator loc = getLocatorFromItemPath(e.getPath()); DavResource res = createResourceFromLocator(loc); ms.addResponse(new MultiStatusResponse(res, propNameSet)); } catch (DavException e) { // should not occur log.error("Error while building MultiStatusResponse from Event: " + e.getMessage()); } catch (RepositoryException e) { // should not occur log.error("Error while building MultiStatusResponse from Event: " + e.getMessage()); } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -