Java tutorial
/*- * ============LICENSE_START======================================================= * openECOMP : SDN-C * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights * reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdnc.sli.SliPluginUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.ListIterator; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.openecomp.sdnc.sli.SvcLogicContext; /** * A utility class used to manage list manipulation in the context memory. * @see org.openecomp.sdnc.sli.SvcLogicContext */ public class SvcLogicContextList { /** * Internal flag indicating if list should be deleted from context memory * when it is copied into the SvcLogicContextList object. */ private enum OperType { COPY, EXTRACT } // TODO: javadoc protected final String prefix; // TODO: javadoc protected final ArrayList<HashMap<String, String>> list; // TODO: javadoc public SvcLogicContextList(SvcLogicContext ctx, String list_prefix) { this(ctx, list_prefix, OperType.COPY); } // TODO: javadoc private SvcLogicContextList(SvcLogicContext ctx, String list_prefix, OperType operation) { this.prefix = list_prefix; // Initialize list int capacity = getCtxListLength(ctx, prefix); this.list = new ArrayList<HashMap<String, String>>(capacity); for (int i = 0; i < capacity; i++) { this.list.add(i, new HashMap<String, String>()); } // Populate "elements" in list String prefix_bracket = this.prefix + '['; for (String key : new HashSet<String>(ctx.getAttributeKeySet())) { if (key.startsWith(prefix_bracket)) { // Extract the index of the list int index = getCtxListIndex(key, this.prefix, capacity); // Store the String suffix = key.substring((prefix_bracket + index + ']').length()); suffix = suffix.isEmpty() ? suffix : suffix.substring(1); this.list.get(index).put(suffix, ctx.getAttribute(key)); // If flag to extract set, remove data from context memory as // it is read into this list if (operation == OperType.EXTRACT) { ctx.setAttribute(key, null); } } } // If flag to extract set, remove list _length value from cxt mem if (operation == OperType.EXTRACT) { ctx.setAttribute(this.prefix + "_length", null); } } // TODO: javadoc public static SvcLogicContextList extract(SvcLogicContext ctx, String list_prefix) { return new SvcLogicContextList(ctx, list_prefix, OperType.EXTRACT); } // ========== PUBLIC FUNCTIONS ========== // TODO: javadoc public HashMap<String, String> get(int index) { return this.list.get(index); } // TODO: javadoc public HashMap<String, String> remove(int index) { return this.list.remove(index); } // TODO: javadoc public void remove(String value) { remove("", value); } // TODO: javadoc public void remove(String key, String value) { if (value == null) { throw new IllegalArgumentException("value cannot be null"); } ListIterator<HashMap<String, String>> itr = this.list.listIterator(); while (itr.hasNext()) { if (value.equals(itr.next().get(key))) { itr.remove(); } } } // TODO javadoc public void remove(Map<String, String> primary_key) { ListIterator<HashMap<String, String>> itr = this.list.listIterator(); while (itr.hasNext()) { boolean found = true; HashMap<String, String> list_element = itr.next(); for (Map.Entry<String, String> key : primary_key.entrySet()) { if (!key.getValue().equals(list_element.get(key.getKey()))) { found = false; break; } } if (found) { itr.remove(); } } } // TODO: javadoc public int size() { return list.size(); } // TODO: javadoc public void writeToContext(SvcLogicContext ctx) { ctx.setAttribute(prefix + "_length", Integer.toString(this.list.size())); for (int i = 0; i < this.list.size(); i++) { for (Map.Entry<String, String> entry : this.list.get(i).entrySet()) { if (entry.getKey().equals("")) { ctx.setAttribute(prefix + '[' + i + ']', entry.getValue()); } else { ctx.setAttribute(prefix + '[' + i + "]." + entry.getKey(), entry.getValue()); } } } } // ========== PRIVATE STATIC FUNCTIONS ========== // TODO: javadoc private static int getCtxListIndex(String key, String prefix, int list_size) { int index = getCtxListIndex(key, prefix); if (index >= list_size) { throw new IllegalArgumentException( "Context memory list \"" + prefix + "[]\" contains an index >= the size of the list", new ArrayIndexOutOfBoundsException( "index \"" + index + "\" is outside the bounds of the context memory list \"" + prefix + "[]. List Length = " + list_size)); } else if (index < 0) { throw new IllegalArgumentException("Context memory list \"" + prefix + "[]\" contains a negative index", new NegativeArraySizeException("index \"" + index + "\" of context memory list is negative")); } return index; } // TODO: javadoc private static int getCtxListIndex(String key, String prefix) { String ctx_index_str = StringUtils.substringBetween(key.substring(prefix.length()), "[", "]"); try { return Integer.parseInt(ctx_index_str); } catch (NumberFormatException e) { throw new IllegalStateException( "Could not parse index value \"" + ctx_index_str + "\" in context memory key \"" + key + "\"", e); } } // TODO: javadoc private static int getCtxListLength(SvcLogicContext ctx, String prefix) { String _length_key = prefix + "_length"; String _length_val_str = ctx.getAttribute(_length_key); try { return Integer.parseInt(_length_val_str); } catch (NumberFormatException e) { if (_length_val_str == null) { throw new IllegalStateException( "Could not find list length \"" + _length_key + "\" in context memory."); } else { throw new IllegalStateException("Could not parse index value \"" + _length_val_str + "\" of context memory list length \"" + _length_key + "\"", e); } } } }