blob: f28fa9957cb3b38ac1ca97865123538b0b82692e [file] [log] [blame]
Felix Meschbergerefb2d082008-08-19 13:18:47 +00001/*
Richard S. Hall59aef192009-04-25 14:50:37 +00002 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
Felix Meschbergerefb2d082008-08-19 13:18:47 +000017package org.apache.felix.shell.remote;
18
Felix Meschbergerd7c324d2008-08-19 14:10:48 +000019import org.osgi.framework.BundleContext;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000020import org.osgi.service.log.LogService;
Richard S. Hall55900ec2009-04-25 16:57:58 +000021import org.osgi.util.tracker.ServiceTracker;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000022
Felix Meschbergerefb2d082008-08-19 13:18:47 +000023/**
24 * Implements a mediator pattern class for services from the OSGi container.
Felix Meschbergerefb2d082008-08-19 13:18:47 +000025 */
26class ServiceMediator
27{
Richard S. Hall55900ec2009-04-25 16:57:58 +000028 private final String m_bundleName;
29 private final long m_bundleId;
30 private final BundleContext m_context;
31 private final ServiceTracker m_logTracker;
32 private final ServiceTracker m_shellTracker;
Richard S. Hall6f5381e2010-08-17 14:49:44 +000033 private final ServiceTracker m_cpTracker;
Richard S. Hall55900ec2009-04-25 16:57:58 +000034
35 ServiceMediator(BundleContext context)
36 {
37 m_context = context;
38 m_bundleName = (m_context.getBundle().getSymbolicName() == null)
39 ? m_context.getBundle().getLocation()
40 : m_context.getBundle().getSymbolicName();
41 m_bundleId = m_context.getBundle().getBundleId();
Richard S. Hall6f5381e2010-08-17 14:49:44 +000042 m_logTracker = new ServiceTracker(
43 m_context, "org.osgi.service.log.LogService", null);
44 m_logTracker.open();
45 m_shellTracker = new ServiceTracker(
46 m_context, "org.apache.felix.shell.ShellService", null);
47 m_shellTracker.open();
48 m_cpTracker = new ServiceTracker(
49 m_context, "org.apache.felix.service.command.CommandProcessor", null);
50 m_cpTracker.open();
51 }
52
53 public Object getCommandProcessor(long wait)
54 {
55 Object svcObj = null;
Richard S. Hall55900ec2009-04-25 16:57:58 +000056 try
57 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +000058 if (wait < 0)
59 {
60 svcObj = m_cpTracker.getService();
61 }
62 else
63 {
64 svcObj = m_cpTracker.waitForService(wait);
65 }
Richard S. Hall55900ec2009-04-25 16:57:58 +000066 }
Richard S. Hall6f5381e2010-08-17 14:49:44 +000067 catch (InterruptedException e)
Richard S. Hall55900ec2009-04-25 16:57:58 +000068 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +000069 e.printStackTrace(System.err);
Richard S. Hall55900ec2009-04-25 16:57:58 +000070 }
Richard S. Hall6f5381e2010-08-17 14:49:44 +000071 return svcObj;
Richard S. Hall55900ec2009-04-25 16:57:58 +000072 }
Felix Meschbergerefb2d082008-08-19 13:18:47 +000073
74 /**
75 * Returns a reference to the <tt>ShellService</tt> (Felix).
76 *
77 * @param wait time in milliseconds to wait for the reference if it isn't available.
78 * @return the reference to the <tt>ShellService</tt> as obtained from the OSGi service layer.
79 */
Richard S. Hall6f5381e2010-08-17 14:49:44 +000080 public Object getShellService(long wait)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000081 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +000082 Object svcObj = null;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000083 try
84 {
Richard S. Hall59aef192009-04-25 14:50:37 +000085 if (wait < 0)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000086 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +000087 svcObj = m_shellTracker.getService();
Felix Meschbergerefb2d082008-08-19 13:18:47 +000088 }
Richard S. Hall55900ec2009-04-25 16:57:58 +000089 else
Felix Meschbergerefb2d082008-08-19 13:18:47 +000090 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +000091 svcObj = m_shellTracker.waitForService(wait);
92 }
93
94 return svcObj;
95 }
96 catch (InterruptedException e)
97 {
98 e.printStackTrace(System.err);
99 }
100 return svcObj;
101 }//getFelixShellService
102
103 public Object getLogService(long wait)
104 {
105 Object svcObj = null;
106 try
107 {
108 if (wait < 0)
109 {
110 svcObj = m_logTracker.getService();
111 }
112 else
113 {
114 svcObj = m_logTracker.waitForService(wait);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000115 }
116 }
Richard S. Hall59aef192009-04-25 14:50:37 +0000117 catch (InterruptedException e)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000118 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000119 e.printStackTrace(System.err);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000120 }
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000121 return svcObj;
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000122 }//getLogService
123
Richard S. Hall59aef192009-04-25 14:50:37 +0000124 public void info(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000125 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000126 Object log = getLogService(NO_WAIT);
Richard S. Hall55900ec2009-04-25 16:57:58 +0000127 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000128 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000129 ((LogService) log).log(LogService.LOG_INFO, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000130 }
131 else
132 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000133 sysout(msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000134 }
135 }//info
136
Richard S. Hall59aef192009-04-25 14:50:37 +0000137 public void error(String msg, Throwable t)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000138 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000139 Object log = getLogService(NO_WAIT);
Richard S. Hall55900ec2009-04-25 16:57:58 +0000140 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000141 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000142 ((LogService) log).log(LogService.LOG_ERROR, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000143 }
144 else
145 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000146 syserr(msg, t);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000147 }
148 }//error
149
Richard S. Hall59aef192009-04-25 14:50:37 +0000150 public void error(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000151 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000152 Object log = getLogService(NO_WAIT);
Richard S. Hall55900ec2009-04-25 16:57:58 +0000153 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000154 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000155 ((LogService) log).log(LogService.LOG_ERROR, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000156 }
157 else
158 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000159 syserr(msg, null);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000160 }
161 }//error
162
Richard S. Hall59aef192009-04-25 14:50:37 +0000163 public void debug(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000164 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000165 Object log = getLogService(NO_WAIT);
Richard S. Hall55900ec2009-04-25 16:57:58 +0000166 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000167 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000168 ((LogService) log).log(LogService.LOG_DEBUG, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000169 }
170 else
171 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000172 sysout(msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000173 }
174 }//debug
175
Richard S. Hall59aef192009-04-25 14:50:37 +0000176 public void warn(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000177 {
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000178 Object log = getLogService(NO_WAIT);
Richard S. Hall55900ec2009-04-25 16:57:58 +0000179 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000180 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000181 ((LogService) log).log(LogService.LOG_WARNING, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000182 }
183 else
184 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000185 syserr(msg, null);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000186 }
187 }//warn
188
Richard S. Hall59aef192009-04-25 14:50:37 +0000189 private void sysout(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000190 {
191 //Assemble String
192 StringBuffer sbuf = new StringBuffer();
Richard S. Hall55900ec2009-04-25 16:57:58 +0000193 sbuf.append(m_bundleName);
Richard S. Hall59aef192009-04-25 14:50:37 +0000194 sbuf.append(" [");
Richard S. Hall55900ec2009-04-25 16:57:58 +0000195 sbuf.append(m_bundleId);
Richard S. Hall59aef192009-04-25 14:50:37 +0000196 sbuf.append("] ");
197 sbuf.append(msg);
198 System.out.println(sbuf.toString());
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000199 }//sysout
200
Richard S. Hall59aef192009-04-25 14:50:37 +0000201 private void syserr(String msg, Throwable t)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000202 {
203 //Assemble String
204 StringBuffer sbuf = new StringBuffer();
Richard S. Hall55900ec2009-04-25 16:57:58 +0000205 sbuf.append(m_bundleName);
Richard S. Hall59aef192009-04-25 14:50:37 +0000206 sbuf.append(" [");
Richard S. Hall55900ec2009-04-25 16:57:58 +0000207 sbuf.append(m_bundleId);
Richard S. Hall59aef192009-04-25 14:50:37 +0000208 sbuf.append("] ");
209 sbuf.append(msg);
210 System.err.println(sbuf.toString());
211 if (t != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000212 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000213 t.printStackTrace(System.err);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000214 }
215 }//logToSystem
216
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000217 /**
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000218 * Deactivates this mediator, nulling out all references.
219 * If called when the bundle is stopped, the framework should actually take
220 * care of unregistering the <tt>ServiceListener</tt>.
221 */
222 public void deactivate()
223 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000224 if (m_logTracker != null)
225 {
226 m_logTracker.close();
227 }
228 m_shellTracker.close();
Richard S. Hall6f5381e2010-08-17 14:49:44 +0000229 m_cpTracker.close();
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000230 }//deactivate
231
Richard S. Hall55900ec2009-04-25 16:57:58 +0000232 public static long WAIT_UNLIMITED = 0;
233 public static long NO_WAIT = -1;
234}//class ServiceMediator