diff --git a/config/alfresco/mimetype/openoffice-document-formats.xml b/config/alfresco/mimetype/openoffice-document-formats.xml index 53a607e3ef..2fc6f37302 100644 --- a/config/alfresco/mimetype/openoffice-document-formats.xml +++ b/config/alfresco/mimetype/openoffice-document-formats.xml @@ -124,7 +124,7 @@ Microsoft Excel Spreadsheet - application/vnd.excel + application/vnd.ms-excel xls SpreadsheetMS Excel 97 @@ -163,7 +163,7 @@ Microsoft PowerPoint Presentation - application/vnd.powerpoint + application/vnd.ms-powerpoint ppt PresentationMS PowerPoint 97 diff --git a/source/java/org/alfresco/repo/content/MimetypeMap.java b/source/java/org/alfresco/repo/content/MimetypeMap.java index e8af326694..ea1b5adfcf 100644 --- a/source/java/org/alfresco/repo/content/MimetypeMap.java +++ b/source/java/org/alfresco/repo/content/MimetypeMap.java @@ -59,9 +59,9 @@ public class MimetypeMap implements MimetypeService public static final String MIMETYPE_PDF = "application/pdf"; public static final String MIMETYPE_JSON = "application/json"; public static final String MIMETYPE_WORD = "application/msword"; - public static final String MIMETYPE_EXCEL = "application/vnd.excel"; + public static final String MIMETYPE_EXCEL = "application/vnd.ms-excel"; public static final String MIMETYPE_BINARY = "application/octet-stream"; - public static final String MIMETYPE_PPT = "application/vnd.powerpoint"; + public static final String MIMETYPE_PPT = "application/vnd.ms-powerpoint"; public static final String MIMETYPE_APP_DWG = "application/dwg"; public static final String MIMETYPE_IMG_DWG = "image/x-dwg"; public static final String MIMETYPE_FLASH = "application/x-shockwave-flash"; diff --git a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java index 4686431f9d..8f2d14cda6 100755 --- a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java +++ b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java @@ -30,7 +30,6 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.TransactionListenerAdapter; @@ -53,6 +52,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.google.gdata.client.GoogleService; +import com.google.gdata.client.GoogleAuthTokenFactory.UserToken; import com.google.gdata.client.docs.DocsService; import com.google.gdata.data.IEntry; import com.google.gdata.data.MediaContent; @@ -64,7 +64,9 @@ import com.google.gdata.data.acl.AclScope; import com.google.gdata.data.docs.DocumentEntry; import com.google.gdata.data.docs.DocumentListEntry; import com.google.gdata.data.docs.FolderEntry; +import com.google.gdata.data.docs.PresentationEntry; import com.google.gdata.data.docs.SpreadsheetEntry; +import com.google.gdata.data.docs.DocumentListEntry.MediaType; import com.google.gdata.data.media.MediaSource; import com.google.gdata.data.media.MediaStreamSource; import com.google.gdata.util.AuthenticationException; @@ -297,7 +299,10 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter { // Get the mime type and input stream from the content reader mimetype = contentReader.getMimetype(); - is = contentReader.getContentInputStream(); + if (contentReader.getSize() != 0) + { + is = contentReader.getContentInputStream(); + } } // Get the parent folder id @@ -493,6 +498,9 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter // Create the folder and set the meta data in Alfresco folder = createGoogleFolder(name, parentFolder); setResourceDetails(parentNodeRef, folder); + + // Set the owner of the document + setGoogleResourcePermission(folder, AuthorityType.USER, username, "owner"); } } @@ -588,23 +596,23 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter // TODO need to verify that download of a spreadsheet works before we delete this historical code ... -// UserToken docsToken = null; -// if (isSpreadSheet) -// { -// docsToken = (UserToken) googleDocumentService.getAuthTokenFactory().getAuthToken(); -// UserToken spreadsheetsToken = (UserToken) spreadsheetsService.getAuthTokenFactory().getAuthToken(); -// googleDocumentService.setUserToken(spreadsheetsToken.getValue()); -// -// } + UserToken docsToken = null; + if (docType.equals(TYPE_SPREADSHEET) == true) + { + docsToken = (UserToken) googleDocumentService.getAuthTokenFactory().getAuthToken(); + UserToken spreadsheetsToken = (UserToken) spreadsheetsService.getAuthTokenFactory().getAuthToken(); + googleDocumentService.setUserToken(spreadsheetsToken.getValue()); + + } MediaContent mc = new MediaContent(); mc.setUri(downloadUrl); MediaSource ms = googleDocumentService.getMedia(mc); - // if (isSpreadSheet) - // { - // googleDocumentService.setUserToken(docsToken.getValue()); - // } + if (docType.equals(TYPE_SPREADSHEET) == true) + { + googleDocumentService.setUserToken(docsToken.getValue()); + } result = ms.getInputStream(); } @@ -717,10 +725,17 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter // Create the document entry object DocumentListEntry docEntry = null; - if (MimetypeMap.MIMETYPE_EXCEL.equals(mimetype) == true) + if (MediaType.XLS.getMimeType().equals(mimetype) == true || + MediaType.XLSX.getMimeType().equals(mimetype) == true || + MediaType.ODS.getMimeType().equals(mimetype) == true) { docEntry = new SpreadsheetEntry(); } + else if (MediaType.PPS.getMimeType().equals(mimetype) == true || + MediaType.PPT.getMimeType().equals(mimetype) == true) + { + docEntry = new PresentationEntry(); + } else { docEntry = new DocumentEntry(); @@ -771,6 +786,7 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter * @param mimeType mimetype * @param is input stream */ + @SuppressWarnings("unused") private void updateGoogleDocContent(DocumentListEntry document, String mimeType, InputStream is) { // Log details diff --git a/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java b/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java index 2e59a7c567..d32addf448 100755 --- a/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java +++ b/source/java/org/alfresco/repo/googledocs/GoogleDocumentServiceTest.java @@ -36,6 +36,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.site.SiteServiceImpl; import org.alfresco.service.cmr.coci.CheckOutCheckInService; import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; @@ -52,10 +53,14 @@ import org.alfresco.util.PropertyMap; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; -import com.google.gdata.client.DocumentQuery; import com.google.gdata.client.docs.DocsService; -import com.google.gdata.data.docs.DocumentListEntry; -import com.google.gdata.data.docs.DocumentListFeed; +import com.google.gdata.data.MediaContent; +import com.google.gdata.data.PlainTextConstruct; +import com.google.gdata.data.docs.FolderEntry; +import com.google.gdata.data.docs.SpreadsheetEntry; +import com.google.gdata.data.docs.DocumentListEntry.MediaType; +import com.google.gdata.data.media.MediaStreamSource; +import com.google.gdata.util.ContentType; import com.google.gdata.util.ServiceException; public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsModel @@ -151,12 +156,19 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod // Create test documents nodeRefDoc = createTestDocument("mydoc.docx", "alfresco/subsystems/googledocs/default/test.docx", MimetypeMap.MIMETYPE_WORD); - //nodeRefSpread = createTestDocument("mydoc.xls", "alfresco/subsystems/googledocs/default/testBook.xls", MimetypeMap.MIMETYPE_EXCEL); - nodeRefSpread = createTestDocument("mydoc2.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.xlsx", "alfresco/subsystems/googledocs/default/test.xlsx", MimetypeMap.MIMETYPE_EXCEL); // Create an empty content node (simulate creation of a new google doc in UI) - nodeRef2 = fileFolderService.create(folder, "mygoogledoc.doc", ContentModel.TYPE_CONTENT).getNodeRef(); + nodeRef2 = fileFolderService.create(folder, "mygoogledoc.xls", ContentModel.TYPE_CONTENT).getNodeRef(); nodeService.addAspect(nodeRef2, ASPECT_GOOGLEEDITABLE, null); + ContentWriter contentWriter = contentService.getWriter(nodeRef2, ContentModel.PROP_CONTENT, true); + contentWriter.setEncoding("UTF-8"); + contentWriter.setMimetype(MimetypeMap.MIMETYPE_EXCEL); + contentWriter.putContent(""); + + ContentData contentData = (ContentData)nodeService.getProperty(nodeRef2, ContentModel.PROP_CONTENT); + System.out.println(" ********** Content data = " + contentData.toString()); } private NodeRef createTestDocument(String name, String contentPath, String mimetype) @@ -219,6 +231,44 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod return result; } + public void testCreateSheet() throws Exception + { + DocsService client = new DocsService("Alfresco"); + client.setUserCredentials("rwetherall@alfresco.com", "123test123"); + + // Create the folder entry + FolderEntry folder = new FolderEntry(); + folder.setTitle(new PlainTextConstruct("RootFolder" + GUID.generate())); + FolderEntry rootFolderEntry = client.insert( + new URL("http://docs.google.com/feeds/default/private/full"), + folder); + + FolderEntry folder2 = new FolderEntry(); + folder2.setTitle(new PlainTextConstruct("ChildFolder" + GUID.generate())); + FolderEntry childFolderEntry = client.insert( + new URL(((MediaContent)rootFolderEntry.getContent()).getUri()), + folder2); + + MediaContent mediaContent = new MediaContent(); + mediaContent.setMimeType(new ContentType(MimetypeMap.MIMETYPE_EXCEL)); + + InputStream is = getClass().getClassLoader().getResourceAsStream("alfresco/subsystems/googledocs/default/testBook.xls"); + mediaContent.setMediaSource(new MediaStreamSource(is, MediaType.XLS.getMimeType())); + + System.out.println(" **** " + MimetypeMap.MIMETYPE_EXCEL + " = " + MediaType.XLS.getMimeType()); + + + SpreadsheetEntry newEntry = new SpreadsheetEntry(); + newEntry = new SpreadsheetEntry(); + + + + newEntry.setContent(mediaContent); + newEntry.setTitle(new PlainTextConstruct("mytestdoc.xls")); + + client.insert(new URL(((MediaContent)childFolderEntry.getContent()).getUri()), newEntry); + } + public void testGoogleDocUploadDownload() throws Exception { if (isGoogleServiceAvailable() == true) @@ -237,17 +287,6 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod String downloadFile = downloadFile(googleDocsService.getGoogleDocContent(nodeRefDoc), ".doc"); System.out.println("Download file: " + downloadFile); - DocsService client = new DocsService("Alfresco"); - client.setUserCredentials("rwetherall@alfresco.com", "123test123"); - - URL feedUri = new URL("https://docs.google.com/feeds/default/private/full/"); - DocumentQuery query = new DocumentQuery(feedUri); - query.setTitleExact(true); - query.setTitleQuery((String)nodeService.getProperty(nodeRefDoc, ContentModel.PROP_NAME)); - DocumentListFeed feed = client.getFeed(query, DocumentListFeed.class); - printDocuments(feed); - - googleDocsService.createGoogleDoc(nodeRefSpread, GoogleDocsPermissionContext.SHARE_WRITE); assertTrue(nodeService.hasAspect(nodeRefSpread, ASPECT_GOOGLERESOURCE)); @@ -261,27 +300,17 @@ public class GoogleDocumentServiceTest extends TestCase implements GoogleDocsMod downloadFile = downloadFile(googleDocsService.getGoogleDocContent(nodeRefSpread), ".xls"); System.out.println("Download file: " + downloadFile); - + googleDocsService.createGoogleDoc(nodeRef2, GoogleDocsPermissionContext.SHARE_WRITE); } } - public void printDocuments(DocumentListFeed feed) - { - for (DocumentListEntry entry : feed.getEntries() ) - { - String resourceId = entry.getResourceId(); - System.out.println(" -- Document(" + resourceId + "/" + entry.getTitle().getPlainText() + ") "); - - } - } - public void testCheckOutCheckIn() throws Exception { if (isGoogleServiceAvailable() == true) { ContentReader contentReader = contentService.getReader(nodeRef2, ContentModel.PROP_CONTENT); - assertNull(contentReader); + //assertNull(contentReader); // Check out the empty google document NodeRef workingCopy = checkOutCheckInService.checkout(nodeRef2);