CCM NG: Package structure cleanup, some more classes for implementing WebDAV resources
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5425 8810af33-2d31-482b-a856-94f89814c4dfccm-docs
parent
f00e149ebf
commit
096488d68c
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (C) 2018 LibreCCM Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml;
|
||||
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.ext.ContextResolver;
|
||||
import javax.ws.rs.ext.Provider;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.JAXBIntrospector;
|
||||
|
||||
/**
|
||||
* Provides support for custom extensions to WebDAV, like custom Properties and
|
||||
* XML Elements.<br>
|
||||
*
|
||||
* WebDAV allows custom extensions for XML Elements and Properties. To enable
|
||||
* JAX-RS to deal with these, each of them must be implemented as a JAXB class
|
||||
* and registered by passing it to the constructor of this resolver.
|
||||
*
|
||||
* The class is based on a class/interface from java.net WebDAV Project:
|
||||
*
|
||||
* <a href="https://gitlab.com/headcrashing/webdav-jaxrs/blob/master/src/main/java/net/java/dev/webdav/jaxrs/Headers.java">https://gitlab.com/headcrashing/webdav-jaxrs/blob/master/src/main/java/net/java/dev/webdav/jaxrs/Headers.java</a>
|
||||
*
|
||||
*
|
||||
* @author Markus KARG (mkarg@java.net)
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*
|
||||
* @see
|
||||
* <a href="http://www.webdav.org/specs/rfc4918.html#xml-extensibility">Chapter
|
||||
* 17 "XML Extensibility in DAV" of RFC 2616 "Hypertext Transfer Protocol --
|
||||
* HTTP/1.1"</a>
|
||||
*/
|
||||
@Provider
|
||||
@Produces(MediaType.APPLICATION_XML)
|
||||
public class WebDavContextResolver implements ContextResolver<JAXBContext> {
|
||||
|
||||
private final JAXBContext context;
|
||||
|
||||
private final JAXBIntrospector introspector;
|
||||
|
||||
/**
|
||||
* Creates an instance of this resolver, registering the provided custom XML
|
||||
* Elements and Properties.
|
||||
*
|
||||
* @param additionalClasses The custom extensions (JAXB classes) to be
|
||||
* registered (can be left blank).
|
||||
*
|
||||
* @throws JAXBException if an error was encountered while creating the
|
||||
* JAXBContext, such as (but not limited to): No JAXB
|
||||
* implementation was discovered, Classes use JAXB
|
||||
* annotations incorrectly, Classes have colliding
|
||||
* annotations (i.e., two classes with the same type
|
||||
* name), The JAXB implementation was unable to locate
|
||||
* provider-specific out-of-band information (such as
|
||||
* additional files generated at the development
|
||||
* time.)
|
||||
*/
|
||||
public WebDavContextResolver(final Class<?>... additionalClasses)
|
||||
throws JAXBException {
|
||||
|
||||
this.context = WebDavJAXBContextBuilder.build(additionalClasses);
|
||||
this.introspector = this.context.createJAXBIntrospector();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return A single, shared context for both, WebDAV XML Elements and
|
||||
* Properties and custom extensions.
|
||||
*/
|
||||
@Override
|
||||
public JAXBContext getContext(final Class<?> type) {
|
||||
|
||||
if (introspector.isElement(buildInstanceOf(type))) {
|
||||
return context;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private <T> T buildInstanceOf(final Class<T> type) {
|
||||
|
||||
if (type == null) {
|
||||
|
||||
return null;
|
||||
|
||||
} else if (type.isEnum()) {
|
||||
|
||||
final T[] enumConstants = type.getEnumConstants();
|
||||
if (enumConstants.length > 0) {
|
||||
return enumConstants[0];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
final Constructor<T> constructor = type
|
||||
.getDeclaredConstructor();
|
||||
constructor.setAccessible(true);
|
||||
return constructor.newInstance();
|
||||
} catch (NoSuchMethodException
|
||||
| InstantiationException
|
||||
| IllegalAccessException
|
||||
| InvocationTargetException ex) {
|
||||
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
/*
|
||||
* Copyright (C) 2018 LibreCCM Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml;
|
||||
|
||||
import org.libreccm.webdav.conditions.CannotModifyProtectedProperty;
|
||||
import org.libreccm.webdav.conditions.LockTokenMatchesRequestUri;
|
||||
import org.libreccm.webdav.conditions.LockTokenSubmitted;
|
||||
import org.libreccm.webdav.conditions.NoConflictingLock;
|
||||
import org.libreccm.webdav.conditions.NoExternalEntities;
|
||||
import org.libreccm.webdav.conditions.PreservedLiveProperties;
|
||||
import org.libreccm.webdav.conditions.PropFindFiniteDepth;
|
||||
import org.libreccm.webdav.xml.elements.ActiveLock;
|
||||
import org.libreccm.webdav.xml.elements.AllProp;
|
||||
import org.libreccm.webdav.xml.elements.Collection;
|
||||
import org.libreccm.webdav.xml.elements.Depth;
|
||||
import org.libreccm.webdav.xml.elements.Exclusive;
|
||||
import org.libreccm.webdav.xml.elements.HRef;
|
||||
import org.libreccm.webdav.xml.elements.Include;
|
||||
import org.libreccm.webdav.xml.elements.Location;
|
||||
import org.libreccm.webdav.xml.elements.LockEntry;
|
||||
import org.libreccm.webdav.xml.elements.LockInfo;
|
||||
import org.libreccm.webdav.xml.elements.LockRoot;
|
||||
import org.libreccm.webdav.xml.elements.LockScope;
|
||||
import org.libreccm.webdav.xml.elements.LockToken;
|
||||
import org.libreccm.webdav.xml.elements.LockType;
|
||||
import org.libreccm.webdav.xml.elements.MultiStatus;
|
||||
import org.libreccm.webdav.xml.elements.Owner;
|
||||
import org.libreccm.webdav.xml.elements.Prop;
|
||||
import org.libreccm.webdav.xml.elements.PropFind;
|
||||
import org.libreccm.webdav.xml.elements.PropName;
|
||||
import org.libreccm.webdav.xml.elements.PropStat;
|
||||
import org.libreccm.webdav.xml.elements.PropertyUpdate;
|
||||
import org.libreccm.webdav.xml.elements.Remove;
|
||||
import org.libreccm.webdav.xml.elements.ResponseDescription;
|
||||
import org.libreccm.webdav.xml.elements.Shared;
|
||||
import org.libreccm.webdav.xml.elements.Status;
|
||||
import org.libreccm.webdav.xml.elements.TimeOut;
|
||||
import org.libreccm.webdav.xml.elements.Write;
|
||||
import org.libreccm.webdav.xml.properties.CreationDate;
|
||||
import org.libreccm.webdav.xml.properties.DisplayName;
|
||||
import org.libreccm.webdav.xml.properties.GetContentLanguage;
|
||||
import org.libreccm.webdav.xml.properties.GetContentLength;
|
||||
import org.libreccm.webdav.xml.properties.GetContentType;
|
||||
import org.libreccm.webdav.xml.properties.GetETag;
|
||||
import org.libreccm.webdav.xml.properties.GetLastModified;
|
||||
import org.libreccm.webdav.xml.properties.LockDiscovery;
|
||||
import org.libreccm.webdav.xml.properties.ResourceType;
|
||||
import org.libreccm.webdav.xml.properties.SupportedLock;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.text.Utilities;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
|
||||
/**
|
||||
* Provides support for custom extensions to WebDAV, like custom Properties and
|
||||
* XML Elements.<br>
|
||||
*
|
||||
* WebDAV allows custom extensions for XML Elements and Properties. To enable
|
||||
* JAX-RS to deal with these, each of them must be implemented as a JAXB class
|
||||
* and registered by passing it to the constructor of this factory.
|
||||
*
|
||||
* The class is based on a class/interface from java.net WebDAV Project:
|
||||
*
|
||||
* <a href="https://gitlab.com/headcrashing/webdav-jaxrs/blob/master/src/main/java/net/java/dev/webdav/jaxrs/Headers.java">https://gitlab.com/headcrashing/webdav-jaxrs/blob/master/src/main/java/net/java/dev/webdav/jaxrs/Headers.java</a>
|
||||
*
|
||||
* @author Markus KARG (mkarg@java.net)
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*
|
||||
* @see
|
||||
* <a href="http://www.webdav.org/specs/rfc4918.html#xml-extensibility">Chapter
|
||||
* 17 "XML Extensibility in DAV" of RFC 2616 "Hypertext Transfer Protocol --
|
||||
* HTTP/1.1"</a>
|
||||
*/
|
||||
final class WebDavJAXBContextBuilder {
|
||||
|
||||
/**
|
||||
* Builds a JAXB context for WebDAV.
|
||||
*
|
||||
* @param auxiliaryClasses Optional set of custom XML elements which shall
|
||||
* get part of the context.
|
||||
*
|
||||
* @throws JAXBException If JAXB cannot create the context.
|
||||
*/
|
||||
public static final JAXBContext build(final Class<?>... auxiliaryClasses)
|
||||
throws JAXBException {
|
||||
|
||||
final Class<?>[] webDavClasses = new Class<?>[]{
|
||||
ActiveLock.class,
|
||||
AllProp.class,
|
||||
CannotModifyProtectedProperty.class,
|
||||
Collection.class,
|
||||
CreationDate.class,
|
||||
Depth.class,
|
||||
DisplayName.class,
|
||||
Error.class,
|
||||
Exclusive.class,
|
||||
GetContentLanguage.class,
|
||||
GetContentLength.class,
|
||||
GetContentType.class,
|
||||
GetETag.class,
|
||||
GetLastModified.class,
|
||||
HRef.class,
|
||||
Include.class,
|
||||
Location.class,
|
||||
LockDiscovery.class,
|
||||
LockEntry.class,
|
||||
LockInfo.class,
|
||||
LockRoot.class,
|
||||
LockScope.class,
|
||||
LockToken.class,
|
||||
LockTokenMatchesRequestUri.class,
|
||||
LockTokenSubmitted.class,
|
||||
LockType.class,
|
||||
MultiStatus.class,
|
||||
NoConflictingLock.class,
|
||||
NoExternalEntities.class,
|
||||
Owner.class,
|
||||
PreservedLiveProperties.class,
|
||||
Prop.class,
|
||||
PropertyUpdate.class,
|
||||
PropFind.class,
|
||||
PropFindFiniteDepth.class,
|
||||
PropName.class,
|
||||
PropStat.class,
|
||||
Remove.class,
|
||||
ResourceType.class,
|
||||
Response.class,
|
||||
ResponseDescription.class,
|
||||
Set.class, Shared.class,
|
||||
Status.class,
|
||||
SupportedLock.class,
|
||||
TimeOut.class,
|
||||
Write.class};
|
||||
|
||||
final List<Class<?>> allClasses = new ArrayList<>();
|
||||
allClasses.addAll(Arrays.asList(webDavClasses));
|
||||
allClasses.addAll(Arrays.asList(auxiliaryClasses));
|
||||
|
||||
|
||||
return JAXBContext.newInstance(allClasses.toArray(new Class<?>[]{}));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
import org.libreccm.webdav.xml.elements.Rfc3339DateTimeFormat;
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
import org.libreccm.webdav.xml.elements.Rfc1123DateFormat;
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
import org.libreccm.webdav.xml.elements.ActiveLock;
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
import org.libreccm.webdav.xml.elements.Collection;
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import org.libreccm.webdav.ConstantsAdapter;
|
||||
import org.libreccm.webdav.xml.elements.LockEntry;
|
||||
|
|
@ -35,7 +35,7 @@
|
|||
@XmlSchema(namespace = "DAV:",
|
||||
xmlns = @XmlNs(prefix = "D", namespaceURI = "DAV:"),
|
||||
elementFormDefault = QUALIFIED)
|
||||
package org.libreccm.webdav.xml.elements.properties;
|
||||
package org.libreccm.webdav.xml.properties;
|
||||
|
||||
import static javax.xml.bind.annotation.XmlNsForm.QUALIFIED;
|
||||
|
||||
Loading…
Reference in New Issue