1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_desktop.hxx"
26
27 #include "cppuhelper/implbase4.hxx"
28 #include "cppuhelper/implementationentry.hxx"
29 #include "rtl/ustrbuf.hxx"
30 #include "rtl/ustring.h"
31 #include "rtl/ustring.hxx"
32 #include "rtl/bootstrap.hxx"
33 #include "sal/types.h"
34 #include "sal/config.h"
35 #include "boost/scoped_array.hpp"
36 #include "com/sun/star/lang/XServiceInfo.hpp"
37 #include "com/sun/star/lang/XInitialization.hpp"
38 #include "com/sun/star/lang/WrappedTargetException.hpp"
39 #include "com/sun/star/task/XJob.hpp"
40 #include "com/sun/star/configuration/backend/XLayer.hpp"
41 #include "com/sun/star/configuration/backend/XLayerHandler.hpp"
42 #include "com/sun/star/configuration/backend/MalformedDataException.hpp"
43 #include "com/sun/star/configuration/backend/TemplateIdentifier.hpp"
44 #include "jvmfwk/framework.h"
45 #include "jvmfwk.hxx"
46 #include <stack>
47 #include <stdio.h>
48
49 #include "osl/thread.hxx"
50 #define OUSTR(x) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( x ))
51
52 #define SERVICE_NAME "com.sun.star.migration.Java"
53 #define IMPL_NAME "com.sun.star.comp.desktop.migration.Java"
54
55 #define ENABLE_JAVA 1
56 #define USER_CLASS_PATH 2
57
58 namespace css = com::sun::star;
59 using namespace rtl;
60 using namespace com::sun::star::uno;
61 using namespace com::sun::star::beans;
62 using namespace com::sun::star::lang;
63 using namespace com::sun::star::configuration::backend;
64
65 namespace migration
66 {
67
68 class CJavaInfo
69 {
70 CJavaInfo(const CJavaInfo&);
71 CJavaInfo& operator = (const CJavaInfo&);
72 public:
73 JavaInfo* pData;
74 CJavaInfo();
75 ~CJavaInfo();
76 operator JavaInfo* ();
77 };
78
CJavaInfo()79 CJavaInfo::CJavaInfo(): pData(NULL)
80 {
81 }
82
~CJavaInfo()83 CJavaInfo::~CJavaInfo()
84 {
85 jfw_freeJavaInfo(pData);
86 }
87
operator JavaInfo*()88 CJavaInfo::operator JavaInfo*()
89 {
90 return pData;
91 }
92
93
94 class JavaMigration : public ::cppu::WeakImplHelper4<
95 css::lang::XServiceInfo,
96 css::lang::XInitialization,
97 css::task::XJob,
98 css::configuration::backend::XLayerHandler>
99 {
100 public:
101 // XServiceInfo
102 virtual OUString SAL_CALL getImplementationName()
103 throw (css::uno::RuntimeException);
104 virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName )
105 throw (css::uno::RuntimeException);
106 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
107 throw (css::uno::RuntimeException);
108
109 //XInitialization
110 virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
111 throw(css::uno::Exception, css::uno::RuntimeException);
112
113 //XJob
114 virtual css::uno::Any SAL_CALL execute(
115 const css::uno::Sequence<css::beans::NamedValue >& Arguments )
116 throw (css::lang::IllegalArgumentException, css::uno::Exception,
117 css::uno::RuntimeException);
118
119 // XLayerHandler
120 virtual void SAL_CALL startLayer()
121 throw(::com::sun::star::lang::WrappedTargetException);
122
123 virtual void SAL_CALL endLayer()
124 throw(
125 ::com::sun::star::configuration::backend::MalformedDataException,
126 ::com::sun::star::lang::WrappedTargetException );
127
128 virtual void SAL_CALL overrideNode(
129 const rtl::OUString& aName,
130 sal_Int16 aAttributes,
131 sal_Bool bClear)
132 throw(
133 ::com::sun::star::configuration::backend::MalformedDataException,
134 ::com::sun::star::lang::WrappedTargetException );
135
136 virtual void SAL_CALL addOrReplaceNode(
137 const rtl::OUString& aName,
138 sal_Int16 aAttributes)
139 throw(
140 ::com::sun::star::configuration::backend::MalformedDataException,
141 ::com::sun::star::lang::WrappedTargetException );
142
143 virtual void SAL_CALL addOrReplaceNodeFromTemplate(
144 const rtl::OUString& aName,
145 const ::com::sun::star::configuration::backend::TemplateIdentifier& aTemplate,
146 sal_Int16 aAttributes )
147 throw(
148 ::com::sun::star::configuration::backend::MalformedDataException,
149 ::com::sun::star::lang::WrappedTargetException );
150
151 virtual void SAL_CALL endNode()
152 throw(
153 ::com::sun::star::configuration::backend::MalformedDataException,
154 ::com::sun::star::lang::WrappedTargetException );
155
156 virtual void SAL_CALL dropNode(
157 const rtl::OUString& aName )
158 throw(
159 ::com::sun::star::configuration::backend::MalformedDataException,
160 ::com::sun::star::lang::WrappedTargetException );
161
162 virtual void SAL_CALL overrideProperty(
163 const rtl::OUString& aName,
164 sal_Int16 aAttributes,
165 const css::uno::Type& aType,
166 sal_Bool bClear )
167 throw(
168 ::com::sun::star::configuration::backend::MalformedDataException,
169 ::com::sun::star::lang::WrappedTargetException );
170
171 virtual void SAL_CALL setPropertyValue(
172 const css::uno::Any& aValue )
173 throw(
174 ::com::sun::star::configuration::backend::MalformedDataException,
175 ::com::sun::star::lang::WrappedTargetException );
176
177 virtual void SAL_CALL setPropertyValueForLocale(
178 const css::uno::Any& aValue,
179 const rtl::OUString& aLocale )
180 throw(
181 ::com::sun::star::configuration::backend::MalformedDataException,
182 ::com::sun::star::lang::WrappedTargetException );
183
184 virtual void SAL_CALL endProperty()
185 throw(
186 ::com::sun::star::configuration::backend::MalformedDataException,
187 ::com::sun::star::lang::WrappedTargetException );
188
189 virtual void SAL_CALL addProperty(
190 const rtl::OUString& aName,
191 sal_Int16 aAttributes,
192 const css::uno::Type& aType )
193 throw(
194 ::com::sun::star::configuration::backend::MalformedDataException,
195 ::com::sun::star::lang::WrappedTargetException );
196
197 virtual void SAL_CALL addPropertyWithValue(
198 const rtl::OUString& aName,
199 sal_Int16 aAttributes,
200 const css::uno::Any& aValue )
201 throw(
202 ::com::sun::star::configuration::backend::MalformedDataException,
203 ::com::sun::star::lang::WrappedTargetException );
204
205
206
207 //----------------
208 ~JavaMigration();
209
210 private:
211 OUString m_sUserDir;
212 css::uno::Reference< ::css::configuration::backend::XLayer> m_xLayer;
213
214 void migrateJavarc();
215 typedef ::std::pair< ::rtl::OUString, sal_Int16> TElementType;
216 typedef ::std::stack< TElementType > TElementStack;
217 TElementStack m_aStack;
218
219 };
220
~JavaMigration()221 JavaMigration::~JavaMigration()
222 {
223 OSL_ASSERT(m_aStack.empty());
224 }
225
jvmfwk_getImplementationName()226 OUString jvmfwk_getImplementationName()
227 {
228 return OUSTR(IMPL_NAME);
229 }
230
jvmfwk_getSupportedServiceNames()231 css::uno::Sequence< OUString > jvmfwk_getSupportedServiceNames()
232 {
233 OUString str_name = OUSTR(SERVICE_NAME);
234 return css::uno::Sequence< OUString >( &str_name, 1 );
235 }
236
237 // XServiceInfo
getImplementationName()238 OUString SAL_CALL JavaMigration::getImplementationName()
239 throw (css::uno::RuntimeException)
240 {
241 return jvmfwk_getImplementationName();
242 }
243
supportsService(const OUString & rServiceName)244 sal_Bool SAL_CALL JavaMigration::supportsService( const OUString & rServiceName )
245 throw (css::uno::RuntimeException)
246 {
247 css::uno::Sequence< OUString > const & rSNL = getSupportedServiceNames();
248 OUString const * pArray = rSNL.getConstArray();
249 for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
250 {
251 if (rServiceName.equals( pArray[ nPos ] ))
252 return true;
253 }
254 return false;
255
256 }
257
getSupportedServiceNames()258 css::uno::Sequence< OUString > SAL_CALL JavaMigration::getSupportedServiceNames()
259 throw (css::uno::RuntimeException)
260 {
261 return jvmfwk_getSupportedServiceNames();
262 }
263
264 //XInitialization ----------------------------------------------------------------------
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)265 void SAL_CALL JavaMigration::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
266 throw(css::uno::Exception, css::uno::RuntimeException)
267 {
268 const css::uno::Any* pIter = aArguments.getConstArray();
269 const css::uno::Any* pEnd = pIter + aArguments.getLength();
270 css::uno::Sequence<css::beans::NamedValue> aOldConfigValues;
271 css::beans::NamedValue aValue;
272 for(;pIter != pEnd;++pIter)
273 {
274 *pIter >>= aValue;
275 if (aValue.Name.equalsAscii("OldConfiguration"))
276 {
277 sal_Bool bSuccess = aValue.Value >>= aOldConfigValues;
278 OSL_ENSURE(bSuccess == sal_True, "[Service implementation " IMPL_NAME
279 "] XInitialization::initialize: Argument OldConfiguration has wrong type.");
280 if (bSuccess)
281 {
282 const css::beans::NamedValue* pIter2 = aOldConfigValues.getConstArray();
283 const css::beans::NamedValue* pEnd2 = pIter2 + aOldConfigValues.getLength();
284 for(;pIter2 != pEnd2;++pIter2)
285 {
286 if ( pIter2->Name.equalsAscii("org.openoffice.Office.Java") )
287 {
288 pIter2->Value >>= m_xLayer;
289 break;
290 }
291 }
292 }
293 }
294 else if (aValue.Name.equalsAscii("UserData"))
295 {
296 if ( !(aValue.Value >>= m_sUserDir) )
297 {
298 OSL_ENSURE(
299 false,
300 "[Service implementation " IMPL_NAME
301 "] XInitialization::initialize: Argument UserData has wrong type.");
302 }
303 }
304 }
305
306 }
307
308 //XJob
execute(const css::uno::Sequence<css::beans::NamedValue> &)309 css::uno::Any SAL_CALL JavaMigration::execute(
310 const css::uno::Sequence<css::beans::NamedValue >& )
311 throw (css::lang::IllegalArgumentException, css::uno::Exception,
312 css::uno::RuntimeException)
313 {
314 migrateJavarc();
315 if (m_xLayer.is())
316 m_xLayer->readData(this);
317
318 return css::uno::Any();
319 }
320
migrateJavarc()321 void JavaMigration::migrateJavarc()
322 {
323 if (m_sUserDir.getLength() == 0)
324 return;
325
326 OUString sValue;
327 rtl::Bootstrap javaini(m_sUserDir + OUSTR( "/user/config/" SAL_CONFIGFILE("java")));
328 sal_Bool bSuccess = javaini.getFrom(OUSTR("Home"), sValue);
329 OSL_ENSURE(bSuccess, "[Service implementation " IMPL_NAME
330 "] XJob::execute: Could not get Home entry from java.ini/javarc.");
331 if (bSuccess == sal_True && sValue.getLength() > 0)
332 {
333 //get the directory
334 CJavaInfo aInfo;
335 javaFrameworkError err = jfw_getJavaInfoByPath(sValue.pData, &aInfo.pData);
336
337 if (err == JFW_E_NONE)
338 {
339 if (jfw_setSelectedJRE(aInfo) != JFW_E_NONE)
340 {
341 OSL_ENSURE(0, "[Service implementation " IMPL_NAME
342 "] XJob::execute: jfw_setSelectedJRE failed.");
343 fprintf(stderr, "\nCannot migrate Java. An error occured.\n");
344 }
345 }
346 else if (err == JFW_E_FAILED_VERSION)
347 {
348 fprintf(stderr, "\nCannot migrate Java settings because the version of the Java "
349 "is not supported anymore.\n");
350 }
351 }
352 }
353
354
355 // XLayerHandler
startLayer()356 void SAL_CALL JavaMigration::startLayer()
357 throw(css::lang::WrappedTargetException)
358 {
359 }
360 // -----------------------------------------------------------------------------
361
endLayer()362 void SAL_CALL JavaMigration::endLayer()
363 throw(
364 MalformedDataException,
365 WrappedTargetException )
366 {
367 }
368 // -----------------------------------------------------------------------------
369
overrideNode(const::rtl::OUString &,sal_Int16,sal_Bool)370 void SAL_CALL JavaMigration::overrideNode(
371 const ::rtl::OUString&,
372 sal_Int16,
373 sal_Bool)
374 throw(
375 MalformedDataException,
376 WrappedTargetException )
377
378 {
379
380 }
381 // -----------------------------------------------------------------------------
382
addOrReplaceNode(const::rtl::OUString &,sal_Int16)383 void SAL_CALL JavaMigration::addOrReplaceNode(
384 const ::rtl::OUString&,
385 sal_Int16)
386 throw(
387 MalformedDataException,
388 WrappedTargetException )
389 {
390
391 }
endNode()392 void SAL_CALL JavaMigration::endNode()
393 throw(
394 MalformedDataException,
395 WrappedTargetException )
396 {
397 }
398 // -----------------------------------------------------------------------------
399
dropNode(const::rtl::OUString &)400 void SAL_CALL JavaMigration::dropNode(
401 const ::rtl::OUString& )
402 throw(
403 MalformedDataException,
404 WrappedTargetException )
405 {
406 }
407 // -----------------------------------------------------------------------------
408
overrideProperty(const::rtl::OUString & aName,sal_Int16,const Type &,sal_Bool)409 void SAL_CALL JavaMigration::overrideProperty(
410 const ::rtl::OUString& aName,
411 sal_Int16,
412 const Type&,
413 sal_Bool )
414 throw(
415 MalformedDataException,
416 WrappedTargetException )
417 {
418 if (aName.equalsAscii("Enable"))
419 m_aStack.push(TElementStack::value_type(aName,ENABLE_JAVA));
420 else if (aName.equalsAscii("UserClassPath"))
421 m_aStack.push(TElementStack::value_type(aName, USER_CLASS_PATH));
422 }
423 // -----------------------------------------------------------------------------
424
setPropertyValue(const Any & aValue)425 void SAL_CALL JavaMigration::setPropertyValue(
426 const Any& aValue )
427 throw(
428 MalformedDataException,
429 WrappedTargetException )
430 {
431 if ( !m_aStack.empty())
432 {
433 switch (m_aStack.top().second)
434 {
435 case ENABLE_JAVA:
436 {
437 sal_Bool val = sal_Bool();
438 if ((aValue >>= val) == sal_False)
439 throw MalformedDataException(
440 OUSTR("[Service implementation " IMPL_NAME
441 "] XLayerHandler::setPropertyValue received wrong type for Enable property"), 0, Any());
442 if (jfw_setEnabled(val) != JFW_E_NONE)
443 throw WrappedTargetException(
444 OUSTR("[Service implementation " IMPL_NAME
445 "] XLayerHandler::setPropertyValue: jfw_setEnabled failed."), 0, Any());
446
447 break;
448 }
449 case USER_CLASS_PATH:
450 {
451 OUString cp;
452 if ((aValue >>= cp) == sal_False)
453 throw MalformedDataException(
454 OUSTR("[Service implementation " IMPL_NAME
455 "] XLayerHandler::setPropertyValue received wrong type for UserClassPath property"), 0, Any());
456
457 if (jfw_setUserClassPath(cp.pData) != JFW_E_NONE)
458 throw WrappedTargetException(
459 OUSTR("[Service implementation " IMPL_NAME
460 "] XLayerHandler::setPropertyValue: jfw_setUserClassPath failed."), 0, Any());
461 break;
462 }
463 default:
464 OSL_ASSERT(0);
465 }
466 }
467 }
468 // -----------------------------------------------------------------------------
469
setPropertyValueForLocale(const Any &,const::rtl::OUString &)470 void SAL_CALL JavaMigration::setPropertyValueForLocale(
471 const Any&,
472 const ::rtl::OUString& )
473 throw(
474 MalformedDataException,
475 WrappedTargetException )
476 {
477 }
478 // -----------------------------------------------------------------------------
479
endProperty()480 void SAL_CALL JavaMigration::endProperty()
481 throw(
482 MalformedDataException,
483 WrappedTargetException )
484 {
485 if (!m_aStack.empty())
486 m_aStack.pop();
487 }
488 // -----------------------------------------------------------------------------
489
addProperty(const rtl::OUString &,sal_Int16,const Type &)490 void SAL_CALL JavaMigration::addProperty(
491 const rtl::OUString&,
492 sal_Int16,
493 const Type& )
494 throw(
495 MalformedDataException,
496 WrappedTargetException )
497 {
498 }
499 // -----------------------------------------------------------------------------
500
addPropertyWithValue(const rtl::OUString &,sal_Int16,const Any &)501 void SAL_CALL JavaMigration::addPropertyWithValue(
502 const rtl::OUString&,
503 sal_Int16,
504 const Any& )
505 throw(
506 MalformedDataException,
507 WrappedTargetException )
508 {
509 }
510
addOrReplaceNodeFromTemplate(const rtl::OUString &,const TemplateIdentifier &,sal_Int16)511 void SAL_CALL JavaMigration::addOrReplaceNodeFromTemplate(
512 const rtl::OUString&,
513 const TemplateIdentifier&,
514 sal_Int16 )
515 throw(
516 MalformedDataException,
517 WrappedTargetException )
518 {
519 }
520
521 // -----------------------------------------------------------------------------
522 //ToDo enable java, user class path
523
524 } //end namespace jfw
525
526