OpenIDMELResolver.java revision 4cb6ef8da83ed001d8087b68aaccb6f6b6b2bc09
208651a016b098f4fa1f6279559f104d70f1632dtakashi/*
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshiki * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshiki *
a1d62218cdb0efd0f02da1b54fd3eda91a681d98nd * Copyright © 2011 ForgeRock AS. All rights reserved.
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshiki *
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * The contents of this file are subject to the terms
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * of the Common Development and Distribution License
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * (the License). You may not use this file except in
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * compliance with the License.
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding *
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * You can obtain a copy of the License at
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * http://forgerock.org/license/CDDLv1.0.html
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * See the License for the specific language governing
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * permission and limitations under the License.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd *
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * When distributing Covered Code, include this CDDL
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * Header Notice in each file and include the License file
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * at http://forgerock.org/license/CDDLv1.0.html
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * If applicable, add the following below the CDDL Header,
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * with the fields enclosed by brackets [] replaced by
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * your own identifying information:
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * "Portions Copyrighted [year] [name of copyright owner]"
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd */
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdndpackage org.forgerock.openidm.workflow.activiti.impl;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshiki
208651a016b098f4fa1f6279559f104d70f1632dtakashiimport org.activiti.engine.delegate.JavaDelegate;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport org.activiti.engine.impl.javax.el.ELContext;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport org.activiti.engine.impl.javax.el.ELResolver;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport org.forgerock.json.resource.ResourceException;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport org.forgerock.json.resource.ServerContext;
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport org.osgi.service.component.ComponentConstants;
208651a016b098f4fa1f6279559f104d70f1632dtakashiimport org.slf4j.Logger;
208651a016b098f4fa1f6279559f104d70f1632dtakashiimport org.slf4j.LoggerFactory;
208651a016b098f4fa1f6279559f104d70f1632dtakashi
efffdf7eb233d119c5b307d41a4d3b047a18a6a4yoshikiimport java.beans.FeatureDescriptor;
5feb3e793f498910da27b70e591fc021e378e44byoshikiimport java.util.HashMap;
5b494b61e20fed5bb166a75725f81ed691ffa6e9yoshikiimport java.util.Iterator;
208651a016b098f4fa1f6279559f104d70f1632dtakashiimport java.util.Map;
208651a016b098f4fa1f6279559f104d70f1632dtakashiimport org.activiti.engine.impl.context.Context;
5feb3e793f498910da27b70e591fc021e378e44byoshikiimport org.forgerock.openidm.workflow.activiti.impl.session.OpenIDMSession;
208651a016b098f4fa1f6279559f104d70f1632dtakashi
5feb3e793f498910da27b70e591fc021e378e44byoshiki/**
5feb3e793f498910da27b70e591fc021e378e44byoshiki * Custom ExpressionResolver for OpenIDM
5feb3e793f498910da27b70e591fc021e378e44byoshiki * @author $author$
208651a016b098f4fa1f6279559f104d70f1632dtakashi * @version $Revision$ $Date$
208651a016b098f4fa1f6279559f104d70f1632dtakashi */
9a2348e1d9f20b5936fbffbe7e3fab6db636ee02kawaipublic class OpenIDMELResolver extends ELResolver {
208651a016b098f4fa1f6279559f104d70f1632dtakashi
5feb3e793f498910da27b70e591fc021e378e44byoshiki private static final Logger LOGGER = LoggerFactory.getLogger(OpenIDMELResolver.class);
5feb3e793f498910da27b70e591fc021e378e44byoshiki private Map<String, JavaDelegate> delegateMap = new HashMap<String, JavaDelegate>();
5feb3e793f498910da27b70e591fc021e378e44byoshiki private ServerContext router;
5feb3e793f498910da27b70e591fc021e378e44byoshiki
5feb3e793f498910da27b70e591fc021e378e44byoshiki public Object getValue(ELContext context, Object base, Object property) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki OpenIDMSession session = Context.getCommandContext().getSession(OpenIDMSession.class);
5feb3e793f498910da27b70e591fc021e378e44byoshiki router = session.getOpenIDM();
5feb3e793f498910da27b70e591fc021e378e44byoshiki if (base == null) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki // according to javadoc, can only be a String
5feb3e793f498910da27b70e591fc021e378e44byoshiki String key = (String) property;
5feb3e793f498910da27b70e591fc021e378e44byoshiki if (null != router && "openidm".equals(key)) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki context.setPropertyResolved(true);
8586c281411240cf582bbd086daefdb3b3cc64d6yoshiki return router;
8586c281411240cf582bbd086daefdb3b3cc64d6yoshiki } else {
5feb3e793f498910da27b70e591fc021e378e44byoshiki for (String name : delegateMap.keySet()) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki if (name.equalsIgnoreCase(key)) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki context.setPropertyResolved(true);
5feb3e793f498910da27b70e591fc021e378e44byoshiki return delegateMap.get(name);
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki
5feb3e793f498910da27b70e591fc021e378e44byoshiki return null;
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki
5feb3e793f498910da27b70e591fc021e378e44byoshiki public void bindService(JavaDelegate delegate, Map props) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki String name = (String) props.get(ComponentConstants.COMPONENT_ID);
208651a016b098f4fa1f6279559f104d70f1632dtakashi delegateMap.put(name, delegate);
5feb3e793f498910da27b70e591fc021e378e44byoshiki LOGGER.info("added Activiti service to delegate cache " + name);
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
208651a016b098f4fa1f6279559f104d70f1632dtakashi
208651a016b098f4fa1f6279559f104d70f1632dtakashi public void unbindService(JavaDelegate delegate, Map props) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi String name = (String) props.get(ComponentConstants.COMPONENT_ID);
5feb3e793f498910da27b70e591fc021e378e44byoshiki if (delegateMap.containsKey(name)) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki delegateMap.remove(name);
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki LOGGER.info("removed Activiti service from delegate cache " + name);
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
208651a016b098f4fa1f6279559f104d70f1632dtakashi
208651a016b098f4fa1f6279559f104d70f1632dtakashi public boolean isReadOnly(ELContext context, Object base, Object property) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi return true;
208651a016b098f4fa1f6279559f104d70f1632dtakashi }
208651a016b098f4fa1f6279559f104d70f1632dtakashi
5feb3e793f498910da27b70e591fc021e378e44byoshiki public void setValue(ELContext context, Object base, Object property, Object value) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi }
5feb3e793f498910da27b70e591fc021e378e44byoshiki
208651a016b098f4fa1f6279559f104d70f1632dtakashi public Class<?> getCommonPropertyType(ELContext context, Object arg) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi return Object.class;
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki
5feb3e793f498910da27b70e591fc021e378e44byoshiki public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object arg) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki return null;
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
5feb3e793f498910da27b70e591fc021e378e44byoshiki
5feb3e793f498910da27b70e591fc021e378e44byoshiki public Class<?> getType(ELContext context, Object arg1, Object arg2) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki return Object.class;
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
208651a016b098f4fa1f6279559f104d70f1632dtakashi
5feb3e793f498910da27b70e591fc021e378e44byoshiki /**
208651a016b098f4fa1f6279559f104d70f1632dtakashi * Called when openidm.xxx() is called from an Expression
208651a016b098f4fa1f6279559f104d70f1632dtakashi * @return result of the call
208651a016b098f4fa1f6279559f104d70f1632dtakashi */
208651a016b098f4fa1f6279559f104d70f1632dtakashi @Override
208651a016b098f4fa1f6279559f104d70f1632dtakashi public Object invoke(ELContext context, Object base, Object method, Class<?>[] paramTypes, Object[] params) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi if (base instanceof ServerContext) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi OpenIDMSession session = Context.getCommandContext().getSession(OpenIDMSession.class);
5feb3e793f498910da27b70e591fc021e378e44byoshiki router = session.getOpenIDM();
5feb3e793f498910da27b70e591fc021e378e44byoshiki context.setPropertyResolved(true);
5feb3e793f498910da27b70e591fc021e378e44byoshiki// try {
5feb3e793f498910da27b70e591fc021e378e44byoshiki// ConnectionFunction.valueOf((String) method).call(null, params);
5feb3e793f498910da27b70e591fc021e378e44byoshiki// switch (SimpleJsonResource.Method.valueOf((String) method)) {
5feb3e793f498910da27b70e591fc021e378e44byoshiki// case read:
5feb3e793f498910da27b70e591fc021e378e44byoshiki// return router.read((String) params[0]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case query:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return router.query((String) params[0], (Map<String, Object>) params[1]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case create:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// router.create((String) params[0], (Map<String, Object>) params[1]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return null;
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case update:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// router.update((String) params[0], (String) params[1], (Map<String, Object>) params[2]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return null;
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case delete:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// router.delete((String) params[0], (String) params[1]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return null;
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case action:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return router.action((String) params[0], (Map<String, Object>) params[1]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// case patch:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// router.patch((String) params[0], (String) params[1], (Patch) params[2]);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// return null;
208651a016b098f4fa1f6279559f104d70f1632dtakashi// default:
208651a016b098f4fa1f6279559f104d70f1632dtakashi// throw new BadRequestException("The requested method is not available: " + method);
5feb3e793f498910da27b70e591fc021e378e44byoshiki// }
208651a016b098f4fa1f6279559f104d70f1632dtakashi
208651a016b098f4fa1f6279559f104d70f1632dtakashi// } catch (ResourceException ex) {
208651a016b098f4fa1f6279559f104d70f1632dtakashi// LOGGER.error(OpenIDMELResolver.class.getName(), ex);
208651a016b098f4fa1f6279559f104d70f1632dtakashi// } catch (Exception ex) {
9a2348e1d9f20b5936fbffbe7e3fab6db636ee02kawai// LOGGER.error(OpenIDMELResolver.class.getName(), ex);
9a2348e1d9f20b5936fbffbe7e3fab6db636ee02kawai// }
5feb3e793f498910da27b70e591fc021e378e44byoshiki }
208651a016b098f4fa1f6279559f104d70f1632dtakashi return null;
208651a016b098f4fa1f6279559f104d70f1632dtakashi }
208651a016b098f4fa1f6279559f104d70f1632dtakashi}
208651a016b098f4fa1f6279559f104d70f1632dtakashi