/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package org.apache.cxf.sts.claims.mapper; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.MapContext; import org.apache.commons.jexl2.Script; import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.sts.claims.ClaimsMapper; import org.apache.cxf.sts.claims.ClaimsParameters; import org.apache.cxf.sts.claims.ProcessedClaimCollection; public class JexlClaimsMapper implements ClaimsMapper { private static final Logger LOG = LogUtils.getL7dLogger(JexlClaimsMapper.class); private JexlEngine jexlEngine = new JexlEngine(); private Script script; public JexlClaimsMapper() { // jexl.setCache(512); // jexl.setLenient(false); jexlEngine.setSilent(false); Map<String, Object> functions = new HashMap<>(); functions.put("claims", new ClaimUtils()); functions.put("LOG", LOG); jexlEngine.setFunctions(functions); } public JexlClaimsMapper(String script) throws IOException { this(); if (script != null) { setScript(script); } } public ProcessedClaimCollection mapClaims(String sourceRealm, ProcessedClaimCollection sourceClaims, String targetRealm, ClaimsParameters parameters) { JexlContext context = new MapContext(); context.set("sourceClaims", sourceClaims); context.set("targetClaims", new ProcessedClaimCollection()); context.set("sourceRealm", sourceRealm); context.set("targetRealm", targetRealm); context.set("claimsParameters", parameters); Script s = getScript(); if (s == null) { LOG.warning("No claim mapping script defined"); return new ProcessedClaimCollection(); // TODO Check if null or an exception would be more // appropriate } else { return (ProcessedClaimCollection)s.execute(context); } } public Script getScript() { return script; } public final void setScript(Script script) { this.script = script; } public final void setScript(String scriptLocation) throws IOException { URL resource = ClassLoaderUtils.getResource(scriptLocation, this.getClass()); if (resource != null) { scriptLocation = resource.getPath(); if (LOG.isLoggable(Level.FINE)) { LOG.fine("Script found within Classpath: " + scriptLocation); } } File scriptFile = new File(scriptLocation); if (scriptFile.exists()) { this.script = jexlEngine.createScript(scriptFile); } else { throw new IllegalArgumentException("Script resource not found!"); } } public JexlEngine getJexlEngine() { return jexlEngine; } public void setJexlEngine(JexlEngine jexl) { this.jexlEngine = jexl; } }