public static BasicPolicyMemento.Builder newPolicyMementoBuilder(Policy policy) { BasicPolicyMemento.Builder builder = BasicPolicyMemento.builder(); builder.type = policy.getClass().getName(); builder.typeClass = policy.getClass(); builder.id = policy.getId(); builder.displayName = policy.getName(); // TODO persist config keys as well? Or only support those defined on policy class; // current code will lose the ConfigKey type on rebind for anything not defined on class. // Whereas entities support that. // TODO Do we need the "nonPersistableFlagNames" that locations use? Map<ConfigKey<?>, Object> config = ((AbstractPolicy) policy).getConfigMap().getAllConfig(); for (Map.Entry<ConfigKey<?>, Object> entry : config.entrySet()) { ConfigKey<?> key = checkNotNull(entry.getKey(), "config=%s", config); Object value = configValueToPersistable(entry.getValue()); builder.config.put(key.getName(), value); } Map<String, Object> persistableFlags = MutableMap.<String, Object>builder() .putAll( FlagUtils.getFieldsWithFlagsExcludingModifiers( policy, Modifier.STATIC ^ Modifier.TRANSIENT)) .remove("id") .remove("name") .build(); builder.config.putAll(persistableFlags); return builder; }
/** * finds the policy indicated by the given ID or name. * * @see {@link getPolicy(String,String,String)}. * <p> * @throws 404 or 412 (unless input is null in which case output is null) */ public Policy getPolicy(Entity entity, String policy) { if (policy == null) return null; for (Policy p : entity.getPolicies()) { if (policy.equals(p.getId())) return p; } for (Policy p : entity.getPolicies()) { if (policy.equals(p.getName())) return p; } throw WebResourceUtils.notFound("Cannot find policy '%s' in entity '%s'", policy, entity); }