/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc., Oracle Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
* Oracle Inc.
* Spring IDE Developers
*****************************************************************************/
package org.springframework.ide.eclipse.osgi.blueprint.internal.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedSet;
import org.springframework.ide.eclipse.osgi.blueprint.internal.support.ToStringClassAdapter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
/**
* Parsing utility class.
*
* @author Andy Piper
* @author Costin Leau
* @author Arnaud Mergey
*
* @since 3.7.2
*/
public abstract class ParserUtils {
private static final AttributeCallback STANDARD_ATTRS_CALLBACK = new StandardAttributeCallback();
private static final AttributeCallback BLUEPRINT_ATTRS_CALLBACK = new BlueprintAttributeCallback();
private static final AttributeCallback PROPERTY_REF_ATTRS_CALLBACK = new PropertyRefAttributeCallback();
private static final AttributeCallback PROPERTY_CONV_ATTRS_CALLBACK = new ConventionsCallback();
public static final String REFERENCE_LISTENER_REF_ATTR = "org.eclipse.gemini.blueprint.config.internal.reference.listener.ref.attr";
/**
* Generic attribute callback. Will parse the given callback array, w/o any
* standard callback.
*
* @param element
* XML element
* @param builder
* current bean definition builder
* @param callbacks
* array of callbacks (can be null/empty)
*/
public static void parseAttributes(Element element, BeanDefinitionBuilder builder, AttributeCallback[] callbacks) {
NamedNodeMap attributes = element.getAttributes();
for (int x = 0; x < attributes.getLength(); x++) {
Attr attr = (Attr) attributes.item(x);
boolean shouldContinue = true;
if (!ObjectUtils.isEmpty(callbacks))
for (int i = 0; i < callbacks.length && shouldContinue; i++) {
AttributeCallback callback = callbacks[i];
shouldContinue = callback.process(element, attr, builder);
}
}
}
/**
* Dedicated parsing method that uses the following stack:
*
* <ol>
* <li>user given {@link AttributeCallback}s</li>
* <li>{@link StandardAttributeCallback}</li>
* <li>{@link PropertyRefAttributeCallback}</li>
* <li>{@link ConventionCallback}</li>
* </ol>
* </pre>
*
* @param element
* XML element
* @param builder
* current bean definition builder
* @param callbacks
* array of callbacks (can be null/empty)
*/
public static void parseCustomAttributes(Element element, BeanDefinitionBuilder builder,
AttributeCallback[] callbacks) {
List<AttributeCallback> list = new ArrayList<>(8);
if (!ObjectUtils.isEmpty(callbacks))
CollectionUtils.mergeArrayIntoCollection(callbacks, list);
// add standard callback
list.add(STANDARD_ATTRS_CALLBACK);
list.add(BLUEPRINT_ATTRS_CALLBACK);
list.add(PROPERTY_REF_ATTRS_CALLBACK);
list.add(PROPERTY_CONV_ATTRS_CALLBACK);
AttributeCallback[] cbacks = list.toArray(new AttributeCallback[list.size()]);
parseAttributes(element, builder, cbacks);
}
/**
* Derivative for
* {@link #parseCustomAttributes(Element, BeanDefinitionBuilder, org.springframework.ide.eclipse.osgi.blueprint.internal.util.internal.config.ParserUtils.AttributeCallback[])}
* accepting only one {@link AttributeCallback}.
*
* @param element
* XML element
* @param builder
* current bean definition builder
* @param callback
* attribute callback, can be null
*/
public static void parseCustomAttributes(Element element, BeanDefinitionBuilder builder,
AttributeCallback callback) {
AttributeCallback[] callbacks = (callback == null ? new AttributeCallback[0]
: new AttributeCallback[] { callback });
parseCustomAttributes(element, builder, callbacks);
}
public static AttributeCallback[] mergeCallbacks(AttributeCallback[] callbacksA, AttributeCallback[] callbacksB) {
if (ObjectUtils.isEmpty(callbacksA))
if (ObjectUtils.isEmpty(callbacksB))
return new AttributeCallback[0];
else
return callbacksB;
if (ObjectUtils.isEmpty(callbacksB))
return callbacksA;
AttributeCallback[] newCallbacks = new AttributeCallback[callbacksA.length + callbacksB.length];
System.arraycopy(callbacksA, 0, newCallbacks, 0, callbacksA.length);
System.arraycopy(callbacksB, 0, newCallbacks, callbacksA.length, callbacksB.length);
return newCallbacks;
}
}