diff --git a/config/alfresco/subsystems/googledocs/default/testBook.xls b/config/alfresco/subsystems/googledocs/default/testBook.xls new file mode 100644 index 0000000000..15d493339d Binary files /dev/null and b/config/alfresco/subsystems/googledocs/default/testBook.xls differ diff --git a/source/java/org/alfresco/model/ContentModel.java b/source/java/org/alfresco/model/ContentModel.java index 85830415a7..d31499c992 100644 --- a/source/java/org/alfresco/model/ContentModel.java +++ b/source/java/org/alfresco/model/ContentModel.java @@ -192,6 +192,7 @@ public interface ContentModel static final QName PROP_COMPANYFAX = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "companyfax"); static final QName PROP_COMPANYEMAIL = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "companyemail"); static final QName PROP_SKYPE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "skype"); + static final QName PROP_GOOGLEUSERNAME = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "googleusername"); static final QName PROP_INSTANTMSG = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "instantmsg"); static final QName PROP_SIZE_CURRENT = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "sizeCurrent"); diff --git a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java index 8d8d44927f..377ef481db 100755 --- a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java +++ b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java @@ -68,13 +68,14 @@ import com.google.gdata.util.ContentType; import com.google.gdata.util.ServiceException; /** - * + * Google docs integration service implementation */ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel { @SuppressWarnings("unused") private static Log logger = LogFactory.getLog(GoogleDocsServiceImpl.class); + /** Google document types */ public static final String TYPE_DOCUMENT = "document"; public static final String TYPE_SPREADSHEET = "spreadsheet"; public static final String TYPE_PRESENTATION = "presentation"; @@ -99,6 +100,7 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel private String username; private String password; + /** Permission map */ private Map permissionMap; /** @@ -157,7 +159,7 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel this.permissionService = permissionService; } - /* + /** * @param ownableService ownable service */ public void setOwnableService(OwnableService ownableService) @@ -340,10 +342,11 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } /** + * Set a google permission on a specified resource * - * @param nodeRef - * @param resourceId - * @param permissionContext + * @param nodeRef node reference + * @param resource document resource + * @param permissionContext permission context */ private void setGoogleResourcePermissions(NodeRef nodeRef, DocumentListEntry resource, GoogleDocsPermissionContext permissionContext) { @@ -387,11 +390,12 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } /** + * Set a google permission on a specified resource * - * @param resourceId - * @param authorityType - * @param authorityName - * @param role + * @param resource document resource + * @param authorityType authority type + * @param authorityName authority name + * @param role role */ private void setGoogleResourcePermission(DocumentListEntry resource, AuthorityType authorityType, String authorityName, String role) { @@ -415,9 +419,10 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } /** + * Gets the users email used to identify their google account. * - * @param userName - * @return + * @param userName user name + * @return String google account email, null if none */ private String getUserEMail(String userName) { @@ -425,15 +430,23 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel NodeRef personNodeRef = personService.getPerson(userName); if (personNodeRef != null) { - email = (String) nodeService.getProperty(personNodeRef, ContentModel.PROP_EMAIL); + // First see if the google user information has been set + email = (String)nodeService.getProperty(personNodeRef, ContentModel.PROP_GOOGLEUSERNAME); + + // If no google user information then default back to the user's email + if (email == null || email.length() == 0) + { + email = (String) nodeService.getProperty(personNodeRef, ContentModel.PROP_EMAIL); + } } return email; } /** + * Gets the nodes parent folder google resource. * - * @param nodeRef - * @return + * @param nodeRef node reference + * @return DocumentList Entry folder resource */ private DocumentListEntry getParentFolder(NodeRef nodeRef) { @@ -636,12 +649,13 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } /** + * Create a google document * - * @param name - * @param mimetype - * @param parentFolder - * @param is - * @return + * @param name document name + * @param mimetype mime type + * @param parentFolder parent folder resource + * @param is input stream for content + * @return DocumentListEntry resource for created document */ private DocumentListEntry createGoogleDocument(String name, String mimetype, DocumentListEntry parentFolder, InputStream is) { @@ -697,10 +711,11 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } /** + * Updates the content of a google document * - * @param docResourceId - * @param mimeType - * @param is + * @param document document resource + * @param mimeType mimetype + * @param is input stream */ private void updateGoogleDocContent(DocumentListEntry document, String mimeType, InputStream is) { @@ -774,6 +789,12 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel ParameterCheck.mandatory("resource", resource); ParameterCheck.mandatory("email", email); ParameterCheck.mandatory("role", role); + + // Log details of failure + if (logger.isDebugEnabled() == true) + { + logger.debug("Setting the role " + role + " on the google resource " + resource.getResourceId() + " for email " + email + "."); + } try { @@ -801,6 +822,7 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } } + // Set the permission details if (aclEntry == null) { aclEntry = new AclEntry(); @@ -808,6 +830,15 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel aclEntry.setScope(scope); googleDocumentService.insert(aclFeedLinkURL, aclEntry); } + else + { + // Log details of failure + if (logger.isDebugEnabled() == true) + { + logger.debug("Unable to the role " + role + " on the google resource " + resource.getResourceId() + " for email " + email + "." + + " This user already has a role on this document."); + } + } // TODO for now we will not 'update' the permissions if they have already been set .... // @@ -823,7 +854,18 @@ public class GoogleDocsServiceImpl implements GoogleDocsService, GoogleDocsModel } catch (ServiceException e) { - throw new AlfrescoRuntimeException("Unable to set premissions on google document", e); + // Ignore this exception since we don't want to roll back the entire transaction because + // a single users permissions can not be set. + // It seems the google API will return a server exception if the email does not correspond to + // a google account, so catching this exception in this indiscriminate way is the best thing to + // do for now. + + // Log details of failure + if (logger.isDebugEnabled() == true) + { + logger.debug("Unable to the role " + role + " on the google resource " + resource.getResourceId() + " for email " + email + "." + + " Check that this is a valid google account."); + } } catch (IOException e) { diff --git a/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java b/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java index 3c8ee521b4..d86a86f970 100755 --- a/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java +++ b/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java @@ -70,6 +70,10 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod private static final String USER_TWO = "GoogleDocUserTwo"; private static final String USER_THREE = "GoogleDocUserThree"; private static final String USER_FOUR = "GoogleDocUserFour"; + private static final String USER_FIVE = "GoogleDocUserFive"; + private static final String USER_SIX = "GoogleDocUserSix"; + private static final String USER_SEVEN = "GoogleDocUserSeven"; + //private static final String EMAIL_DOMAIN = "@alfresco.com"; private NodeRef folder = null; @@ -112,10 +116,13 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod googleDocsService = (GoogleDocsService)childContext.getBean("googleDocsService"); // Create the test users - createUser(USER_ONE, "rwetherall@alfresco.com"); - createUser(USER_TWO, "rwetherall@activiti.com"); - createUser(USER_THREE, "roy.wetherall@alfresco.com"); - createUser(USER_FOUR, "roy.wetherall@activiti.com"); + createUser(USER_ONE, "rwetherall@alfresco.com", null); + createUser(USER_TWO, "admin@alfresco.com", "rwetherall@activiti.com"); + createUser(USER_THREE, "roy.wetherall@alfresco.com", null); + createUser(USER_FOUR, "roy.wetherall@activiti.com", null); + createUser(USER_FIVE, "admin@alfresco.com", "admin@alfresco.com"); + createUser(USER_SIX, "admin@alfresco.com", null); + createUser(USER_SEVEN, null, null); // Authenticate as user one AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); @@ -130,13 +137,17 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod siteService.setMembership(id, USER_TWO, SiteServiceImpl.SITE_COLLABORATOR); siteService.setMembership(id, USER_THREE, SiteServiceImpl.SITE_CONTRIBUTOR); siteService.setMembership(id, USER_FOUR, SiteServiceImpl.SITE_CONSUMER); + siteService.setMembership(id, USER_FIVE, SiteServiceImpl.SITE_COLLABORATOR); + siteService.setMembership(id, USER_SIX, SiteServiceImpl.SITE_COLLABORATOR); + siteService.setMembership(id, USER_SEVEN, SiteServiceImpl.SITE_COLLABORATOR); // Create a folder in our site container folder = fileFolderService.create(container, "myfolder", ContentModel.TYPE_FOLDER).getNodeRef(); // Create test documents nodeRefDoc = createTestDocument("mydoc.docx", "alfresco/subsystems/googledocs/default/test.docx", MimetypeMap.MIMETYPE_WORD); - nodeRefSpread = createTestDocument("mydoc.xlsx", "alfresco/subsystems/googledocs/default/test.xlsx", MimetypeMap.MIMETYPE_EXCEL); + //nodeRefSpread = createTestDocument("mydoc.xls", "alfresco/subsystems/googledocs/default/testBook.xls", MimetypeMap.MIMETYPE_EXCEL); + nodeRefSpread = createTestDocument("mydoc2.docx", "alfresco/subsystems/googledocs/default/test.docx", MimetypeMap.MIMETYPE_WORD); // Create an empty content node (simulate creation of a new google doc in UI) nodeRef2 = fileFolderService.create(folder, "mygoogledoc.doc", ContentModel.TYPE_CONTENT).getNodeRef(); @@ -154,7 +165,7 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod return nodeRef; } - private void createUser(String userName, String email) + private void createUser(String userName, String email, String googleEmail) { if (authenticationService.authenticationExists(userName) == false) { @@ -163,10 +174,19 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod PropertyMap ppOne = new PropertyMap(4); ppOne.put(ContentModel.PROP_USERNAME, userName); ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); - ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); - ppOne.put(ContentModel.PROP_EMAIL, email); + ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + if (email != null) + { + ppOne.put(ContentModel.PROP_EMAIL, email); + } + + if (googleEmail != null) + { + ppOne.put(ContentModel.PROP_GOOGLEUSERNAME, googleEmail); + } + personService.createPerson(ppOne); } } @@ -211,18 +231,18 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod String downloadFile = downloadFile(googleDocsService.getGoogleDocContent(nodeRefDoc), ".doc"); System.out.println("Download file: " + downloadFile); - // googleDocsService.upload(nodeRefSpread, GoogleDocsPermissionContext.SHARE_WRITE); - // - // assertTrue(nodeService.hasAspect(nodeRefSpread, ASPECT_GOOGLERESOURCE)); - // assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_URL)); - // assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_ID)); - // assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_TYPE)); - // - // System.out.println("Google doc URL: " + nodeService.getProperty(nodeRefSpread, PROP_URL)); - // System.out.println("Google doc type: " + nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_TYPE)); - // System.out.println("Google doc id: " + nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_ID)); - // downloadFile = downloadFile(googleDocsService.download(nodeRefSpread), ".xls"); - // System.out.println("Download file: " + downloadFile); + googleDocsService.createGoogleDoc(nodeRefSpread, GoogleDocsPermissionContext.SHARE_WRITE); + + assertTrue(nodeService.hasAspect(nodeRefSpread, ASPECT_GOOGLERESOURCE)); + assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_URL)); + assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_ID)); + assertNotNull(nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_TYPE)); + + System.out.println("Google doc URL: " + nodeService.getProperty(nodeRefSpread, PROP_URL)); + System.out.println("Google doc type: " + nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_TYPE)); + System.out.println("Google doc id: " + nodeService.getProperty(nodeRefSpread, PROP_RESOURCE_ID)); +// // downloadFile = downloadFile(googleDocsService.download(nodeRefSpread), ".xls"); +// // System.out.println("Download file: " + downloadFile); } }