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