/*- * ============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> 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>(capacity); for( int i = 0; i < capacity; i++ ) { this.list.add(i, new HashMap()); } // Populate "elements" in list String prefix_bracket = this.prefix + '['; for (String key : new HashSet(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 get( int index ) { return this.list.get(index); } // TODO: javadoc public HashMap 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> itr = this.list.listIterator(); while( itr.hasNext() ) { if( value.equals(itr.next().get(key)) ) { itr.remove(); } } } // TODO javadoc public void remove( Map primary_key ) { ListIterator> itr = this.list.listIterator(); while( itr.hasNext() ) { boolean found = true; HashMap list_element = itr.next(); for( Map.Entry 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 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 ); } } } }