001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.model; 018 019 import javax.xml.bind.annotation.XmlAccessType; 020 import javax.xml.bind.annotation.XmlAccessorType; 021 import javax.xml.bind.annotation.XmlAttribute; 022 import javax.xml.bind.annotation.XmlRootElement; 023 import javax.xml.bind.annotation.XmlTransient; 024 025 import org.apache.camel.Processor; 026 import org.apache.camel.spi.Policy; 027 import org.apache.camel.spi.RouteContext; 028 import org.apache.camel.util.ObjectHelper; 029 030 /** 031 * Represents an XML <policy/> element 032 * 033 * @version $Revision: 791395 $ 034 */ 035 @XmlRootElement(name = "policy") 036 @XmlAccessorType(XmlAccessType.FIELD) 037 public class PolicyDefinition extends OutputDefinition<ProcessorDefinition> { 038 039 // TODO: Align this code with TransactedDefinition 040 041 @XmlTransient 042 protected Class<? extends Policy> type; 043 @XmlAttribute(required = true) 044 protected String ref; 045 @XmlTransient 046 private Policy policy; 047 048 public PolicyDefinition() { 049 } 050 051 public PolicyDefinition(Policy policy) { 052 this.policy = policy; 053 } 054 055 @Override 056 public String toString() { 057 return "Policy[" + description() + "]"; 058 } 059 060 @Override 061 public String getShortName() { 062 return "policy"; 063 } 064 065 @Override 066 public String getLabel() { 067 if (ref != null) { 068 return "ref:" + ref; 069 } else if (policy != null) { 070 return policy.toString(); 071 } else { 072 return ""; 073 } 074 } 075 076 public String getRef() { 077 return ref; 078 } 079 080 public void setRef(String ref) { 081 this.ref = ref; 082 } 083 084 /** 085 * Sets a policy type that this defition should scope within. 086 * <p/> 087 * Is used for convention over configuration situations where the policy 088 * should be automatic looked up in the registry and it should be based 089 * on this type. For instance a {@link org.apache.camel.spi.TransactedPolicy} 090 * can be set as type for easy transaction configuration. 091 * <p/> 092 * Will by default scope to the wide {@link Policy} 093 * 094 * @param type the policy type 095 */ 096 public void setType(Class<? extends Policy> type) { 097 this.type = type; 098 } 099 100 /** 101 * Sets a reference to use for lookup the policy in the registry. 102 * 103 * @param ref the reference 104 * @return the builder 105 */ 106 public PolicyDefinition ref(String ref) { 107 setRef(ref); 108 return this; 109 } 110 111 @Override 112 public Processor createProcessor(RouteContext routeContext) throws Exception { 113 Processor childProcessor = createOutputsProcessor(routeContext); 114 115 Policy policy = resolvePolicy(routeContext); 116 ObjectHelper.notNull(policy, "policy", this); 117 return policy.wrap(routeContext, childProcessor); 118 } 119 120 protected String description() { 121 if (policy != null) { 122 return policy.toString(); 123 } else { 124 return "ref:" + ref; 125 } 126 } 127 128 protected Policy resolvePolicy(RouteContext routeContext) { 129 if (policy != null) { 130 return policy; 131 } 132 // reuse code on transacted definition to do the resolution 133 return TransactedDefinition.doResolvePolicy(routeContext, getRef(), type); 134 } 135 136 }