Files
davx5-ose/src/at/bitfire/davdroid/resource/RemoteCollection.java
Ricki Hirner abd67609e6 Refactoring
* move common code to super-classes
* new icons
2013-10-05 20:34:26 +02:00

109 lines
4.2 KiB
Java

/*******************************************************************************
* Copyright (c) 2013 Richard Hirner (bitfire web engineering).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
******************************************************************************/
package at.bitfire.davdroid.resource;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.LinkedList;
import java.util.List;
import lombok.Getter;
import net.fortuna.ical4j.data.ParserException;
import org.apache.http.HttpException;
import at.bitfire.davdroid.webdav.HttpPropfind;
import at.bitfire.davdroid.webdav.WebDavCollection;
import at.bitfire.davdroid.webdav.WebDavCollection.MultigetType;
import at.bitfire.davdroid.webdav.WebDavResource;
import at.bitfire.davdroid.webdav.WebDavResource.PutMode;
public abstract class RemoteCollection<ResourceType extends Resource> {
@Getter WebDavCollection collection;
abstract protected String memberContentType();
abstract protected MultigetType multiGetType();
abstract protected ResourceType newResourceSkeleton(String name, String ETag);
public RemoteCollection(String baseURL, String user, String password) throws IOException, URISyntaxException {
collection = new WebDavCollection(new URI(baseURL), user, password);
}
/* collection operations */
public String getCTag() throws IOException, HttpException {
try {
if (collection.getCTag() == null && collection.getMembers() == null) // not already fetched
collection.propfind(HttpPropfind.Mode.COLLECTION_CTAG);
} catch (IncapableResourceException e) {
return null;
}
return collection.getCTag();
}
public Resource[] getMemberETags() throws IOException, IncapableResourceException, HttpException {
collection.propfind(HttpPropfind.Mode.MEMBERS_ETAG);
List<ResourceType> resources = new LinkedList<ResourceType>();
for (WebDavResource member : collection.getMembers())
resources.add(newResourceSkeleton(member.getName(), member.getETag()));
return resources.toArray(new Resource[0]);
}
@SuppressWarnings("unchecked")
public Resource[] multiGet(ResourceType[] resources) throws IOException, IncapableResourceException, HttpException, ParserException {
if (resources.length == 1) {
Resource resource = get(resources[0]);
return (resource != null) ? (ResourceType[]) new Resource[] { resource } : null;
}
LinkedList<String> names = new LinkedList<String>();
for (ResourceType resource : resources)
names.add(resource.getName());
collection.multiGet(names.toArray(new String[0]), multiGetType());
LinkedList<ResourceType> foundResources = new LinkedList<ResourceType>();
for (WebDavResource member : collection.getMembers()) {
ResourceType resource = newResourceSkeleton(member.getName(), member.getETag());
resource.parseEntity(member.getContent());
foundResources.add(resource);
}
return foundResources.toArray(new Resource[0]);
}
/* internal member operations */
public ResourceType get(ResourceType resource) throws IOException, HttpException, ParserException {
WebDavResource member = new WebDavResource(collection, resource.getName());
member.get();
resource.parseEntity(member.getContent());
return resource;
}
public void add(ResourceType resource) throws IOException, HttpException {
WebDavResource member = new WebDavResource(collection, resource.getName(), resource.getETag());
member.setContentType(memberContentType());
member.put(resource.toEntity().getBytes("UTF-8"), PutMode.ADD_DONT_OVERWRITE);
}
public void delete(ResourceType resource) throws IOException, HttpException {
WebDavResource member = new WebDavResource(collection, resource.getName(), resource.getETag());
member.delete();
}
public void update(ResourceType resource) throws IOException, HttpException {
WebDavResource member = new WebDavResource(collection, resource.getName(), resource.getETag());
member.setContentType(memberContentType());
member.put(resource.toEntity().getBytes("UTF-8"), PutMode.UPDATE_DONT_OVERWRITE);
}
}