/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.aries.blueprint;
import java.net.URI;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.io.IOException;
import javax.xml.validation.Schema;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.apache.aries.blueprint.parser.NamespaceHandlerSet;
import org.apache.aries.blueprint.reflect.BeanMetadataImpl;
import org.osgi.service.blueprint.reflect.BeanArgument;
import org.osgi.service.blueprint.reflect.BeanMetadata;
import org.osgi.service.blueprint.reflect.BeanProperty;
import org.osgi.service.blueprint.reflect.CollectionMetadata;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.Metadata;
import org.osgi.service.blueprint.reflect.NullMetadata;
import org.osgi.service.blueprint.reflect.RefMetadata;
import org.osgi.service.blueprint.reflect.ValueMetadata;
import org.xml.sax.SAXException;
/**
* TODO: constructor injection
* TODO: Dependency#setMethod
*/
public class ParserTest extends AbstractBlueprintTest {
public void test() {
Integer[] oo = new Integer[1];
Object[] ii = oo;
}
public void testParseComponent() throws Exception {
ComponentDefinitionRegistry registry = parse("/test-simple-component.xml");
assertNotNull(registry);
ComponentMetadata component = registry.getComponentDefinition("pojoA");
assertNotNull(component);
assertEquals("pojoA", component.getId());
assertTrue(component instanceof BeanMetadata);
BeanMetadata local = (BeanMetadata) component;
List<String> deps = local.getDependsOn();
assertNotNull(deps);
assertEquals(2, deps.size());
assertTrue(deps.contains("pojoB"));
assertTrue(deps.contains("pojoC"));
assertEquals("org.apache.aries.blueprint.pojos.PojoA", local.getClassName());
List<BeanArgument> params = local.getArguments();
assertNotNull(params);
assertEquals(6, params.size());
BeanArgument param = params.get(0);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertNull(param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof ValueMetadata);
assertEquals("val0", ((ValueMetadata) param.getValue()).getStringValue());
assertNull(((ValueMetadata) param.getValue()).getType());
param = params.get(1);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertNull(param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof RefMetadata);
assertEquals("val1", ((RefMetadata) param.getValue()).getComponentId());
param = params.get(2);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertNull(param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof NullMetadata);
param = params.get(3);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertEquals("java.lang.String", param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof ValueMetadata);
assertEquals("val3", ((ValueMetadata) param.getValue()).getStringValue());
assertNull(((ValueMetadata) param.getValue()).getType());
param = params.get(4);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertNull(param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof CollectionMetadata);
CollectionMetadata array = (CollectionMetadata) param.getValue();
assertNull(array.getValueType());
assertNotNull(array.getValues());
assertEquals(3, array.getValues().size());
assertTrue(array.getValues().get(0) instanceof ValueMetadata);
assertTrue(array.getValues().get(1) instanceof ComponentMetadata);
assertTrue(array.getValues().get(2) instanceof NullMetadata);
param = params.get(5);
assertNotNull(param);
assertEquals(-1, param.getIndex());
assertNull(param.getValueType());
assertNotNull(param.getValue());
assertTrue(param.getValue() instanceof RefMetadata);
assertEquals("pojoB", ((RefMetadata) param.getValue()).getComponentId());
assertEquals(null, local.getInitMethod());
assertEquals(null, local.getDestroyMethod());
// test pojoB
ComponentMetadata pojoB = registry.getComponentDefinition("pojoB");
assertNotNull(pojoB);
assertEquals("pojoB", pojoB.getId());
assertTrue(pojoB instanceof BeanMetadata);
BeanMetadata pojoBLocal = (BeanMetadata) pojoB;
assertEquals("initPojo", pojoBLocal.getInitMethod());
// assertEquals("", pojoBLocal.getDestroyMethod());
params = pojoBLocal.getArguments();
assertNotNull(params);
assertEquals(2, params.size());
param = params.get(0);
assertNotNull(param);
assertEquals(1, param.getIndex());
param = params.get(1);
assertNotNull(param);
assertEquals(0, param.getIndex());
}
public void testParse() throws Exception {
parse("/test.xml");
}
public void testCustomNodes() throws Exception {
ComponentDefinitionRegistry registry = parse("/test-custom-nodes.xml", new TestNamespaceHandlerSet());
ComponentMetadata metadata;
metadata = registry.getComponentDefinition("fooService");
assertNotNull(metadata);
assertTrue(metadata instanceof MyLocalComponentMetadata);
MyLocalComponentMetadata comp1 = (MyLocalComponentMetadata) metadata;
assertEquals(true, comp1.getCacheReturnValues());
assertEquals("getVolatile", comp1.getOperation());
metadata = registry.getComponentDefinition("barService");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
BeanMetadata comp2 = (BeanMetadata) metadata;
assertEquals(1, comp2.getProperties().size());
BeanProperty propertyMetadata = comp2.getProperties().get(0);
assertEquals("localCache", propertyMetadata.getName());
Metadata propertyValue = propertyMetadata.getValue();
assertTrue(propertyValue instanceof BeanMetadata);
BeanMetadata innerComp = (BeanMetadata) propertyValue;
assertEquals("org.apache.aries.CacheProperty", innerComp.getClassName());
metadata = registry.getComponentDefinition("myCache");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
BeanMetadata comp3 = (BeanMetadata) metadata;
assertEquals("org.apache.aries.Cache", comp3.getClassName());
}
public void testScopes() throws Exception {
ComponentDefinitionRegistry registry = parse("/test-scopes.xml", new TestNamespaceHandlerSet());
ComponentMetadata metadata = registry.getComponentDefinition("fooService");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
BeanMetadata bm = (BeanMetadata) metadata;
assertNull(bm.getScope());
metadata = registry.getComponentDefinition("barService");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
bm = (BeanMetadata) metadata;
assertEquals("prototype", bm.getScope());
metadata = registry.getComponentDefinition("bazService");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
bm = (BeanMetadata) metadata;
assertEquals("singleton", bm.getScope());
metadata = registry.getComponentDefinition("booService");
assertNotNull(metadata);
assertTrue(metadata instanceof BeanMetadata);
bm = (BeanMetadata) metadata;
assertEquals("{http://test.org}boo", bm.getScope());
}
private static class TestNamespaceHandlerSet implements NamespaceHandlerSet {
private static final URI CACHE = URI.create("http://cache.org");
private static final URI TEST = URI.create("http://test.org");
private TestNamespaceHandlerSet() {
}
public Set<URI> getNamespaces() {
Set<URI> namespaces = new HashSet<URI>();
namespaces.add(CACHE);
namespaces.add(TEST);
return namespaces;
}
public boolean isComplete() {
return true;
}
public NamespaceHandler getNamespaceHandler(URI namespace) {
if (CACHE.equals(namespace)) {
return new TestNamespaceHandler();
} else if (TEST.equals(namespace)) {
return new ScopeNamespaceHandler();
} else {
return null;
}
}
public Schema getSchema() throws SAXException, IOException {
return null;
}
public Schema getSchema(Map<String, String> locations) throws SAXException, IOException {
return null;
}
public void addListener(NamespaceHandlerSet.Listener listener) {
}
public void removeListener(NamespaceHandlerSet.Listener listener) {
}
public void destroy() {
}
}
private static class ScopeNamespaceHandler implements NamespaceHandler {
public URL getSchemaLocation(String namespace) {
// TODO Auto-generated method stub
return null;
}
public Set<Class> getManagedClasses() {
// TODO Auto-generated method stub
return null;
}
public Metadata parse(Element element, ParserContext context) {
// TODO Auto-generated method stub
return null;
}
public ComponentMetadata decorate(Node node,
ComponentMetadata component, ParserContext context) {
return component;
}
}
private static class TestNamespaceHandler implements NamespaceHandler {
public URL getSchemaLocation(String namespace) {
return getClass().getResource("/cache.xsd");
}
public Set<Class> getManagedClasses() {
return new HashSet<Class>();
}
public ComponentMetadata decorate(Node node,
ComponentMetadata component,
ParserContext context) {
//System.out.println("decorate: " + node + " " + component + " " + container.getEnclosingComponent().getId());
if (node instanceof Attr) {
Attr attr = (Attr) node;
MyLocalComponentMetadata decoratedComp = new MyLocalComponentMetadata((BeanMetadata)component);
decoratedComp.setCacheReturnValues(Boolean.parseBoolean(attr.getValue()));
return decoratedComp;
} else if (node instanceof Element) {
Element element = (Element) node;
MyLocalComponentMetadata decoratedComp = (MyLocalComponentMetadata) component;
decoratedComp.setOperation(element.getAttribute("name"));
return decoratedComp;
} else {
throw new RuntimeException("Unhandled node: " + node);
}
}
public Metadata parse(Element element, ParserContext context) {
String comp = (context.getEnclosingComponent() == null) ? null : context.getEnclosingComponent().getId();
//System.out.println("parse: " + element.getLocalName() + " " + comp);
String className;
if (context.getEnclosingComponent() == null) {
className = "org.apache.aries.Cache";
} else {
className = "org.apache.aries.CacheProperty";
}
BeanMetadataImpl p = new BeanMetadataImpl();
p.setId(element.getAttribute("id"));
p.setClassName(className);
return p;
}
}
private static class MyLocalComponentMetadata extends BeanMetadataImpl {
private boolean cacheReturnValues;
private String operation;
public MyLocalComponentMetadata(BeanMetadata impl) {
super(impl);
}
public boolean getCacheReturnValues() {
return cacheReturnValues;
}
public void setCacheReturnValues(boolean value) {
cacheReturnValues = value;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getOperation() {
return this.operation;
}
}
}