001/*
002 * (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Alexandre Russel
016 *
017 * $Id$
018 */
019
020package org.nuxeo.ecm.platform.annotations.service;
021
022import org.nuxeo.ecm.platform.annotations.api.AnnotationsService;
023import org.nuxeo.ecm.platform.annotations.api.UriResolver;
024import org.nuxeo.ecm.platform.annotations.api.AnnotationsConstants.ExtensionPoint;
025import org.nuxeo.ecm.platform.annotations.descriptors.AnnotabilityManagerDescriptor;
026import org.nuxeo.ecm.platform.annotations.descriptors.AnnotationIDGeneratorDescriptor;
027import org.nuxeo.ecm.platform.annotations.descriptors.EventListenerDescriptor;
028import org.nuxeo.ecm.platform.annotations.descriptors.MetadataMapperDescriptor;
029import org.nuxeo.ecm.platform.annotations.descriptors.PermissionManagerDescriptor;
030import org.nuxeo.ecm.platform.annotations.descriptors.PermissionMapperDescriptor;
031import org.nuxeo.ecm.platform.annotations.descriptors.URLPatternFilterDescriptor;
032import org.nuxeo.ecm.platform.annotations.descriptors.UriResolverDescriptor;
033import org.nuxeo.ecm.platform.annotations.proxy.AnnotationServiceProxy;
034import org.nuxeo.runtime.model.ComponentContext;
035import org.nuxeo.runtime.model.ComponentInstance;
036import org.nuxeo.runtime.model.ComponentName;
037import org.nuxeo.runtime.model.DefaultComponent;
038
039/**
040 * @author Alexandre Russel
041 */
042public class AnnotationsComponent extends DefaultComponent {
043
044    public static final ComponentName NAME = new ComponentName(
045            "org.nuxeo.ecm.platform.annotations.services.annotationServiceFactory");
046
047    private AnnotationServiceProxy annotationServiceProxy;
048
049    private final AnnotationConfigurationService configuration = new AnnotationConfigurationServiceImpl();
050
051    @Override
052    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
053        ExtensionPoint point = Enum.valueOf(ExtensionPoint.class, extensionPoint);
054        switch (point) {
055        case uriResolver:
056            UriResolver resolver = newInstance(((UriResolverDescriptor) contribution).getKlass());
057            configuration.setUriResolver(resolver);
058            break;
059        case urlPatternFilter:
060            URLPatternFilterDescriptor descriptor = (URLPatternFilterDescriptor) contribution;
061            boolean order = descriptor.getOrder().equalsIgnoreCase("Allow,Deny");
062            URLPatternFilter filter = new URLPatternFilter(order, descriptor.getDenies(), descriptor.getAllows());
063            configuration.setFilter(filter);
064            break;
065        case metadataMapper:
066            MetadataMapper mapper = newInstance(((MetadataMapperDescriptor) contribution).getKlass());
067            configuration.setMetadataMapper(mapper);
068            break;
069        case permissionManager:
070            PermissionManager manager = newInstance(((PermissionManagerDescriptor) contribution).getKlass());
071            configuration.setPermissionManager(manager);
072            break;
073        case annotabilityManager:
074            AnnotabilityManager annotabilityManager = newInstance(((AnnotabilityManagerDescriptor) contribution).getKlass());
075            configuration.setAnnotabilityManager(annotabilityManager);
076            break;
077        case eventListener:
078            Class<? extends EventListener> listener = ((EventListenerDescriptor) contribution).getListener();
079            configuration.addListener(newInstance(listener));
080            break;
081        case annotationIDGenerator:
082            AnnotationIDGenerator generator = newInstance(((AnnotationIDGeneratorDescriptor) contribution).getKlass());
083            configuration.setIDGenerator(generator);
084            break;
085        case permissionMapper:
086            configuration.setPermissionMapper((PermissionMapperDescriptor) contribution);
087            break;
088        }
089    }
090
091    protected <T> T newInstance(Class<T> klass) {
092        try {
093            return klass.newInstance();
094        } catch (ReflectiveOperationException e) {
095            throw new RuntimeException(e);
096        }
097    }
098
099    @Override
100    public void activate(ComponentContext context) {
101    }
102
103    @Override
104    public void deactivate(ComponentContext context) {
105    }
106
107    @SuppressWarnings("unchecked")
108    @Override
109    public <T> T getAdapter(Class<T> adapter) {
110        if (AnnotationsService.class.isAssignableFrom(adapter)) {
111            return (T) getAnnotationServiceProxy();
112        } else if (AnnotationConfigurationService.class.isAssignableFrom(adapter)) {
113            return (T) configuration;
114        }
115        return null;
116    }
117
118    private AnnotationsService getAnnotationServiceProxy() {
119        if (annotationServiceProxy == null) {
120            annotationServiceProxy = new AnnotationServiceProxy();
121            annotationServiceProxy.initialise();
122        }
123        return annotationServiceProxy;
124    }
125
126}