/**
* personium.io
* Copyright 2014 FUJITSU LIMITED
*
* Licensed 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 com.fujitsu.dc.core.rs.box;
import java.io.InputStream;
import java.io.Reader;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.PUT;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import org.apache.wink.webdav.WebDAVMethod;
import com.fujitsu.dc.common.utils.DcCoreUtils;
import com.fujitsu.dc.core.annotations.ACL;
import com.fujitsu.dc.core.auth.BoxPrivilege;
import com.fujitsu.dc.core.model.DavCmp;
import com.fujitsu.dc.core.model.DavMoveResource;
import com.fujitsu.dc.core.model.DavRsCmp;
/**
* JAX-RS Resource class for a plain WebDAV file resource.
*/
public class DavFileResource {
DavRsCmp davRsCmp;
/**
* Constructor.
* @param parent Parent resource
* @param davCmp DavCmp
*/
public DavFileResource(final DavRsCmp parent, final DavCmp davCmp) {
this.davRsCmp = new DavRsCmp(parent, davCmp);
}
/**
* process PUT Method and update the file.
* @param contentType Content-Type Header
* @param ifMatch If-Match Header
* @param inputStream Request Body
* @return JAX-RS response object
*/
@PUT
public Response put(@HeaderParam(HttpHeaders.CONTENT_TYPE) final String contentType,
@HeaderParam(HttpHeaders.IF_MATCH) final String ifMatch,
final InputStream inputStream) {
// Access Control
this.davRsCmp.checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.WRITE);
ResponseBuilder rb = this.davRsCmp.getDavCmp().putForUpdate(contentType, inputStream, ifMatch);
return rb.build();
}
/**
* process GET Method and retrieve the file content.
* @param ifNoneMatch If-None-Match Header
* @param rangeHeaderField Range header
* @return JAX-RS response object
*/
@GET
public Response get(
@HeaderParam(HttpHeaders.IF_NONE_MATCH) final String ifNoneMatch,
@HeaderParam("Range") final String rangeHeaderField
) {
// Access Control
this.davRsCmp.checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.READ);
ResponseBuilder rb = this.davRsCmp.get(ifNoneMatch, rangeHeaderField);
return rb.build();
}
/**
* process DELETE Method and delete this resource.
* @param ifMatch If-Match header
* @return JAX-RS response object
*/
@DELETE
public Response delete(@HeaderParam(HttpHeaders.IF_MATCH) final String ifMatch) {
// Access Control
// DavFileResourceは必ず親(最上位はBox)を持つため、this.davRsCmp.getParent()の結果がnullになることはない
this.davRsCmp.getParent().checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.WRITE);
ResponseBuilder rb = this.davRsCmp.getDavCmp().delete(ifMatch, false);
return rb.build();
}
/**
* process PROPPATCH Method.
* @param requestBodyXml request body
* @return JAX-RS response object
*/
@WebDAVMethod.PROPPATCH
public Response proppatch(final Reader requestBodyXml) {
// Access Control
this.davRsCmp.checkAccessContext(
this.davRsCmp.getAccessContext(), BoxPrivilege.WRITE_PROPERTIES);
return this.davRsCmp.doProppatch(requestBodyXml);
}
/**
* process PROPFIND Method.
* @param requestBodyXml request body
* @param depth Depth Header
* @param contentLength Content-Length Header
* @param transferEncoding Transfer-Encoding Header
* @return JAX-RS response object
*/
@WebDAVMethod.PROPFIND
public Response propfind(final Reader requestBodyXml,
@HeaderParam(DcCoreUtils.HttpHeaders.DEPTH) final String depth,
@HeaderParam(HttpHeaders.CONTENT_LENGTH) final Long contentLength,
@HeaderParam("Transfer-Encoding") final String transferEncoding) {
return this.davRsCmp.doPropfind(requestBodyXml, depth, contentLength, transferEncoding,
BoxPrivilege.READ_PROPERTIES, BoxPrivilege.READ_ACL);
}
/**
* process ACL Method and configure ACL.
* @param reader request body
* @return JAX-RS Response
*/
@ACL
public Response acl(final Reader reader) {
// Access Control
this.davRsCmp.checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.WRITE_ACL);
return this.davRsCmp.doAcl(reader);
}
/**
* process MOVE Method.
* @param headers Http headers
* @return JAX-RS response object
*/
@WebDAVMethod.MOVE
public Response move(
@Context HttpHeaders headers) {
// Access Control against the move source
// DavFileResourceは必ず親(最上位はBox)を持つため、this.davRsCmp.getParent()の結果がnullになることはない
this.davRsCmp.getParent().checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.WRITE);
return new DavMoveResource(this.davRsCmp.getParent(), this.davRsCmp.getDavCmp(), headers).doMove();
}
/**
* process OPTIONS Method.
* @return JAX-RS response object
*/
@OPTIONS
public Response options() {
// Access Control
this.davRsCmp.checkAccessContext(this.davRsCmp.getAccessContext(), BoxPrivilege.READ);
return DcCoreUtils.responseBuilderForOptions(
HttpMethod.GET,
HttpMethod.PUT,
HttpMethod.DELETE,
com.fujitsu.dc.common.utils.DcCoreUtils.HttpMethod.MOVE,
com.fujitsu.dc.common.utils.DcCoreUtils.HttpMethod.PROPFIND,
com.fujitsu.dc.common.utils.DcCoreUtils.HttpMethod.PROPPATCH,
com.fujitsu.dc.common.utils.DcCoreUtils.HttpMethod.ACL
).build();
}
}