package org.exoplatform.extension.exchange.service; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.annotation.security.RolesAllowed; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import microsoft.exchange.webservices.data.Folder; import microsoft.exchange.webservices.data.FolderId; import org.exoplatform.common.http.HTTPStatus; import org.exoplatform.extension.exchange.listener.IntegrationListener; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.organization.OrganizationService; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.security.ConversationState; /** * * @author Boubaker Khanfir * */ @Path("/exchange") public class ExchangeRESTService implements ResourceContainer, Serializable { private static final long serialVersionUID = -8085801604143848875L; private static final Log LOG = ExoLogger.getLogger(ExchangeRESTService.class); static CacheControl cc = new CacheControl(); static { cc.setNoCache(true); cc.setNoStore(true); } private IntegrationListener integrationListener; private OrganizationService organizationService; public ExchangeRESTService(IntegrationListener integrationListener, OrganizationService organizationService) { this.integrationListener = integrationListener; this.organizationService = organizationService; } @GET @RolesAllowed("users") @Path("/calendars") @Produces({ MediaType.APPLICATION_JSON }) public Response getCalendars() throws Exception { // It must be a user present in the session because of RolesAllowed // annotation String username = ConversationState.getCurrent().getIdentity().getUserId(); try { List<FolderBean> beans = new ArrayList<FolderBean>(); IntegrationService service = IntegrationService.getInstance(username); if (service != null) { List<FolderId> folderIDs = service.getAllExchangeCalendars(); for (FolderId folderId : folderIDs) { Folder folder = service.getExchangeCalendar(folderId); if (folder != null) { boolean synchronizedFolder = service.isCalendarSynchronizedWithExchange(folderId.getUniqueId()); FolderBean bean = new FolderBean(folderId.getUniqueId(), folder.getDisplayName(), synchronizedFolder); beans.add(bean); } } } return Response.ok(beans).cacheControl(cc).build(); } catch (Exception e) { if (LOG.isTraceEnabled()) { LOG.trace("Exchange Inegration Service: Unable to retrieve list of calendars for user: '" + username + "'"); } return Response.ok().cacheControl(cc).build(); } } @GET @RolesAllowed("users") @Path("/syncNow") public Response synchronizeNow() throws Exception { // It must be a user present in the session because of RolesAllowed // annotation String username = ConversationState.getCurrent().getIdentity().getUserId(); integrationListener.synchronize(username); return Response.ok().build(); } @GET @RolesAllowed("users") @Path("/sync") public Response synchronizeFolderWithExo(@QueryParam("folderId") String folderIdString) throws Exception { if (folderIdString == null || folderIdString.isEmpty()) { LOG.warn("folderId parameter is null while synchronizing."); return Response.noContent().build(); } // It must be a user present in the session because of RolesAllowed // annotation String username = ConversationState.getCurrent().getIdentity().getUserId(); IntegrationService service = IntegrationService.getInstance(username); service.addFolderToSynchronization(folderIdString); integrationListener.synchronize(username); return Response.ok().build(); } @GET @RolesAllowed("users") @Path("/unsync") public Response unsynchronizeFolderWithExo(@QueryParam("folderId") String folderIdString) throws Exception { if (folderIdString == null || folderIdString.isEmpty()) { LOG.warn("folderId parameter is null while unsynchronizing"); return Response.noContent().build(); } // It must be a user present in the session because of RolesAllowed // annotation String username = ConversationState.getCurrent().getIdentity().getUserId(); IntegrationService service = IntegrationService.getInstance(username); service.deleteFolderFromSynchronization(folderIdString); integrationListener.synchronize(username); return Response.ok().build(); } @GET @RolesAllowed("users") @Path("/settings") @Produces(MediaType.APPLICATION_JSON) public Response getSettings() throws Exception { try { String username = ConversationState.getCurrent().getIdentity().getUserId(); UserSettings settings = new UserSettings(); String exchangeServerName = IntegrationService.getUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_SERVER_URL_ATTRIBUTE); String exchangeDomainName = IntegrationService.getUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_SERVER_DOMAIN_ATTRIBUTE); String exchangeUsername = IntegrationService.getUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_USERNAME_ATTRIBUTE); settings.setServerName(exchangeServerName == null ? integrationListener.exchangeServerURL : exchangeServerName); settings.setDomainName(exchangeDomainName == null ? integrationListener.exchangeDomain : exchangeDomainName); settings.setUsername(exchangeUsername == null ? username : exchangeUsername); return Response.ok(settings, MediaType.APPLICATION_JSON).cacheControl(cc).build(); } catch (Exception e) { return Response.status(HTTPStatus.INTERNAL_ERROR).cacheControl(cc).build(); } } @POST @RolesAllowed("users") @Path("/settings") @Consumes(MediaType.APPLICATION_JSON) public Response setSettings(UserSettings settings) throws Exception { try { String username = ConversationState.getCurrent().getIdentity().getUserId(); IntegrationService.setUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_SERVER_URL_ATTRIBUTE, settings.getServerName()); IntegrationService.setUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_SERVER_DOMAIN_ATTRIBUTE, settings.getDomainName()); IntegrationService.setUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_USERNAME_ATTRIBUTE, settings.getUsername()); IntegrationService.setUserArrtibute(organizationService, username, IntegrationService.USER_EXCHANGE_PASSWORD_ATTRIBUTE, settings.getPassword()); integrationListener.userLoggedOut(username); integrationListener.startExchangeSynchronizationTask(username, settings.getUsername(), settings.getPassword(), settings.getDomainName(), settings.getServerName()); return Response.ok().cacheControl(cc).build(); } catch (Exception e) { return Response.status(HTTPStatus.INTERNAL_ERROR).cacheControl(cc).build(); } } public static class FolderBean implements Serializable { private static final long serialVersionUID = 4517749353533921356L; String id; String name; boolean synchronizedFolder = false; public FolderBean(String id, String name, boolean synchronizedFolder) { this.id = id; this.name = name; this.synchronizedFolder = synchronizedFolder; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSynchronizedFolder() { return synchronizedFolder; } public void setSynchronizedFolder(boolean synchronizedFolder) { this.synchronizedFolder = synchronizedFolder; } } public static class UserSettings implements Serializable { private static final long serialVersionUID = -3248503274980906631L; private String serverName; private String domainName; private String username; private String password; public String getServerName() { return serverName; } public void setServerName(String serverName) { this.serverName = serverName; } public String getDomainName() { return domainName; } public void setDomainName(String domainName) { this.domainName = domainName; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } protected String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } }