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 java.util.ArrayList;
020 import java.util.Collection;
021 import javax.xml.bind.annotation.XmlAccessType;
022 import javax.xml.bind.annotation.XmlAccessorType;
023 import javax.xml.bind.annotation.XmlAttribute;
024 import javax.xml.bind.annotation.XmlRootElement;
025
026 import org.apache.camel.Processor;
027 import org.apache.camel.processor.AOPProcessor;
028 import org.apache.camel.spi.RouteContext;
029
030 /**
031 * Represents an XML <aop/> element
032 *
033 * @deprecated will be removed in the future. You can for example use {@link Processor} and
034 * {@link org.apache.camel.spi.InterceptStrategy} to do AOP in Camel.
035 * @version
036 */
037 @XmlRootElement(name = "aop")
038 @XmlAccessorType(XmlAccessType.FIELD)
039 @Deprecated
040 public class AOPDefinition extends OutputDefinition<AOPDefinition> {
041 @XmlAttribute
042 private String beforeUri;
043 @XmlAttribute
044 private String afterUri;
045 @XmlAttribute
046 private String afterFinallyUri;
047
048 public AOPDefinition() {
049 }
050
051 @Override
052 public String toString() {
053 return "AOP[" + getOutputs() + "]";
054 }
055
056 public String getBeforeUri() {
057 return beforeUri;
058 }
059
060 public void setBeforeUri(String beforeUri) {
061 this.beforeUri = beforeUri;
062 }
063
064 public String getAfterUri() {
065 return afterUri;
066 }
067
068 public void setAfterUri(String afterUri) {
069 this.afterUri = afterUri;
070 }
071
072 public String getAfterFinallyUri() {
073 return afterFinallyUri;
074 }
075
076 public void setAfterFinallyUri(String afterFinallyUri) {
077 this.afterFinallyUri = afterFinallyUri;
078 }
079
080 @Override
081 public String getShortName() {
082 return "aop";
083 }
084
085 @Override
086 public String getLabel() {
087 return "aop";
088 }
089
090 @Override
091 public Processor createProcessor(final RouteContext routeContext) throws Exception {
092 // either before or after must be provided
093 if (beforeUri == null && afterUri == null && afterFinallyUri == null) {
094 throw new IllegalArgumentException("At least one of before, after or afterFinally must be provided on: " + this);
095 }
096
097 // use a pipeline to assemble the before and target processor
098 // and the after if not afterFinally
099 Collection<ProcessorDefinition<?>> pipe = new ArrayList<ProcessorDefinition<?>>();
100
101 Processor finallyProcessor = null;
102
103 if (beforeUri != null) {
104 pipe.add(new ToDefinition(beforeUri));
105 }
106 pipe.addAll(getOutputs());
107
108 if (afterUri != null) {
109 pipe.add(new ToDefinition(afterUri));
110 } else if (afterFinallyUri != null) {
111 finallyProcessor = new ToDefinition(afterFinallyUri).createProcessor(routeContext);
112 }
113
114 Processor tryProcessor = createOutputsProcessor(routeContext, pipe);
115
116 // the AOP processor is based on TryProcessor so we do not have any catches
117 return new AOPProcessor(tryProcessor, null, finallyProcessor);
118 }
119
120 /**
121 * Uses a AOP around.
122 *
123 * @param beforeUri the uri of the before endpoint
124 * @param afterUri the uri of the after endpoint
125 * @return the builder
126 */
127 public AOPDefinition around(String beforeUri, String afterUri) {
128 this.beforeUri = beforeUri;
129 this.afterUri = afterUri;
130 this.afterFinallyUri = null;
131 return this;
132 }
133
134 /**
135 * Uses a AOP around with after being invoked in a finally block
136 *
137 * @param beforeUri the uri of the before endpoint
138 * @param afterUri the uri of the after endpoint
139 * @return the builder
140 */
141 public AOPDefinition aroundFinally(String beforeUri, String afterUri) {
142 this.beforeUri = beforeUri;
143 this.afterUri = null;
144 this.afterFinallyUri = afterUri;
145 return this;
146 }
147
148 /**
149 * Uses a AOP before.
150 *
151 * @param beforeUri the uri of the before endpoint
152 * @return the builder
153 */
154 public AOPDefinition before(String beforeUri) {
155 this.beforeUri = beforeUri;
156 this.afterUri = null;
157 this.afterFinallyUri = null;
158 return this;
159 }
160
161 /**
162 * Uses a AOP after.
163 *
164 * @param afterUri the uri of the after endpoint
165 * @return the builder
166 */
167 public AOPDefinition after(String afterUri) {
168 this.beforeUri = null;
169 this.afterUri = afterUri;
170 this.afterFinallyUri = null;
171 return this;
172 }
173
174 /**
175 * Uses a AOP after with after being invoked in a finally block.
176 *
177 * @param afterUri the uri of the after endpoint
178 * @return the builder
179 */
180 public AOPDefinition afterFinally(String afterUri) {
181 this.beforeUri = null;
182 this.afterUri = null;
183 this.afterFinallyUri = afterUri;
184 return this;
185 }
186 }