blob: 994a4ff01fdbbc22fe6d97a15976f60e22b4d024 [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 Meschbergerefb2d082008-08-19 13:18:47 +000019import org.apache.felix.shell.ShellService;
Felix Meschbergerd7c324d2008-08-19 14:10:48 +000020import org.osgi.framework.Bundle;
21import org.osgi.framework.BundleContext;
22import org.osgi.framework.Constants;
23import org.osgi.framework.InvalidSyntaxException;
24import org.osgi.framework.ServiceEvent;
25import org.osgi.framework.ServiceListener;
26import org.osgi.framework.ServiceReference;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000027import org.osgi.service.log.LogService;
Richard S. Hall55900ec2009-04-25 16:57:58 +000028import org.osgi.util.tracker.ServiceTracker;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000029
Felix Meschbergerefb2d082008-08-19 13:18:47 +000030/**
31 * Implements a mediator pattern class for services from the OSGi container.
Felix Meschbergerefb2d082008-08-19 13:18:47 +000032 */
33class ServiceMediator
34{
Richard S. Hall55900ec2009-04-25 16:57:58 +000035 private final String m_bundleName;
36 private final long m_bundleId;
37 private final BundleContext m_context;
38 private final ServiceTracker m_logTracker;
39 private final ServiceTracker m_shellTracker;
40
41 ServiceMediator(BundleContext context)
42 {
43 m_context = context;
44 m_bundleName = (m_context.getBundle().getSymbolicName() == null)
45 ? m_context.getBundle().getLocation()
46 : m_context.getBundle().getSymbolicName();
47 m_bundleId = m_context.getBundle().getBundleId();
48 ServiceTracker logTracker = null;
49 try
50 {
51 logTracker = new ServiceTracker(m_context, LogService.class.getName(), null);
52 logTracker.open();
53 }
54 catch (Throwable ex)
55 {
56 // This means we don't have access to the log service package since it
57 // is optional, so don't track log services.
58 logTracker = null;
59 }
60 m_logTracker = logTracker;
61 m_shellTracker = new ServiceTracker(m_context, ShellService.class.getName(), null);
62 m_shellTracker.open();
63 }
Felix Meschbergerefb2d082008-08-19 13:18:47 +000064
65 /**
66 * Returns a reference to the <tt>ShellService</tt> (Felix).
67 *
68 * @param wait time in milliseconds to wait for the reference if it isn't available.
69 * @return the reference to the <tt>ShellService</tt> as obtained from the OSGi service layer.
70 */
Richard S. Hall59aef192009-04-25 14:50:37 +000071 public ShellService getFelixShellService(long wait)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000072 {
Richard S. Hall55900ec2009-04-25 16:57:58 +000073 ShellService shell = null;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000074 try
75 {
Richard S. Hall59aef192009-04-25 14:50:37 +000076 if (wait < 0)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000077 {
Richard S. Hall55900ec2009-04-25 16:57:58 +000078 shell = (ShellService) m_shellTracker.getService();
Felix Meschbergerefb2d082008-08-19 13:18:47 +000079 }
Richard S. Hall55900ec2009-04-25 16:57:58 +000080 else
Felix Meschbergerefb2d082008-08-19 13:18:47 +000081 {
Richard S. Hall55900ec2009-04-25 16:57:58 +000082 shell = (ShellService) m_shellTracker.waitForService(wait);
Felix Meschbergerefb2d082008-08-19 13:18:47 +000083 }
84 }
Richard S. Hall59aef192009-04-25 14:50:37 +000085 catch (InterruptedException e)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000086 {
Richard S. Hall59aef192009-04-25 14:50:37 +000087 e.printStackTrace(System.err);
Felix Meschbergerefb2d082008-08-19 13:18:47 +000088 }
89
Richard S. Hall55900ec2009-04-25 16:57:58 +000090 return shell;
Felix Meschbergerefb2d082008-08-19 13:18:47 +000091 }//getFelixShellService
92
Richard S. Hall55900ec2009-04-25 16:57:58 +000093 public Object getLogServiceLatch(long wait)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000094 {
Richard S. Hall55900ec2009-04-25 16:57:58 +000095 Object log = null;
96 if (m_logTracker != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +000097 {
Richard S. Hall55900ec2009-04-25 16:57:58 +000098 try
Felix Meschbergerefb2d082008-08-19 13:18:47 +000099 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000100 if (wait < 0)
101 {
102 log = m_logTracker.getService();
103 }
104 else
105 {
106 log = m_logTracker.waitForService(wait);
107 }
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000108 }
Richard S. Hall55900ec2009-04-25 16:57:58 +0000109 catch (InterruptedException e)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000110 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000111 e.printStackTrace(System.err);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000112 }
113 }
Richard S. Hall55900ec2009-04-25 16:57:58 +0000114 return log;
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000115 }//getLogService
116
Richard S. Hall59aef192009-04-25 14:50:37 +0000117 public void info(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000118 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000119 Object log = getLogServiceLatch(NO_WAIT);
120 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000121 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000122 ((LogService) log).log(LogService.LOG_INFO, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000123 }
124 else
125 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000126 sysout(msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000127 }
128 }//info
129
Richard S. Hall59aef192009-04-25 14:50:37 +0000130 public void error(String msg, Throwable t)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000131 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000132 Object log = getLogServiceLatch(NO_WAIT);
133 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000134 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000135 ((LogService) log).log(LogService.LOG_ERROR, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000136 }
137 else
138 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000139 syserr(msg, t);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000140 }
141 }//error
142
Richard S. Hall59aef192009-04-25 14:50:37 +0000143 public void error(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000144 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000145 Object log = getLogServiceLatch(NO_WAIT);
146 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000147 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000148 ((LogService) log).log(LogService.LOG_ERROR, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000149 }
150 else
151 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000152 syserr(msg, null);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000153 }
154 }//error
155
Richard S. Hall59aef192009-04-25 14:50:37 +0000156 public void debug(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000157 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000158 Object log = getLogServiceLatch(NO_WAIT);
159 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000160 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000161 ((LogService) log).log(LogService.LOG_DEBUG, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000162 }
163 else
164 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000165 sysout(msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000166 }
167 }//debug
168
Richard S. Hall59aef192009-04-25 14:50:37 +0000169 public void warn(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000170 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000171 Object log = getLogServiceLatch(NO_WAIT);
172 if (log != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000173 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000174 ((LogService) log).log(LogService.LOG_WARNING, msg);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000175 }
176 else
177 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000178 syserr(msg, null);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000179 }
180 }//warn
181
Richard S. Hall59aef192009-04-25 14:50:37 +0000182 private void sysout(String msg)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000183 {
184 //Assemble String
185 StringBuffer sbuf = new StringBuffer();
Richard S. Hall55900ec2009-04-25 16:57:58 +0000186 sbuf.append(m_bundleName);
Richard S. Hall59aef192009-04-25 14:50:37 +0000187 sbuf.append(" [");
Richard S. Hall55900ec2009-04-25 16:57:58 +0000188 sbuf.append(m_bundleId);
Richard S. Hall59aef192009-04-25 14:50:37 +0000189 sbuf.append("] ");
190 sbuf.append(msg);
191 System.out.println(sbuf.toString());
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000192 }//sysout
193
Richard S. Hall59aef192009-04-25 14:50:37 +0000194 private void syserr(String msg, Throwable t)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000195 {
196 //Assemble String
197 StringBuffer sbuf = new StringBuffer();
Richard S. Hall55900ec2009-04-25 16:57:58 +0000198 sbuf.append(m_bundleName);
Richard S. Hall59aef192009-04-25 14:50:37 +0000199 sbuf.append(" [");
Richard S. Hall55900ec2009-04-25 16:57:58 +0000200 sbuf.append(m_bundleId);
Richard S. Hall59aef192009-04-25 14:50:37 +0000201 sbuf.append("] ");
202 sbuf.append(msg);
203 System.err.println(sbuf.toString());
204 if (t != null)
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000205 {
Richard S. Hall59aef192009-04-25 14:50:37 +0000206 t.printStackTrace(System.err);
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000207 }
208 }//logToSystem
209
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000210 /**
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000211 * Deactivates this mediator, nulling out all references.
212 * If called when the bundle is stopped, the framework should actually take
213 * care of unregistering the <tt>ServiceListener</tt>.
214 */
215 public void deactivate()
216 {
Richard S. Hall55900ec2009-04-25 16:57:58 +0000217 if (m_logTracker != null)
218 {
219 m_logTracker.close();
220 }
221 m_shellTracker.close();
Felix Meschbergerefb2d082008-08-19 13:18:47 +0000222 }//deactivate
223
Richard S. Hall55900ec2009-04-25 16:57:58 +0000224 public static long WAIT_UNLIMITED = 0;
225 public static long NO_WAIT = -1;
226}//class ServiceMediator