diff --git a/.classpath b/.classpath index e63f86e..831dad6 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + @@ -31,5 +31,5 @@ - + diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs index eb0c223..df29e16 100644 --- a/.settings/com.google.gdt.eclipse.core.prefs +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -1,5 +1,5 @@ eclipse.preferences.version=1 jarsExcludedFromWebInfLib= -lastWarOutDir=/Users/massi/Documents/workspace/share-updates/target/share-updates-1.1.1-SNAPSHOT +lastWarOutDir=/Users/massi/Documents/workspace/share-updates/target/share-updates-1.1.2-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index dde9c8f..fb4e233 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,9 +4,6 @@ - - uses - diff --git a/pom.xml b/pom.xml index 6acd6cb..531d394 100644 --- a/pom.xml +++ b/pom.xml @@ -118,11 +118,9 @@ 1.4 - org.imgscalr - imgscalr-lib - 4.2 - jar - compile + net.coobird + thumbnailator + [0.4, 0.5) commons-fileupload @@ -140,6 +138,11 @@ org.gcube.common home-library provided + + + org.gcube.common + home-library-jcr + provided org.gcube.portal diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java index 69f3f27..4b2b216 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java @@ -17,7 +17,8 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; */ @RemoteServiceRelativePath("shareupdateServlet") public interface ShareUpdateService extends RemoteService { - ClientFeed share(String feedText, FeedType type, PrivacyLevel pLevel, String vreName, String linkTitle, String linkDesc, String url, String urlThumbnail, String host, ArrayList mentionedUsers); + ClientFeed share(String feedText, FeedType type, PrivacyLevel pLevel, String vreName, LinkPreview preview, String urlThumbnail, ArrayList mentionedUsers, String fileName, String FilePathOnServer); + UserSettings getUserSettings(); diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java index 087d2b9..dd95ff1 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java @@ -16,9 +16,9 @@ import com.google.gwt.user.client.rpc.AsyncCallback; */ public interface ShareUpdateServiceAsync { void share(String feedText, FeedType type, PrivacyLevel pLevel, - String vreName, String linkTitle, String linkDesc, String url, - String urlThumbnail, String host, ArrayList mentionedUsers, - AsyncCallback callback); + String vreName, LinkPreview preview, String urlThumbnail, + ArrayList mentionedUsers, String fileName, + String FilePathOnServer, AsyncCallback callback); void checkLink(String linkToCheck, AsyncCallback callback); diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/LinkPreviewer.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/LinkPreviewer.java index 130ed61..12ae332 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/LinkPreviewer.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/LinkPreviewer.java @@ -59,7 +59,7 @@ public class LinkPreviewer extends Composite { if (isFilePreview) { saveCopy = new SaveInWorkspaceBox(); uploadInWS.add(saveCopy); - } + } } @@ -99,4 +99,10 @@ public class LinkPreviewer extends Composite { public String getUrlThumbnail() { return switcher.getSelectedImageURL(); } + protected boolean isSharingFile() { + return (saveCopy != null); + } + protected boolean isSaveCopySelected() { + return isSharingFile() ? saveCopy.getValue() : false; + } } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SaveInWorkspaceBox.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SaveInWorkspaceBox.java index 7c32fbc..5236184 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SaveInWorkspaceBox.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SaveInWorkspaceBox.java @@ -1,16 +1,10 @@ package org.gcube.portlets.user.shareupdates.client.view; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.Widget; public class SaveInWorkspaceBox extends Composite { @@ -33,6 +27,8 @@ public class SaveInWorkspaceBox extends Composite { initWidget(uiBinder.createAndBindUi(this)); } - + protected boolean getValue() { + return saveCheckBox.getValue(); + } } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/ShareUpdateForm.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/ShareUpdateForm.java index 89d4a90..59ae260 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/ShareUpdateForm.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/ShareUpdateForm.java @@ -56,12 +56,19 @@ public class ShareUpdateForm extends Composite { final PageBusAdapter pageBusAdapter = new PageBusAdapter(); protected final static String SHARE_UPDATE_TEXT = "Share an update or paste a link, use “@” to mention someone"; protected final static String ERROR_UPDATE_TEXT = "Looks like empty to me!"; + public final static String NO_TEXT_FILE_SHARE = "_N0_73X7_SH4R3_"; private final static String LISTBOX_LEVEL = " - "; public static final String loading = GWT.getModuleBaseURL() + "../images/avatarLoader.gif"; public static final String avatar_default = GWT.getModuleBaseURL() + "../images/Avatar_default.png"; public static final String attach = GWT.getModuleBaseURL() + "../images/attach.png"; + /** + * needed to know where to find the (possible) uploaded file + */ + private String uploadedFilePathOnServer; + private String uploadedFileNameOnServer; + private HandlerManager eventBus = new HandlerManager(null); private static ShareUpdateFormUiBinder uiBinder = GWT @@ -97,7 +104,8 @@ public class ShareUpdateForm extends Composite { @UiField ListBox privacyLevel = new ListBox(false); - UserInfo myUserInfo; + private UserInfo myUserInfo; + private void bind() { /** @@ -208,13 +216,18 @@ public class ShareUpdateForm extends Composite { } myUserInfo = result.getUserInfo(); String toShare = shareTextArea.getText().trim(); + + //We allow to post a file without writing nothing in the sharing textarea + if (myLinkPreviewer != null && myLinkPreviewer.isSharingFile() && (toShare.equals(SHARE_UPDATE_TEXT) || toShare.equals(ERROR_UPDATE_TEXT) || toShare.equals("")) ) { + toShare = NO_TEXT_FILE_SHARE; + } if (toShare.equals(SHARE_UPDATE_TEXT) || toShare.equals(ERROR_UPDATE_TEXT) || toShare.equals("")) { shareTextArea.addStyleName("error"); shareTextArea.setText(ERROR_UPDATE_TEXT); return; } - //then you can post, but pass html - String toPost = shareTextArea.getText(); + //then you can post but you have to pass html checks now + String toPost = toShare; postTweet(toPost, shareTextArea.getMentionedUsers()); } }); @@ -239,21 +252,22 @@ public class ShareUpdateForm extends Composite { if (getPrivacyLevel() == PrivacyLevel.SINGLE_VRE) { vreId = privacyLevel.getValue(privacyLevel.getSelectedIndex()); } - - String linkTitle = ""; - String linkDescription = ""; - String linkUrl = ""; - String linkUrlThumbnail = ""; - String linkHost = ""; - + //preparing to send stuff + String linkTitle = "", linkDescription = "" , linkUrl = "", linkUrlThumbnail = "", linkHost = "", fileName = null, filePath = null; if (myLinkPreviewer != null) { linkTitle = myLinkPreviewer.getLinkTitle(); linkDescription = myLinkPreviewer.getLinkDescription(); linkUrl = myLinkPreviewer.getUrl(); linkUrlThumbnail = myLinkPreviewer.getUrlThumbnail(); - linkHost = myLinkPreviewer.getHost(); + linkHost = myLinkPreviewer.getHost(); + if (myLinkPreviewer.isSaveCopySelected()) { + fileName = uploadedFileNameOnServer; + filePath = uploadedFilePathOnServer; + } } - shareupdateService.share(toShare, FeedType.TWEET, getPrivacyLevel(), vreId, linkTitle, linkDescription, linkUrl, linkUrlThumbnail, linkHost, mentionedUsers, new AsyncCallback() { + LinkPreview preview2Share = new LinkPreview(linkTitle, linkDescription, linkUrl, linkHost, null); + + shareupdateService.share(toShare, FeedType.TWEET, getPrivacyLevel(), vreId, preview2Share, linkUrlThumbnail, mentionedUsers, fileName, filePath, new AsyncCallback() { public void onFailure(Throwable caught) { submitButton.setEnabled(true); shareTextArea.setEnabled(true); @@ -353,7 +367,7 @@ public class ShareUpdateForm extends Composite { * @param fileName the name of the file * @param absolutePathOnServer the path of the file ending with its name on the server temp */ - protected void checkFile(String fileName, String absolutePathOnServer) { + protected void checkFile(final String fileName, final String absolutePathOnServer) { preview.add(new LinkLoader()); shareupdateService.checkUploadedFile(fileName, absolutePathOnServer, new AsyncCallback() { public void onFailure(Throwable caught) { @@ -362,12 +376,14 @@ public class ShareUpdateForm extends Composite { attachButton.getElement().getStyle().setVisibility(Visibility.VISIBLE); //beacuse otherwise it looses the other properties setting } - public void onSuccess(LinkPreview result) { + public void onSuccess(LinkPreview result) { preview.clear(); uploadProgress.setVisible(false); if (result != null) addPreview(result, true); attachButton.getElement().getStyle().setVisibility(Visibility.HIDDEN); //beacuse otherwise it looses the other properties setting + uploadedFilePathOnServer = absolutePathOnServer; + uploadedFileNameOnServer = fileName; } }); } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/server/FilePreviewer.java b/src/main/java/org/gcube/portlets/user/shareupdates/server/FilePreviewer.java index 9412b93..d28b2a9 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/server/FilePreviewer.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/server/FilePreviewer.java @@ -1,5 +1,6 @@ package org.gcube.portlets.user.shareupdates.server; +import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; @@ -13,17 +14,20 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +import java.util.Iterator; import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.FileImageInputStream; +import javax.imageio.stream.ImageInputStream; + +import net.coobird.thumbnailator.Thumbnails; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.util.PDFTextStripper; import org.gcube.applicationsupportlayer.social.storage.FTPManager; import org.gcube.portal.databook.shared.ImageType; import org.gcube.portlets.user.shareupdates.shared.LinkPreview; -import org.imgscalr.Scalr; -import org.imgscalr.Scalr.Method; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -129,24 +133,24 @@ public class FilePreviewer { */ protected static LinkPreview getImagePreview(String fileName, String path2Image, String httpUrl, String mimeType) throws Exception { ArrayList imagesUrl = new ArrayList(); + + Dimension dim = extractDimension(path2Image); //description - String desc = ""; - BufferedImage img = ImageIO.read(new File(path2Image)); // load image - BufferedImage thumbnail = Scalr.resize(img, Method.QUALITY, 80, Scalr.OP_ANTIALIAS); + String desc = ((int) dim.getWidth()) + "x" + ((int) dim.getHeight()) + " pixels"; + ByteArrayOutputStream out = new ByteArrayOutputStream(); - boolean result = ImageIO.write(thumbnail, "JPG", out); - if (result) { - String httpLink = getFTPManager().uploadImageOnFTPServer(new ByteArrayInputStream(out.toByteArray()), ImageType.JPG); - _log.debug("Image thumbnail available at: " + httpLink); - imagesUrl.add(httpLink); - return new LinkPreview(fileName, desc, httpUrl, mimeType, imagesUrl); - } - else - throw new IOException("Could not process pdf file"); + Thumbnails.of(path2Image) + .width(80) + .outputFormat("jpg") + .toOutputStream(out); + String httpLink = getFTPManager().uploadImageOnFTPServer(new ByteArrayInputStream(out.toByteArray()), ImageType.JPG); + _log.debug("\nFlushed, Image thumbnail available at: " + httpLink); + imagesUrl.add(httpLink); + return new LinkPreview(fileName, desc, httpUrl, mimeType, imagesUrl); } - + /** * * @param fileName thename of the file @@ -196,5 +200,30 @@ public class FilePreviewer { doc.close(); return toReturn; } + /** + * extract the dimension in pixels without reading the whole file + * @param path2Image + * @return + * @throws IOException + */ + private static Dimension extractDimension(String path2Image) throws IOException { + ImageInputStream in = ImageIO.createImageInputStream(new File(path2Image)); + try { + final Iterator readers = ImageIO.getImageReaders(in); + if (readers.hasNext()) { + ImageReader reader = readers.next(); + try { + reader.setInput(in); + return new Dimension(reader.getWidth(0), reader.getHeight(0)); + } finally { + reader.dispose(); + } + } + } finally { + if (in != null) in.close(); + } + return null; + } + } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java index b266432..b294f92 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java @@ -1,16 +1,12 @@ package org.gcube.portlets.user.shareupdates.server; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -28,9 +24,6 @@ import org.apache.tika.detect.Detector; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; import org.apache.tika.mime.MediaType; -import org.apache.tika.parser.AutoDetectParser; -import org.apache.tika.parser.Parser; -import org.apache.tika.sax.BodyContentHandler; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; @@ -41,7 +34,6 @@ import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; -import org.gcube.common.homelibrary.util.MimeTypeUtil; import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; @@ -62,6 +54,7 @@ import org.gcube.portal.databook.shared.PrivacyLevel; import org.gcube.portal.databook.shared.UserInfo; import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException; import org.gcube.portlets.user.shareupdates.client.ShareUpdateService; +import org.gcube.portlets.user.shareupdates.client.view.ShareUpdateForm; import org.gcube.portlets.user.shareupdates.server.metaseeker.MetaSeeker; import org.gcube.portlets.user.shareupdates.server.opengraph.OpenGraph; import org.gcube.portlets.user.shareupdates.shared.LinkPreview; @@ -79,7 +72,6 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.tidy.Tidy; -import org.xml.sax.ContentHandler; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.kernel.exception.PortalException; @@ -156,7 +148,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar * */ public ClientFeed share(String postText, FeedType feedType, PrivacyLevel pLevel, - String vreId, String linkTitle, String linkDesc, String url, String urlThumbnail, String host, ArrayList mentionedUserFullNames) { + String vreId, LinkPreview preview, String urlThumbnail, ArrayList mentionedUserFullNames,String fileName, String filePathOnServer) { String escapedFeedText = escapeHtml(postText); @@ -183,11 +175,27 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar e.printStackTrace(); } } + + String linkTitle = preview.getTitle(); + String linkDesc = preview.getDescription(); + String host = preview.getHost(); + String url = preview.getUrl(); + Date feedDate = new Date(); + //this means the user has shared a file without text in it. + String textToPost = ""; + if (escapedFeedText.compareTo(ShareUpdateForm.NO_TEXT_FILE_SHARE) == 0) { + textToPost = convertFileNameAnchorHTML(url); + } else { + textToPost = transformUrls(escapedFeedText); + } + + Feed toShare = new Feed(UUID.randomUUID().toString(), feedType, username, feedDate, - "", url, urlThumbnail, transformUrls(escapedFeedText), pLevel, fullName, email, thumbnailURL, linkTitle, linkDesc, host); + "", url, urlThumbnail, textToPost, pLevel, fullName, email, thumbnailURL, linkTitle, linkDesc, host); _log.trace("Attempting to save Feed with text: " + escapedFeedText + " Level: " + pLevel); + boolean result = store.saveUserFeed(toShare); //need to put the feed into VRES Timeline too @@ -207,7 +215,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar } //share on a single VRE Timeline //receives a VreId(groupId) get the scope from the groupId else if (pLevel == PrivacyLevel.SINGLE_VRE && vreId != null && vreId.compareTo("") != 0) { - String vreScope = getScopeByOrganizationId(vreId); + String vreScope = (withinPortal) ? getScopeByOrganizationId(vreId) : "/gcube/devsec/devVRE"; _log.trace("Attempting to write onto " + vreScope); try { store.saveFeedToVRETimeline(toShare.getKey(), vreScope); @@ -230,6 +238,14 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar Thread thread = new Thread(new MentionNotificationsThread(toShare.getKey(), escapedFeedText, nm, mentionedUsers)); thread.start(); } + + //it means I also should upload a copy on the user's Workspace root folder + if (fileName != null && filePathOnServer != null) { + //The workspace uploader Thread starts here asyncronously + Thread thread = new Thread(new UploadToWorkspaceThread(username, fileName, filePathOnServer)); + thread.start(); + + } return cf; @@ -269,7 +285,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar * @param feedText * @return the text with the clickable url in it */ - public String transformUrls(String feedText) { + private String transformUrls(String feedText) { StringBuilder sb = new StringBuilder(); // separate input by spaces ( URLs have no spaces ) String [] parts = feedText.split("\\s"); @@ -293,9 +309,19 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar } } return sb.toString(); - } - + /** + * + * @param preview + * @return + */ + private String convertFileNameAnchorHTML(String url) { + StringBuilder sb = new StringBuilder(); + sb.append("shared ").append("a file.").append(" ").toString(); + return sb.toString(); + } + + @Override public UserSettings getUserSettings() { if (getUserSettingsFromSession() != null) return getUserSettingsFromSession(); @@ -373,13 +399,13 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar break; case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": mimeType = "application/wordprocessor"; - break; + return FilePreviewer.getUnhandledTypePreview(fileName, fileabsolutePathOnServer, httpURL, mimeType); case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": mimeType = "application/spreadsheet"; - break; + return FilePreviewer.getUnhandledTypePreview(fileName, fileabsolutePathOnServer, httpURL, mimeType); case "application/vnd.openxmlformats-officedocument.presentationml.presentation": mimeType = "application/presentation"; - break; + return FilePreviewer.getUnhandledTypePreview(fileName, fileabsolutePathOnServer, httpURL, mimeType); case "image/png": case "image/gif": case "image/tiff": @@ -413,7 +439,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar * @throws MagicMatchNotFoundException * @throws MagicException */ - private String getMimeType(File file, String filenameWithExtension) throws IOException { + protected static String getMimeType(File file, String filenameWithExtension) throws IOException { TikaConfig config = TikaConfig.getDefaultConfig(); Detector detector = config.getDetector(); TikaInputStream stream = TikaInputStream.get(file); diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/server/UploadToWorkspaceThread.java b/src/main/java/org/gcube/portlets/user/shareupdates/server/UploadToWorkspaceThread.java new file mode 100644 index 0000000..1d8a0e6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/server/UploadToWorkspaceThread.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.user.shareupdates.server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Date; + +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Massimiliano Assante ISTI-CNR + * + */ +public class UploadToWorkspaceThread implements Runnable { + private static Logger _log = LoggerFactory.getLogger(UploadToWorkspaceThread.class); + /** + * the identifier of the workspace you are putting + */ + private String username; + /** + * the name of the file you are putting + */ + private String fileName; + /** + * the path (with name) of the file you are putting + */ + private String fileabsolutePathOnServer; + + /** + * + * @param sClient the instance of the storage client + * @param fileToUpload the absolute path of the file + */ + public UploadToWorkspaceThread(String username, String fileName, String fileabsolutePathOnServer) { + super(); + this.username = username; + this.fileName = fileName; + this.fileabsolutePathOnServer = fileabsolutePathOnServer; + } + + @Override + public void run() { + try { + Workspace ws = HomeLibrary + .getHomeManagerFactory() + .getHomeManager() + .getHome(username).getWorkspace(); + + File file = new File(fileabsolutePathOnServer); + String mimeType = ShareUpdateServiceImpl.getMimeType(file, fileName); + InputStream fileData = new FileInputStream(file); + String theId = ""; + try { + theId = ws.createExternalFile(fileName ,"File added automatically by Share Updates" , mimeType ,fileData, ws.getRoot().getId()).getId(); + } + catch (ItemAlreadyExistException ex) { + _log.warn("fileName " + fileName + " exists, appending timestamp"); + theId = ws.createExternalFile(fileName+" ("+ new Date()+")" ,"File added automatically by Share Updates" , mimeType ,fileData, ws.getRoot().getId()).getId(); + } finally { + fileData.close(); + } + fileData.close(); + _log.debug("Uploaded " + fileName + " - Returned Workspace id=" + theId); + } + + catch (Exception e) { + e.printStackTrace(); + _log.error("Something wrong while uploading " + fileName + " in Workspace " + e.getMessage()); + } + } + +}