/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed 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.compass.core.metadata.ant;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Iterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import org.compass.core.config.CompassSettings;
import org.compass.core.config.binding.XmlMetaDataBinding;
import org.compass.core.metadata.Alias;
import org.compass.core.metadata.MetaData;
import org.compass.core.metadata.impl.DefaultCompassMetaData;
import org.compass.core.metadata.impl.DefaultMetaDataGroup;
import org.compass.core.util.DTDEntityResolver;
import org.compass.core.util.config.ConfigurationHelper;
import org.compass.core.util.config.XmlConfigurationHelperBuilder;
import org.xml.sax.EntityResolver;
/**
* @author kimchy
*/
public class MetaDataTask extends Task {
private File destDir;
private FileSet fileset;
public void setDestDir(File destDir) {
this.destDir = destDir;
}
public void addFileset(FileSet fileset) {
this.fileset = fileset;
}
public void execute() throws BuildException {
EntityResolver entityResolver = new DTDEntityResolver();
DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
String[] files = ds.getIncludedFiles();
File dir = fileset.getDir(getProject());
for (int i = 0; i < files.length; i++) {
if (!files[i].endsWith("cmd.xml")) {
continue;
}
File srcFile = new File(dir, files[i]);
ConfigurationHelper conf;
try {
XmlConfigurationHelperBuilder builder = new XmlConfigurationHelperBuilder();
builder.setEntityResolver(entityResolver);
conf = builder.buildFromFile(srcFile);
} catch (Exception e) {
throw new BuildException(e.getMessage(), e);
}
DefaultCompassMetaData compassMetaData = new DefaultCompassMetaData();
XmlMetaDataBinding metaDataBinding = new XmlMetaDataBinding();
metaDataBinding.setUpBinding(null, compassMetaData, new CompassSettings());
metaDataBinding.doAddConfiguration(conf);
for (Iterator it = compassMetaData.groupsIterator(); it.hasNext();) {
DefaultMetaDataGroup group = (DefaultMetaDataGroup) it.next();
String className = group.getId();
className = className.substring(0, 1).toUpperCase() + className.substring(1, className.length());
File javaFile = new File(destDir, files[i]);
// create the parent dir if not exists
if (!javaFile.getParentFile().exists()) {
javaFile.mkdirs();
}
javaFile = new File(javaFile.getParentFile(), className + ".java");
String packageName = "";
File tmpFile = javaFile.getParentFile();
while (!destDir.getAbsolutePath().equals(tmpFile.getAbsolutePath())) {
packageName = tmpFile.getName() + "." + packageName;
tmpFile = tmpFile.getParentFile();
}
packageName = packageName.substring(0, packageName.length() - 1);
try {
System.out.println("Generating common meta data for [" + srcFile.getAbsolutePath() + "]");
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(javaFile)));
PrintHelper printHelper = new PrintHelper(writer);
printHelper.print("// Auto generated by compass meta-data ant task at: " + new Date());
printHelper.print("package " + packageName + ";");
printHelper.emptyLine();
// writer.println("import org.compass.core.Property;");
printHelper.printJavaDoc(group.getDescription());
printHelper.startClass(false, className);
printHelper.printJavaDoc(group.getDescription());
printHelper.startClass(true, "group");
printHelper.printConstant("Id", group.getId());
printHelper.printConstant("DispayName", group.getDisplayName());
printHelper.printConstant("Uri", group.getUri());
printHelper.endClass();
printHelper.startClass(true, "alias");
for (Iterator aliasIt = group.aliasIterator(); aliasIt.hasNext();) {
Alias alias = (Alias) aliasIt.next();
printHelper.printJavaDoc(alias.getDescription());
printHelper.startClass(true, alias.getId());
printHelper.printConstant("Id", alias.getId());
printHelper.printConstant("Name", alias.getName());
printHelper.printConstant("DisplayName", alias.getDisplayName());
printHelper.printConstant("Uri", alias.getUri());
printHelper.printConstant("GroupId", alias.getGroup().getId());
printHelper.endClass();
}
printHelper.endClass();
printHelper.startClass(true, "metaData");
for (Iterator metaDataIt = group.metaDataIterator(); metaDataIt.hasNext();) {
MetaData metaData = (MetaData) metaDataIt.next();
printHelper.printJavaDoc(metaData.getDescription());
printHelper.startClass(true, metaData.getId());
printHelper.printConstant("Id", metaData.getId());
printHelper.printConstant("Name", metaData.getName());
printHelper.printConstant("DisplayName", metaData.getDisplayName());
printHelper.printConstant("Uri", metaData.getUri());
printHelper.printConstant("GroupId", metaData.getGroup().getId());
if (metaData.getFormat() != null) {
printHelper.printConstant("Format", metaData.getFormat());
}
printHelper.endClass();
}
printHelper.endClass();
printHelper.endClass();
printHelper.close();
} catch (FileNotFoundException e) {
throw new BuildException("Failed to write to file: " + javaFile.getAbsolutePath(), e);
}
}
}
}
private static final class PrintHelper {
private PrintWriter writer;
private int indent = 0;
public PrintHelper(PrintWriter writer) {
this.writer = writer;
}
public void close() {
writer.flush();
writer.close();
}
public void emptyLine() {
writer.println();
}
public void startClass(boolean isStatic, String className) {
writeIndent();
writer.print("public ");
if (isStatic) {
writer.print("static ");
}
className = className.substring(0, 1).toUpperCase() + className.substring(1, className.length());
writer.print("final class " + className + " {");
emptyLine();
indent++;
}
public void endClass() {
indent--;
writeIndent();
writer.println("}");
emptyLine();
}
public void print(String line) {
writer.println(line);
}
public void printConstant(String name, String value) {
printConstant("String", name, value);
}
public void printConstant(String type, String name, String value) {
writeIndent();
writer.print("public static final ");
writer.print(type);
writer.print(" ");
writer.print(name);
writer.print(" = ");
writer.print("\"");
writer.print(value);
writer.print("\";");
emptyLine();
}
public void printJavaDoc(String description) {
writeIndent();
writer.println("/**");
writeIndent();
writer.print(" * ");
writer.println(description);
writeIndent();
writer.println(" */");
}
private void writeIndent() {
for (int i = 0; i < indent; i++) {
writer.print("\t");
}
}
}
}