001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.admin.client.cli; 028 import org.opends.messages.Message; 029 030 import java.io.OutputStream; 031 import java.io.PrintStream; 032 033 import org.opends.admin.ads.ADSContextException; 034 import org.opends.server.admin.ClassLoaderProvider; 035 import org.opends.server.core.DirectoryServer; 036 import org.opends.server.types.InitializationException; 037 import org.opends.server.types.NullOutputStream; 038 import org.opends.server.util.args.ArgumentException; 039 040 import static org.opends.server.admin.client.cli.DsFrameworkCliReturnCode.*; 041 import static org.opends.messages.AdminMessages.*; 042 import static org.opends.messages.DSConfigMessages.*; 043 import static org.opends.messages.ToolMessages.*; 044 import org.opends.messages.MessageBuilder; 045 import static org.opends.server.util.ServerConstants.*; 046 import static org.opends.server.util.StaticUtils.*; 047 048 049 /** 050 * This class provides a tool that can be used to Directory Server framework 051 * services. 052 */ 053 public class DsFrameworkCliMain 054 { 055 /** 056 * The fully-qualified name of this class. 057 */ 058 private static final String CLASS_NAME = 059 "org.opends.server.admin.client.cli.DsFrameworkCliMain"; 060 061 // The print stream to use for standard error. 062 private PrintStream err; 063 064 // The print stream to use for standard output. 065 private PrintStream out; 066 067 068 069 /** 070 * Constructor for the DsFrameworkCLI object. 071 * 072 * @param out The print stream to use for standard output. 073 * @param err The print stream to use for standard error. 074 */ 075 public DsFrameworkCliMain(PrintStream out, PrintStream err) 076 { 077 this.out = out; 078 this.err = err; 079 } 080 081 /** 082 * The main method for dsframework tool. 083 * 084 * @param args The command-line arguments provided to this program. 085 */ 086 087 public static void main(String[] args) 088 { 089 int retCode = mainCLI(args, true, System.out, System.err); 090 091 if(retCode != 0) 092 { 093 System.exit(retCode); 094 } 095 } 096 097 /** 098 * Parses the provided command-line arguments and uses that information to 099 * run the dsframework tool. 100 * 101 * @param args The command-line arguments provided to this program. 102 * 103 * @return The error code. 104 */ 105 106 public static int mainCLI(String[] args) 107 { 108 return mainCLI(args, true, System.out, System.err); 109 } 110 111 /** 112 * Parses the provided command-line arguments and uses that information to 113 * run the dsframework tool. 114 * 115 * @param args The command-line arguments provided to this 116 * program. 117 * @param initializeServer Indicates whether to initialize the server. 118 * @param outStream The output stream to use for standard output, or 119 * <CODE>null</CODE> if standard output is not 120 * needed. 121 * @param errStream The output stream to use for standard error, or 122 * <CODE>null</CODE> if standard error is not 123 * needed. 124 * @return The error code. 125 */ 126 127 public static int mainCLI(String[] args, boolean initializeServer, 128 OutputStream outStream, OutputStream errStream) 129 { 130 PrintStream out; 131 if (outStream == null) 132 { 133 out = NullOutputStream.printStream(); 134 } 135 else 136 { 137 out = new PrintStream(outStream); 138 } 139 140 PrintStream err; 141 if (errStream == null) 142 { 143 err = NullOutputStream.printStream(); 144 } 145 else 146 { 147 err = new PrintStream(errStream); 148 } 149 150 DsFrameworkCliMain dsFrameworkCli = new DsFrameworkCliMain(out, err); 151 return dsFrameworkCli.execute(args,initializeServer); 152 } 153 154 /** 155 * Parses the provided command-line arguments and uses that information to 156 * run the dsframework tool. 157 * 158 * @param args The command-line arguments provided to this 159 * program. 160 * @param initializeServer Indicates whether to initialize the server. 161 * 162 * @return The error code. 163 */ 164 public int execute(String[] args, boolean initializeServer) 165 { 166 // Create the command-line argument parser for use with this 167 // program. 168 DsFrameworkCliParser argParser ; 169 try 170 { 171 Message toolDescription = INFO_ADMIN_TOOL_DESCRIPTION.get(); 172 argParser = new DsFrameworkCliParser(CLASS_NAME, 173 toolDescription, false); 174 argParser.initializeParser(out); 175 } 176 catch (ArgumentException ae) 177 { 178 Message message = ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()); 179 180 err.println(wrapText(message, MAX_LINE_WIDTH)); 181 return CANNOT_INITIALIZE_ARGS.getReturnCode(); 182 } 183 184 // Parse the command-line arguments provided to this program. 185 try 186 { 187 argParser.parseArguments(args); 188 } 189 catch (ArgumentException ae) 190 { 191 Message message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage()); 192 193 err.println(wrapText(message, MAX_LINE_WIDTH)); 194 err.println(argParser.getUsage()); 195 return ERROR_PARSING_ARGS.getReturnCode(); 196 } 197 198 // If we should just display usage information, then print it and exit. 199 if (argParser.usageOrVersionDisplayed()) 200 { 201 return SUCCESSFUL.getReturnCode(); 202 } 203 204 if (argParser.getSubCommand() == null) 205 { 206 Message message = ERR_ERROR_PARSING_ARGS.get( 207 ERR_DSCFG_ERROR_MISSING_SUBCOMMAND.get()); 208 err.println(wrapText(message, MAX_LINE_WIDTH)); 209 err.println(); 210 err.println(argParser.getHelpUsageReference()); 211 return ERROR_PARSING_ARGS.getReturnCode(); 212 } 213 214 // Validate args 215 int ret = argParser.validateGlobalOptions(err); 216 if (ret != SUCCESSFUL_NOP.getReturnCode()) 217 { 218 return ret; 219 } 220 221 // Check if we need a connection 222 223 DsFrameworkCliReturnCode returnCode = SUCCESSFUL; 224 225 226 // Should we initialize the server in client mode? 227 if (initializeServer) 228 { 229 // Bootstrap and initialize directory data structures. 230 DirectoryServer.bootstrapClient(); 231 232 // Bootstrap definition classes. 233 try 234 { 235 ClassLoaderProvider.getInstance().enable(); 236 } 237 catch (InitializationException e) 238 { 239 err.println(wrapText(e.getMessage(), MAX_LINE_WIDTH)); 240 return ERROR_UNEXPECTED.getReturnCode(); 241 } 242 catch (IllegalStateException e) 243 { 244 err.println(wrapText(e.getMessage(), MAX_LINE_WIDTH)); 245 return ERROR_UNEXPECTED.getReturnCode(); 246 } 247 } 248 249 // perform the subCommand 250 ADSContextException adsException = null; 251 try 252 { 253 returnCode = argParser.performSubCommand(out, err); 254 } 255 catch (ADSContextException e) 256 { 257 adsException = e; 258 returnCode = DsFrameworkCliReturnCode.getReturncodeFromAdsError(e 259 .getError()); 260 if (returnCode == null) 261 { 262 returnCode = ERROR_UNEXPECTED; 263 } 264 } 265 catch (ArgumentException ae) 266 { 267 Message message = ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()); 268 269 err.println(wrapText(message, MAX_LINE_WIDTH)); 270 return CANNOT_INITIALIZE_ARGS.getReturnCode(); 271 } 272 273 Message msg = returnCode.getMessage(); 274 if ( (returnCode == SUCCESSFUL) 275 || 276 (returnCode == SUCCESSFUL_NOP)) 277 { 278 if (argParser.isVerbose()) 279 { 280 out.println(wrapText(msg.toString(), MAX_LINE_WIDTH)); 281 } 282 } 283 else 284 if (msg != null && 285 msg.getDescriptor().getId() != ERR_ADMIN_NO_MESSAGE.getId()) 286 { 287 MessageBuilder mb = new MessageBuilder(INFO_ADMIN_ERROR.get()); 288 mb.append(msg); 289 err.println(wrapText(mb.toString(), MAX_LINE_WIDTH)); 290 if (argParser.isVerbose() && (adsException != null)) 291 { 292 adsException.printStackTrace(); 293 } 294 } 295 return returnCode.getReturnCode(); 296 } 297 }