001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Nuxeo - initial API and implementation
011 *
012 * $Id$
013 */
014
015package org.nuxeo.runtime.model.impl;
016
017import java.io.Serializable;
018
019import org.nuxeo.common.xmap.XMap;
020import org.nuxeo.common.xmap.annotation.XContent;
021import org.nuxeo.common.xmap.annotation.XNode;
022import org.nuxeo.common.xmap.annotation.XNodeList;
023import org.nuxeo.common.xmap.annotation.XObject;
024import org.nuxeo.common.xmap.annotation.XParent;
025import org.nuxeo.runtime.model.Extension;
026import org.nuxeo.runtime.model.ExtensionPoint;
027import org.nuxeo.runtime.model.RegistrationInfo;
028import org.w3c.dom.Element;
029
030/**
031 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
032 */
033@XObject
034public class ExtensionPointImpl implements ExtensionPoint, Serializable {
035
036    private static final long serialVersionUID = 3959978759388449332L;
037
038    @XNode("@name")
039    public String name;
040
041    @XNode("@target")
042    public String superComponent;
043
044    @XContent("documentation")
045    public String documentation;
046
047    @XNodeList(value = "object@class", type = Class[].class, componentType = Class.class)
048    public transient Class[] contributions;
049
050    public transient XMap xmap;
051
052    @XParent
053    public transient RegistrationInfo ri;
054
055    @Override
056    public Class[] getContributions() {
057        return contributions;
058    }
059
060    @Override
061    public String getName() {
062        return name;
063    }
064
065    @Override
066    public String getDocumentation() {
067        return documentation;
068    }
069
070    @Override
071    public String getSuperComponent() {
072        return superComponent;
073    }
074
075    public Extension createExtension(Element element) {
076        return null;
077    }
078
079    public Object[] loadContributions(RegistrationInfo owner, Extension extension) {
080        Object[] contribs = extension.getContributions();
081        if (contribs != null) {
082            // contributions already computed - this should e an overloaded (extended) extension point
083            return contribs;
084        }
085        // should compute now the contributions
086        if (contributions != null) {
087            if (xmap == null) {
088                xmap = new XMap();
089                for (Class contrib : contributions) {
090                    if (contrib != null) {
091                        xmap.register(contrib);
092                    } else {
093                        throw new RuntimeException("Unknown implementation class when contributing to "
094                                + owner.getComponent().getName());
095                    }
096                }
097            }
098            contribs = xmap.loadAll(new XMapContext(extension.getContext()), extension.getElement());
099            extension.setContributions(contribs);
100        }
101        return contribs;
102    }
103
104}