Skip to content

Commit d86313a

Browse files
author
svuillet
committed
add standalone office launcher with clipboard
1 parent 2084bdc commit d86313a

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package org.silverpeas.openoffice;
2+
3+
import java.awt.Toolkit;
4+
import java.awt.datatransfer.Clipboard;
5+
import java.awt.datatransfer.ClipboardOwner;
6+
import java.awt.datatransfer.DataFlavor;
7+
import java.awt.datatransfer.Transferable;
8+
import java.io.IOException;
9+
import java.net.MalformedURLException;
10+
import java.net.URL;
11+
import java.util.logging.Level;
12+
import java.util.logging.Logger;
13+
14+
import javax.activation.MimetypesFileTypeMap;
15+
16+
import org.apache.commons.httpclient.HttpException;
17+
import org.silverpeas.openoffice.util.FinderFactory;
18+
import org.silverpeas.openoffice.util.MessageDisplayer;
19+
import org.silverpeas.openoffice.util.MessageUtil;
20+
import org.silverpeas.openoffice.util.MsOfficeType;
21+
import org.silverpeas.openoffice.util.OsEnum;
22+
import org.silverpeas.openoffice.util.UrlExtractor;
23+
import org.silverpeas.openoffice.windows.FileWebDavAccessManager;
24+
import org.silverpeas.openoffice.windows.MsOfficeVersion;
25+
26+
public class OfficeLancherFromBoard implements ClipboardOwner {
27+
28+
static final Logger logger = Logger.getLogger(OfficeLauncher.class.getName());
29+
30+
private Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
31+
private static final MimetypesFileTypeMap mimeTypes = new MimetypesFileTypeMap();
32+
33+
34+
public void run() {
35+
Transferable trans = sysClip.getContents(this);
36+
regainOwnership(trans);
37+
logger.log(Level.INFO, "Listening to board...");
38+
39+
while (true) {
40+
try {
41+
Thread.sleep(250);
42+
} catch (InterruptedException ex) {
43+
logger.log(Level.SEVERE, MessageUtil.getMessage("error.message.general"), ex);
44+
MessageDisplayer.displayError(ex);
45+
}
46+
}
47+
}
48+
49+
public void lostOwnership(Clipboard c, Transferable t) {
50+
try {
51+
Thread.sleep(200);
52+
} catch (InterruptedException ex) {
53+
logger.log(Level.SEVERE, MessageUtil.getMessage("error.message.general"), ex);
54+
MessageDisplayer.displayError(ex);
55+
}
56+
57+
Transferable contents = sysClip.getContents(this);
58+
59+
if (contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
60+
processContents(contents);
61+
regainOwnership(contents);
62+
}
63+
}
64+
65+
public static int processContents(Transferable t) {
66+
try {
67+
String url = (String) t.getTransferData(DataFlavor.stringFlavor);
68+
logger.log(Level.INFO, "Processing: " + url);
69+
if (url.contains("silverpeas") && url.contains("jackrabbit") && url.contains("webdav")) {
70+
MsOfficeType type = getContentType(UrlExtractor.decodeUrl(url));
71+
OfficeFinder finder = FinderFactory.getFinder(type);
72+
if (finder.isMicrosoftOffice() && (OsEnum.getOS() == OsEnum.WINDOWS_XP || (OsEnum.isWindows() && MsOfficeVersion.isOldOffice(type)))) {
73+
url = url.replace("/repository/", "/repository2000/");
74+
}
75+
AuthenticationInfo authInfo = null; //TODO : extract from url parameters
76+
switch (type) {
77+
case EXCEL:
78+
return launch(type, finder.findSpreadsheet(), url, false, authInfo);
79+
case POWERPOINT:
80+
return launch(type, finder.findPresentation(), url, false, authInfo);
81+
case WORD:
82+
return launch(type, finder.findWordEditor(), url, false, authInfo);
83+
case NONE:
84+
default:
85+
return launch(type, finder.findOther(), url, false, authInfo);
86+
}
87+
}
88+
} catch (IOException ex) {
89+
logger.log(Level.SEVERE, MessageUtil.getMessage("error.message.general"), ex);
90+
MessageDisplayer.displayError(ex);
91+
} catch (InterruptedException ex) {
92+
logger.log(Level.SEVERE, MessageUtil.getMessage("error.message.general"),
93+
ex);
94+
MessageDisplayer.displayError(ex);
95+
} catch (Throwable ex) {
96+
logger.log(Level.SEVERE, MessageUtil.getMessage("error.message.general"),
97+
ex);
98+
MessageDisplayer.displayError(ex);
99+
}
100+
101+
return 0;
102+
}
103+
104+
protected static MsOfficeType getContentType(String url) throws MalformedURLException {
105+
String fileName = new URL(url).getFile();
106+
String contentType = mimeTypes.getContentType(fileName.toLowerCase());
107+
return MsOfficeType.valueOfMimeType(contentType);
108+
}
109+
110+
/**
111+
* Launch document edition
112+
*
113+
* @param path path to editor
114+
* @param url document url
115+
* @param modeDisconnected disconnected mode.
116+
* @param auth authentication info
117+
* @return status
118+
* @throws IOException
119+
* @throws InterruptedException
120+
*/
121+
protected static int launch(MsOfficeType type, String path, String url, boolean modeDisconnected,
122+
AuthenticationInfo auth) throws IOException, InterruptedException {
123+
logger.log(Level.INFO, "The path: {0}", path);
124+
logger.log(Level.INFO, "The url: {0}", url);
125+
if (modeDisconnected) {
126+
try {
127+
String webdavUrl = url;
128+
final FileWebDavAccessManager webdavAccessManager = new FileWebDavAccessManager(auth);
129+
if ('"' == url.charAt(0)) {
130+
webdavUrl = url.substring(1, url.length() - 1);
131+
}
132+
String tmpFilePath = webdavAccessManager.retrieveFile(webdavUrl);
133+
logger.log(Level.INFO, "The exact exec line: {0} {1}", new Object[]{path, tmpFilePath});
134+
Process process = Runtime.getRuntime().exec(path + ' ' + tmpFilePath);
135+
process.waitFor();
136+
webdavAccessManager.pushFile(tmpFilePath, url);
137+
MessageDisplayer.displayMessage(MessageUtil.getMessage("info.ok"));
138+
return 0;
139+
} catch (HttpException ex) {
140+
logger.log(Level.SEVERE, null, ex);
141+
throw new IOException(ex);
142+
} catch (IOException ex) {
143+
logger.log(Level.SEVERE, null, ex);
144+
throw ex;
145+
}
146+
} else {
147+
// Standard mode : just open it
148+
logger.log(Level.INFO, "The exact exec line: {0} {1}", new Object[]{path, url});
149+
Process process = Runtime.getRuntime().exec(path + ' ' + url);
150+
return process.waitFor();
151+
}
152+
}
153+
154+
private void regainOwnership(Transferable t) {
155+
sysClip.setContents(t, this);
156+
}
157+
158+
public static void main(String[] args) {
159+
OfficeLancherFromBoard b = new OfficeLancherFromBoard();
160+
b.run();
161+
}
162+
}

0 commit comments

Comments
 (0)