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 018package org.apache.commons.cli; 019 020import java.io.File; 021 022import java.net.MalformedURLException; 023import java.net.URL; 024 025import java.util.Date; 026 027/** 028 * This is a temporary implementation. TypeHandler will handle the 029 * pluggableness of OptionTypes and it will direct all of these types 030 * of conversion functionalities to ConvertUtils component in Commons 031 * already. BeanUtils I think. 032 * 033 * @version $Id: TypeHandler.java 1443102 2013-02-06 18:12:16Z tn $ 034 */ 035public class TypeHandler 036{ 037 /** 038 * Returns the <code>Object</code> of type <code>obj</code> 039 * with the value of <code>str</code>. 040 * 041 * @param str the command line value 042 * @param obj the type of argument 043 * @return The instance of <code>obj</code> initialised with 044 * the value of <code>str</code>. 045 * @throws ParseException if the value creation for the given object type failed 046 */ 047 public static Object createValue(String str, Object obj) throws ParseException 048 { 049 return createValue(str, (Class<?>) obj); 050 } 051 052 /** 053 * Returns the <code>Object</code> of type <code>clazz</code> 054 * with the value of <code>str</code>. 055 * 056 * @param str the command line value 057 * @param clazz the type of argument 058 * @return The instance of <code>clazz</code> initialised with 059 * the value of <code>str</code>. 060 * @throws ParseException if the value creation for the given class failed 061 */ 062 public static Object createValue(String str, Class<?> clazz) throws ParseException 063 { 064 if (PatternOptionBuilder.STRING_VALUE == clazz) 065 { 066 return str; 067 } 068 else if (PatternOptionBuilder.OBJECT_VALUE == clazz) 069 { 070 return createObject(str); 071 } 072 else if (PatternOptionBuilder.NUMBER_VALUE == clazz) 073 { 074 return createNumber(str); 075 } 076 else if (PatternOptionBuilder.DATE_VALUE == clazz) 077 { 078 return createDate(str); 079 } 080 else if (PatternOptionBuilder.CLASS_VALUE == clazz) 081 { 082 return createClass(str); 083 } 084 else if (PatternOptionBuilder.FILE_VALUE == clazz) 085 { 086 return createFile(str); 087 } 088 else if (PatternOptionBuilder.EXISTING_FILE_VALUE == clazz) 089 { 090 return createFile(str); 091 } 092 else if (PatternOptionBuilder.FILES_VALUE == clazz) 093 { 094 return createFiles(str); 095 } 096 else if (PatternOptionBuilder.URL_VALUE == clazz) 097 { 098 return createURL(str); 099 } 100 else 101 { 102 return null; 103 } 104 } 105 106 /** 107 * Create an Object from the classname and empty constructor. 108 * 109 * @param classname the argument value 110 * @return the initialised object 111 * @throws ParseException if the class could not be found or the object could not be created 112 */ 113 public static Object createObject(String classname) throws ParseException 114 { 115 Class<?> cl; 116 117 try 118 { 119 cl = Class.forName(classname); 120 } 121 catch (ClassNotFoundException cnfe) 122 { 123 throw new ParseException("Unable to find the class: " + classname); 124 } 125 126 try 127 { 128 return cl.newInstance(); 129 } 130 catch (Exception e) 131 { 132 throw new ParseException(e.getClass().getName() + "; Unable to create an instance of: " + classname); 133 } 134 } 135 136 /** 137 * Create a number from a String. If a . is present, it creates a 138 * Double, otherwise a Long. 139 * 140 * @param str the value 141 * @return the number represented by <code>str</code> 142 * @throws ParseException if <code>str</code> is not a number 143 */ 144 public static Number createNumber(String str) throws ParseException 145 { 146 try 147 { 148 if (str.indexOf('.') != -1) 149 { 150 return Double.valueOf(str); 151 } 152 else 153 { 154 return Long.valueOf(str); 155 } 156 } 157 catch (NumberFormatException e) 158 { 159 throw new ParseException(e.getMessage()); 160 } 161 } 162 163 /** 164 * Returns the class whose name is <code>classname</code>. 165 * 166 * @param classname the class name 167 * @return The class if it is found 168 * @throws ParseException if the class could not be found 169 */ 170 public static Class<?> createClass(String classname) throws ParseException 171 { 172 try 173 { 174 return Class.forName(classname); 175 } 176 catch (ClassNotFoundException e) 177 { 178 throw new ParseException("Unable to find the class: " + classname); 179 } 180 } 181 182 /** 183 * Returns the date represented by <code>str</code>. 184 * <p> 185 * This method is not yet implemented and always throws an 186 * {@link UnsupportedOperationException}. 187 * 188 * @param str the date string 189 * @return The date if <code>str</code> is a valid date string, 190 * otherwise return null. 191 * @throws UnsupportedOperationException always 192 */ 193 public static Date createDate(String str) 194 { 195 throw new UnsupportedOperationException("Not yet implemented"); 196 } 197 198 /** 199 * Returns the URL represented by <code>str</code>. 200 * 201 * @param str the URL string 202 * @return The URL in <code>str</code> is well-formed 203 * @throws ParseException if the URL in <code>str</code> is not well-formed 204 */ 205 public static URL createURL(String str) throws ParseException 206 { 207 try 208 { 209 return new URL(str); 210 } 211 catch (MalformedURLException e) 212 { 213 throw new ParseException("Unable to parse the URL: " + str); 214 } 215 } 216 217 /** 218 * Returns the File represented by <code>str</code>. 219 * 220 * @param str the File location 221 * @return The file represented by <code>str</code>. 222 */ 223 public static File createFile(String str) 224 { 225 return new File(str); 226 } 227 228 /** 229 * Returns the File[] represented by <code>str</code>. 230 * <p> 231 * This method is not yet implemented and always throws an 232 * {@link UnsupportedOperationException}. 233 * 234 * @param str the paths to the files 235 * @return The File[] represented by <code>str</code>. 236 * @throws UnsupportedOperationException always 237 */ 238 public static File[] createFiles(String str) 239 { 240 // to implement/port: 241 // return FileW.findFiles(str); 242 throw new UnsupportedOperationException("Not yet implemented"); 243 } 244}