You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2010/07/06 03:05:26 UTC
svn commit: r960740 - in /servicemix/smx4/nmr/trunk/document/src:
main/java/org/apache/servicemix/document/factory/
main/java/org/apache/servicemix/document/impl/
main/java/org/apache/servicemix/document/impl/blueprint/
main/java/org/apache/servicemix/...
Author: gnodet
Date: Tue Jul 6 01:05:25 2010
New Revision: 960740
URL: http://svn.apache.org/viewvc?rev=960740&view=rev
Log:
SMX4NMR-205: Provide a clean custom namespace for the document registry
Added:
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/BlueprintDocumentFactory.java
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/NamespaceHandler.java
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/NamespaceHandler.java
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/SpringDocumentFactory.java
servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.handlers
servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.schemas
servicemix/smx4/nmr/trunk/document/src/main/resources/org/
servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/
servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/
servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/
servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/document.xsd
Removed:
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/factory/
Modified:
servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/Activator.java
servicemix/smx4/nmr/trunk/document/src/test/resources/test.xml
Modified: servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/Activator.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/Activator.java?rev=960740&r1=960739&r2=960740&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/Activator.java (original)
+++ servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/Activator.java Tue Jul 6 01:05:25 2010
@@ -35,6 +35,11 @@ public class Activator implements Bundle
new String[] { DocumentRepository.class.getName(), URLStreamHandlerService.class.getName() },
new DocumentRepositoryImpl(),
properties);
+ try {
+ org.apache.servicemix.document.impl.blueprint.NamespaceHandler.register(context);
+ } catch (Throwable t) {
+ // Ignore
+ }
}
public void stop(BundleContext context) throws Exception {
Added: servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/BlueprintDocumentFactory.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/BlueprintDocumentFactory.java?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/BlueprintDocumentFactory.java (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/BlueprintDocumentFactory.java Tue Jul 6 01:05:25 2010
@@ -0,0 +1,223 @@
+/*
+ * 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.servicemix.document.impl.blueprint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.aries.blueprint.ComponentDefinitionRegistry;
+import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor;
+import org.apache.aries.blueprint.mutable.*;
+import org.apache.servicemix.document.DocumentRepository;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.reflect.*;
+
+public class BlueprintDocumentFactory implements ComponentDefinitionRegistryProcessor {
+
+ private BundleContext bundleContext;
+ private String document;
+ private String documentId;
+ private String beanName;
+ private DocumentRepository repository;
+
+ public void setDocument(String document) {
+ this.document = document;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public void setBeanName(String beanName) {
+ this.beanName = beanName;
+ }
+
+ public void setRepository(DocumentRepository repository) {
+ this.repository = repository;
+ }
+
+ public void afterPropertiesSet() throws Exception {
+ if (document == null) {
+ throw new IllegalStateException("document must be set");
+ }
+ if (repository != null) {
+ this.documentId = repository.register(document.getBytes());
+ } else if (bundleContext != null) {
+ ServiceReference ref = bundleContext.getServiceReference(DocumentRepository.class.getName());
+ if (ref == null) {
+ throw new IllegalStateException("Can not get a reference to the DocumentRepository");
+ }
+ try {
+ DocumentRepository rep = (DocumentRepository) bundleContext.getService(ref);
+ this.documentId = rep.register(document.getBytes());
+ } finally {
+ if (ref != null) {
+ bundleContext.ungetService(ref);
+ }
+ }
+ } else {
+ throw new IllegalStateException("repoitory or bundleContext must be set");
+ }
+ }
+
+ public void process(ComponentDefinitionRegistry registry) throws ComponentDefinitionException {
+ for (String name : registry.getComponentDefinitionNames()) {
+ processMetadata(registry.getComponentDefinition(name));
+ }
+ }
+
+ protected Metadata processMetadata(Metadata metadata) {
+ if (metadata instanceof BeanMetadata) {
+ return processBeanMetadata((BeanMetadata) metadata);
+ } else if (metadata instanceof ReferenceListMetadata) {
+ return processRefCollectionMetadata((ReferenceListMetadata) metadata);
+ } else if (metadata instanceof ReferenceMetadata) {
+ return processReferenceMetadata((ReferenceMetadata) metadata);
+ } else if (metadata instanceof ServiceMetadata) {
+ return processServiceMetadata((ServiceMetadata) metadata);
+ } else if (metadata instanceof CollectionMetadata) {
+ return processCollectionMetadata((CollectionMetadata) metadata);
+ } else if (metadata instanceof MapMetadata) {
+ return processMapMetadata((MapMetadata) metadata);
+ } else if (metadata instanceof PropsMetadata) {
+ return processPropsMetadata((PropsMetadata) metadata);
+ } else if (metadata instanceof ValueMetadata) {
+ return processValueMetadata((ValueMetadata) metadata);
+ } else {
+ return metadata;
+ }
+ }
+
+ protected Metadata processBeanMetadata(BeanMetadata component) {
+ for (BeanArgument arg : component.getArguments()) {
+ ((MutableBeanArgument) arg).setValue(processMetadata(arg.getValue()));
+ }
+ for (BeanProperty prop : component.getProperties()) {
+ ((MutableBeanProperty) prop).setValue(processMetadata(prop.getValue()));
+ }
+ ((MutableBeanMetadata) component).setFactoryComponent((Target) processMetadata(component.getFactoryComponent()));
+ return component;
+ }
+
+ protected Metadata processServiceMetadata(ServiceMetadata component) {
+ ((MutableServiceMetadata) component).setServiceComponent((Target) processMetadata(component.getServiceComponent()));
+ List<MapEntry> entries = new ArrayList<MapEntry>(component.getServiceProperties());
+ for (MapEntry entry : entries) {
+ ((MutableServiceMetadata) component).removeServiceProperty(entry);
+ }
+ for (MapEntry entry : processMapEntries(entries)) {
+ ((MutableServiceMetadata) component).addServiceProperty(entry);
+ }
+ for (RegistrationListener listener : component.getRegistrationListeners()) {
+ ((MutableRegistrationListener) listener).setListenerComponent((Target) processMetadata(listener.getListenerComponent()));
+ }
+ return component;
+ }
+
+ protected Metadata processReferenceMetadata(ReferenceMetadata component) {
+ for (ReferenceListener listener : component.getReferenceListeners()) {
+ ((MutableReferenceListener) listener).setListenerComponent((Target) processMetadata(listener.getListenerComponent()));
+ }
+ return component;
+ }
+
+ protected Metadata processRefCollectionMetadata(ReferenceListMetadata component) {
+ for (ReferenceListener listener : component.getReferenceListeners()) {
+ ((MutableReferenceListener) listener).setListenerComponent((Target) processMetadata(listener.getListenerComponent()));
+ }
+ return component;
+ }
+
+ protected Metadata processPropsMetadata(PropsMetadata metadata) {
+ List<MapEntry> entries = new ArrayList<MapEntry>(metadata.getEntries());
+ for (MapEntry entry : entries) {
+ ((MutablePropsMetadata) metadata).removeEntry(entry);
+ }
+ for (MapEntry entry : processMapEntries(entries)) {
+ ((MutablePropsMetadata) metadata).addEntry(entry);
+ }
+ return metadata;
+ }
+
+ protected Metadata processMapMetadata(MapMetadata metadata) {
+ List<MapEntry> entries = new ArrayList<MapEntry>(metadata.getEntries());
+ for (MapEntry entry : entries) {
+ ((MutableMapMetadata) metadata).removeEntry(entry);
+ }
+ for (MapEntry entry : processMapEntries(entries)) {
+ ((MutableMapMetadata) metadata).addEntry(entry);
+ }
+ return metadata;
+ }
+
+ protected List<MapEntry> processMapEntries(List<MapEntry> entries) {
+ for (MapEntry entry : entries) {
+ ((MutableMapEntry) entry).setKey((NonNullMetadata) processMetadata(entry.getKey()));
+ ((MutableMapEntry) entry).setValue(processMetadata(entry.getValue()));
+ }
+ return entries;
+ }
+
+ protected Metadata processCollectionMetadata(CollectionMetadata metadata) {
+ List<Metadata> values = new ArrayList<Metadata>(metadata.getValues());
+ for (Metadata value : values) {
+ ((MutableCollectionMetadata) metadata).removeValue(value);
+ }
+ for (Metadata value : values) {
+ ((MutableCollectionMetadata) metadata).addValue(processMetadata(value));
+ }
+ return metadata;
+ }
+
+ protected Metadata processValueMetadata(ValueMetadata metadata) {
+ return new LateBindingValueMetadata(metadata);
+ }
+
+ public class LateBindingValueMetadata implements ValueMetadata {
+
+ private final ValueMetadata metadata;
+ private boolean retrieved;
+ private String retrievedValue;
+
+ public LateBindingValueMetadata(ValueMetadata metadata) {
+ this.metadata = metadata;
+ }
+
+ public String getStringValue() {
+ if (!retrieved) {
+ retrieved = true;
+ retrievedValue = processString(metadata.getStringValue());
+ }
+ return retrievedValue;
+ }
+
+ public String getType() {
+ return metadata.getType();
+ }
+
+ }
+
+ protected String processString(String str) {
+ if (str.equals("document-name:" + beanName)) {
+ str = documentId;
+ }
+ return str;
+ }
+
+}
Added: servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/NamespaceHandler.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/NamespaceHandler.java?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/NamespaceHandler.java (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/blueprint/NamespaceHandler.java Tue Jul 6 01:05:25 2010
@@ -0,0 +1,121 @@
+/*
+ * 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.servicemix.document.impl.blueprint;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableValueMetadata;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
+
+ public static final String DOCUMENT = "document";
+ public static final String ID = "id";
+ public static final String REPOSITORY = "repository";
+
+ public static ServiceRegistration register(BundleContext context) {
+ Properties props = new Properties();
+ props.put("osgi.service.blueprint.namespace", "http://servicemix.apache.org/schema/document");
+ return context.registerService(
+ new String[] { org.apache.aries.blueprint.NamespaceHandler.class.getName() },
+ new NamespaceHandler(),
+ props
+ );
+ }
+
+ public URL getSchemaLocation(String s) {
+ return getClass().getResource("/org/apache/servicemix/document/document.xsd");
+ }
+
+ public Set<Class> getManagedClasses() {
+ return new HashSet<Class>(Arrays.asList(
+ BlueprintDocumentFactory.class
+ ));
+ }
+
+ public Metadata parse(Element element, ParserContext context) {
+ String name = element.getLocalName() != null ? element.getLocalName() : element.getNodeName();
+ if (DOCUMENT.equals(name)) {
+ return parseDocument(element, context);
+ }
+ throw new ComponentDefinitionException("Bad xml syntax: unknown element '" + name + "'");
+ }
+
+ public ComponentMetadata decorate(Node node, ComponentMetadata componentMetadata, ParserContext parserContext) {
+ throw new ComponentDefinitionException("Unsupported node: " + node.getNodeName());
+ }
+
+ private Metadata parseDocument(Element element, ParserContext context) {
+ MutableBeanMetadata bean = context.createMetadata(MutableBeanMetadata.class);
+ bean.setRuntimeClass(BlueprintDocumentFactory.class);
+ String id = element.getAttribute(ID);
+ bean.setId(id);
+ bean.addProperty("beanName", createValue(context, id));
+ bean.addProperty("bundleContext", createRef(context, "blueprintBundleContext"));
+ if (element.hasAttribute(REPOSITORY)) {
+ bean.addProperty(REPOSITORY, createRef(context, element.getAttribute(REPOSITORY)));
+ }
+ bean.addProperty(DOCUMENT, createValue(context, getTextValue(element)));
+ bean.setInitMethod("afterPropertiesSet");
+ bean.setProcessor(true);
+ return bean;
+ }
+
+ private ValueMetadata createValue(ParserContext context, String value) {
+ MutableValueMetadata v = context.createMetadata(MutableValueMetadata.class);
+ v.setStringValue(value);
+ return v;
+ }
+
+ private RefMetadata createRef(ParserContext context, String value) {
+ MutableRefMetadata r = context.createMetadata(MutableRefMetadata.class);
+ r.setComponentId(value);
+ return r;
+ }
+
+ private static String getTextValue(Element element) {
+ StringBuffer value = new StringBuffer();
+ NodeList nl = element.getChildNodes();
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node item = nl.item(i);
+ if ((item instanceof CharacterData && !(item instanceof Comment)) || item instanceof EntityReference) {
+ value.append(item.getNodeValue());
+ }
+ }
+ return value.toString();
+ }
+
+}
Added: servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/NamespaceHandler.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/NamespaceHandler.java?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/NamespaceHandler.java (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/NamespaceHandler.java Tue Jul 6 01:05:25 2010
@@ -0,0 +1,66 @@
+/*
+ * 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.servicemix.document.impl.spring;
+
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class NamespaceHandler extends NamespaceHandlerSupport {
+
+ public static final String DOCUMENT = "document";
+ public static final String REPOSITORY = "repository";
+
+ public void init() {
+ registerBeanDefinitionParser(DOCUMENT, new DocumentParser());
+ }
+
+ public static class DocumentParser extends AbstractBeanDefinitionParser {
+
+ @Override
+ protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
+ BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(SpringDocumentFactory.class);
+ if (element.hasAttribute(REPOSITORY)) {
+ bdb.addPropertyReference(REPOSITORY, element.getAttribute(REPOSITORY));
+ }
+ bdb.addPropertyValue(DOCUMENT, getTextValue(element));
+ return bdb.getBeanDefinition();
+ }
+
+ }
+
+ private static String getTextValue(Element element) {
+ StringBuffer value = new StringBuffer();
+ NodeList nl = element.getChildNodes();
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node item = nl.item(i);
+ if ((item instanceof CharacterData && !(item instanceof Comment)) || item instanceof EntityReference) {
+ value.append(item.getNodeValue());
+ }
+ }
+ return value.toString();
+ }
+
+}
Added: servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/SpringDocumentFactory.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/SpringDocumentFactory.java?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/SpringDocumentFactory.java (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/java/org/apache/servicemix/document/impl/spring/SpringDocumentFactory.java Tue Jul 6 01:05:25 2010
@@ -0,0 +1,132 @@
+/*
+ * 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.servicemix.document.impl.spring;
+
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanDefinitionStoreException;
+import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.BeanDefinitionVisitor;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.BeansException;
+import org.springframework.osgi.context.BundleContextAware;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.apache.servicemix.document.DocumentRepository;
+
+/**
+ * A spring document factory allowing documents to be registered in the DocumentRegistry
+ * and also post processes the document-name:xxx url to transform it into a
+ * document: url handled by the repository.
+ */
+public class SpringDocumentFactory implements FactoryBean, BundleContextAware, InitializingBean, BeanFactoryPostProcessor, BeanNameAware, BeanFactoryAware {
+
+ private BundleContext bundleContext;
+ private String document;
+ private String documentId;
+ private BeanFactory beanFactory;
+ private String beanName;
+ private DocumentRepository repository;
+
+ public Object getObject() throws Exception {
+ return documentId;
+ }
+
+ public Class getObjectType() {
+ return String.class;
+ }
+
+ public boolean isSingleton() {
+ return true;
+ }
+
+ public void setDocument(String document) {
+ this.document = document;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ this.beanFactory = beanFactory;
+ }
+
+ public void setBeanName(String beanName) {
+ this.beanName = beanName;
+ }
+
+ public void setRepository(DocumentRepository repository) {
+ this.repository = repository;
+ }
+
+ public void afterPropertiesSet() throws Exception {
+ if (document == null) {
+ throw new IllegalStateException("document must be set");
+ }
+ if (repository != null) {
+ this.documentId = repository.register(document.getBytes());
+ } else if (bundleContext != null) {
+ ServiceReference ref = bundleContext.getServiceReference(DocumentRepository.class.getName());
+ if (ref == null) {
+ throw new IllegalStateException("Can not get a reference to the DocumentRepository");
+ }
+ try {
+ DocumentRepository rep = (DocumentRepository) bundleContext.getService(ref);
+ this.documentId = rep.register(document.getBytes());
+ } finally {
+ if (ref != null) {
+ bundleContext.ungetService(ref);
+ }
+ }
+ } else {
+ throw new IllegalStateException("repoitory or bundleContext must be set");
+ }
+ }
+
+ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactoryToProcess) throws BeansException {
+ BeanDefinitionVisitor visitor = new BundleExtUrlBeanDefinitionVisitor();
+ String[] beanNames = beanFactoryToProcess.getBeanDefinitionNames();
+ for (int i = 0; i < beanNames.length; i++) {
+ // Check that we're not parsing our own bean definition,
+ // to avoid failing on unresolvable placeholders in properties file locations.
+ if (!(beanNames[i].equals(this.beanName) && beanFactoryToProcess.equals(this.beanFactory))) {
+ BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(beanNames[i]);
+ try {
+ visitor.visitBeanDefinition(bd);
+ } catch (BeanDefinitionStoreException ex) {
+ throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanNames[i], ex.getMessage());
+ }
+ }
+ }
+ }
+
+ private class BundleExtUrlBeanDefinitionVisitor extends BeanDefinitionVisitor {
+
+ protected String resolveStringValue(String string) {
+ if (string.equals("document-name:" + beanName)) {
+ string = documentId;
+ }
+ return string;
+ }
+ }
+
+}
Added: servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.handlers
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.handlers?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.handlers (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.handlers Tue Jul 6 01:05:25 2010
@@ -0,0 +1,24 @@
+##
+## 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.
+##
+
+##
+## $Rev: 697807 $ $Date: 2008-09-22 20:12:04 +0700 (Mon, 22 Sep 2008) $
+##
+
+http\://servicemix.apache.org/schema/document=org.apache.servicemix.document.impl.spring.NamespaceHandler
\ No newline at end of file
Added: servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.schemas
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.schemas?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.schemas (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/resources/META-INF/spring.schemas Tue Jul 6 01:05:25 2010
@@ -0,0 +1,24 @@
+##
+## 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.
+##
+
+##
+## $Rev: 697807 $ $Date: 2008-09-22 20:12:04 +0700 (Mon, 22 Sep 2008) $
+##
+
+http\://servicemix.apache.org/schema/document/document.xsd=org/apache/servicemix/document/document.xsd
Added: servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/document.xsd
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/document.xsd?rev=960740&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/document.xsd (added)
+++ servicemix/smx4/nmr/trunk/document/src/main/resources/org/apache/servicemix/document/document.xsd Tue Jul 6 01:05:25 2010
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<!-- $Rev: 699828 $ $Date: 2008-09-28 16:35:27 +0200 (Sun, 28 Sep 2008) $ -->
+
+<xsd:schema xmlns="http://servicemix.apache.org/schema/document"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://servicemix.apache.org/schema/document"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <xsd:element name="document">
+ <xsd:complexType mixed="true">
+ <xsd:attribute name="id" type="xsd:ID" use="required"/>
+ <xsd:attribute name="repository" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema>
\ No newline at end of file
Modified: servicemix/smx4/nmr/trunk/document/src/test/resources/test.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/document/src/test/resources/test.xml?rev=960740&r1=960739&r2=960740&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/document/src/test/resources/test.xml (original)
+++ servicemix/smx4/nmr/trunk/document/src/test/resources/test.xml Tue Jul 6 01:05:25 2010
@@ -21,18 +21,22 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:doc="http://servicemix.apache.org/schema/document"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/osgi
- http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://servicemix.apache.org/schema/document
+ http://servicemix.apache.org/schema/document/document.xsd
+ ">
<bean id="documentRepository" class="org.apache.servicemix.document.impl.DocumentRepositoryImpl">
</bean>
- <bean id="doc" class="org.apache.servicemix.document.factory.SpringDocumentFactory">
+ <bean id="doc" class="org.apache.servicemix.document.impl.spring.SpringDocumentFactory">
<property name="repository" ref="documentRepository" />
<property name="document">
<value>
@@ -41,8 +45,16 @@
</property>
</bean>
+ <doc:document id="doc2" repository="documentRepository">
+ Hey guy !
+ </doc:document>
+
<bean id="uri" class="java.net.URI" factory-method="create">
<constructor-arg value="document-name:doc" />
</bean>
+ <bean id="uri2" class="java.net.URI" factory-method="create">
+ <constructor-arg value="document-name:doc2" />
+ </bean>
+
</beans>