[
https://issues.apache.org/jira/browse/OPENMEETINGS-1636?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16674282#comment-16674282
]
ASF GitHub Bot commented on OPENMEETINGS-1636:
----------------------------------------------
solomax closed pull request #12: OPENMEETINGS-1636 Upgrade Caldav4j to
1.0.0-rc.1
URL: https://github.com/apache/openmeetings/pull/12
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
index 8d8db38abe..cb55a68fbc 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
@@ -25,19 +25,21 @@
import java.net.URI;
import java.util.Collection;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import javax.annotation.PreDestroy;
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.OptionsMethod;
-import org.apache.commons.httpclient.params.HttpClientParams;
-import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
+import org.apache.http.HttpResponse;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.Credentials;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpOptions;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
+import org.apache.jackrabbit.webdav.client.methods.HttpPropfind;
import org.apache.jackrabbit.webdav.property.DavProperty;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
@@ -53,28 +55,36 @@
import org.apache.openmeetings.service.calendar.caldav.handler.EtagsHandler;
import
org.apache.openmeetings.service.calendar.caldav.handler.WebDAVSyncHandler;
import org.apache.wicket.util.string.Strings;
-import org.osaf.caldav4j.CalDAVConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.w3c.dom.Element;
+import com.github.caldav4j.CalDAVConstants;
+
+import net.fortuna.ical4j.util.MapTimeZoneCache;
+
/**
* Class which does syncing and provides respective API's required for
performing CalDAV Operations.
- * @author Ankush Mishra
+ * @author Ankush Mishra <[email protected]>
*/
@Component
public class AppointmentManager {
private static final Logger log =
LoggerFactory.getLogger(AppointmentManager.class);
//HttpClient and ConnectionManager Params
- private static final int IDLE_CONNECTION_TIMEOUT = 30000; // 30 seconds
+ private static final int IDLE_CONNECTION_TIMEOUT = 30; // 30 seconds
private static final int MAX_HOST_CONNECTIONS = 6; // Number of
simultaneous connections to one host
private static final int MAX_TOTAL_CONNECTIONS = 10; // Max
Connections, at one time in memory.
private static final int CONNECTION_MANAGER_TIMEOUT = 1000; // Waits
for 1 sec if no empty connection exists
- private MultiThreadedHttpConnectionManager connmanager = null;
+ private PoolingHttpClientConnectionManager connmanager = null;
+
+ static {
+ // Disable TimeZone caching through JCache
+ System.setProperty("net.fortuna.ical4j.timezone.cache.impl",
MapTimeZoneCache.class.getName());
+ }
@Autowired
private OmCalendarDao calendarDao;
@@ -90,29 +100,14 @@
*/
public HttpClient createHttpClient() {
if (connmanager == null) {
- connmanager = new MultiThreadedHttpConnectionManager();
- HttpConnectionManagerParams params = new
HttpConnectionManagerParams();
-
params.setDefaultMaxConnectionsPerHost(MAX_HOST_CONNECTIONS);
- params.setMaxTotalConnections(MAX_TOTAL_CONNECTIONS);
- connmanager.setParams(params);
+ connmanager = new PoolingHttpClientConnectionManager();
+ connmanager.setDefaultMaxPerRoute(MAX_HOST_CONNECTIONS);
+ connmanager.setMaxTotal(MAX_TOTAL_CONNECTIONS);
}
- HttpClientParams clientParams = new HttpClientParams();
-
clientParams.setConnectionManagerTimeout(CONNECTION_MANAGER_TIMEOUT);
- return new HttpClient(connmanager);
- }
-
- /**
- * Returns the Path from the Calendar.
- *
- * @param client Client which makes the connection.
- * @param calendar Calendar who's URL is used to get the path from.
- * @return Path component of the URL.
- */
- public String getPathfromCalendar(HttpClient client, OmCalendar
calendar) {
- URI temp = URI.create(calendar.getHref());
- client.getHostConfiguration().setHost(temp.getHost(),
temp.getPort(), temp.getScheme());
- return temp.getPath();
+ return HttpClients.custom()
+ .setConnectionManager(connmanager)
+ .build();
}
/**
@@ -128,15 +123,15 @@ private static String ensureTrailingSlash(String str) {
/**
* Adds the Credentials provided to the given client on the Calendar's
URL.
*
- * @param client Client which makes the connection.
+ * @param context Context of the Client which makes the connection.
* @param calendar Calendar whose Host the Credentials are for.
* @param credentials Credentials to add
*/
- public void provideCredentials(HttpClient client, OmCalendar calendar,
Credentials credentials) {
+ public void provideCredentials(HttpClientContext context, OmCalendar
calendar, Credentials credentials) {
+ // Done through creating a new Local context
if (!Strings.isEmpty(calendar.getHref()) && credentials !=
null) {
URI temp = URI.create(calendar.getHref());
- client.getHostConfiguration().setHost(temp.getHost(),
temp.getPort(), temp.getScheme());
- client.getState().setCredentials(new
AuthScope(temp.getHost(), temp.getPort()), credentials);
+ context.getCredentialsProvider().setCredentials(new
AuthScope(temp.getHost(), temp.getPort()), credentials);
}
}
@@ -147,16 +142,16 @@ public void provideCredentials(HttpClient client,
OmCalendar calendar, Credentia
* @param calendar Calendar whose URL is to be accessed.
* @return Returns true for HTTP Status 200, or 204, else false.
*/
- public boolean testConnection(HttpClient client, OmCalendar calendar) {
+ public boolean testConnection(HttpClient client, HttpClientContext
context, OmCalendar calendar) {
cleanupIdleConnections();
- OptionsMethod optionsMethod = null;
+ HttpOptions optionsMethod = null;
try {
- String path = getPathfromCalendar(client, calendar);
- optionsMethod = new OptionsMethod(path);
- optionsMethod.setRequestHeader("Accept", "*/*");
- client.executeMethod(optionsMethod);
- int status = optionsMethod.getStatusCode();
+ String path = calendar.getHref();
+ optionsMethod = new HttpOptions(path);
+ optionsMethod.setHeader("Accept", "*/*");
+ HttpResponse response = client.execute(optionsMethod,
context);
+ int status = response.getStatusLine().getStatusCode();
if (status == SC_OK || status == SC_NO_CONTENT) {
return true;
}
@@ -167,7 +162,7 @@ public boolean testConnection(HttpClient client, OmCalendar
calendar) {
log.error("Severe Error in executing OptionsMethod
during testConnection.", e);
} finally {
if (optionsMethod != null) {
- optionsMethod.releaseConnection();
+ optionsMethod.reset();
}
}
return false;
@@ -180,9 +175,9 @@ public boolean testConnection(HttpClient client, OmCalendar
calendar) {
* @param calendar - calendar to be created
* @return <code>true</code> if calendar was created/updated
*/
- public boolean createCalendar(HttpClient client, OmCalendar calendar) {
+ public boolean createCalendar(HttpClient client, HttpClientContext
context, OmCalendar calendar) {
if (calendar.getId() == null && calendar.getSyncType() !=
SyncType.GOOGLE_CALENDAR) {
- return discoverCalendars(client, calendar);
+ return discoverCalendars(client, context, calendar);
}
calendarDao.update(calendar);
return true;
@@ -229,23 +224,23 @@ public void deleteCalendar(OmCalendar calendar) {
* @param client - {@link HttpClient} to discover calendar
* @param calendar Calendar who's sync has to take place
*/
- public void syncItem(HttpClient client, OmCalendar calendar) {
+ public void syncItem(HttpClient client, HttpClientContext context,
OmCalendar calendar) {
cleanupIdleConnections();
if (calendar.getSyncType() != SyncType.NONE) {
CalendarHandler calendarHandler;
- String path = getPathfromCalendar(client, calendar);
+ String path = calendar.getHref();
switch (calendar.getSyncType()) {
case WEBDAV_SYNC:
- calendarHandler = new
WebDAVSyncHandler(path, calendar, client, appointmentDao, utils);
+ calendarHandler = new
WebDAVSyncHandler(path, calendar, client, context, appointmentDao, utils);
break;
case CTAG:
- calendarHandler = new CtagHandler(path,
calendar, client, appointmentDao, utils);
+ calendarHandler = new CtagHandler(path,
calendar, client, context, appointmentDao, utils);
break;
case ETAG:
default: //Default is the EtagsHandler.
- calendarHandler = new
EtagsHandler(path, calendar, client, appointmentDao, utils);
+ calendarHandler = new
EtagsHandler(path, calendar, client, context, appointmentDao, utils);
break;
}
@@ -260,10 +255,10 @@ public void syncItem(HttpClient client, OmCalendar
calendar) {
* @param client - {@link HttpClient} to discover calendar
* @param userId - id of the user
*/
- public void syncItems(HttpClient client, Long userId) {
+ public void syncItems(HttpClient client, HttpClientContext context,
Long userId) {
List<OmCalendar> calendars = getCalendars(userId);
for (OmCalendar calendar : calendars) {
- syncItem(client, calendar);
+ syncItem(client, context, calendar);
}
}
@@ -274,11 +269,11 @@ public void syncItems(HttpClient client, Long userId) {
* @param calendar - calendar to get principal URL from
* @return - <code>true</code> in case calendar was discovered
successfully
*/
- private boolean discoverCalendars(HttpClient client, OmCalendar
calendar) {
+ private boolean discoverCalendars(HttpClient client, HttpClientContext
context, OmCalendar calendar) {
cleanupIdleConnections();
if (calendar.getSyncType() == SyncType.NONE) {
- PropFindMethod propFindMethod = null;
+ HttpPropfind propFindMethod = null;
String userPath = null, homepath = null;
DavPropertyName curUserPrincipal =
DavPropertyName.create("current-user-principal"),
@@ -287,25 +282,25 @@ private boolean discoverCalendars(HttpClient client,
OmCalendar calendar) {
//Find out whether it's a calendar or if we can find
the calendar-home or current-user url
try {
- String path = getPathfromCalendar(client,
calendar);
+ String path = calendar.getHref();
DavPropertyNameSet properties = new
DavPropertyNameSet();
properties.add(curUserPrincipal);
properties.add(calHomeSet);
properties.add(DavPropertyName.RESOURCETYPE);
- propFindMethod = new PropFindMethod(path,
properties, CalDAVConstants.DEPTH_0);
- client.executeMethod(propFindMethod);
+ propFindMethod = new HttpPropfind(path,
properties, CalDAVConstants.DEPTH_0);
+ HttpResponse httpResponse =
client.execute(propFindMethod, context);
- if (propFindMethod.succeeded()) {
- for (MultiStatusResponse response :
propFindMethod.getResponseBodyAsMultiStatus().getResponses()) {
+ if (propFindMethod.succeeded(httpResponse)) {
+ for (MultiStatusResponse response :
propFindMethod.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
DavPropertySet set =
response.getProperties(SC_OK);
DavProperty<?> calhome =
set.get(calHomeSet), curPrinci = set.get(curUserPrincipal),
resourcetype =
set.get(DavPropertyName.RESOURCETYPE);
if
(checkCalendarResourceType(resourcetype)) {
//This is a calendar
and thus initialize and return
- return
initCalendar(client, calendar);
+ return
initCalendar(client, context, calendar);
}
//Else find all the calendars
on the Principal and return.
@@ -327,11 +322,11 @@ private boolean discoverCalendars(HttpClient client,
OmCalendar calendar) {
//If calendar home path wasn't set,
then we get it
DavPropertyNameSet props = new
DavPropertyNameSet();
props.add(calHomeSet);
- propFindMethod = new
PropFindMethod(userPath, props, DavConstants.DEPTH_0);
- client.executeMethod(propFindMethod);
+ propFindMethod = new
HttpPropfind(userPath, props, DavConstants.DEPTH_0);
+ httpResponse =
client.execute(propFindMethod, context);
- if (propFindMethod.succeeded()) {
- for (MultiStatusResponse
response : propFindMethod.getResponseBodyAsMultiStatus().getResponses()) {
+ if
(propFindMethod.succeeded(httpResponse)) {
+ for (MultiStatusResponse
response :
propFindMethod.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
DavPropertySet set =
response.getProperties(SC_OK);
DavProperty<?> calhome
= set.get(calHomeSet);
@@ -351,13 +346,16 @@ private boolean discoverCalendars(HttpClient client,
OmCalendar calendar) {
props.add(suppCalCompSet);
props.add(DavPropertyName.DISPLAYNAME);
- propFindMethod = new
PropFindMethod(homepath, props, DavConstants.DEPTH_1);
+ propFindMethod = new
HttpPropfind(homepath, props, DavConstants.DEPTH_1);
- client.executeMethod(propFindMethod);
+ httpResponse =
client.execute(propFindMethod, context);
- if (propFindMethod.succeeded()) {
+ if
(propFindMethod.succeeded(httpResponse)) {
boolean success = false;
- for (MultiStatusResponse
response : propFindMethod.getResponseBodyAsMultiStatus().getResponses()) {
+
+ URI resourceUri =
propFindMethod.getURI();
+ String host =
resourceUri.getScheme() + "://" + resourceUri.getHost() +
((resourceUri.getPort() != -1)? ":" + resourceUri.getPort() : "");
+ for (MultiStatusResponse
response :
propFindMethod.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
boolean isVevent =
false, isCalendar;
DavPropertySet set =
response.getProperties(SC_OK);
@@ -388,13 +386,13 @@ private boolean discoverCalendars(HttpClient client,
OmCalendar calendar) {
tempCalendar.setTitle(displayname.getValue().toString());
}
-
tempCalendar.setHref(client.getHostConfiguration().getHostURL() +
response.getHref());
+
tempCalendar.setHref(host + response.getHref());
tempCalendar.setDeleted(false);
tempCalendar.setOwner(calendar.getOwner());
calendarDao.update(tempCalendar);
-
initCalendar(client, tempCalendar);
+
initCalendar(client, context, tempCalendar);
}
}
return success;
@@ -407,7 +405,7 @@ private boolean discoverCalendars(HttpClient client,
OmCalendar calendar) {
log.error("Severe Error in executing PROPFIND
Method, during testConnection.", e);
} finally {
if (propFindMethod != null) {
- propFindMethod.releaseConnection();
+ propFindMethod.reset();
}
}
}
@@ -461,15 +459,15 @@ private static boolean
checkCalendarResourceType(DavProperty<?> resourcetype) {
* @param calendar - calendar to be inited
* @return <code>true</code> in case calendar was inited
*/
- private boolean initCalendar(HttpClient client, OmCalendar calendar) {
+ private boolean initCalendar(HttpClient client, HttpClientContext
context, OmCalendar calendar) {
if (calendar.getToken() == null || calendar.getSyncType() ==
SyncType.NONE) {
calendarDao.update(calendar);
- PropFindMethod propFindMethod = null;
+ HttpPropfind propFindMethod = null;
try {
- String path = getPathfromCalendar(client,
calendar);
+ String path = calendar.getHref();
DavPropertyNameSet properties = new
DavPropertyNameSet();
properties.add(DavPropertyName.RESOURCETYPE);
@@ -477,12 +475,12 @@ private boolean initCalendar(HttpClient client,
OmCalendar calendar) {
properties.add(CtagHandler.DNAME_GETCTAG);
properties.add(WebDAVSyncHandler.DNAME_SYNCTOKEN);
- propFindMethod = new PropFindMethod(path,
properties, CalDAVConstants.DEPTH_0);
- client.executeMethod(propFindMethod);
+ propFindMethod = new HttpPropfind(path,
properties, CalDAVConstants.DEPTH_0);
+ HttpResponse httpResponse =
client.execute(propFindMethod, context);
- if (propFindMethod.succeeded()) {
+ if (propFindMethod.succeeded(httpResponse)) {
- for (MultiStatusResponse response :
propFindMethod.getResponseBodyAsMultiStatus().getResponses()) {
+ for (MultiStatusResponse response :
propFindMethod.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
DavPropertySet set =
response.getProperties(SC_OK);
if (calendar.getTitle() ==
null) {
@@ -501,10 +499,10 @@ private boolean initCalendar(HttpClient client,
OmCalendar calendar) {
}
}
- syncItem(client, calendar);
+ syncItem(client, context, calendar);
return true;
} else {
- log.error("Error executing PROPFIND
Method, with status Code: {}", propFindMethod.getStatusCode());
+ log.error("Error executing PROPFIND
Method, with status Code: {}", httpResponse.getStatusLine().getStatusCode());
calendar.setSyncType(SyncType.NONE);
}
@@ -514,7 +512,7 @@ private boolean initCalendar(HttpClient client, OmCalendar
calendar) {
log.error("Severe Error in executing
OptionsMethod during testConnection.", e);
} finally {
if (propFindMethod != null) {
- propFindMethod.releaseConnection();
+ propFindMethod.reset();
}
}
}
@@ -530,20 +528,20 @@ private boolean initCalendar(HttpClient client,
OmCalendar calendar) {
* @param appointment Appointment to create/update.
* @return <code>true</code> in case item was updated
*/
- public boolean updateItem(HttpClient client, Appointment appointment) {
+ public boolean updateItem(HttpClient client, HttpClientContext context,
Appointment appointment) {
cleanupIdleConnections();
OmCalendar calendar = appointment.getCalendar();
SyncType type = calendar.getSyncType();
if (type != SyncType.NONE && type != SyncType.GOOGLE_CALENDAR) {
CalendarHandler calendarHandler;
- String path =
ensureTrailingSlash(getPathfromCalendar(client, calendar));
+ String path = ensureTrailingSlash(calendar.getHref());
switch (type) {
case WEBDAV_SYNC:
case CTAG:
case ETAG:
- calendarHandler = new
EtagsHandler(path, calendar, client, appointmentDao, utils);
+ calendarHandler = new
EtagsHandler(path, calendar, client, context, appointmentDao, utils);
break;
default:
return false;
@@ -562,7 +560,7 @@ public boolean updateItem(HttpClient client, Appointment
appointment) {
* @param appointment Appointment to Delete
* @return <code>true</code> in case item was deleted
*/
- public boolean deleteItem(HttpClient client, Appointment appointment) {
+ public boolean deleteItem(HttpClient client, HttpClientContext context,
Appointment appointment) {
cleanupIdleConnections();
OmCalendar calendar = appointment.getCalendar();
@@ -570,13 +568,13 @@ public boolean deleteItem(HttpClient client, Appointment
appointment) {
if (type != SyncType.NONE && type != SyncType.GOOGLE_CALENDAR) {
CalendarHandler calendarHandler;
- String path = getPathfromCalendar(client, calendar);
+ String path = calendar.getHref();
switch (type) {
case WEBDAV_SYNC:
case CTAG:
case ETAG:
- calendarHandler = new
EtagsHandler(path, calendar, client, appointmentDao, utils);
+ calendarHandler = new
EtagsHandler(path, calendar, client, context, appointmentDao, utils);
break;
default:
return false;
@@ -602,7 +600,7 @@ public static String getTokenFromProperty(DavProperty<?>
property) {
*/
public void cleanupIdleConnections() {
if (connmanager != null) {
-
connmanager.closeIdleConnections(IDLE_CONNECTION_TIMEOUT);
+
connmanager.closeIdleConnections(IDLE_CONNECTION_TIMEOUT, TimeUnit.SECONDS);
}
}
@@ -611,7 +609,7 @@ public void cleanupIdleConnections() {
*/
@PreDestroy
public void destroy() {
- MultiThreadedHttpConnectionManager.shutdownAll();
+ connmanager.shutdown();
connmanager = null;
}
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
index 738e7c921e..fe96d1af56 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
@@ -25,9 +25,11 @@
import java.text.ParsePosition;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.NoSuchElementException;
+import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;
@@ -217,7 +219,9 @@ private Appointment
addVEventPropertiestoAppointment(Appointment a, CalendarComp
}
}
- List<MeetingMember> attList = a.getMeetingMembers() == null ?
new ArrayList<>() : a.getMeetingMembers();
+ Set<MeetingMember> attList = a.getMeetingMembers() == null ?
new HashSet<>()
+ : new HashSet<>(a.getMeetingMembers());
+ String organizerEmail = null;
//Note this value can be repeated in attendees as well.
if (organizer != null) {
@@ -226,13 +230,17 @@ private Appointment
addVEventPropertiestoAppointment(Appointment a, CalendarComp
//If the value of the organizer is an email
if ("mailto".equals(uri.getScheme())) {
String email = uri.getSchemeSpecificPart();
- //Contact or exist and owner
- User org = userDao.getByEmail(email);
- if (org == null) {
- org = userDao.getContact(email,
a.getOwner());
- attList.add(createMeetingMember(a,
org));
- } else if
(!org.getId().equals(a.getOwner().getId())) {
- attList.add(createMeetingMember(a,
org));
+
+ organizerEmail = email;
+ if
(!email.equals(a.getOwner().getAddress().getEmail())) {
+ //Contact or exist and owner
+ User org = userDao.getByEmail(email);
+ if (org == null) {
+ org = userDao.getContact(email,
a.getOwner());
+
attList.add(createMeetingMember(a, org));
+ } else if
(!org.getId().equals(a.getOwner().getId())) {
+
attList.add(createMeetingMember(a, org));
+ }
}
}
}
@@ -242,16 +250,24 @@ private Appointment
addVEventPropertiestoAppointment(Appointment a, CalendarComp
URI uri = URI.create(attendee.getValue());
if ("mailto".equals(uri.getScheme())) {
String email =
uri.getSchemeSpecificPart();
+
+ Role role =
attendee.getParameter(Role.CHAIR.getName());
+ if (role != null &&
role.getValue().equals(Role.CHAIR.getValue())
+ &&
email.equals(organizerEmail)) {
+ continue;
+ }
+
User u = userDao.getByEmail(email);
if (u == null) {
u = userDao.getContact(email,
a.getOwner());
}
attList.add(createMeetingMember(a, u));
+
}
}
}
- a.setMeetingMembers(attList.isEmpty() ? null : attList);
+ a.setMeetingMembers(attList.isEmpty() ? null : new
ArrayList<>(attList));
return a;
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/AbstractCalendarHandler.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/AbstractCalendarHandler.java
index a3a39d13b9..8e8b0b0740 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/AbstractCalendarHandler.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/AbstractCalendarHandler.java
@@ -23,9 +23,11 @@
import java.util.List;
import java.util.Map;
-import org.apache.commons.httpclient.HttpClient;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.jackrabbit.webdav.DavException;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
import org.apache.openmeetings.db.entity.calendar.Appointment;
import org.apache.openmeetings.db.entity.calendar.OmCalendar;
@@ -40,6 +42,7 @@
private static final Logger log =
LoggerFactory.getLogger(AbstractCalendarHandler.class);
protected HttpClient client;
+ protected HttpClientContext context;
protected OmCalendar calendar;
protected String path;
protected IcalUtils utils;
@@ -47,26 +50,36 @@
protected AppointmentDao appointmentDao;
public AbstractCalendarHandler(String path, OmCalendar calendar,
HttpClient client,
- AppointmentDao appointmentDao, IcalUtils utils)
+ HttpClientContext context,
AppointmentDao appointmentDao,
+ IcalUtils utils)
{
this.path = path;
this.calendar = calendar;
this.client = client;
+ this.context = context;
this.appointmentDao = appointmentDao;
this.utils = utils;
}
- public static Map<String, Appointment> listToMap(List<String> keys,
List<Appointment> values) {
+ /**
+ * Converts a list of appointments to a {@link HashMap} with the Href
as the key
+ * @param appointments Appointments to map
+ * @return Map of Hrefs to Appointments
+ */
+ static Map<String, Appointment> listToMap(List<Appointment>
appointments) {
Map<String, Appointment> map = new HashMap<>();
- for (int i = 0; i < keys.size(); ++i) {
- map.put(keys.get(i), values.get(i));
+ for(Appointment a : appointments) {
+ map.put(a.getHref(), a);
}
return map;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public OmCalendar syncItems() {
- DavMethodBase method = null;
+ BaseDavRequest method = null;
try {
method = internalSyncItems();
} catch (IOException | DavException e) {
@@ -79,11 +92,22 @@ public OmCalendar syncItems() {
return calendar;
}
- void releaseConnection(DavMethodBase method) {
+ /**
+ * Resets the Method for reusablility.
+ * @param method Method to reset.
+ */
+ void releaseConnection(HttpRequestBase method) {
if (method != null) {
- method.releaseConnection();
+ method.reset();
}
}
- abstract DavMethodBase internalSyncItems() throws IOException,
DavException;
+ /**
+ * Abstract method for syncing, this is implemented by subclasses to
+ * perform the actual syncing.
+ * @return Method which performed the execution.
+ * @throws IOException on error
+ * @throws DavException on error
+ */
+ abstract BaseDavRequest internalSyncItems() throws IOException,
DavException;
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
index ac0453ef15..e05216ec95 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
@@ -18,14 +18,14 @@
*/
package org.apache.openmeetings.service.calendar.caldav.handler;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-
-import java.io.IOException;
-
-import org.apache.commons.httpclient.HttpClient;
+import com.github.caldav4j.CalDAVConstants;
+import com.github.caldav4j.methods.HttpPropFindMethod;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
import org.apache.jackrabbit.webdav.property.DavPropertySet;
@@ -35,11 +35,13 @@
import org.apache.openmeetings.db.entity.calendar.OmCalendar;
import org.apache.openmeetings.service.calendar.caldav.AppointmentManager;
import org.apache.openmeetings.service.calendar.caldav.IcalUtils;
-import org.osaf.caldav4j.CalDAVConstants;
-import org.osaf.caldav4j.methods.PropFindMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.IOException;
+
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+
/**
* Class for Syncing through the help of Ctags.
* It checks if the Ctag of the Calendar has changed.
@@ -53,46 +55,48 @@
public static final Namespace NAMESPACE_CALSERVER =
Namespace.getNamespace("cs", "http://calendarserver.org/ns/");
public static final DavPropertyName DNAME_GETCTAG =
DavPropertyName.create("getctag", NAMESPACE_CALSERVER);
- public CtagHandler(String path, OmCalendar calendar, HttpClient client,
AppointmentDao appointmentDao, IcalUtils utils) {
- super(path, calendar, client, appointmentDao, utils);
+ public CtagHandler(String path, OmCalendar calendar, HttpClient client,
+ HttpClientContext context, AppointmentDao
appointmentDao,
+ IcalUtils utils) {
+ super(path, calendar, client, context, appointmentDao, utils);
}
@Override
- DavMethodBase internalSyncItems() throws IOException, DavException {
+ BaseDavRequest internalSyncItems() throws IOException, DavException {
//Calendar already inited.
DavPropertyNameSet properties = new DavPropertyNameSet();
properties.add(DNAME_GETCTAG);
- PropFindMethod method = new PropFindMethod(path, properties,
CalDAVConstants.DEPTH_0);
- client.executeMethod(method);
+ HttpPropFindMethod method = new HttpPropFindMethod(path,
properties, CalDAVConstants.DEPTH_0);
+ HttpResponse httpResponse = client.execute(method, context);
- if (method.succeeded()) {
- for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus().getResponses()) {
+ if (method.succeeded(httpResponse)) {
+ for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
DavPropertySet set =
response.getProperties(SC_OK);
String ctag =
AppointmentManager.getTokenFromProperty(set.get(DNAME_GETCTAG));
if (ctag != null &&
!ctag.equals(calendar.getToken())) {
- EtagsHandler etagsHandler = new
EtagsHandler(path, calendar, client, appointmentDao, utils);
+ EtagsHandler etagsHandler = new
EtagsHandler(path, calendar, client, context, appointmentDao, utils);
etagsHandler.syncItems();
calendar.setToken(ctag);
}
}
} else {
- log.error("Error executing PROPFIND Method, with status
Code: {}", method.getStatusCode());
+ log.error("Error executing PROPFIND Method, with status
Code: {}", httpResponse.getStatusLine().getStatusCode());
}
return method;
}
@Override
public boolean updateItem(Appointment appointment) {
- EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, appointmentDao, utils);
+ EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, context, appointmentDao, utils);
return etagsHandler.updateItem(appointment);
}
@Override
public boolean deleteItem(Appointment appointment) {
- EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, appointmentDao, utils);
+ EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, context, appointmentDao, utils);
return etagsHandler.deleteItem(appointment);
}
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
index fceea13141..030db74576 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
@@ -18,22 +18,23 @@
*/
package org.apache.openmeetings.service.calendar.caldav.handler;
-import static javax.servlet.http.HttpServletResponse.SC_CREATED;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.IOException;
-import java.util.ArrayList;
+import java.net.URI;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
@@ -42,18 +43,20 @@
import org.apache.openmeetings.db.entity.calendar.OmCalendar.SyncType;
import org.apache.openmeetings.service.calendar.caldav.IcalUtils;
import org.apache.wicket.util.string.Strings;
-import org.osaf.caldav4j.CalDAVConstants;
-import org.osaf.caldav4j.methods.CalDAVReportMethod;
-import org.osaf.caldav4j.methods.DeleteMethod;
-import org.osaf.caldav4j.methods.PutMethod;
-import org.osaf.caldav4j.model.request.CalendarData;
-import org.osaf.caldav4j.model.request.CalendarQuery;
-import org.osaf.caldav4j.model.request.CompFilter;
-import org.osaf.caldav4j.model.response.CalendarDataProperty;
-import org.osaf.caldav4j.util.UrlUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.caldav4j.CalDAVConstants;
+import com.github.caldav4j.methods.HttpCalDAVReportMethod;
+import com.github.caldav4j.methods.HttpDeleteMethod;
+import com.github.caldav4j.methods.HttpPutMethod;
+import com.github.caldav4j.model.request.CalendarData;
+import com.github.caldav4j.model.request.CalendarQuery;
+import com.github.caldav4j.model.request.CalendarRequest;
+import com.github.caldav4j.model.request.CompFilter;
+import com.github.caldav4j.model.response.CalendarDataProperty;
+import com.github.caldav4j.util.UrlUtils;
+
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Component;
@@ -73,15 +76,27 @@
public class EtagsHandler extends AbstractCalendarHandler {
private static final Logger log =
LoggerFactory.getLogger(EtagsHandler.class);
- public EtagsHandler(String path, OmCalendar calendar, HttpClient
client, AppointmentDao appointmentDao, IcalUtils utils) {
- super(path, calendar, client, appointmentDao, utils);
+ /**
+ * @param uri URI to provide the host and scheme
+ * @param path Path to append to host
+ * @return Returns the full path, based on the URI as host and the path
provided
+ */
+ private static String getFullPath(URI uri, String path) {
+ return uri.getScheme() + "://" + uri.getAuthority() + path;
+ }
+
+ public EtagsHandler(String path, OmCalendar calendar, HttpClient client,
+ HttpClientContext context, AppointmentDao
appointmentDao, IcalUtils utils) {
+ super(path, calendar, client, context, appointmentDao, utils);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
- DavMethodBase internalSyncItems() throws IOException, DavException {
+ BaseDavRequest internalSyncItems() throws IOException, DavException {
Long ownerId = this.calendar.getOwner().getId();
- Map<String, Appointment> map =
listToMap(appointmentDao.getHrefsbyCalendar(calendar.getId()),
- appointmentDao.getbyCalendar(calendar.getId()));
+ Map<String, Appointment> map =
listToMap(appointmentDao.getbyCalendar(calendar.getId()));
DavPropertyNameSet properties = new DavPropertyNameSet();
properties.add(DavPropertyName.GETETAG);
@@ -89,11 +104,11 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
CompFilter vcalendar = new CompFilter(Calendar.VCALENDAR);
vcalendar.addCompFilter(new CompFilter(Component.VEVENT));
- CalendarQuery query = new CalendarQuery(properties, vcalendar,
map.isEmpty() ? new CalendarData() : null, false, false);
- CalDAVReportMethod method = new CalDAVReportMethod(path, query,
CalDAVConstants.DEPTH_1);
- client.executeMethod(method);
- if (method.succeeded()) {
- MultiStatusResponse[] multiStatusResponses =
method.getResponseBodyAsMultiStatus().getResponses();
+ CalendarQuery query = new CalendarQuery(properties, vcalendar,
new CalendarData(), false, false);
+ HttpCalDAVReportMethod method = new
HttpCalDAVReportMethod(path, query, CalDAVConstants.DEPTH_1);
+ HttpResponse httpResponse = client.execute(method, context);
+ if (method.succeeded(httpResponse)) {
+ MultiStatusResponse[] multiStatusResponses =
method.getResponseBodyAsMultiStatus(httpResponse).getResponses();
if (map.isEmpty()) {
//Initializing the Calendar for the first time.
@@ -110,7 +125,6 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
}
} else {
//Calendar has been inited before
- List<String> currenthrefs = new ArrayList<>();
for (MultiStatusResponse response :
multiStatusResponses) {
if
(response.getStatus()[0].getStatusCode() == SC_OK) {
@@ -123,12 +137,19 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
//If etag is modified
if
(!currentetag.equals(origetag)) {
-
currenthrefs.add(appointment.getHref());
+ Calendar
calendar = CalendarDataProperty.getCalendarfromResponse(response);
+ appointment =
utils.parseCalendartoAppointment(appointment, calendar, currentetag);
+
appointmentDao.update(appointment, ownerId);
}
map.remove(response.getHref());
} else {
// The orig list of
events doesn't contain this event.
-
currenthrefs.add(response.getHref());
+ String etag =
CalendarDataProperty.getEtagfromResponse(response);
+ Calendar ical =
CalendarDataProperty.getCalendarfromResponse(response);
+ Appointment
appointments = utils.parseCalendartoAppointment(
+ ical,
response.getHref(), etag, calendar);
+
+
appointmentDao.update(appointments, ownerId);
}
}
}
@@ -137,19 +158,16 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
for (Map.Entry<String, Appointment> entry :
map.entrySet()) {
appointmentDao.delete(entry.getValue(),
ownerId);
}
-
- //Get the rest of the events through a Multiget
Handler.
- MultigetHandler multigetHandler = new
MultigetHandler(currenthrefs, path,
- calendar, client,
appointmentDao, utils);
- releaseConnection(method);
- return multigetHandler.internalSyncItems();
}
} else {
- log.error("Report Method return Status: {} for calId {}
", method.getStatusCode(), calendar.getId());
+ log.error("Report Method return Status: {} for calId {}
", httpResponse.getStatusLine().getStatusCode(), calendar.getId());
}
return method;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean updateItem(Appointment appointment) {
OmCalendar calendar = appointment.getCalendar();
@@ -158,38 +176,36 @@ public boolean updateItem(Appointment appointment) {
if (calendar != null && calendar.getSyncType() !=
SyncType.NONE) {
//Store new Appointment on the server
- PutMethod putMethod = null;
+ HttpPutMethod putMethod = null;
try {
List<String> hrefs = null;
CalendarOutputter calendarOutputter = new
CalendarOutputter();
+ String temp = null;
Calendar ical =
utils.parseAppointmenttoCalendar(appointment);
-
- putMethod = new PutMethod();
- putMethod.setRequestBody(ical);
-
putMethod.setCalendarOutputter(calendarOutputter);
+ CalendarRequest cr = new CalendarRequest(ical);
if (Strings.isEmpty(appointment.getHref())) {
- String temp = path +
appointment.getIcalId() + ".ics";
+ temp = this.path +
appointment.getIcalId() + ".ics";
temp =
UrlUtils.removeDoubleSlashes(temp);
- putMethod.setPath(temp);
- putMethod.setIfNoneMatch(true);
- putMethod.setAllEtags(true);
+ cr.setIfNoneMatch(true);
+ cr.setAllEtags(true);
} else {
-
putMethod.setPath(appointment.getHref());
- putMethod.setIfMatch(true);
-
putMethod.addEtag(appointment.getEtag());
+ temp =
getFullPath(URI.create(this.path), appointment.getHref());
+ cr.setIfMatch(true);
+ cr.addEtag(appointment.getEtag());
}
- client.executeMethod(putMethod);
+ putMethod = new HttpPutMethod(temp, cr,
calendarOutputter);
+
+ HttpResponse httpResponse =
client.execute(putMethod, context);
- if (putMethod.getStatusCode() == SC_CREATED ||
- putMethod.getStatusCode() ==
SC_NO_CONTENT) {
- href = putMethod.getPath();
+ if (putMethod.succeeded(httpResponse)) {
+ href = putMethod.getURI().getPath(); //
Set the href as the path
appointment.setHref(href);
//Check if the ETag header was returned.
- Header etagh =
putMethod.getResponseHeader("ETag");
+ Header etagh =
putMethod.getFirstHeader("ETag");
if (etagh == null)
hrefs =
Collections.singletonList(appointment.getHref());
else {
@@ -203,7 +219,7 @@ public boolean updateItem(Appointment appointment) {
//Get new etags for the ones which didn't
return an ETag header
MultigetHandler multigetHandler = new
MultigetHandler(hrefs, true, path,
- calendar, client,
appointmentDao, utils);
+ calendar, client, context,
appointmentDao, utils);
multigetHandler.syncItems();
return true;
} catch (IOException e) {
@@ -211,9 +227,7 @@ public boolean updateItem(Appointment appointment) {
} catch (Exception e) {
log.error("Severe Error in executing
OptionsMethod during testConnection.", e);
} finally {
- if (putMethod != null) {
- putMethod.releaseConnection();
- }
+ releaseConnection(putMethod);
}
}
@@ -221,21 +235,30 @@ public boolean updateItem(Appointment appointment) {
}
/**
- * @see CalendarHandler#deleteItem(Appointment)
+ * {@inheritDoc}
*/
@Override
public boolean deleteItem(Appointment appointment) {
- if (calendar != null && calendar.getSyncType() != SyncType.NONE
&& !Strings.isEmpty(appointment.getHref())) {
- DeleteMethod deleteMethod = null;
+ if (calendar != null && calendar.getSyncType() !=
SyncType.NONE) {
+ HttpDeleteMethod deleteMethod = null;
try {
- deleteMethod = new
DeleteMethod(appointment.getHref(), appointment.getEtag());
- log.info("Deleting at location: {} with ETag:
{}", appointment.getHref(), appointment.getEtag());
+ String fullPath;
+ if (Strings.isEmpty(appointment.getHref())) {
+ // Make sure to set HREF just in case,
if calendar exists but no href does.
+ fullPath = this.path +
appointment.getIcalId() + ".ics";
+ } else {
+ fullPath =
getFullPath(URI.create(this.path), appointment.getHref());
+ }
+
+ deleteMethod = new HttpDeleteMethod(fullPath,
appointment.getEtag());
- client.executeMethod(deleteMethod);
+ log.info("Deleting at location: {} with ETag:
{}", fullPath, appointment.getEtag());
- int status = deleteMethod.getStatusCode();
+ HttpResponse response =
client.execute(deleteMethod, context);
+
+ int status =
response.getStatusLine().getStatusCode();
if (status == SC_NO_CONTENT || status == SC_OK
|| status == SC_NOT_FOUND) {
log.info("Successfully deleted
appointment with id: " + appointment.getId());
return true;
@@ -247,9 +270,7 @@ public boolean deleteItem(Appointment appointment) {
} catch (Exception e) {
log.error("Severe Error in executing
OptionsMethod during testConnection.", e);
} finally {
- if (deleteMethod != null) {
- deleteMethod.releaseConnection();
- }
+ releaseConnection(deleteMethod);
}
}
return false;
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
index 752eb98b09..50d886ab42 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
@@ -24,10 +24,12 @@
import java.util.List;
import java.util.Map;
-import org.apache.commons.httpclient.HttpClient;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
@@ -35,22 +37,24 @@
import org.apache.openmeetings.db.entity.calendar.OmCalendar;
import org.apache.openmeetings.db.entity.calendar.OmCalendar.SyncType;
import org.apache.openmeetings.service.calendar.caldav.IcalUtils;
-import org.osaf.caldav4j.CalDAVConstants;
-import org.osaf.caldav4j.methods.CalDAVReportMethod;
-import org.osaf.caldav4j.model.request.CalendarData;
-import org.osaf.caldav4j.model.request.CalendarMultiget;
-import org.osaf.caldav4j.model.request.CompFilter;
-import org.osaf.caldav4j.model.response.CalendarDataProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.caldav4j.CalDAVConstants;
+import com.github.caldav4j.methods.HttpCalDAVReportMethod;
+import com.github.caldav4j.model.request.CalendarData;
+import com.github.caldav4j.model.request.CalendarMultiget;
+import com.github.caldav4j.model.request.CompFilter;
+import com.github.caldav4j.model.response.CalendarDataProperty;
+
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Component;
/**
- * Class used to sync a given list of hrefs and update or add new
Appointments, whenever feasible.
- * This class cannot be used to update or delete Appointments, which are
handled seperately.
- * We use the Calendar-Multiget Report Method to handle this type of query.
+ * Class used to sync a given list of hrefs and update or add new Appointments,
+ * whenever feasible. This class cannot be used to update or delete
Appointments,
+ * which are handled seperately. We use the Calendar-Multiget Report Method to
+ * handle this type of query.
*
* @see CalendarHandler
*/
@@ -60,9 +64,11 @@
private CalendarMultiget query;
private boolean isMultigetDisabled = false, onlyEtag = false;
- public MultigetHandler(List<String> hrefs, boolean onlyEtag, String
path, OmCalendar calendar, HttpClient client,
- AppointmentDao appointmentDao, IcalUtils utils) {
- super(path, calendar, client, appointmentDao, utils);
+ public MultigetHandler(List<String> hrefs, boolean onlyEtag, String
path,
+ OmCalendar calendar, HttpClient client,
+ HttpClientContext context, AppointmentDao
appointmentDao,
+ IcalUtils utils) {
+ super(path, calendar, client, context, appointmentDao, utils);
this.onlyEtag = onlyEtag;
if (hrefs == null || hrefs.isEmpty() || calendar.getSyncType()
== SyncType.NONE) {
@@ -82,25 +88,25 @@ public MultigetHandler(List<String> hrefs, boolean
onlyEtag, String path, OmCale
}
}
- public MultigetHandler(List<String> hrefs, String path, OmCalendar
calendar, HttpClient client,
- AppointmentDao appointmentDao, IcalUtils utils)
+ public MultigetHandler(List<String> hrefs, String path, OmCalendar
calendar,
+ HttpClient client, HttpClientContext context,
+ AppointmentDao appointmentDao, IcalUtils utils)
{
- this(hrefs, false, path, calendar, client, appointmentDao,
utils);
+ this(hrefs, false, path, calendar, client, context,
appointmentDao, utils);
}
@Override
- DavMethodBase internalSyncItems() throws IOException, DavException {
+ BaseDavRequest internalSyncItems() throws IOException, DavException {
Long ownerId = this.calendar.getOwner().getId();
if (!isMultigetDisabled) {
- CalDAVReportMethod method = new
CalDAVReportMethod(path, query, CalDAVConstants.DEPTH_1);
+ HttpCalDAVReportMethod method = new
HttpCalDAVReportMethod(path, query, CalDAVConstants.DEPTH_1);
- client.executeMethod(method);
- if (method.succeeded()) {
+ HttpResponse httpResponse = client.execute(method,
context);
+ if (method.succeeded(httpResponse)) {
//Map for each Href as key and Appointment as
Value.
- Map<String, Appointment> map =
listToMap(appointmentDao.getHrefsbyCalendar(calendar.getId()),
-
appointmentDao.getbyCalendar(calendar.getId()));
+ Map<String, Appointment> map =
listToMap(appointmentDao.getbyCalendar(calendar.getId()));
- for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus().getResponses()) {
+ for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
if
(response.getStatus()[0].getStatusCode() == SC_OK) {
Appointment a =
map.get(response.getHref());
@@ -132,7 +138,7 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
}
}
} else {
- log.error("Report Method return Status: {} for
calId {}", method.getStatusCode(), calendar.getId());
+ log.error("Report Method return Status: {} for
calId {}", httpResponse.getStatusLine().getStatusCode(), calendar.getId());
}
return method;
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
index 274bc48740..9c8eac7be2 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
@@ -19,21 +19,21 @@
package org.apache.openmeetings.service.calendar.caldav.handler;
+import static
com.github.caldav4j.util.CalDAVStatus.SC_INSUFFICIENT_SPACE_ON_RESOURCE;
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
-import static
org.apache.jackrabbit.webdav.DavServletResponse.SC_INSUFFICIENT_SPACE_ON_RESOURCE;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Map;
-import org.apache.commons.httpclient.HttpClient;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
@@ -42,10 +42,14 @@
import org.apache.openmeetings.service.calendar.caldav.IcalUtils;
import org.apache.openmeetings.service.calendar.caldav.methods.SyncMethod;
import org.apache.openmeetings.service.calendar.caldav.methods.SyncReportInfo;
-import org.osaf.caldav4j.model.response.CalendarDataProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.caldav4j.CalDAVConstants;
+import com.github.caldav4j.model.response.CalendarDataProperty;
+
+import net.fortuna.ical4j.model.Calendar;
+
/**
* Class used to sync events using WebDAV-Sync defined in RFC 6578.
* This handles the additional HTTP Status Code 507, which specifies for
further sync required.
@@ -58,30 +62,37 @@
public static final DavPropertyName DNAME_SYNCTOKEN =
DavPropertyName.create(SyncReportInfo.XML_SYNC_TOKEN,
SyncReportInfo.NAMESPACE);
- public WebDAVSyncHandler(String path, OmCalendar calendar, HttpClient
client, AppointmentDao appointmentDao, IcalUtils utils) {
- super(path, calendar, client, appointmentDao, utils);
+ public WebDAVSyncHandler(String path, OmCalendar calendar, HttpClient
client,
+ HttpClientContext context, AppointmentDao
appointmentDao,
+ IcalUtils utils) {
+ super(path, calendar, client, context, appointmentDao, utils);
}
+ /**
+ * Sync using WebDAV-Sync.
+ * @throws IOException on error
+ * @throws DavException on error
+ */
@Override
- DavMethodBase internalSyncItems() throws IOException, DavException {
+ BaseDavRequest internalSyncItems() throws IOException, DavException {
+ Long ownerId = this.calendar.getOwner().getId();
boolean additionalSyncNeeded = false;
DavPropertyNameSet properties = new DavPropertyNameSet();
properties.add(DavPropertyName.GETETAG);
+ properties.add(CalDAVConstants.DNAME_CALENDAR_DATA); // To
return Calendar Data.
//Create report to get
SyncReportInfo reportInfo = new
SyncReportInfo(calendar.getToken(), properties, SyncReportInfo.SYNC_LEVEL_1);
SyncMethod method = new SyncMethod(path, reportInfo);
- client.executeMethod(method);
+ HttpResponse httpResponse = client.execute(method, context);
- if (method.succeeded()) {
- List<String> currenthrefs = new ArrayList<>();
+ if (method.succeeded(httpResponse)) {
//Map of Href and the Appointments, belonging to it.
- Map<String, Appointment> map =
listToMap(appointmentDao.getHrefsbyCalendar(calendar.getId()),
-
appointmentDao.getbyCalendar(calendar.getId()));
+ Map<String, Appointment> map =
listToMap(appointmentDao.getbyCalendar(calendar.getId()));
- for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus().getResponses()) {
+ for (MultiStatusResponse response :
method.getResponseBodyAsMultiStatus(httpResponse).getResponses()) {
int status =
response.getStatus()[0].getStatusCode();
if (status == SC_OK) {
Appointment a =
map.get(response.getHref());
@@ -89,15 +100,22 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
if (a != null) {
//Old Event to get
String origetag = a.getEtag(),
- currentetag =
CalendarDataProperty.getEtagfromResponse(response);
+ currentetag =
CalendarDataProperty
+
.getEtagfromResponse(response);
//If event modified, only then
get it.
if
(!currentetag.equals(origetag)) {
-
currenthrefs.add(response.getHref());
+ Calendar calendar =
CalendarDataProperty.getCalendarfromResponse(response);
+ a =
utils.parseCalendartoAppointment(a, calendar, currentetag);
+
appointmentDao.update(a, ownerId);
}
} else {
//New Event, to get
-
currenthrefs.add(response.getHref());
+ String etag =
CalendarDataProperty.getEtagfromResponse(response);
+ Calendar ical =
CalendarDataProperty.getCalendarfromResponse(response);
+ Appointment appointments =
utils.parseCalendartoAppointment(
+ ical,
response.getHref(), etag, calendar);
+
appointmentDao.update(appointments, ownerId);
}
} else if (status == SC_NOT_FOUND) {
//Delete the Appointments not found on
the server.
@@ -112,14 +130,10 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
}
}
-
- MultigetHandler multigetHandler = new
MultigetHandler(currenthrefs, path,
- calendar, client, appointmentDao,
utils);
- multigetHandler.syncItems();
-
//Set the new token
- calendar.setToken(method.getResponseSynctoken());
- } else if (method.getStatusCode() == SC_FORBIDDEN ||
method.getStatusCode() == SC_PRECONDITION_FAILED) {
+
calendar.setToken(method.getResponseSynctoken(httpResponse));
+ } else if (httpResponse.getStatusLine().getStatusCode() ==
SC_FORBIDDEN
+ || httpResponse.getStatusLine().getStatusCode()
== SC_PRECONDITION_FAILED) {
//Specific case where a server might sometimes forget
the sync token
//Thus requiring a full sync needed to be done.
@@ -127,7 +141,7 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
calendar.setToken(null);
additionalSyncNeeded = true;
} else {
- log.error("Error in Sync Method Response with status
code {}", method.getStatusCode());
+ log.error("Error in Sync Method Response with status
code {}", httpResponse.getStatusLine().getStatusCode());
}
if (additionalSyncNeeded) {
releaseConnection(method);
@@ -136,15 +150,27 @@ DavMethodBase internalSyncItems() throws IOException,
DavException {
return method;
}
+ /**
+ * {@inheritDoc}
+ * <br><br>
+ * Note: This Uses EtagsHandler for Updating.
+ */
@Override
public boolean updateItem(Appointment appointment) {
- EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, appointmentDao, utils);
+ EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, context,
+ appointmentDao, utils);
return etagsHandler.updateItem(appointment);
}
+ /**
+ * {@inheritDoc}
+ * <br><br>
+ * Note: This Uses EtagsHandler for Deleting.<br>
+ */
@Override
public boolean deleteItem(Appointment appointment) {
- EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, appointmentDao, utils);
+ EtagsHandler etagsHandler = new EtagsHandler(path, calendar,
client, context,
+ appointmentDao, utils);
return etagsHandler.deleteItem(appointment);
}
}
diff --git
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/methods/SyncMethod.java
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/methods/SyncMethod.java
index 696c2c9628..7508980344 100644
---
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/methods/SyncMethod.java
+++
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/methods/SyncMethod.java
@@ -19,16 +19,16 @@
package org.apache.openmeetings.service.calendar.caldav.methods;
import java.io.IOException;
+import java.net.URI;
-import org.apache.commons.httpclient.HttpConnection;
-import org.apache.commons.httpclient.HttpState;
+import org.apache.http.HttpResponse;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavMethods;
import org.apache.jackrabbit.webdav.DavServletResponse;
import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
-import org.apache.jackrabbit.webdav.client.methods.ReportMethod;
+import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest;
+import org.apache.jackrabbit.webdav.client.methods.XmlEntity;
import org.apache.jackrabbit.webdav.header.DepthHeader;
import org.apache.jackrabbit.webdav.xml.DomUtil;
import org.slf4j.Logger;
@@ -40,15 +40,16 @@
*
* @see SyncReportInfo for Request Report to be given as argument
*/
-public class SyncMethod extends DavMethodBase {
- private static final Logger log =
LoggerFactory.getLogger(ReportMethod.class);
+public class SyncMethod extends BaseDavRequest {
+ private static final Logger log =
LoggerFactory.getLogger(SyncMethod.class);
private MultiStatus multiStatus = null;
private String synctoken = null;
+ private boolean processedResponse = false;
- public SyncMethod(String uri, SyncReportInfo reportInfo) throws
IOException {
+ public SyncMethod(URI uri, SyncReportInfo reportInfo) throws
IOException {
super(uri);
- setRequestBody(reportInfo);
+ setEntity(XmlEntity.create(reportInfo));
if (reportInfo.getDepth() >= 0) {
parseDepth(reportInfo.getDepth());
@@ -57,6 +58,10 @@ public SyncMethod(String uri, SyncReportInfo reportInfo)
throws IOException {
log.info("Using the WEBDAV-SYNC method for syncing.");
}
+ public SyncMethod(String uri, SyncReportInfo reportInfo) throws
IOException {
+ this(URI.create(uri), reportInfo);
+ }
+
/**
* Used to add request header for Depth.
*
@@ -64,7 +69,8 @@ public SyncMethod(String uri, SyncReportInfo reportInfo)
throws IOException {
* Depth of the Request
*/
private void parseDepth(int depth) {
- addRequestHeader(new DepthHeader(depth));
+ DepthHeader dh = new DepthHeader(depth);
+ setHeader(dh.getHeaderName(), dh.getHeaderValue());
}
/**
@@ -81,21 +87,22 @@ public void setDepth(int depth) {
* Implements the Report Method.
*/
@Override
- public String getName() {
+ public String getMethod() {
return DavMethods.METHOD_REPORT;
}
/**
- * @see DavMethodBase#isSuccess
+ * @see BaseDavRequest#succeeded(HttpResponse)
* @return Return true only when when Response is Multistatus.
*/
@Override
- protected boolean isSuccess(int statusCode) {
- return statusCode == DavServletResponse.SC_MULTI_STATUS;
+ public boolean succeeded(HttpResponse response) {
+ return response.getStatusLine().getStatusCode() ==
DavServletResponse.SC_MULTI_STATUS;
}
- public String getResponseSynctoken() {
- checkUsed();
+ public String getResponseSynctoken(HttpResponse response) {
+ if (!processedResponse)
+ processResponseBody(response);
return synctoken;
}
@@ -103,45 +110,48 @@ public String getResponseSynctoken() {
* Adapted from DavMethodBase to handle MultiStatus responses.
*
* @return MultiStatus response
- * @throws IOException if the response body could not be parsed
- * @throws DavException in case of error
+ * @throws DavException if the response body could not be parsed
*/
@Override
- public MultiStatus getResponseBodyAsMultiStatus() throws IOException,
DavException {
- checkUsed();
+ public MultiStatus getResponseBodyAsMultiStatus(HttpResponse response)
throws DavException {
+ if (!processedResponse)
+ processResponseBody(response);
+
if (multiStatus != null) {
return multiStatus;
} else {
- DavException dx = getResponseException();
+ DavException dx = getResponseException(response);
if (dx != null) {
throw dx;
} else {
- throw new DavException(getStatusCode(),
getName() + " resulted with unexpected status: " + getStatusLine());
+ throw new
DavException(response.getStatusLine().getStatusCode(), getMethod() + " resulted
with unexpected status: " + response.getStatusLine());
}
}
}
/**
- * Overridden to process the sync-token. Adapted from DavMethodBase.
- *
- * @see DavMethodBase#processResponseBody(HttpState, HttpConnection)
+ * Process the sync-token, from the response.
*/
- @Override
- protected void processResponseBody(HttpState httpState, HttpConnection
httpConnection) {
- if (getStatusCode() == DavServletResponse.SC_MULTI_STATUS) {
+ protected void processResponseBody(HttpResponse response) {
+ if (!processedResponse && succeeded(response)) {
try {
- Document document = getResponseBodyAsDocument();
+ Document document =
getResponseBodyAsDocument(response.getEntity());
if (document != null) {
synctoken =
DomUtil.getChildText(document.getDocumentElement(),
SyncReportInfo.XML_SYNC_TOKEN, DavConstants.NAMESPACE);
log.info("Sync-Token for REPORT: " +
synctoken);
-
multiStatus =
MultiStatus.createFromXml(document.getDocumentElement());
- processMultiStatusBody(multiStatus,
httpState, httpConnection);
}
} catch (IOException e) {
log.error("Error while parsing sync-token.", e);
- setSuccess(false);
}
+
+ processedResponse = true;
}
}
+
+ @Override
+ public void reset() {
+ super.reset();
+ processedResponse = false;
+ }
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index 69df3c8e2c..0f7f84b20a 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -291,10 +291,11 @@ protected void onSubmit(AjaxRequestTarget target,
DialogButton btn) {
a.setStart(getDate(form.start.getModelObject()));
a.setEnd(getDate(form.end.getModelObject()));
a.setCalendar(form.cals.getModelObject());
- apptDao.update(a, getUserId());
if (a.getCalendar() != null) {
+ // Updates on the remote server and sets the href.
Should be before dao update
calendarPanel.updatedeleteAppointment(target,
CalendarDialog.DIALOG_TYPE.UPDATE_APPOINTMENT, a);
}
+ apptDao.update(a, getUserId());
target.add(feedback);
calendarPanel.refresh(target);
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
index 9931026d92..c3879639f0 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
@@ -23,8 +23,9 @@
import java.util.Arrays;
import java.util.List;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
import org.apache.openmeetings.db.entity.calendar.Appointment;
import org.apache.openmeetings.db.entity.calendar.OmCalendar;
@@ -214,6 +215,7 @@ protected void onSubmit(AjaxRequestTarget target,
DialogButton btn) {
OmCalendar c = form.getModelObject();
c.setHref(form.url.getModelObject());
HttpClient client =
calendarPanel.getHttpClient();
+ HttpClientContext context =
calendarPanel.getHttpClientContext();
if (form.gcal.getModelObject()) {
c.setSyncType(OmCalendar.SyncType.GOOGLE_CALENDAR);
@@ -222,11 +224,11 @@ protected void onSubmit(AjaxRequestTarget target,
DialogButton btn) {
calendarPanel.populateGoogleCalendar(c, target);
}
} else if (c.getId() == null &&
form.username.getModelObject() != null) {
- apptManager.provideCredentials(client,
c, new UsernamePasswordCredentials(form.username.getModelObject(),
+ apptManager.provideCredentials(context,
c, new UsernamePasswordCredentials(form.username.getModelObject(),
form.pass.getModelObject()));
}
- apptManager.createCalendar(client, c);
+ apptManager.createCalendar(client, context, c);
calendarPanel.refreshCalendars(target);
calendarPanel.refresh(target);
break;
@@ -259,11 +261,12 @@ protected void onSubmit(AjaxRequestTarget target,
DialogButton btn) {
*/
private void syncCalendar(OmCalendar c, IPartialPageRequestHandler
handler) {
HttpClient client = calendarPanel.getHttpClient();
+ HttpClientContext context =
calendarPanel.getHttpClientContext();
if (form.username.getModelObject() != null) {
- apptManager.provideCredentials(client, c, new
UsernamePasswordCredentials(form.username.getModelObject(),
+ apptManager.provideCredentials(context, c, new
UsernamePasswordCredentials(form.username.getModelObject(),
form.pass.getModelObject()));
}
- apptManager.syncItem(client, c);
+ apptManager.syncItem(client, context, c);
calendarPanel.refresh(handler);
log.trace("Calendar " + c.getTitle() + " Successfully synced.");
}
@@ -274,7 +277,7 @@ private void syncCalendar(OmCalendar c,
IPartialPageRequestHandler handler) {
* @param a Appointment to delete
*/
private void deleteAppointment(Appointment a) {
- apptManager.deleteItem(calendarPanel.getHttpClient(), a);
+ apptManager.deleteItem(calendarPanel.getHttpClient(),
calendarPanel.getHttpClientContext(), a);
appointment = null;
}
@@ -284,7 +287,7 @@ private void deleteAppointment(Appointment a) {
* @param a Appointment to update
*/
private void updateAppointment(Appointment a) {
- apptManager.updateItem(calendarPanel.getHttpClient(), a);
+ apptManager.updateItem(calendarPanel.getHttpClient(),
calendarPanel.getHttpClientContext(), a);
appointment = null;
}
@@ -307,7 +310,7 @@ private static boolean isOwner(OmCalendar object) {
private boolean setCalendarList(IPartialPageRequestHandler target) {
type = DIALOG_TYPE.SYNC_CALENDAR;
cals = apptManager.getCalendars(getUserId());
- apptManager.createHttpClient();
+ calendarPanel.getHttpClient();
calIndex = 0;
setButtons(target);
return setFormModelObject();
@@ -318,12 +321,13 @@ private boolean setFormModelObject() {
if (cals != null && !cals.isEmpty() && calIndex < cals.size()) {
OmCalendar calendar = cals.get(calIndex++);
HttpClient client = calendarPanel.getHttpClient();
- if (!apptManager.testConnection(client, calendar)) {
+ HttpClientContext context =
calendarPanel.getHttpClientContext();
+ if (!apptManager.testConnection(client, context,
calendar)) {
form.setModelObject(calendar);
form.url.setModelObject(calendar.getHref());
return true;
} else {
- apptManager.syncItem(client, calendar);
+ apptManager.syncItem(client, context, calendar);
return setFormModelObject();
}
}
@@ -335,7 +339,7 @@ private boolean setFormModelObject() {
// Sets the form model object if the calendar cannot be reached.
Returns true if model is set
private boolean setFormModelObject(Appointment a,
IPartialPageRequestHandler target) {
OmCalendar c = a.getCalendar();
- if (apptManager.testConnection(calendarPanel.getHttpClient(),
c)) {
+ if (apptManager.testConnection(calendarPanel.getHttpClient(),
calendarPanel.getHttpClientContext(), c)) {
return false;
}
@@ -579,13 +583,15 @@ protected void onValidate() {
calendar.setHref(url.getInput());
}
HttpClient client =
calendarPanel.getHttpClient();
-
apptManager.provideCredentials(client, calendar,
+ HttpClientContext
context = calendarPanel.getHttpClientContext();
+
+
apptManager.provideCredentials(context, calendar,
new
UsernamePasswordCredentials(username.getInput(), pass.getInput()));
- if
(apptManager.testConnection(client, calendar)) {
+ if
(apptManager.testConnection(client, context, calendar)) {
return;
}
} catch (Exception e) {
- log.error("Error
executing the TestConnection");
+ log.error("Error
executing the TestConnection", e);
}
error(getString("calendar.error"));
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
index 24a531ce62..eb89f298f6 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
@@ -30,8 +30,10 @@
import java.util.List;
import java.util.Optional;
-import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.lang3.StringUtils;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
import org.apache.openmeetings.db.dao.user.UserDao;
@@ -92,7 +94,13 @@ protected void onTimer(AjaxRequestTarget target) {
private CalendarDialog calendarDialog;
private AppointmentDialog dialog;
private final WebMarkupContainer calendarListContainer = new
WebMarkupContainer("calendarListContainer");
- private transient HttpClient client = null; // Non-Serializable
HttpClient.
+
+ // Non-Serializable HttpClient.
+ private transient HttpClient client = null;
+
+ // Context for the HttpClient. Mainly used for credentials.
+ private transient HttpClientContext context = null;
+
@SpringBean
private AppointmentDao apptDao;
@SpringBean
@@ -315,7 +323,7 @@ public void cleanup(IPartialPageRequestHandler handler) {
syncTimer.stop(handler);
if (client != null) {
apptManager.cleanupIdleConnections();
- client.getState().clear();
+ context.getCredentialsProvider().clear();
}
}
@@ -355,6 +363,15 @@ public HttpClient getHttpClient() {
return client;
}
+ public HttpClientContext getHttpClientContext() {
+ if (context == null) {
+ context = HttpClientContext.create();
+ context.setCredentialsProvider(new
BasicCredentialsProvider());
+ }
+
+ return context;
+ }
+
//Adds a new Event Source to the Calendar
public void populateGoogleCalendar(OmCalendar gcal,
IPartialPageRequestHandler target) {
calendar.addSource(new GoogleCalendar(gcal.getHref(),
gcal.getToken()));
diff --git a/pom.xml b/pom.xml
index e306cf8e31..3f306f881c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,7 +103,7 @@
<commons-collections4.version>4.2</commons-collections4.version>
<xstream.version>1.4.10</xstream.version>
<api-all.version>2.0.0.AM2</api-all.version>
- <caldav4j.version>0.9.1</caldav4j.version>
+ <caldav4j.version>1.0.0-rc.1</caldav4j.version>
<tika-parsers.version>1.19.1</tika-parsers.version>
<commons-text.version>1.6</commons-text.version>
<slf4j.version>1.7.25</slf4j.version>
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Upgrade AppointmentManager from HttpClient 3.x to 4.x
> -----------------------------------------------------
>
> Key: OPENMEETINGS-1636
> URL: https://issues.apache.org/jira/browse/OPENMEETINGS-1636
> Project: Openmeetings
> Issue Type: Improvement
> Components: HTML5/Calendar
> Reporter: Ankush Mishra
> Assignee: Ankush Mishra
> Priority: Minor
> Fix For: 4.0.7
>
>
> I had been waiting for
> [JCR-2406|https://issues.apache.org/jira/browse/JCR-2406] to close. Since,
> that has been completed for a couple of months, I opened another Issue for
> CalDAV4j [here|https://github.com/caldav4j/caldav4j/issues/63] , which I will
> try to first release to the Central Repo soon, with 3.x, after which I will
> get to work on the migration.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)