/*
* (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Bogdan Stefanescu
* Florent Guillaume
*/
package org.nuxeo.ecm.core.schema;
import org.nuxeo.runtime.model.ComponentContext;
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 {
private static final String XP_SCHEMA = "schema";
private static final String XP_DOCTYPE = "doctype";
private static final String XP_CONFIGURATION = "configuration";
private SchemaManagerImpl 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) {
// use the context of the bundle contributing the extension
// to load schemas
SchemaBindingDescriptor sbd = (SchemaBindingDescriptor) contrib;
sbd.context = extension.getContext();
schemaManager.registerSchema(sbd);
}
} 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) {
schemaManager.flushPendingsRegistration();
}
@Override
public int getApplicationStartedOrder() {
return -100;
}
}