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 = createProcessor(routeContext, new ToDefinition(afterFinallyUri)); 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 }