001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.system.main;
018
019 import java.io.IOException;
020 import java.net.JarURLConnection;
021 import java.net.URI;
022 import java.net.URISyntaxException;
023 import java.net.URL;
024 import java.util.ArrayList;
025 import java.util.Collections;
026 import java.util.List;
027 import java.util.StringTokenizer;
028 import java.util.jar.Attributes;
029 import java.util.jar.Manifest;
030
031 import org.apache.geronimo.gbean.AbstractNameQuery;
032 import org.apache.geronimo.kernel.repository.Artifact;
033
034 /**
035 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
036 */
037 public class CommandLineManifest {
038 public static final Attributes.Name MAIN_GBEAN = new Attributes.Name("Main-GBean");
039 public static final Attributes.Name MAIN_METHOD = new Attributes.Name("Main-Method");
040 public static final Attributes.Name CONFIGURATIONS = new Attributes.Name("Configurations");
041 public static final Attributes.Name ENDORSED_DIRS = new Attributes.Name("Endorsed-Dirs");
042 public static final Attributes.Name EXTENSION_DIRS = new Attributes.Name("Extension-Dirs");
043
044 public static CommandLineManifest getManifestEntries() {
045 // find the startup jar
046 ClassLoader classLoader = CommandLine.class.getClassLoader();
047 URL url = classLoader.getResource("META-INF/startup-jar");
048 if (url == null) {
049 throw new IllegalArgumentException("Unable to determine location of startup jar");
050 }
051
052 // extract the manifest
053 Manifest manifest;
054 try {
055 JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
056 manifest = jarConnection.getManifest();
057 } catch (IOException e) {
058 System.err.println("Startup jar does not contain a manifest: " + url);
059 System.exit(1);
060 throw new AssertionError();
061 }
062 Attributes mainAttributes = manifest.getMainAttributes();
063
064 // get the main gbean class
065 String mainGBeanString = mainAttributes.getValue(MAIN_GBEAN);
066
067 AbstractNameQuery mainGBean = null;
068 if (mainGBeanString != null) {
069 try {
070 mainGBean = new AbstractNameQuery(new URI(mainGBeanString));
071 } catch (URISyntaxException e) {
072 System.err.println("Invalid Main-GBean name: " + mainGBeanString);
073 System.exit(1);
074 throw new AssertionError();
075 }
076 }
077
078 // get the main method
079 String mainMethod = mainAttributes.getValue(MAIN_METHOD);
080
081 // get the list of extra configurations to load
082 List configurations = new ArrayList();
083 String configurationsString = mainAttributes.getValue(CONFIGURATIONS);
084 if (configurationsString != null) {
085 for (StringTokenizer tokenizer = new StringTokenizer(configurationsString, " "); tokenizer.hasMoreTokens();)
086 {
087 String configuration = tokenizer.nextToken();
088 configurations.add(Artifact.create(configuration));
089 }
090 }
091
092 // get the list of endorsed directories
093 List endorsedDirs = new ArrayList();
094 String endorsedDirsString = mainAttributes.getValue(ENDORSED_DIRS);
095 if (endorsedDirsString != null) {
096 for (StringTokenizer tokenizer = new StringTokenizer(endorsedDirsString, " "); tokenizer.hasMoreTokens();) {
097 String directory = tokenizer.nextToken();
098 endorsedDirs.add(directory);
099 }
100 }
101
102 // get the list of extension directories
103 List extensionDirs = new ArrayList();
104 String extensionDirsString = mainAttributes.getValue(EXTENSION_DIRS);
105 if (extensionDirsString != null) {
106 for (StringTokenizer tokenizer = new StringTokenizer(extensionDirsString, " "); tokenizer.hasMoreTokens();)
107 {
108 String directory = tokenizer.nextToken();
109 extensionDirs.add(directory);
110 }
111 }
112
113 CommandLineManifest commandLineManifest = new CommandLineManifest(mainGBean, mainMethod, configurations, endorsedDirs, extensionDirs);
114 return commandLineManifest;
115 }
116
117 private final AbstractNameQuery mainGBean;
118 private final String mainMethod;
119 private final List configurations;
120 private final List endorsedDirs;
121 private final List extensionDirs;
122
123 public CommandLineManifest(AbstractNameQuery mainGBean, String mainMethod, List configurations, List endorsedDirs, List extensionDirs) {
124 this.mainGBean = mainGBean;
125 this.mainMethod = mainMethod;
126 this.configurations = Collections.unmodifiableList(configurations);
127 this.endorsedDirs = endorsedDirs;
128 this.extensionDirs = extensionDirs;
129 }
130
131 public AbstractNameQuery getMainGBeanQuery() {
132 return mainGBean;
133 }
134
135 public String getMainMethod() {
136 return mainMethod;
137 }
138
139 public List getConfigurations() {
140 return configurations;
141 }
142
143 public List getEndorsedDirs() {
144 return endorsedDirs;
145 }
146
147 public List getExtensionDirs() {
148 return extensionDirs;
149 }
150 }