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());
+ }
+ }
+
+}