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 }