/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.protocol.jsonrpc; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import com.almende.eve.capabilities.AbstractCapabilityBuilder; import com.almende.eve.capabilities.handler.Handler; import com.almende.eve.capabilities.handler.SimpleHandler; import com.almende.eve.protocol.auth.Authorizor; import com.almende.eve.protocol.auth.DefaultAuthorizor; import com.almende.util.TypeUtil; import com.almende.util.uuid.UUID; /** * The Class JSONRpcProtocolBuilder. */ public class JSONRpcProtocolBuilder extends AbstractCapabilityBuilder<JSONRpcProtocol> { private static final Logger LOG = Logger.getLogger(JSONRpcProtocolBuilder.class .getName()); private static final TypeUtil<Handler<Object>> TYPEUTIL = new TypeUtil<Handler<Object>>() {}; private static final TypeUtil<Handler<Authorizor>> TYPEUTILAUTH = new TypeUtil<Handler<Authorizor>>() {}; private static final Map<String, JSONRpcProtocol> INSTANCES = new HashMap<String, JSONRpcProtocol>(); /* * (non-Javadoc) * @see * com.almende.eve.capabilities.CapabilityService#get(com.fasterxml.jackson. * databind * .JsonNode, com.almende.eve.capabilities.handler.Handler, java.lang.Class) */ @Override public JSONRpcProtocol build() { JSONRpcProtocolConfig config = JSONRpcProtocolConfig .decorate(getParams()); String id = config.getId(); if (id == null) { id = new UUID().toString(); LOG.warning("Parameter 'id' is required for JSONRpcProtocol. (giving temporary name: " + id + ")"); } JSONRpcProtocol result; if (INSTANCES.containsKey(id)) { result = INSTANCES.get(id); final Handler<Object> oldHandle = result.getHandle(); oldHandle.update(TYPEUTIL.inject(getHandle())); } else { result = new JSONRpcProtocol(getParams(), TYPEUTIL.inject(getHandle())); } INSTANCES.put(id, result); if (result.getAuth() == null || config.getAuthorizor() == null || !result.getAuth().getClass().getName() .equals(config.getAuthorizor())) { // Add authorizor, defaulting to the destination if that is an // Authorizer. if (getHandle().get() instanceof Authorizor) { result.setAuth(TYPEUTILAUTH.inject(getHandle())); } else { if (config.getAuthorizor() != null) { try { @SuppressWarnings("unchecked") final Class<Authorizor> clazz = (Class<Authorizor>) Class .forName(config.getAuthorizor()); result.setAuth(new SimpleHandler<Authorizor>(clazz .newInstance())); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { LOG.log(Level.WARNING, "Couldn't instantiate authorizor class:" + config.getAuthorizor(), e); result.setAuth(new SimpleHandler<Authorizor>( new DefaultAuthorizor())); } } else { result.setAuth(new SimpleHandler<Authorizor>( new DefaultAuthorizor())); } } } return result; } /** * Delete. * * @param id * the id */ public static void delete(final String id) { INSTANCES.remove(id); } }