001/*license*\ 002 Codelet: Copyright (C) 2014, Jeff Epstein (aliteralmind __DASH__ github __AT__ yahoo __DOT__ com) 003 004 This software is dual-licensed under the: 005 - Lesser General Public License (LGPL) version 3.0 or, at your option, any later version; 006 - Apache Software License (ASL) version 2.0. 007 008 Either license may be applied at your discretion. More information may be found at 009 - http://en.wikipedia.org/wiki/Multi-licensing. 010 011 The text of both licenses is available in the root directory of this project, under the names "LICENSE_lgpl-3.0.txt" and "LICENSE_asl-2.0.txt". The latest copies may be downloaded at: 012 - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt 013 - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt 014\*license*/ 015package com.github.aliteralmind.codelet.alter; 016 import com.github.aliteralmind.codelet.CodeletInstance; 017 import com.github.aliteralmind.codelet.CodeletType; 018 import com.github.xbn.lang.CrashIfObject; 019 import com.github.xbn.linefilter.alter.TextLineAlterer; 020 import com.github.xbn.list.MapUtil; 021 import java.util.ArrayList; 022 import java.util.Arrays; 023 import java.util.Iterator; 024 import java.util.LinkedHashMap; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.NoSuchElementException; 028 import static com.github.aliteralmind.codelet.CodeletBaseConfig.*; 029/** 030 <p>Utilities related to default alterers.</p> 031 032 * @see com.github.aliteralmind.codelet.CodeletBaseConfig#DEFAULT_ALTERERS_CLASS_NAME 033 * @since 0.1.0 034 * @author Copyright (C) 2014, Jeff Epstein ({@code aliteralmind __DASH__ github __AT__ yahoo __DOT__ com}), dual-licensed under the LGPL (version 3.0 or later) or the ASL (version 2.0). See source code for details. <a href="http://codelet.aliteralmind.com">{@code http://codelet.aliteralmind.com}</a>, <a href="https://github.com/aliteralmind/codelet">{@code https://github.com/aliteralmind/codelet}</a> 035 **/ 036public class DefaultAlterGetterUtil { 037 /** 038 <p>Get a default alterer from its name.</p> 039 040 * @param instance_forTypeOnly May not be {@code null}. 041 * @param map_keyName Must be an existing key in the map. 042 * @return <code>{@link #getMap(CodeletType) getMap}(instance_forTypeOnly.{@link CodeletInstance#getType() getType}()).{@link java.util.LinkedHashMap#get(Object) get}(map_keyName)</code> 043 * @exception NoSuchElementException If {@code map_keyName} is not a key in the map. 044 */ 045 public static final TextLineAlterer get(CodeletInstance instance_forTypeOnly, String map_keyName, Appendable debugDest_ifNonNull) { 046 TextLineAlterer alterer = null; 047 try { 048 alterer = getMap(instance_forTypeOnly.getType()).get(map_keyName); 049 } catch(RuntimeException rx) { 050 throw CrashIfObject.nullOrReturnCause(instance_forTypeOnly, "instance_forTypeOnly", null, rx); 051 } 052 if(alterer == null) { 053 throw new NoSuchElementException("instance_forTypeOnly.getType()=" + instance_forTypeOnly.getType() + ", getDefaultAlterGetter():" + getDefaultAlterGetter().getClass().getName() + ", map_keyName=\"" + map_keyName + "\""); 054 } 055 try { 056 alterer = (TextLineAlterer)alterer.getObjectCopy(); 057 alterer.setDebug(debugDest_ifNonNull, (debugDest_ifNonNull != null)); 058 } catch(RuntimeException rx) { 059 throw new DefaultAlterGetterException("Attempting to duplicate the alterer and then set the debugging object. instance_forTypeOnly.getType()=" + instance_forTypeOnly.getType() + ", map_keyName=\"" + map_keyName + "\", debugDest_ifNonNull=" + debugDest_ifNonNull, rx); 060 } 061 return alterer; 062 } 063 /** 064 <p>Get the map of default alterers.</p> 065 066 * @param needed_defaultAlterType May not be {@code null}. 067 * @return If {@code needed_defaultAlterType} is<ul> 068 <li>{@link CodeletType#SOURCE_CODE SOURCE_CODE}: <code>{@link com.github.aliteralmind.codelet.CodeletBaseConfig#getDefaultAlterGetter() getDefaultAlterGetter}()*.{@link DefaultAlterGetter#getForSourceCodelet() getForSourceCodelet}()</code></li> 069 <li>{@link CodeletType#CONSOLE_OUT CONSOLE_OUT}: <code>getDefaultAlterGetter().{@link DefaultAlterGetter#getForCodeletDotOut() getForCodeletDotOut}()</code></li> 070 <li>{@link CodeletType#FILE_TEXT FILE_TEXT}: <code>getDefaultAlterGetter().{@link DefaultAlterGetter#getForFileTextlet() getForFileTextlet}()</code></li> 071 </ul> 072 * @exception IllegalArgumentException If {@code needed_defaultAlterType} is {@link CodeletType#SOURCE_AND_OUT}. Use {@code SOURCE_CODE} or {@code CONSOLE_OUT} instead. 073 * @exception DefaultAlterGetterException If anything goes wrong when attempting to retrieve the map. 074 */ 075 public static final LinkedHashMap<String,TextLineAlterer> getMap(CodeletType needed_defaultAlterType) { 076 try { 077 switch(needed_defaultAlterType) { 078 case SOURCE_CODE: 079 return getDefaultAlterGetter().getForSourceCodelet(); 080 case CONSOLE_OUT: 081 return getDefaultAlterGetter().getForCodeletDotOut(); 082// case SOURCE_AND_OUT: 083// return getDefaultAlterGetter().getForCodeletAndOut(); 084 case FILE_TEXT: 085 return getDefaultAlterGetter().getForFileTextlet(); 086 } 087 if(needed_defaultAlterType == CodeletType.SOURCE_AND_OUT) { 088 throw new IllegalArgumentException("needed_defaultAlterType=SOURCE_AND_OUT. Use SOURCE_CODE or CONSOLE_OUT."); 089 } 090 throw new DefaultAlterGetterException("needed_defaultAlterType (CodeletType." + needed_defaultAlterType + ") is an unknown value."); 091 } catch(RuntimeException rx) { 092 CrashIfObject.nnull(needed_defaultAlterType, "needed_defaultAlterType", null); 093 throw new DefaultAlterGetterException("Attempting to retrieve default alter map for needed_defaultAlterType=" + needed_defaultAlterType, rx); 094 } 095 } 096 /** 097 <p>Creates a new list with a initial capacity equal to the default-alterers map, plus a number.</p> 098 099 * @param numToAdd_toDefaultMapSize <i>Should</i> be greater than zero. 100 * @return <code>(new {@link ArrayList#ArrayList(int) ArrayList}<TextLineAlterer>( 101 <br/> 102 numToAdd_toDefaultMapSize + {@link #getMap(CodeletType) getMap}(needed_defaultAlterType).size()))</code> 103 * @exception IllegalArgumentException If {@code numToAdd_toDefaultMapSize} results in an initial capacity that is negative. 104 * @exception DefaultAlterGetterException If anything goes wrong when attempting to retrieve the map or its size. 105 */ 106 public static final ArrayList<TextLineAlterer> newEmptyArrayListWithDefaultInitCapacityPlus(CodeletType needed_defaultAlterType, int numToAdd_toDefaultMapSize) { 107 try { 108 return (new ArrayList<TextLineAlterer>( 109 numToAdd_toDefaultMapSize + getMap(needed_defaultAlterType).size())); 110 } catch(IllegalArgumentException iax) { 111 throw new IllegalArgumentException("numToAdd_toDefaultMapSize=" + numToAdd_toDefaultMapSize, iax); 112 } 113 } 114 /** 115 <p>Creates a new line-alter array with all defaults.</p> 116 117 * @return <code>{@link #getAlterArrayWithDefaultAlterersAdded(CodeletType, List) getAlterArrayWithDefaultAlterersAdded}(needed_defaultAlterType, 118 <br/> new {@link ArrayList#ArrayList(int) ArrayList}<TextLineAlterer>({@link #getMap(CodeletType) getMap}(needed_defaultAlterType).size()))</code> 119 */ 120 public static final TextLineAlterer[] getDefaultAlterArray(CodeletType needed_defaultAlterType) { 121 return getAlterArrayWithDefaultAlterersAdded(needed_defaultAlterType, 122 new ArrayList<TextLineAlterer>(getMap(needed_defaultAlterType).size())); 123 } 124 /** 125 <p>Creates a new line-alter array with all default alterers placed after the provided alterer.</p> 126 127 * @return <code>{@link #getAlterArrayWithDefaultAlterersAdded(CodeletType, List) getAlterArrayWithDefaultAlterersAdded}(needed_defaultAlterType, 128 <br/> new {@link ArrayList#ArrayList(Collection) ArrayList}<TextLineAlterer>( 129 <br/> {@link java.util.Arrays}.<!-- GENERIC PARAMETERS FAIL IN @link --><a href="http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T)">asList</a>(new TextLineAlterer[]{the_onlyAlterer})))</code> 130 */ 131 public static final TextLineAlterer[] getAlterArrayWithDefaultAlterersAdded(CodeletType needed_defaultAlterType, TextLineAlterer the_onlyAlterer) { 132 return getAlterArrayWithDefaultAlterersAdded(needed_defaultAlterType, 133 new ArrayList<TextLineAlterer>( 134 Arrays.asList(new TextLineAlterer[]{the_onlyAlterer}))); 135 } 136 /** 137 <p>Creates a new line-alter array with all default alterers placed after all provided alterers.</p> 138 139 * @param needed_defaultAlterType May not be {@code null}. 140 * @param alter_list May not be {@code null}, but may be empty or contain {@code null} elements. 141 * @exception DefaultAlterGetterException If anything goes wrong when attempting to retrieve the map, its {@linkplain java.util.Map#entrySet() entry} iterator, or an entry. 142 * @see #getDefaultAlterArray(CodeletType) getDefaultAlterArray 143 * @see #getAlterArrayWithDefaultAlterersAdded(CodeletType, TextLineAlterer) getAlterArrayWithDefaultAlterersAdded 144 */ 145 public static final TextLineAlterer[] getAlterArrayWithDefaultAlterersAdded(CodeletType needed_defaultAlterType, List<TextLineAlterer> alter_list) { 146 Iterator<Map.Entry<String,TextLineAlterer>> entryItr = null; 147 try { 148 entryItr = getMap(needed_defaultAlterType).entrySet().iterator(); 149 } catch(RuntimeException rx) { 150 throw new DefaultAlterGetterException("Attempting getMap(needed_defaultAlterType).entrySet().iterator(). needed_defaultAlterType=" + needed_defaultAlterType, rx); 151 } 152 try { 153 while(entryItr.hasNext()) { 154 Map.Entry<String,TextLineAlterer> entry = entryItr.next(); 155 TextLineAlterer alterer = entry.getValue(); 156 if(alterer == null) { 157 throw new IllegalArgumentException("getMap(" + needed_defaultAlterType + ").entrySet().iterator() has a null element. All elements: " + MapUtil.toString(getMap(needed_defaultAlterType), null)); 158 } 159 alter_list.add(alterer); 160 } 161 } catch(DefaultAlterGetterException dgx) { 162 throw dgx; 163 } catch(RuntimeException rx) { 164 throw new DefaultAlterGetterException("Attempting [getMap(needed_defaultAlterType).entrySet().iterator()].hasNext() (\"hasNext()\" failed). needed_defaultAlterType=" + needed_defaultAlterType, rx); 165 } 166 return alter_list.toArray(new TextLineAlterer[alter_list.size()]); 167 } 168 private DefaultAlterGetterUtil() { 169 throw new IllegalStateException("Do not instantiate."); 170 } 171}