All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openrdf.repository.object.compiler.Compiler Maven / Gradle / Ivy

Go to download

The Object Composition library merges multiple Java objects into a single multi-subject object.

There is a newer version: 2.4
Show newest version
/*
 * Copyright (c) 2007-2009, James Leigh All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution. 
 * - Neither the name of the openrdf.org nor the names of its contributors may
 *   be used to endorse or promote products derived from this software without
 *   specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 */
package org.openrdf.repository.object.compiler;

import info.aduna.io.MavenUtil;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.openrdf.model.Model;
import org.openrdf.model.impl.TreeModel;

/**
 * Converts OWL ontologies into Java source code from the command line.
 * 
 * @author James Leigh
 * 
 */
public abstract class Compiler {
	private static final String VERSION = MavenUtil.loadVersion(
			"org.openrdf.alibaba", "alibaba-repository-object", "devel");

	private static final String APP_NAME = "OpenRDF Alibaba owl-compiler";

	private static final Options options = new Options();
	static {
		Option jar = new Option("j", "jar", true,
				"filename where the jar will be saved");
		jar.setArgName("jar file");
		Option imports = new Option("i", "import", true,
				"jar file that should be imported before compiling");
		imports.setArgName("included jar file");
		Option prefix = new Option("p", "prefix", true,
				"prefix the property names with namespace prefix");
		prefix.setArgName("prefix");
		prefix.setOptionalArg(true);
		Option follow = new Option("f", "follow", true, "follow imports arg is 'true' or 'false'");
		Option baseClass = new Option("e", "extends", true,
				"super class that all concepts should extend");
		baseClass.setArgName("full class name");
		Option s = new Option("s", "singular", false, "Don't pluralise Set property names");
		Option o = new Option("o", "offline", false, "Don't resolve prefix using a Web service");
		options.addOption("h", "help", false, "Print Help (this message) and exit");
		options.addOption("v", "version", false, "Print version information and exit");
		options.addOption(baseClass);
		options.addOption(prefix);
		options.addOption(jar);
		options.addOption(imports);
		options.addOption(follow);
		options.addOption(s);
		options.addOption(o);
	}

	public static void main(String[] args) throws Exception {
		try {
			CommandLine line = new GnuParser().parse(options, args);
			if (line.hasOption('h')) {
				HelpFormatter formatter = new HelpFormatter();
				String cmdLineSyntax = Compiler.class.getSimpleName()
						+ " [options] ontology...";
				String header = "ontology... a list of RDF files that should be compiled together.";
				formatter.printHelp(cmdLineSyntax, header, options, "");
				return;
			}
			if (line.hasOption('v')) {
				System.out.println(APP_NAME + " " + VERSION);
				return;
			}
			File jar;
			if (line.hasOption('j')) {
				jar = new File(line.getOptionValue('j'));
			} else if (line.getArgs().length > 0) {
				String filename = line.getArgs()[line.getArgs().length - 1];
				if (!new File(filename).exists()) {
					filename = new File(new URL(filename).getPath()).getName();
				}
				if (filename.contains(".")) {
					filename = filename.substring(0, filename.lastIndexOf('.'));
				}
				jar = new File(filename + ".jar");
			} else {
				throw new ParseException("Missig -j option");
			}
			List list = getURLs(line.getOptionValues('i'));
			ClassLoader cl = Thread.currentThread().getContextClassLoader();
			cl = new URLClassLoader(list.toArray(new URL[list.size()]), cl);
			boolean follow = true;
			if (line.hasOption('f')) {
				follow = Boolean.parseBoolean(line.getOptionValue('f'));
			}
			List urls = getURLs(line.getArgs());
			OntologyLoader loader = new OntologyLoader(new TreeModel());
			loader.loadOntologies(urls);
			if (follow) {
				loader.followImports();
			}
			Model model = loader.getModel();
			OWLCompiler converter = new OWLCompiler(cl);
			if (line.hasOption('s')) {
				converter.setPluralForms(false);
			} else {
				converter.setPluralForms(true);
			}
			if (line.hasOption('o')) {
				converter.setResolvingPrefix(false);
			} else {
				converter.setResolvingPrefix(true);
			}
			converter.setModel(model);
			if (line.hasOption('p')) {
				String prefix = line.getOptionValue('p');
				if (prefix == null) {
					prefix = "";
				}
				converter.setMemberPrefix(prefix);
			}
			if (line.hasOption('e')) {
				converter.setBaseClasses(line.getOptionValues('e'));
			}
			urls.addAll(loader.getImported());
			converter.setOntologies(loader.getImportedFormats());
			converter.setPrefixNamespaces(loader.getNamespaces().values());
			converter.createJar(jar);
			if (isJarEmpty(jar))
				System.err.println("No classes found - Try a different namespace.");
			return;
		} catch (ParseException exp) {
			System.err.println(exp.getMessage());
			System.exit(1);
		}
	}

	private static boolean isJarEmpty(File jar) throws ZipException, IOException {
		if (jar == null || !jar.canRead())
			return true;
		ZipFile zip = new ZipFile(jar);
		try {
			return zip.size() <= 0;
		} finally {
			zip.close();
		}
	}

	private static List getURLs(String[] args)
			throws MalformedURLException {
		List list = new ArrayList();
		if (args == null)
			return list;
		for (String arg : args) {
			File file = new File(arg);
			if (file.exists()) {
				list.add(file.toURI().toURL());
			} else {
				list.add(new URL(arg));
			}
		}
		return list;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy