/* * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nuxeo - initial API and implementation * * $Id$ */ package org.eclipse.ecr.runtime.model.impl; import java.io.ByteArrayInputStream; import java.io.IOException; import org.eclipse.ecr.runtime.model.ComponentInstance; import org.eclipse.ecr.runtime.model.ComponentName; import org.eclipse.ecr.runtime.model.Extension; import org.eclipse.ecr.runtime.model.RuntimeContext; import org.nuxeo.common.xmap.DOMSerializer; import org.nuxeo.common.xmap.annotation.XContent; import org.nuxeo.common.xmap.annotation.XNode; import org.nuxeo.common.xmap.annotation.XObject; import org.w3c.dom.Element; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ @XObject("extension") public class ExtensionImpl implements Extension { // used to generate the extension id if none was provided private static int cnt = 0; private static final long serialVersionUID = 8504100747683248986L; private static final ExtensionDescriptorReader reader = new ExtensionDescriptorReader(); @XNode("@target") ComponentName target; @XNode("@point") String extensionPoint; @XNode("@id") private String id; @XContent("documentation") String documentation; @XNode("") transient Element element; transient Object[] contributions; // declaring component transient ComponentInstance component; @Override public void dispose() { element = null; contributions = null; } @Override public Element getElement() { return element; } @Override public void setElement(Element element) { this.element = element; } @Override public String getExtensionPoint() { return extensionPoint; } @Override public ComponentName getTargetComponent() { return target; } @Override public Object[] getContributions() { return contributions; } @Override public void setContributions(Object[] contributions) { this.contributions = contributions; } @Override public void setComponent(ComponentInstance component) { this.component = component; } @Override public ComponentInstance getComponent() { return component; } @Override public RuntimeContext getContext() { return component.getContext(); } @Override public String getId() { if (id == null) { if (component != null) { id = component.getName().getName() + '#' + extensionPoint + '.' + (cnt++); } else { id = "null#" + extensionPoint + '.' + (cnt++); } } return id; } @Override public String getDocumentation() { return documentation; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(ExtensionImpl.class.getSimpleName()); buf.append(" {"); buf.append("target: "); buf.append(target); buf.append(", point:"); buf.append(extensionPoint); buf.append(", contributor:"); buf.append(component); buf.append('}'); return buf.toString(); } /** * Gets the XML string for this extension. */ @Override public String toXML() { try { return DOMSerializer.toStringOmitXml(element); } catch (IOException e) { System.err.println("Failed to serialize extension " + e); return null; } } public static ExtensionImpl fromXML(RuntimeContext context, String xml) throws Exception { return reader.read(context, new ByteArrayInputStream(xml.getBytes())); } }