blob: 0275bca6cf6a58b5c314ac282a4e881497c2708c [file] [log] [blame]
Richard S. Hall930fecc2005-08-16 18:33:34 +00001/*
2 * Copyright 2005 The Apache Software Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
Richard S. Hall5a031592005-08-19 19:53:58 +000017package org.apache.felix.shell.impl;
Richard S. Hall930fecc2005-08-16 18:33:34 +000018
19import java.io.PrintStream;
Richard S. Hall930fecc2005-08-16 18:33:34 +000020import java.net.URL;
21import java.util.StringTokenizer;
22
Richard S. Hall5a031592005-08-19 19:53:58 +000023import org.apache.felix.shell.CdCommand;
24import org.apache.felix.shell.Command;
Richard S. Hall930fecc2005-08-16 18:33:34 +000025import org.osgi.framework.*;
26
27public class InstallCommandImpl implements Command
28{
29 private BundleContext m_context = null;
30
31 public InstallCommandImpl(BundleContext context)
32 {
33 m_context = context;
34 }
35
36 public String getName()
37 {
38 return "install";
39 }
40
41 public String getUsage()
42 {
43 return "install <URL> [<URL> ...]";
44 }
45
46 public String getShortDescription()
47 {
48 return "install bundle(s).";
49 }
50
51 public void execute(String s, PrintStream out, PrintStream err)
52 {
53 StringTokenizer st = new StringTokenizer(s, " ");
54
55 // Ignore the command name.
56 st.nextToken();
57
58 // There should be at least one URL.
59 if (st.countTokens() >= 1)
60 {
61 while (st.hasMoreTokens())
62 {
63 String location = st.nextToken().trim();
64 install(location, out, err);
65 }
66 }
67 else
68 {
69 err.println("Incorrect number of arguments");
70 }
71 }
72
73 protected Bundle install(String location, PrintStream out, PrintStream err)
74 {
75 String abs = absoluteLocation(location);
76 if (abs == null)
77 {
78 err.println("Malformed location: " + location);
79 }
80 else
81 {
82 try
83 {
84 return m_context.installBundle(abs, null);
85 }
86 catch (IllegalStateException ex)
87 {
88 err.println(ex.toString());
89 }
90 catch (BundleException ex)
91 {
92 if (ex.getNestedException() != null)
93 {
94 err.println(ex.getNestedException().toString());
95 }
96 else
97 {
98 err.println(ex.toString());
99 }
100 }
101 catch (Exception ex)
102 {
103 err.println(ex.toString());
104 }
105 }
106 return null;
107 }
108
109 private String absoluteLocation(String location)
110 {
Richard S. Hall7c9da3d2006-02-24 20:09:28 +0000111 String guess = location;
112 // If the location does not contain a ":", then try to
113 // add the base URL from the 'cd' command service.
114 if (location.indexOf(':') < 0)
Richard S. Hall930fecc2005-08-16 18:33:34 +0000115 {
116 // Try to create a valid URL using the base URL
117 // contained in the "cd" command service.
118 String baseURL = "";
119
120 try
121 {
122 // Get a reference to the "cd" command service.
123 ServiceReference ref = m_context.getServiceReference(
Richard S. Hall5a031592005-08-19 19:53:58 +0000124 org.apache.felix.shell.CdCommand.class.getName());
Richard S. Hall930fecc2005-08-16 18:33:34 +0000125
126 if (ref != null)
127 {
128 CdCommand cd = (CdCommand) m_context.getService(ref);
129 baseURL = cd.getBaseURL();
130 baseURL = (baseURL == null) ? "" : baseURL;
131 m_context.ungetService(ref);
132 }
133
Richard S. Hall7c9da3d2006-02-24 20:09:28 +0000134 String theURL = baseURL + guess;
Richard S. Hall930fecc2005-08-16 18:33:34 +0000135 new URL(theURL);
Richard S. Hall930fecc2005-08-16 18:33:34 +0000136 }
137 catch (Exception ex2)
138 {
Richard S. Hall7c9da3d2006-02-24 20:09:28 +0000139 // If that fails, then just return the original.
140 return location;
Richard S. Hall930fecc2005-08-16 18:33:34 +0000141 }
Richard S. Hall7c9da3d2006-02-24 20:09:28 +0000142 guess = baseURL + guess;
Richard S. Hall930fecc2005-08-16 18:33:34 +0000143 }
Richard S. Hall7c9da3d2006-02-24 20:09:28 +0000144 return guess;
Richard S. Hall930fecc2005-08-16 18:33:34 +0000145 }
146}