1*2be43276SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2be43276SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2be43276SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2be43276SAndrew Rist  * distributed with this work for additional information
6*2be43276SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2be43276SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2be43276SAndrew Rist  * "License"); you may not use this file except in compliance
9*2be43276SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2be43276SAndrew Rist  *
11*2be43276SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2be43276SAndrew Rist  *
13*2be43276SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2be43276SAndrew Rist  * software distributed under the License is distributed on an
15*2be43276SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2be43276SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2be43276SAndrew Rist  * specific language governing permissions and limitations
18*2be43276SAndrew Rist  * under the License.
19*2be43276SAndrew Rist  *
20*2be43276SAndrew Rist  *************************************************************/
21*2be43276SAndrew Rist 
22*2be43276SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package com.sun.star.comp.urlresolver;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir 
27cdf0e10cSrcweir import com.sun.star.bridge.XBridge;
28cdf0e10cSrcweir import com.sun.star.bridge.XBridgeFactory;
29cdf0e10cSrcweir import com.sun.star.bridge.XUnoUrlResolver;
30cdf0e10cSrcweir 
31cdf0e10cSrcweir import com.sun.star.comp.loader.FactoryHelper;
32cdf0e10cSrcweir 
33cdf0e10cSrcweir import com.sun.star.connection.ConnectionSetupException;
34cdf0e10cSrcweir import com.sun.star.connection.NoConnectException;
35cdf0e10cSrcweir import com.sun.star.connection.XConnection;
36cdf0e10cSrcweir import com.sun.star.connection.XConnector;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir import com.sun.star.lang.IllegalArgumentException;
39cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
40cdf0e10cSrcweir import com.sun.star.lang.XSingleServiceFactory;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir import com.sun.star.registry.XRegistryKey;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir 
47cdf0e10cSrcweir /**
48cdf0e10cSrcweir  * This component gives a factory for an <code>UnoUrlResolver</code> service.
49cdf0e10cSrcweir  * <p>
50cdf0e10cSrcweir  * @version 	$Revision: 1.6 $ $ $Date: 2008-04-11 11:12:25 $
51cdf0e10cSrcweir  * @author 	    Kay Ramme
52cdf0e10cSrcweir  * @see         com.sun.star.brige.XBrideFactory
53cdf0e10cSrcweir  * @see         com.sun.star.connection.Connector
54cdf0e10cSrcweir  * @since       UDK1.0
55cdf0e10cSrcweir  */
56cdf0e10cSrcweir public class UrlResolver {
57cdf0e10cSrcweir 	static private final boolean DEBUG = false;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	static public class _UrlResolver implements XUnoUrlResolver {
61cdf0e10cSrcweir 		static private final String __serviceName = "com.sun.star.bridge.UnoUrlResolver";
62cdf0e10cSrcweir 
63cdf0e10cSrcweir 		private XMultiServiceFactory _xMultiServiceFactory;
64cdf0e10cSrcweir 
_UrlResolver(XMultiServiceFactory xMultiServiceFactory)65cdf0e10cSrcweir 		public _UrlResolver(XMultiServiceFactory xMultiServiceFactory) {
66cdf0e10cSrcweir 			_xMultiServiceFactory = xMultiServiceFactory;
67cdf0e10cSrcweir 		}
68cdf0e10cSrcweir 
resolve( String dcp)69cdf0e10cSrcweir 		public Object resolve(/*IN*/String dcp) throws NoConnectException, ConnectionSetupException, IllegalArgumentException, com.sun.star.uno.RuntimeException {
70cdf0e10cSrcweir 			String conDcp  ;
71cdf0e10cSrcweir 			String protDcp  ;
72cdf0e10cSrcweir 			String rootOid  ;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 			if(dcp.indexOf(';') == -1) {// use old style
75cdf0e10cSrcweir 				conDcp = dcp;
76cdf0e10cSrcweir 				protDcp = "iiop";
77cdf0e10cSrcweir 				rootOid = "classic_uno";
78cdf0e10cSrcweir 			}
79cdf0e10cSrcweir 			else { // new style
80cdf0e10cSrcweir 				int index = dcp.indexOf(':');
81cdf0e10cSrcweir 				String url = dcp.substring(0, index).trim();
82cdf0e10cSrcweir 				dcp = dcp.substring(index + 1).trim();
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 				index = dcp.indexOf(';');
85cdf0e10cSrcweir 				conDcp = dcp.substring(0, index).trim();
86cdf0e10cSrcweir 				dcp = dcp.substring(index + 1).trim();
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 				index = dcp.indexOf(';');
89cdf0e10cSrcweir 				protDcp = dcp.substring(0, index).trim();
90cdf0e10cSrcweir 				dcp = dcp.substring(index + 1).trim();
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 				rootOid = dcp.trim().trim();
93cdf0e10cSrcweir 			}
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 			Object rootObject  ;
96cdf0e10cSrcweir 			XBridgeFactory xBridgeFactory ;
97cdf0e10cSrcweir 			try {
98cdf0e10cSrcweir 				xBridgeFactory = UnoRuntime.queryInterface(XBridgeFactory.class,
99cdf0e10cSrcweir 																		  _xMultiServiceFactory.createInstance("com.sun.star.bridge.BridgeFactory"));
100cdf0e10cSrcweir 			} catch (com.sun.star.uno.Exception e) {
101cdf0e10cSrcweir 				throw new com.sun.star.uno.RuntimeException(e.getMessage());
102cdf0e10cSrcweir 			}
103cdf0e10cSrcweir 			XBridge xBridge = xBridgeFactory.getBridge(conDcp + ";" + protDcp);
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 			if(xBridge == null) {
106cdf0e10cSrcweir 				Object connector ;
107cdf0e10cSrcweir 				try {
108cdf0e10cSrcweir 					connector = _xMultiServiceFactory.createInstance("com.sun.star.connection.Connector");
109cdf0e10cSrcweir 				} catch (com.sun.star.uno.Exception e) {
110cdf0e10cSrcweir 						throw new com.sun.star.uno.RuntimeException(e.getMessage());
111cdf0e10cSrcweir 				}
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 				XConnector connector_xConnector = UnoRuntime.queryInterface(XConnector.class, connector);
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 				// connect to the server
116cdf0e10cSrcweir 				XConnection xConnection = connector_xConnector.connect(conDcp);
117cdf0e10cSrcweir 				try {
118cdf0e10cSrcweir 					xBridge = xBridgeFactory.createBridge(conDcp + ";" + protDcp, protDcp, xConnection, null);
119cdf0e10cSrcweir 				} catch (com.sun.star.bridge.BridgeExistsException e) {
120cdf0e10cSrcweir 					throw new com.sun.star.uno.RuntimeException(e.getMessage());
121cdf0e10cSrcweir 				}
122cdf0e10cSrcweir 			}
123cdf0e10cSrcweir 			rootObject = xBridge.getInstance(rootOid);
124cdf0e10cSrcweir 			return rootObject;
125cdf0e10cSrcweir 		}
126cdf0e10cSrcweir 	}
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 	/**
130cdf0e10cSrcweir 	 * Gives a factory for creating the service.
131cdf0e10cSrcweir 	 * This method is called by the <code>JavaLoader</code>
132cdf0e10cSrcweir 	 * <p>
133cdf0e10cSrcweir 	 * @return  returns a <code>XSingleServiceFactory</code> for creating the component
134cdf0e10cSrcweir 	 * @param   implName     the name of the implementation for which a service is desired
135cdf0e10cSrcweir 	 * @param   multiFactory the service manager to be uses if needed
136cdf0e10cSrcweir 	 * @param   regKey       the registryKey
137cdf0e10cSrcweir 	 * @see                  com.sun.star.comp.loader.JavaLoader
138cdf0e10cSrcweir 	 */
__getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey)139cdf0e10cSrcweir 	public static XSingleServiceFactory __getServiceFactory(String implName,
140cdf0e10cSrcweir 															XMultiServiceFactory multiFactory,
141cdf0e10cSrcweir 															XRegistryKey regKey)
142cdf0e10cSrcweir 	{
143cdf0e10cSrcweir 		XSingleServiceFactory xSingleServiceFactory = null;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir   	    if (implName.equals(UrlResolver.class.getName()) )
146cdf0e10cSrcweir 	        xSingleServiceFactory = FactoryHelper.getServiceFactory(_UrlResolver.class,
147cdf0e10cSrcweir 																	_UrlResolver.__serviceName,
148cdf0e10cSrcweir 																	multiFactory,
149cdf0e10cSrcweir 																	regKey);
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	    return xSingleServiceFactory;
152cdf0e10cSrcweir 	}
153cdf0e10cSrcweir }
154