/*
* ModeShape (http://www.modeshape.org)
*
* 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.
*/
package org.modeshape.schematic.internal.document;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.modeshape.schematic.document.Array;
import org.modeshape.schematic.document.Document;
class Utility {
public static Array unwrap( Array array ) {
if (array instanceof ArrayEditor) {
return unwrap(((ArrayEditor)array).unwrap());
}
return array;
}
public static Document unwrap( Document document ) {
if (document instanceof DocumentEditor) {
return unwrap(((DocumentEditor)document).unwrap());
}
return document;
}
public static Object unwrap( Object value ) {
if (value instanceof DocumentEditor) {
return unwrap(((DocumentEditor)value).unwrap());
}
if (value instanceof ArrayEditor) {
return unwrap(((ArrayEditor)value).unwrap());
}
return value;
}
@SuppressWarnings( "unchecked" )
public static Map<? extends String, ?> unwrapValues( Map<? extends String, ?> map ) {
if (map == null || map.isEmpty()) return map;
Map<String, Object> newMap = (Map<String, Object>)map; // just cast
for (Map.Entry<? extends String, ?> entry : map.entrySet()) {
Object orig = entry.getValue();
Object unwrapped = unwrap(orig);
if (orig != unwrapped) {
String key = entry.getKey();
newMap.put(key, unwrapped);
}
}
return newMap;
}
@SuppressWarnings( "unchecked" )
public static Collection<?> unwrapValues( Collection<?> c ) {
if (c == null || c.isEmpty()) return c;
if (c instanceof Set<?>) {
Set<Object> replaced = null;
Set<Object> result = (Set<Object>)c;
Iterator<?> iter = c.iterator();
while (iter.hasNext()) {
Object orig = iter.next();
Object unwrapped = unwrap(orig);
if (orig != unwrapped) {
iter.remove();
if (replaced == null) replaced = new HashSet<>();
replaced.add(unwrapped);
}
}
if (replaced != null) {
result.addAll(replaced);
}
return result;
}
if (c instanceof List<?>) {
List<Object> result = (List<Object>)c;
ListIterator<Object> iter = result.listIterator();
while (iter.hasNext()) {
Object orig = iter.next();
Object unwrapped = unwrap(orig);
if (orig != unwrapped) {
iter.set(unwrapped);
}
}
return result;
}
return c.stream().map(Utility::unwrap).collect(Collectors.toList());
}
}