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}&lt;TextLineAlterer&gt;(
101         <br/> &nbsp; &nbsp;
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/> &nbsp; &nbsp; new {@link ArrayList#ArrayList(int) ArrayList}&lt;TextLineAlterer&gt;({@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/> &nbsp; &nbsp; new {@link ArrayList#ArrayList(Collection) ArrayList}&lt;TextLineAlterer&gt;(
129      <br/> &nbsp; &nbsp; &nbsp; &nbsp; {@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}