blob: b10b92aa8d8d378328a7f3ab49a68cf950e63684 [file] [log] [blame]
/*
* 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.ode.jacob.ap;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Date;
import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.InterfaceDeclaration;
import com.sun.mirror.type.InterfaceType;
import com.sun.mirror.util.DeclarationFilter;
class ChannelTypeAnnotationProcessor implements AnnotationProcessor {
AnnotationProcessorEnvironment _env;
AnnotationTypeDeclaration _atd;
ChannelTypeAnnotationProcessor(AnnotationTypeDeclaration atd, AnnotationProcessorEnvironment env) {
_atd = atd;
_env = env;
}
public void process() {
Collection<InterfaceDeclaration> channels = DeclarationFilter.getFilter(InterfaceDeclaration.class).filter(_env.getDeclarationsAnnotatedWith(_atd),InterfaceDeclaration.class);
for (InterfaceDeclaration c : channels) {
PrintWriter pw = null;
try {
pw = _env.getFiler().createSourceFile(c.getQualifiedName() + "Channel");
writeChannelClass(pw, c);
} catch (IOException e) {
_env.getMessager().printError(c.getPosition(), "IO Error: " + e.getMessage());
} finally {
if (pw != null) pw.close();
pw = null;
}
try {
pw = _env.getFiler().createSourceFile(c.getQualifiedName() + "ChannelListener");
writeChannelListenerClass(pw, c);
} catch (IOException e) {
_env.getMessager().printError(c.getPosition(), "IO Error: " + e.getMessage());
} finally {
if (pw != null) pw.close();
pw = null;
}
}
}
private void writeChannelClass(PrintWriter pw, InterfaceDeclaration c) {
pw.println("/*");
pw.println(" * SOURCE FILE GENERATATED BY JACOB CHANNEL CLASS GENERATOR");
pw.println(" * ");
pw.println(" * !!! DO NOT EDIT !!!! ");
pw.println(" * ");
pw.println(" * Generated On : " + new Date());
pw.println(" * For Interface : " + c.getQualifiedName());
pw.println(" */");
pw.println();
pw.println("package " + c.getPackage().getQualifiedName() + ";");
pw.println();
pw.println("/**");
pw.println(" * An auto-generated channel interface for the channel type");
pw.println(" * {@link " + c.getQualifiedName() + "}.");
pw.println(" * @see " + c.getQualifiedName() );
pw.println(" * @see " + c.getQualifiedName() + "ChannelListener");
pw.println(" */");
pw.println("public interface " + c.getSimpleName() + "Channel");
Collection<InterfaceType> supers = c.getSuperinterfaces();
if (supers.isEmpty()) {
pw.println(" extends org.apache.ode.jacob.Channel, ");
} else {
pw.print(" extends ");
for (InterfaceType s : supers)
pw.println(" "+ s.getDeclaration().getQualifiedName() + "Channel, ");
pw.println (" org.apache.ode.jacob.Channel, ");
}
pw.println(" " + c.getQualifiedName());
pw.println("{}");
pw.flush();
}
private void writeChannelListenerClass(PrintWriter pw, InterfaceDeclaration c) {
pw.println("/*");
pw.println(" * SOURCE FILE GENERATATED BY JACOB CHANNEL CLASS GENERATOR");
pw.println(" * ");
pw.println(" * !!! DO NOT EDIT !!!! ");
pw.println(" * ");
pw.println(" * Generated On : " + new Date());
pw.println(" * For Interface : " + c.getQualifiedName());
pw.println(" */");
pw.println();
pw.println("package " + c.getPackage().getQualifiedName() + ";");
pw.println();
pw.println("import org.apache.commons.logging.LogFactory;");
pw.println("import org.apache.commons.logging.Log;");
pw.println();
pw.println("/**");
pw.println(" * An auto-generated channel listener abstract class for the ");
pw.println(" * {@link " + c.getQualifiedName() + "} channel type. ");
pw.println(" * @see " + c.getQualifiedName() );
pw.println(" * @see " + c.getQualifiedName() + "Channel");
pw.println(" */");
pw.println("public abstract class " + c.getSimpleName() + "ChannelListener");
pw.println(" extends org.apache.ode.jacob.ChannelListener<" + c.getQualifiedName() + "Channel>" );
pw.println(" implements " + c.getQualifiedName());
pw.println("{");
pw.println();
pw.println(" private static final Log __log = LogFactory.getLog(" + c.getQualifiedName() + ".class);");
pw.println();
pw.println(" protected Log log() { return __log; } " );
pw.println();
pw.println(" protected " + c.getSimpleName() + "ChannelListener(" + c.getQualifiedName() + "Channel channel) {");
pw.println(" super(channel);");
pw.println(" }");
pw.println("}");
pw.flush();
}
}