/*
* Copyright (c) 2006-2012 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:
* Bogdan Stefanescu
* Florent Guillaume
*/
package org.nuxeo.ecm.core.schema;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.model.ComponentContext;
import org.nuxeo.runtime.model.ComponentName;
import org.nuxeo.runtime.model.DefaultComponent;
import org.nuxeo.runtime.model.Extension;
/**
* The TypeService is the component dealing with registration of schemas and
* document types (and facets and prefetch configuration).
* <p>
* The implementation is delegated to the SchemaManager.
*/
public class TypeService extends DefaultComponent {
/**
* @deprecated since 5.7 (unused)
*/
@Deprecated
public static final ComponentName NAME = new ComponentName(
"org.nuxeo.ecm.core.schema.TypeService");
private static final Log log = LogFactory.getLog(TypeService.class);
private static final String XP_SCHEMA = "schema";
private static final String XP_DOCTYPE = "doctype";
private static final String XP_CONFIGURATION = "configuration";
private SchemaManagerImpl schemaManager;
/**
* @deprecated since 5.7, use
* {@code Framework.getLocalService(SchemaManager.class)}
* instead.
*/
@Deprecated
public static SchemaManager getSchemaManager() {
return Framework.getLocalService(SchemaManager.class);
}
/**
* @deprecated since 5.7, use
* {@code Framework.getLocalService(SchemaManager.class)}
* instead.
*/
@Deprecated
public SchemaManager getTypeManager() {
return schemaManager;
}
/**
* @deprecated since 5.7 (unused)
*/
@Deprecated
public XSDLoader getSchemaLoader() {
return new XSDLoader(schemaManager);
}
@Override
public void activate(ComponentContext context) {
schemaManager = new SchemaManagerImpl();
}
@Override
public void deactivate(ComponentContext context) {
schemaManager = null;
}
@Override
public void registerExtension(Extension extension) {
String xp = extension.getExtensionPoint();
if (XP_DOCTYPE.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
if (contrib instanceof DocumentTypeDescriptor) {
schemaManager.registerDocumentType((DocumentTypeDescriptor) contrib);
} else if (contrib instanceof FacetDescriptor) {
schemaManager.registerFacet((FacetDescriptor) contrib);
} else if (contrib instanceof ProxiesDescriptor) {
schemaManager.registerProxies((ProxiesDescriptor) contrib);
}
}
} else if (XP_SCHEMA.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
try {
// use the context of the bundle contributing the extension
// to load schemas
SchemaBindingDescriptor sbd = (SchemaBindingDescriptor) contrib;
sbd.context = extension.getContext();
schemaManager.registerSchema(sbd);
} catch (Exception e) {
log.error(e, e);
}
}
} else if (XP_CONFIGURATION.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
schemaManager.registerConfiguration((TypeConfiguration) contrib);
}
}
}
@Override
public void unregisterExtension(Extension extension) {
String xp = extension.getExtensionPoint();
if (XP_DOCTYPE.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
if (contrib instanceof DocumentTypeDescriptor) {
schemaManager.unregisterDocumentType((DocumentTypeDescriptor) contrib);
} else if (contrib instanceof FacetDescriptor) {
schemaManager.unregisterFacet((FacetDescriptor) contrib);
} else if (contrib instanceof ProxiesDescriptor) {
schemaManager.unregisterProxies((ProxiesDescriptor) contrib);
}
}
} else if (XP_SCHEMA.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
schemaManager.unregisterSchema((SchemaBindingDescriptor) contrib);
}
} else if (XP_CONFIGURATION.equals(xp)) {
Object[] contribs = extension.getContributions();
for (Object contrib : contribs) {
schemaManager.unregisterConfiguration((TypeConfiguration) contrib);
}
}
}
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Class<T> adapter) {
if (SchemaManager.class.isAssignableFrom(adapter)) {
return (T) schemaManager;
} else if (TypeProvider.class.isAssignableFrom(adapter)) {
return (T) schemaManager;
}
return null;
}
@Override
public void applicationStarted(ComponentContext context) throws Exception {
schemaManager.flushPendingsRegistration();
}
@Override
public int getApplicationStartedOrder() {
return -100;
}
}