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}