blob: bae973cfca2d306e3f06920257694ad4fc67ca34 [file] [log] [blame]
/*
* 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;
}
}