http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/Pst.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/Pst.java b/pst/src/main/java/org/apache/wave/pst/Pst.java deleted file mode 100644 index 1265899..0000000 --- a/pst/src/main/java/org/apache/wave/pst/Pst.java +++ /dev/null @@ -1,189 +0,0 @@ -/** - * 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.wave.pst; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.protobuf.Descriptors.Descriptor; -import com.google.protobuf.Descriptors.FileDescriptor; - -import org.antlr.stringtemplate.StringTemplate; -import org.antlr.stringtemplate.StringTemplateGroup; - -import org.apache.wave.pst.model.Message; -import org.apache.wave.pst.model.MessageProperties; -import org.apache.wave.pst.style.Styler; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -/** - * PST stands for protobuf-stringtemplate. - * - * The tool allows arbitrary code generation given a series of string - * templates, each passed the description of a protocol buffer file. This allows - * protobuf- based file generation beyond what existing protocol compilers - * (protoc, protostuff, etc) are capable of (without modification), using the - * convenience and safety of <a href="http://stringtemplate.org">string - * template</a>. - * - * A number of sample templates are bundles (in templates), so see these as - * examples. These templates give a complete client/server JSON message stack: - * <ul> - * <li><em>message</em> is a common interface.</li> - * <li><em>messageTestImpl</em> is a simple/pure Java in-memory implementation - * of the interface, for testing.</li> - * <li><em>messagePojoImpl</em> is a like messageTestImpl with JSON - * serialization and deserialization using the Gson library.</li> - * <li><em>messageServerImpl</em> is a protobuf-backed implementation, useful - * for a multi-server environment where the efficient serialization of protocol - * buffers is an advantage. JSON is also supported.</li> - * <li><em>messageClientImpl</em> is an efficent javascript implementation for - * use with GWT.</li> - * </ul> - * - * There is no particular reason why PST can only be used to generate Java, for - * example, a pure JS rather than GWT implementation of the client JSON message - * component could be generated[1]. - * - * PST is implemented using the protocol buffer reflection generated by protoc - * alongside the actual Message classes it generates; these are converted into - * simple Java model objects with simple accessors suitable for accessing from - * stringtemplate. - * - * The code generated by stringtemplate is then post-processed using a simple - * custom code formatter since the output from stringtemplate can be hard to - * humanly read (e.g. the indentation is unpredictable). - * - * [1] although, currently it is hardcoded in PST to generate .java files, and - * the model has Java-centric methods. The code formatter also assumes that - * it is run over a Java file. These all could be easily modified, however. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class Pst { - - private final File outputDir; - private final FileDescriptor fd; - private final Styler styler; - private final Iterable<File> templates; - private final boolean saveBackups; - private final boolean useInt52; - - /** - * @param outputDir the base directory to write the generated files - * @param fd the {@link FileDescriptor} of the protobuf to use (i.e. pass to - * each string template) - * @param styler the code styler to post-process generated code with - * @param templates the collection of string templates to use - * @param saveBackups whether to save intermediate generated files - * @param useInt52 whether we use doubles to serialize 64-bit integers - */ - public Pst(File outputDir, FileDescriptor fd, Styler styler, Iterable<File> templates, - boolean saveBackups, boolean useInt52) { - this.outputDir = checkNotNull(outputDir, "outputDir cannot be null"); - this.fd = checkNotNull(fd, "fd cannot be null"); - this.styler = checkNotNull(styler, "styler cannot be null"); - this.templates = checkNotNull(templates, "templates cannot be null"); - this.saveBackups = saveBackups; - this.useInt52 = useInt52; - } - - /** - * Runs the code generation for all templates. - */ - public void run() throws PstException { - List<PstException.TemplateException> exceptions = Lists.newArrayList(); - for (File template : templates) { - try { - MessageProperties properties = createProperties(template); - String groupName = stripSuffix(".st", template.getName()); - String templateName = properties.hasTemplateName() ? - properties.getTemplateName() : ""; - StringTemplateGroup group = new StringTemplateGroup(groupName + "Group", dir(template)); - StringTemplate st = group.getInstanceOf(groupName); - for (Descriptor messageDescriptor : fd.getMessageTypes()) { - Message message = new Message(messageDescriptor, templateName, properties); - st.reset(); - st.setAttribute("m", message); - write(st, new File( - outputDir.getPath() + File.separator + - message.getFullJavaType().replace('.', File.separatorChar) + "." + - (properties.hasFileExtension() ? properties.getFileExtension() : "java"))); - } - } catch (Exception e) { - exceptions.add(new PstException.TemplateException(template.getPath(), e)); - } - } - if (!exceptions.isEmpty()) { - throw new PstException(exceptions); - } - } - - /** - * @return the path to the directory which contains a file, or just the path - * to the file itself if it's already a directory - */ - private String dir(File f) { - return f.isDirectory() - ? f.getPath() - : (Strings.isNullOrEmpty(f.getParent()) ? "." : f.getParent()); - } - - private String stripSuffix(String suffix, String s) { - return s.endsWith(suffix) ? s.substring(0, s.length() - suffix.length()) : s; - } - - private void write(StringTemplate st, File output) throws IOException { - output.getParentFile().mkdirs(); - BufferedWriter writer = new BufferedWriter(new FileWriter(output)); - try { - writer.write(st.toString()); - } finally { - try { - writer.close(); - } catch (IOException e) { - // If another exception is already propagating, we don't - // want to throw a secondary one. - // This means that exceptions on close() are ignored, - // but what could usefully be done for a close() - // exception anyway? - } - } - styler.style(output, saveBackups); - } - - private MessageProperties createProperties(File template) - throws FileNotFoundException, IOException { - File propertiesFile = - new File(template.getParentFile().getPath() + File.separator + "properties"); - MessageProperties properties = propertiesFile.exists() - ? MessageProperties.createFromFile(propertiesFile) : MessageProperties.createEmpty(); - properties.setUseInt52(useInt52); - return properties; - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/PstCommandLine.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/PstCommandLine.java b/pst/src/main/java/org/apache/wave/pst/PstCommandLine.java deleted file mode 100644 index b725704..0000000 --- a/pst/src/main/java/org/apache/wave/pst/PstCommandLine.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * 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.wave.pst; - -import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -import org.apache.wave.pst.style.PstStyler; -import org.apache.wave.pst.style.Styler; - -import java.io.File; -import java.util.Map; - -/** - * Encapsulates the command line options to protobuf-stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class PstCommandLine { - - private static final String DEFAULT_OUTPUT_DIR = "."; - private static final String DEFAULT_PROTO_PATH = "."; - private static final Map<String, Styler> STYLERS = ImmutableMap.<String, Styler> builder() - .put("none", Styler.EMPTY) - .put("pst", new PstStyler()) - .build(); - - private final CommandLine cl; - - public PstCommandLine(String... args) throws ParseException { - cl = new DefaultParser().parse(getOptions(), args); - checkArgs(); - } - - private void checkArgs() throws ParseException { - if (!hasFile()) { - throw new ParseException("Must specify file"); - } - if (cl.getArgList().isEmpty()) { - throw new ParseException("Must specify at least one template"); - } - } - - private static Options getOptions() { - Options options = new Options(); - options.addOption("h", "help", false, "Show this help"); - options.addOption("f", "file", true, "The protobuf specification file to use"); - options.addOption("d", "dir", true, String.format( - "The base directory to output generated files to (default: %s)", DEFAULT_OUTPUT_DIR)); - options.addOption("s", "styler", true, "The styler to use, if any (default: none). " + - "Available options: " + STYLERS.keySet()); - options.addOption("i", "save_pre_styled", false, "Save the intermediate pre-styled files"); - options.addOption("j", "save_java", false, "Save the protoc-generated Java file, if any"); - options.addOption("I", "proto_path", true, "Extra path to search for proto extensions. " - + "This needs to be specified if the target file is a .proto file with any of the PST-" - + "specific extensions, in which case the path should include both PST source " - + "base and the protoc source base; i.e., /PATH/TO/PST/src:/PATH/TO/PROTOC/src"); - options.addOption("t", "int52", true, - "Specifies if pst should store 64-bit integers should be serialized to" - + "doubles which will use 52-bit precision. It's useful " - + "when data is meant to be serialized/deserialized in JavaScript, since it doesn't " - + "support 64-bit integers (default: false)."); - return options; - } - - public boolean hasHelp() { - return cl.hasOption('h'); - } - - // NOTE: private because it's always true, checked in checkArgs(). - private boolean hasFile() { - return cl.hasOption('f'); - } - - public static void printHelp() { - new HelpFormatter().printHelp( - PstMain.class.getSimpleName() + " [options] templates...", getOptions()); - } - - public File getProtoFile() { - return new File(cl.getOptionValue('f')); - } - - @SuppressWarnings("unchecked") - public Iterable<File> getTemplateFiles() { - return Iterables.transform(cl.getArgList(), new Function<String, File>() { - @Override public File apply(String filename) { - return new File(filename); - } - }); - } - - public File getOutputDir() { - return new File(cl.hasOption('d') ? cl.getOptionValue('d') : DEFAULT_OUTPUT_DIR); - } - - public File getProtoPath() { - return new File(cl.hasOption('I') ? cl.getOptionValue('I') : DEFAULT_PROTO_PATH); - } - - public Styler getStyler() { - if (cl.hasOption('s')) { - String stylerName = cl.getOptionValue('s'); - if (STYLERS.containsKey(stylerName)) { - return STYLERS.get(stylerName); - } else { - System.err.println("WARNING: unrecognised styler: " + stylerName + ", using none"); - return Styler.EMPTY; - } - } else { - return Styler.EMPTY; - } - } - - public boolean shouldSavePreStyled() { - return cl.hasOption('p'); - } - - public boolean shouldSaveJava() { - return cl.hasOption('j'); - } - - public boolean shouldUseInt52() { - return !cl.hasOption('t') // - || (cl.hasOption('t') && "true".equals(cl.getOptionValue('t'))); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/PstException.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/PstException.java b/pst/src/main/java/org/apache/wave/pst/PstException.java deleted file mode 100644 index 9b17bd7..0000000 --- a/pst/src/main/java/org/apache/wave/pst/PstException.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * 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.wave.pst; - -import com.google.common.collect.ImmutableList; - -import java.util.List; - -/** - * Exception caused by any errors caused in code generation. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class PstException extends Exception { - - public static final class TemplateException extends Exception { - private final String templateName; - - public TemplateException(String templateName, String message, Throwable cause) { - super(message, cause); - this.templateName = templateName; - } - - public TemplateException(String templateName, Throwable cause) { - super(cause); - this.templateName = templateName; - } - - /** - * @return the name of the template being parsed when the exception occurred - */ - public String getTemplateName() { - return templateName; - } - } - - private final ImmutableList<TemplateException> exceptions; - - public PstException(List<TemplateException> exceptions) { - super(); - this.exceptions = ImmutableList.copyOf(exceptions); - } - - /** - * @return all exceptions caused - */ - public ImmutableList<TemplateException> getTemplateExceptions() { - return exceptions; - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java b/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java deleted file mode 100644 index abdc544..0000000 --- a/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java +++ /dev/null @@ -1,352 +0,0 @@ -/** - * 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.wave.pst; - -import com.google.common.base.Joiner; -import com.google.common.base.Predicate; -import com.google.common.io.CharStreams; -import com.google.common.io.Files; -import com.google.protobuf.Descriptors.FileDescriptor; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A loader for a {@link FileDescriptor}, accepting and handling a proto file - * specified as: - * <ul> - * <li>A path to a .proto file.</li> - * <li>A path to a .java (protoc-)compiled proto spec.</li> - * <li>A path to a .class (javac-) compiled proto spec.</li> - * <li>A proto spec that is already on the classpath.</li> - * </ul> - * - * @author [email protected] (Benjamin Kalman) - */ -public final class PstFileDescriptor { - - private final FileDescriptor descriptor; - - /** - * Loads the {@link FileDescriptor} from a path. The path may be a class name - * (e.g. foo.Bar), path to a class (e.g. bin/foo/Bar.class), or a path to a - * Java source file (e.g. src/foo/Bar.java). - * - * In each case it is the caller's responsibility to ensure that the classpath - * of the Java runtime is correct. - * - * @param path the path to load the proto description from - * @param intermediateJavaDir path to save the intermediate protoc- - * generated Java file (if any) - * @param protoPath any additional path to pass to the protoc compiler - */ - public static FileDescriptor load(String path, File intermediateJavaDir, File protoPath) { - return new PstFileDescriptor(path, intermediateJavaDir, protoPath).get(); - } - - private PstFileDescriptor(String path, File intermediateJavaDir, File protoPath) { - Class<?> clazz = null; - if (path.endsWith(".class")) { - clazz = fromPathToClass(path); - } else if (path.endsWith(".java")) { - clazz = fromPathToJava(path, intermediateJavaDir); - } else if (path.endsWith(".proto")) { - clazz = fromPathToProto(path, intermediateJavaDir, protoPath); - } else { - clazz = fromClassName(path); - } - - if (clazz == null) { - descriptor = null; - } else { - descriptor = asFileDescriptor(clazz); - } - } - - private FileDescriptor get() { - return descriptor; - } - - private Class<?> fromClassName(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } - - private Class<?> fromPathToClass(String pathToClass) { - String currentBaseDir = new File(pathToClass).isAbsolute() ? "" : "."; - String currentPath = pathToClass; - Class<?> clazz = null; - while (clazz == null) { - clazz = loadClassAtPath(currentBaseDir, currentPath); - if (clazz == null) { - int indexOfSep = currentPath.indexOf(File.separatorChar); - if (indexOfSep == -1) { - break; - } else { - currentBaseDir += File.separator + currentPath.substring(0, indexOfSep); - currentPath = currentPath.substring(indexOfSep + 1); - } - } - } - return clazz; - } - - private Class<?> loadClassAtPath(String baseDir, String path) { - try { - ClassLoader classLoader = new URLClassLoader(new URL[] {new File(baseDir).toURI().toURL()}); - return classLoader.loadClass(getBinaryName(path)); - } catch (Throwable t) { - return null; - } - } - - private String getBinaryName(String path) { - return path.replace(File.separatorChar, '.').substring(0, path.length() - ".class".length()); - } - - private Class<?> fromPathToJava(String pathToJava, File intermediateJavaDir) { - try { - File dir = intermediateJavaDir; - String[] javacCommand = new String[] { - "javac", pathToJava, "-d", dir.getAbsolutePath(), "-verbose", - "-cp", determineClasspath(pathToJava) + ":" + determineSystemClasspath() - }; - Process javac = Runtime.getRuntime().exec(javacCommand); - consumeStdOut(javac); - List<String> stdErr = readLines(javac.getErrorStream()); - int exitCode = javac.waitFor(); - if (exitCode != 0) { - // Couldn't compile the file. - System.err.printf("ERROR: running \"%s\" failed (%s):", - Joiner.on(' ').join(javacCommand), exitCode); - for (String line : stdErr) { - System.err.println(line); - } - return null; - } else { - // Compiled the file! Now to determine where javac put it. - Pattern pattern; - if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) <= 6) { - // JDK 6 or lower - pattern = Pattern.compile("\\[wrote ([^\\]]*)\\]"); - } else { - // JDK 7 or higher - pattern = Pattern.compile("\\[wrote RegularFileObject\\[([^\\]]*)\\]\\]"); - } - String pathToClass = null; - for (String line : stdErr) { - Matcher lineMatcher = pattern.matcher(line); - if (lineMatcher.matches()) { - pathToClass = lineMatcher.group(1); - // NOTE: don't break, as the correct path is the last one matched. - } - } - if (pathToClass != null) { - return fromPathToClass(pathToClass); - } else { - System.err.println("WARNING: couldn't find javac output from javac " + pathToJava); - return null; - } - } - } catch (Exception e) { - System.err.println("WARNING: exception while processing " + pathToJava + ": " - + e.getMessage()); - return null; - } - } - - /** - * Fires off a background thread to consume anything written to a process' - * standard output. Without running this, a process that outputs too much data - * will block. - */ - private void consumeStdOut(Process p) { - final InputStream o = p.getInputStream(); - Thread t = new Thread() { - @Override - public void run() { - try { - while (o.read() != -1) {} - } catch (IOException e) { - e.printStackTrace(); - } - } - }; - t.setDaemon(true); - t.start(); - } - - private String determineClasspath(String pathToJava) { - // Try to determine the classpath component of a path by looking at the - // path components. - StringBuilder classpath = new StringBuilder(); - if (new File(pathToJava).isAbsolute()) { - classpath.append(File.separator); - } - - // This is just silly, but it will get by for now. - for (String component : pathToJava.split(File.separator)) { - if (component.equals("org") - || component.equals("com") - || component.equals("au")) { - return classpath.toString(); - } else { - classpath.append(component + File.separator); - } - } - - System.err.println("WARNING: couldn't determine classpath for " + pathToJava); - return "."; - } - - private String determineSystemClasspath() { - StringBuilder s = new StringBuilder(); - boolean needsColon = false; - for (URL url : ((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs()) { - if (needsColon) { - s.append(':'); - } - s.append(url.getPath()); - needsColon = true; - } - return s.toString(); - } - - private Class<?> fromPathToProto(String pathToProto, File intermediateJavaDir, File protoPath) { - try { - intermediateJavaDir.mkdirs(); - File proto = new File(pathToProto); - String[] protocCommand = new String[] { - "protoc", tryGetRelativePath(proto), - "-I" + protoPath.getPath(), - "--java_out", intermediateJavaDir.getAbsolutePath() - }; - Process protoc = Runtime.getRuntime().exec(protocCommand); - // TODO(ben): configure timeout? - killProcessAfter(10, TimeUnit.SECONDS, protoc); - int exitCode = protoc.waitFor(); - if (exitCode != 0) { - // Couldn't compile the file. - System.err.printf("ERROR: running \"%s\" failed (%s):", - Joiner.on(' ').join(protocCommand), exitCode); - for (String line : readLines(protoc.getErrorStream())) { - System.err.println(line); - } - return null; - } else { - final String javaFileName = capitalize(stripSuffix(".proto", proto.getName())) + ".java"; - String maybeJavaFilePath = find(intermediateJavaDir, new Predicate<File>() { - @Override public boolean apply(File f) { - return f.getName().equals(javaFileName); - } - }); - if (maybeJavaFilePath == null) { - System.err.println("ERROR: couldn't find result of protoc in " + intermediateJavaDir); - return null; - } - return fromPathToJava(maybeJavaFilePath, intermediateJavaDir); - } - } catch (Exception e) { - System.err.println("WARNING: exception while processing " + pathToProto + ": " - + e.getMessage()); - e.printStackTrace(); - return null; - } - } - - private String find(File dir, Predicate<File> predicate) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - String path = find(file, predicate); - if (path != null) { - return path; - } - } - if (predicate.apply(file)) { - return file.getAbsolutePath(); - } - } - return null; - } - - private String tryGetRelativePath(File file) { - String pwd = System.getProperty("user.dir"); - return stripPrefix(pwd + File.separator, file.getAbsolutePath()); - } - - private String stripPrefix(String prefix, String s) { - return s.startsWith(prefix) ? s.substring(prefix.length()) : s; - } - - private String stripSuffix(String suffix, String s) { - return s.endsWith(suffix) ? s.substring(0, s.length() - suffix.length()) : s; - } - - private String capitalize(String s) { - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } - - private List<String> readLines(InputStream is) { - try { - return CharStreams.readLines(new InputStreamReader(is)); - } catch (IOException e) { - e.printStackTrace(); - // TODO(kalman): this is a bit hacky, deal with it properly. - return Collections.singletonList("(Error, couldn't read lines from the input stream. " + - "Try running the command external to PST to view the output.)"); - } - } - - private FileDescriptor asFileDescriptor(Class<?> clazz) { - try { - Method method = clazz.getMethod("getDescriptor"); - return (FileDescriptor) method.invoke(null); - } catch (Exception e) { - return null; - } - } - - private void killProcessAfter(final long delay, final TimeUnit unit, final Process process) { - Thread processKiller = new Thread() { - @Override public void run() { - try { - Thread.sleep(unit.toMillis(delay)); - process.destroy(); - } catch (InterruptedException e) { - } - } - }; - processKiller.setDaemon(true); - processKiller.start(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java.orig ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java.orig b/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java.orig deleted file mode 100644 index 8962b0f..0000000 --- a/pst/src/main/java/org/apache/wave/pst/PstFileDescriptor.java.orig +++ /dev/null @@ -1,352 +0,0 @@ -/** - * 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.wave.pst; - -import com.google.common.base.Joiner; -import com.google.common.base.Predicate; -import com.google.common.io.CharStreams; -import com.google.common.io.Files; -import com.google.protobuf.Descriptors.FileDescriptor; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A loader for a {@link FileDescriptor}, accepting and handling a proto file - * specified as: - * <ul> - * <li>A path to a .proto file.</li> - * <li>A path to a .java (protoc-)compiled proto spec.</li> - * <li>A path to a .class (javac-) compiled proto spec.</li> - * <li>A proto spec that is already on the classpath.</li> - * </ul> - * - * @author [email protected] (Benjamin Kalman) - */ -public final class PstFileDescriptor { - - private final FileDescriptor descriptor; - - /** - * Loads the {@link FileDescriptor} from a path. The path may be a class name - * (e.g. foo.Bar), path to a class (e.g. bin/foo/Bar.class), or a path to a - * Java source file (e.g. src/foo/Bar.java). - * - * In each case it is the caller's responsibility to ensure that the classpath - * of the Java runtime is correct. - * - * @param path the path to load the proto description from - * @param intermediateJavaDir path to save the intermediate protoc- - * generated Java file (if any) - * @param protoPath any additional path to pass to the protoc compiler - */ - public static FileDescriptor load(String path, File intermediateJavaDir, File protoPath) { - return new PstFileDescriptor(path, intermediateJavaDir, protoPath).get(); - } - - private PstFileDescriptor(String path, File intermediateJavaDir, File protoPath) { - Class<?> clazz = null; - if (path.endsWith(".class")) { - clazz = fromPathToClass(path); - } else if (path.endsWith(".java")) { - clazz = fromPathToJava(path); - } else if (path.endsWith(".proto")) { - clazz = fromPathToProto(path, intermediateJavaDir, protoPath); - } else { - clazz = fromClassName(path); - } - - if (clazz == null) { - descriptor = null; - } else { - descriptor = asFileDescriptor(clazz); - } - } - - private FileDescriptor get() { - return descriptor; - } - - private Class<?> fromClassName(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } - - private Class<?> fromPathToClass(String pathToClass) { - String currentBaseDir = new File(pathToClass).isAbsolute() ? "" : "."; - String currentPath = pathToClass; - Class<?> clazz = null; - while (clazz == null) { - clazz = loadClassAtPath(currentBaseDir, currentPath); - if (clazz == null) { - int indexOfSep = currentPath.indexOf(File.separatorChar); - if (indexOfSep == -1) { - break; - } else { - currentBaseDir += File.separator + currentPath.substring(0, indexOfSep); - currentPath = currentPath.substring(indexOfSep + 1); - } - } - } - return clazz; - } - - private Class<?> loadClassAtPath(String baseDir, String path) { - try { - ClassLoader classLoader = new URLClassLoader(new URL[] {new File(baseDir).toURI().toURL()}); - return classLoader.loadClass(getBinaryName(path)); - } catch (Throwable t) { - return null; - } - } - - private String getBinaryName(String path) { - return path.replace(File.separatorChar, '.').substring(0, path.length() - ".class".length()); - } - - private Class<?> fromPathToJava(String pathToJava) { - try { - File dir = Files.createTempDir(); - String[] javacCommand = new String[] { - "javac", pathToJava, "-d", dir.getAbsolutePath(), "-verbose", - "-cp", determineClasspath(pathToJava) + ":" + determineSystemClasspath() - }; - Process javac = Runtime.getRuntime().exec(javacCommand); - consumeStdOut(javac); - List<String> stdErr = readLines(javac.getErrorStream()); - int exitCode = javac.waitFor(); - if (exitCode != 0) { - // Couldn't compile the file. - System.err.printf("ERROR: running \"%s\" failed (%s):", - Joiner.on(' ').join(javacCommand), exitCode); - for (String line : stdErr) { - System.err.println(line); - } - return null; - } else { - // Compiled the file! Now to determine where javac put it. - Pattern pattern; - if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) <= 6) { - // JDK 6 or lower - pattern = Pattern.compile("\\[wrote ([^\\]]*)\\]"); - } else { - // JDK 7 or higher - pattern = Pattern.compile("\\[wrote RegularFileObject\\[([^\\]]*)\\]\\]"); - } - String pathToClass = null; - for (String line : stdErr) { - Matcher lineMatcher = pattern.matcher(line); - if (lineMatcher.matches()) { - pathToClass = lineMatcher.group(1); - // NOTE: don't break, as the correct path is the last one matched. - } - } - if (pathToClass != null) { - return fromPathToClass(pathToClass); - } else { - System.err.println("WARNING: couldn't find javac output from javac " + pathToJava); - return null; - } - } - } catch (Exception e) { - System.err.println("WARNING: exception while processing " + pathToJava + ": " - + e.getMessage()); - return null; - } - } - - /** - * Fires off a background thread to consume anything written to a process' - * standard output. Without running this, a process that outputs too much data - * will block. - */ - private void consumeStdOut(Process p) { - final InputStream o = p.getInputStream(); - Thread t = new Thread() { - @Override - public void run() { - try { - while (o.read() != -1) {} - } catch (IOException e) { - e.printStackTrace(); - } - } - }; - t.setDaemon(true); - t.start(); - } - - private String determineClasspath(String pathToJava) { - // Try to determine the classpath component of a path by looking at the - // path components. - StringBuilder classpath = new StringBuilder(); - if (new File(pathToJava).isAbsolute()) { - classpath.append(File.separator); - } - - // This is just silly, but it will get by for now. - for (String component : pathToJava.split(File.separator)) { - if (component.equals("org") - || component.equals("com") - || component.equals("au")) { - return classpath.toString(); - } else { - classpath.append(component + File.separator); - } - } - - System.err.println("WARNING: couldn't determine classpath for " + pathToJava); - return "."; - } - - private String determineSystemClasspath() { - StringBuilder s = new StringBuilder(); - boolean needsColon = false; - for (URL url : ((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs()) { - if (needsColon) { - s.append(':'); - } - s.append(url.getPath()); - needsColon = true; - } - return s.toString(); - } - - private Class<?> fromPathToProto(String pathToProto, File intermediateJavaDir, File protoPath) { - try { - intermediateJavaDir.mkdirs(); - File proto = new File(pathToProto); - String[] protocCommand = new String[] { - "protoc", tryGetRelativePath(proto), - "-I" + protoPath.getPath(), - "--java_out", intermediateJavaDir.getAbsolutePath() - }; - Process protoc = Runtime.getRuntime().exec(protocCommand); - // TODO(ben): configure timeout? - killProcessAfter(10, TimeUnit.SECONDS, protoc); - int exitCode = protoc.waitFor(); - if (exitCode != 0) { - // Couldn't compile the file. - System.err.printf("ERROR: running \"%s\" failed (%s):", - Joiner.on(' ').join(protocCommand), exitCode); - for (String line : readLines(protoc.getErrorStream())) { - System.err.println(line); - } - return null; - } else { - final String javaFileName = capitalize(stripSuffix(".proto", proto.getName())) + ".java"; - String maybeJavaFilePath = find(intermediateJavaDir, new Predicate<File>() { - @Override public boolean apply(File f) { - return f.getName().equals(javaFileName); - } - }); - if (maybeJavaFilePath == null) { - System.err.println("ERROR: couldn't find result of protoc in " + intermediateJavaDir); - return null; - } - return fromPathToJava(maybeJavaFilePath); - } - } catch (Exception e) { - System.err.println("WARNING: exception while processing " + pathToProto + ": " - + e.getMessage()); - e.printStackTrace(); - return null; - } - } - - private String find(File dir, Predicate<File> predicate) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - String path = find(file, predicate); - if (path != null) { - return path; - } - } - if (predicate.apply(file)) { - return file.getAbsolutePath(); - } - } - return null; - } - - private String tryGetRelativePath(File file) { - String pwd = System.getProperty("user.dir"); - return stripPrefix(pwd + File.separator, file.getAbsolutePath()); - } - - private String stripPrefix(String prefix, String s) { - return s.startsWith(prefix) ? s.substring(prefix.length()) : s; - } - - private String stripSuffix(String suffix, String s) { - return s.endsWith(suffix) ? s.substring(0, s.length() - suffix.length()) : s; - } - - private String capitalize(String s) { - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } - - private List<String> readLines(InputStream is) { - try { - return CharStreams.readLines(new InputStreamReader(is)); - } catch (IOException e) { - e.printStackTrace(); - // TODO(kalman): this is a bit hacky, deal with it properly. - return Collections.singletonList("(Error, couldn't read lines from the input stream. " + - "Try running the command external to PST to view the output.)"); - } - } - - private FileDescriptor asFileDescriptor(Class<?> clazz) { - try { - Method method = clazz.getMethod("getDescriptor"); - return (FileDescriptor) method.invoke(null); - } catch (Exception e) { - return null; - } - } - - private void killProcessAfter(final long delay, final TimeUnit unit, final Process process) { - Thread processKiller = new Thread() { - @Override public void run() { - try { - Thread.sleep(unit.toMillis(delay)); - process.destroy(); - } catch (InterruptedException e) { - } - } - }; - processKiller.setDaemon(true); - processKiller.start(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/PstMain.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/PstMain.java b/pst/src/main/java/org/apache/wave/pst/PstMain.java deleted file mode 100644 index 3faeba1..0000000 --- a/pst/src/main/java/org/apache/wave/pst/PstMain.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * 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.wave.pst; - -import com.google.common.collect.Lists; -import com.google.common.io.Files; -import com.google.protobuf.Descriptors.FileDescriptor; - -import org.apache.commons.cli.ParseException; - -import java.io.File; -import java.util.List; - -/** - * Entry point for command line protobuf-stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class PstMain { - - public static void main(String[] args) { - PstCommandLine cl = null; - try { - cl = new PstCommandLine(args); - } catch (ParseException e) { - System.err.println("Error parsing command line arguments: " + e.getMessage()); - PstCommandLine.printHelp(); - System.exit(1); - } - - if (cl.hasHelp()) { - PstCommandLine.printHelp(); - System.exit(0); - } - - FileDescriptor fd = PstFileDescriptor.load( - cl.getProtoFile().getPath(), - cl.shouldSaveJava() ? cl.getOutputDir() : Files.createTempDir(), - cl.getProtoPath()); - if (fd == null) { - System.err.println("Error: cannot find file descriptor for " + cl.getProtoFile()); - System.exit(1); - } - - boolean failed = false; - - List<File> templates = Lists.newArrayList(); - for (File maybeTemplate : cl.getTemplateFiles()) { - if (maybeTemplate.exists()) { - templates.add(maybeTemplate); - } else { - System.err.println("ERROR: template " + maybeTemplate.getPath() + " does not exist."); - failed = true; - } - } - - Pst pst = new Pst(cl.getOutputDir(), fd, cl.getStyler(), templates, cl.shouldSavePreStyled(), - cl.shouldUseInt52()); - try { - pst.run(); - } catch (PstException e) { - System.err.printf("ERROR: generation failed for %d/%d templates:\n", - e.getTemplateExceptions().size(), templates.size()); - for (PstException.TemplateException te : e.getTemplateExceptions()) { - System.err.println('\n' + te.getTemplateName() + " failed:"); - te.printStackTrace(System.err); - } - failed = true; - } - - if (failed) { - System.exit(1); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/EnumValue.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/EnumValue.java b/pst/src/main/java/org/apache/wave/pst/model/EnumValue.java deleted file mode 100644 index f246d13..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/EnumValue.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * 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.wave.pst.model; - -import com.google.protobuf.Descriptors.EnumValueDescriptor; - -/** - * Wraps a {@link EnumValueDescriptor} with methods suitable for stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class EnumValue { - - private final EnumValueDescriptor descriptor; - - public EnumValue(EnumValueDescriptor descriptor) { - this.descriptor = descriptor; - } - - /** - * Gets the name of the enum value, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender.MALE = "MALE".</li> - * </ul> - * - * @return the name of the enum value - */ - public String getName() { - return descriptor.getName(); - } - - /** - * Gets the number of the enum value, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender.MALE = 1.</li> - * </ul> - * - * @return the name of the enum value - */ - public int getNumber() { - return descriptor.getNumber(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/Field.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/Field.java b/pst/src/main/java/org/apache/wave/pst/model/Field.java deleted file mode 100644 index 2477566..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/Field.java +++ /dev/null @@ -1,283 +0,0 @@ -/** - * 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.wave.pst.model; - -import com.google.protobuf.Descriptors.FieldDescriptor; - -import org.apache.wave.pst.protobuf.Extensions; - -/** - * Wraps a {@link FieldDescriptor} with methods suitable for stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class Field { - - private final FieldDescriptor field; - private final Type type; - private final MessageProperties properties; - - public Field(FieldDescriptor field, Type type, MessageProperties properties) { - this.field = field; - this.type = type; - this.properties = properties; - } - - /** - * Returns the type of the field as the Java type, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "int"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as the Java type - */ - public String getJavaType() { - return type.getJavaType(isInt52()); - } - - /** - * Returns the type of the field as the Java type capitalized, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "Int"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as the Java type - */ - public String getCapJavaType() { - return type.getCapJavaType(isInt52()); - } - - /** - * Returns the type of the field as the boxed Java type, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "Integer"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as a boxed Java type - */ - public String getBoxedJavaType() { - return type.getBoxedJavaType(isInt52()); - } - - /** - * Returns the message type of the field without template suffix, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = undefined</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = undefined</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = undefined</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = - * "Address" (regardless of template name)</li> - * </ul> - * - * @return the message type of the field without template suffix - */ - public String getMessageType() { - return type.getMessage().getName(); - } - - /** - * Gets the type of this field. - * - * @return the type of this field. - */ - public Type getType() { - return type; - } - - /** - * Returns the name of the field as uncapitalizedCamelCase, for example - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "firstName"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "age"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.lucky_numbers = "luckyNumbers"</li> - * </ul> - * - * @return the name of the field as uncapitalizedCamelCase - */ - public String getName() { - return Util.uncapitalize(getCapName()); - } - - /** - * Returns the name of the field as CapitalizedCamelCase, for example - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "FirstName"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "age"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.lucky_numbers = "LuckyNumbers"</li> - * </ul> - * - * @return the name of the field as CapitalizedCamelCase - */ - public String getCapName() { - StringBuilder result = new StringBuilder(); - for (String s : getNameParts()) { - result.append(Util.capitalize(s)); - } - return result.toString(); - } - - private String[] getNameParts() { - // Assumes that the field is separated by underscores... not sure if this - // is always the case. - return field.getName().split("_"); - } - - /** - * Returns the number of the field, for example - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = 1</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = 4</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.lucky_numbers = 5</li> - * </ul> - * - * @return the number of the field - */ - public int getNumber() { - return field.getNumber(); - } - - /** - * Gets the default value of the field (null for objects, empty strings/arrays, zero, false, etc). - * - * @return the "default value" of the field - */ - public String getDefaultValue() { - return type.getDefaultValue(); - } - - /** - * Gets the name of a Java getter for this field. - * - * @return the name of a Java getter for this field. - */ - public String getGetter() { - return "get" + getCapName(); - } - - /** - * Gets the name of a Java setter for this field. - * - * @return the name of a Java getter for this field. - */ - public String getSetter() { - return "set" + getCapName(); - } - - /** - * Gets whether the field is of type int52. This means that although the - * field's native type is int64, only 52 bits of information are used. - * - * @return whether the field is a 52-bit integer - */ - public boolean isInt52() { - return properties.getUseInt52() // - && field.getOptions().hasExtension(Extensions.int52) - && field.getOptions().getExtension(Extensions.int52); - } - - /** - * Gets whether the field is of type long (int64). This means that the field - * may use up to 64 bits of information. - * - * @return whether the field is a long (64-bit integer) - */ - public boolean isLong() { - return field.getJavaType() == FieldDescriptor.JavaType.LONG && !isInt52(); - } - - // - // These map directly to the .proto definitions (except for isPrimitive, but that's pretty - // self explanatory). - // - - /** - * @return whether the field is required - */ - public boolean isRequired() { - return field.isRequired(); - } - - /** - * @return whether the field is optional - */ - public boolean isOptional() { - return field.isOptional(); - } - - /** - * @return whether the field is repeated - */ - public boolean isRepeated() { - return field.isRepeated(); - } - - /** - * @return whether the field is a message - */ - public boolean isMessage() { - return type.isMessage(); - } - - /** - * @return whether the field is an enum - */ - public boolean isEnum() { - return type.isEnum(); - } - - /** - * @return whether the field type is a Java primitive - */ - public boolean isPrimitive() { - return type.isPrimitive(); - } - - /** - * @return whether the field type is a data blob. - */ - public boolean isBlob() { - return type.isBlob(); - } - - /** - * @return whether the field type is a Java primitive and not repeated - */ - public boolean isPrimitiveAndNotRepeated() { - // NOTE: If stringtemplate could handle statements like - // $if (f.primitive && !f.repeated)$ - // then this method would be unnecessary. However, from what I can tell, it can't. - return isPrimitive() && !isRepeated(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/Message.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/Message.java b/pst/src/main/java/org/apache/wave/pst/model/Message.java deleted file mode 100644 index 75e2483..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/Message.java +++ /dev/null @@ -1,343 +0,0 @@ -/** - * 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.wave.pst.model; - - import com.google.common.base.Joiner; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.google.protobuf.Descriptors.Descriptor; -import com.google.protobuf.Descriptors.EnumDescriptor; -import com.google.protobuf.Descriptors.FieldDescriptor; -import com.google.protobuf.Descriptors.FieldDescriptor.JavaType; - -import java.util.Collection; -import java.util.Deque; -import java.util.List; - -/** - * Wraps a {@link Descriptor} with methods suitable for stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class Message { - - private final Descriptor descriptor; - private final String templateName; - private final MessageProperties extraProperties; - - // Lazily created. - private List<Field> fields = null; - private List<Message> messages = null; - private List<ProtoEnum> enums = null; - private List<Message> referencedMessages = null; - private List<ProtoEnum> referencedEnums = null; - private String fullName; - private String fullJavaType; - - public Message(Descriptor descriptor, String templateName, MessageProperties extraProperties) { - this.descriptor = descriptor; - this.templateName = templateName; - this.extraProperties = extraProperties; - } - - /** - * Returns the short name of the Java type of this message, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = "Person"</li> - * </ul> - * - * @return the name of the protocol buffer message - */ - public String getName() { - return descriptor.getName(); - } - - /** - * Returns the short name of Java type being generated. For example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = <ul> - * <li>"PersonMessage" (for template name "message")</li> - * <li>"PersonMessageServerImpl" (for template name "messageServerImpl")</li></ul> - * </li> - * </ul> - * - * @return the name of the Java message - */ - public String getJavaType() { - return descriptor.getName() + Util.capitalize(templateName); - } - - /** - * Returns the full name of the this message in abstract Java space. For - * example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = <ul> - * <li>"org.waveprotocol.pst.examples.Person" - * (for template name "Message" and package suffix "dto")</li></ul> - * </li> - * </ul> - * - * @return the name of the protocol buffer message - */ - public String getFullName() { - if (fullName == null) { - fullName = getFullName(false); - } - return fullName; - } - - /** - * Returns the full name of the Java type of this message, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = <ul> - * <li>"org.waveprotocol.pst.examples.dto.PersonMessage" - * (for template name "Message" and package suffix "dto")</li> - * <li>"org.waveprotocol.pst.examples.impl.PersonImpl" - * (for template name "Impl" and package suffix "impl")</li></ul> - * </li> - * </ul> - * - * @return the name of the protocol buffer message - */ - public String getFullJavaType() { - if (fullJavaType == null) { - fullJavaType = getFullName(true); - } - return fullJavaType; - } - - /** - * Gets the fully-qualified name of this message. - * - * @param covariant if true, the name refers to the Java type being generated - * for this message. Otherwise, the name refers to a - * template-independent Java type, which may or may not exist. This is - * intended to be used so that the generated Java type for this message - * can refer to other Java types derived from this message. - * @return the fully-qualified name of this message. - */ - private String getFullName(boolean covariant) { - String prefix; - if (descriptor.getContainingType() != null) { - prefix = adapt(descriptor.getContainingType()).getFullName(covariant); - } else { - prefix = covariant ? getPackage() : getPackageBase(); - } - - return prefix + "." + (covariant ? getJavaType() : getName()); - } - - /** - * Returns the package of the Java messageas the base plus the suffix - * components of the package, for example given org.waveprotocol.pst.examples.Example1.Person: - * <ul> - * <li>Message = "org.waveprotocol.pst.examples"</li> - * <li>MessageServerImpl (package suffix "server") = "org.waveprotocol.pst.examples.server"</li> - * <li>MessageClientImpl (package suffix "client") = "org.waveprotocol.pst.examples.client"</li> - * </ul> - * - * @return the Java package of the message - */ - public String getPackage() { - String suffix = getPackageSuffix(); - return getPackageBase() + (!Strings.isNullOrEmpty(suffix) ? "." + suffix : ""); - } - - /** - * Returns the base component of the Java message package, for example, given - * org.waveprotocol.pst.examples.Example1.Person: - * <ul> - * <li>Message = "org.waveprotocol.pst.examples"</li> - * <li>MessageServerImpl (package suffix "server") = "org.waveprotocol.pst.examples"</li> - * </ul> - * - * @return the base component of the Java package - */ - public String getPackageBase() { - String javaPackage = descriptor.getFile().getOptions().getJavaPackage(); - if (Strings.isNullOrEmpty(javaPackage)) { - javaPackage = descriptor.getFile().getPackage(); - } - return javaPackage; - } - - /** - * Returns the suffix component of the Java message package, as configured in - * the message's properties file, for example: - * <ul> - * <li>Message = null</li> - * <li>MessageServerImpl = "server"</li> - * <li>MessageClientImpl = "client"</li> - * </ul> - */ - public String getPackageSuffix() { - return extraProperties.getPackageSuffix(); - } - - /** - * @return the filename of the protocol buffer (.proto) file where the message - * is defined - */ - public String getFilename() { - return descriptor.getFile().getName(); - } - - /** - * Returns the qualified type of the protobuf message, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = - * "org.waveprotocol.pst.examples.Example1.Person"</li> - * </ul> - * - * @return the full type of the protocol buffer message - */ - public String getProtoType() { - Deque<String> scopes = Lists.newLinkedList(); - for (Descriptor message = descriptor; message != null; message = message.getContainingType()) { - scopes.push(message.getName()); - } - scopes.push(descriptor.getFile().getOptions().getJavaOuterClassname()); - scopes.push(getPackageBase()); - return Joiner.on('.').join(scopes); - } - - /** - * @return the fields of the message - */ - public List<Field> getFields() { - if (fields == null) { - ImmutableList.Builder<Field> builder = ImmutableList.builder(); - for (FieldDescriptor fd : descriptor.getFields()) { - builder.add(new Field(fd, new Type(fd, templateName, extraProperties), extraProperties)); - } - fields = builder.build(); - } - return fields; - } - - /** - * @return the set of all messages referred to be this message and its nested - * messages. Message references are due to message-typed fields. - */ - public List<Message> getReferencedMessages() { - if (referencedMessages == null) { - referencedMessages = Lists.newArrayList(); - for (Descriptor d : collectMessages(descriptor, Sets.<Descriptor>newLinkedHashSet())) { - referencedMessages.add(adapt(d)); - } - } - return referencedMessages; - } - - /** - * @return the set of all enums referred to be this message and its nested - * messages. Enum references are due to message-typed fields. - */ - public List<ProtoEnum> getReferencedEnums() { - if (referencedEnums == null) { - referencedEnums = Lists.newArrayList(); - for (EnumDescriptor d : collectEnums(descriptor, Sets.<EnumDescriptor> newLinkedHashSet())) { - referencedEnums.add(adapt(d)); - } - } - return referencedEnums; - } - - /** - * Collects messages referred to by a message and its nested messages. - * - * @return {@code referenced} - */ - private static Collection<Descriptor> collectMessages( - Descriptor message, Collection<Descriptor> referenced) { - for (FieldDescriptor fd : message.getFields()) { - if (fd.getJavaType() == JavaType.MESSAGE) { - referenced.add(fd.getMessageType()); - } - } - for (Descriptor nd : message.getNestedTypes()) { - collectMessages(nd, referenced); - } - return referenced; - } - - /** - * Collects enums referred to by a message and its nested messages. - * - * @return {@code referenced} - */ - private static Collection<EnumDescriptor> collectEnums( - Descriptor d, Collection<EnumDescriptor> referenced) { - for (FieldDescriptor fd : d.getFields()) { - if (fd.getJavaType() == JavaType.ENUM) { - referenced.add(fd.getEnumType()); - } - } - for (Descriptor nd : d.getNestedTypes()) { - collectEnums(nd, referenced); - } - return referenced; - } - - /** - * @return the nested messages of the message - */ - public List<Message> getNestedMessages() { - if (messages == null) { - ImmutableList.Builder<Message> builder = ImmutableList.builder(); - for (Descriptor d : descriptor.getNestedTypes()) { - builder.add(adapt(d)); - } - messages = builder.build(); - } - return messages; - } - - /** - * @return the nested enums of the message - */ - public List<ProtoEnum> getNestedEnums() { - if (enums == null) { - ImmutableList.Builder<ProtoEnum> builder = ImmutableList.builder(); - for (EnumDescriptor ed : descriptor.getEnumTypes()) { - builder.add(adapt(ed)); - } - enums = builder.build(); - } - return enums; - } - - /** - * @return whether this is an inner class - */ - public boolean isInner() { - return descriptor.getContainingType() != null; - } - - private Message adapt(Descriptor d) { - return new Message(d, templateName, extraProperties); - } - - private ProtoEnum adapt(EnumDescriptor d) { - return new ProtoEnum(d, templateName, extraProperties); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/MessageProperties.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/MessageProperties.java b/pst/src/main/java/org/apache/wave/pst/model/MessageProperties.java deleted file mode 100644 index 782d639..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/MessageProperties.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * 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.wave.pst.model; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; - -/** - * Container for the Properties of a message. - * - * @author [email protected] - */ -public final class MessageProperties { - - private static final String PACKAGE_SUFFIX = "package.suffix"; - private static final String FILE_EXTENSION = "file.extension"; - private static final String TEMPLATE_NAME = "template.name"; - - private final Properties properties; - private boolean useInt52; - - private MessageProperties(Properties properties) { - this.properties = properties; - } - - public static MessageProperties createFromFile(File propertiesFile) throws FileNotFoundException, - IOException { - Properties properties = new Properties(); - properties.load(new FileReader(propertiesFile)); - return new MessageProperties(properties); - } - - public static MessageProperties createEmpty() { - return new MessageProperties(new Properties()); - } - - /** - * @return the package suffix, or null if one isn't specified. - */ - public String getPackageSuffix() { - return properties.getProperty(PACKAGE_SUFFIX); - } - - /** - * @return whether a package suffix has been specified. - */ - public boolean hasPackageSuffix() { - return getPackageSuffix() != null; - } - - /** - * @return the file extension, or null if it isn't specified. - */ - public String getFileExtension() { - return properties.getProperty(FILE_EXTENSION); - } - - /** - * @return whether a file extension has been specified. - */ - public boolean hasFileExtension() { - return getFileExtension() != null; - } - - /** - * @return the template name, or null if it isn't specified. - */ - public String getTemplateName() { - return properties.getProperty(TEMPLATE_NAME); - } - - /** - * @return whether a template name has been specified. - */ - public boolean hasTemplateName() { - return getTemplateName() != null; - } - - /** - * Sets the global int52 type property - */ - public void setUseInt52(boolean useInt52) { - this.useInt52 = useInt52; - } - - /** - * @return the int52 type or null if it isn't specified. - */ - public boolean getUseInt52() { - return useInt52; - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/ProtoEnum.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/ProtoEnum.java b/pst/src/main/java/org/apache/wave/pst/model/ProtoEnum.java deleted file mode 100644 index abc5f8a..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/ProtoEnum.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * 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.wave.pst.model; - -import com.google.common.collect.Lists; -import com.google.protobuf.Descriptors.EnumDescriptor; -import com.google.protobuf.Descriptors.EnumValueDescriptor; - -import java.util.List; - -/** - * Wraps a {@link EnumDescriptor} with methods suitable for stringtemplate. - * - * Called ProtoEnum rather than Enum to avoid java.lang namespace conflict. - * - * @author [email protected] (Benjamnin Kalman) - */ -public final class ProtoEnum { - - private final EnumDescriptor descriptor; - private final String templateName; - private final MessageProperties extra; - - private String fullName; - private String fullJavaType; - - public ProtoEnum(EnumDescriptor descriptor, String templateName, MessageProperties extra) { - this.descriptor = descriptor; - this.templateName = templateName; - this.extra = extra; - } - - /** - * Returns the enum, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender = "Gender"</li> - * </ul> - * - * @return the name of the enum - */ - public String getName() { - return descriptor.getName(); - } - - /** - * Returns the short name of the Java type generated for this enum, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender = "Gender"</li> - * </ul> - * - * @return the name of the java type of the enum - */ - public String getJavaType() { - return getName(); - } - - /** - * Returns the fully-qualified name of the enum in abstract space. For - * example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender = - * "org.waveprotocol.pst.examples.Person.Gender"</li> - * </ul> - * - * @return the name of the enum - */ - public String getFullName() { - if (fullName == null) { - fullName = getContainingMessage().getFullName() + "." + getName(); - } - return fullName; - } - - /** - * Returns the fully-qualified name of the Java type for this enum. - * example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender = - * "org.waveprotocol.pst.examples.Person.Gender"</li> - * </ul> - * - * @return the name of the enum - */ - public String getFullJavaType() { - if (fullJavaType == null) { - fullJavaType = getContainingMessage().getFullJavaType() + "." + getName(); - } - return fullJavaType; - } - - /** - * Returns the qualified type of the protobuf enum, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person = - * "org.waveprotocol.pst.examples.Example1.Person"</li> - * </ul> - * - * @return the full type of the protocol buffer enum - */ - public String getProtoType() { - return getContainingMessage().getProtoType() + "." + getName(); - } - - /** - * Returns the enum values, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.Gender = [MALE, FEMALE, OTHER]</li> - * </ul> - * - * @return the enum values - */ - public List<EnumValue> getValues() { - List<EnumValue> enums = Lists.newArrayList(); - for (EnumValueDescriptor evd : descriptor.getValues()) { - enums.add(new EnumValue(evd)); - } - return enums; - } - - private Message getContainingMessage() { - return new Message(descriptor.getContainingType(), templateName, extra); - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/Type.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/Type.java b/pst/src/main/java/org/apache/wave/pst/model/Type.java deleted file mode 100644 index 7fcb7b8..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/Type.java +++ /dev/null @@ -1,244 +0,0 @@ -/** - * 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.wave.pst.model; - -import com.google.protobuf.Descriptors.Descriptor; -import com.google.protobuf.Descriptors.FieldDescriptor; - -/** - * Wraps a {@link FieldDescriptor} to expose type-only information for - * stringtemplate. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class Type { - - private final FieldDescriptor field; - private final String templateName; - private final MessageProperties extraProperties; - private Message messageType; - - public Type(FieldDescriptor field, String templateName, MessageProperties extraProperties) { - this.field = field; - this.templateName = templateName; - this.extraProperties = extraProperties; - } - - /** - * Returns the type of the field as the Java type, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "int"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as the Java type - */ - public String getJavaType(boolean hasInt52Ext) { - switch (field.getJavaType()) { - case BOOLEAN: - return "boolean"; - case BYTE_STRING: - return "Blob"; - case DOUBLE: - return "double"; - case ENUM: - return field.getEnumType().getName(); - case FLOAT: - return "float"; - case INT: - return "int"; - case LONG: - return hasInt52Ext && extraProperties.getUseInt52() ? "double" : "long"; - case MESSAGE: - return getMessage().getJavaType(); - case STRING: - return "String"; - default: - throw new UnsupportedOperationException("Unsupported field type " + field.getJavaType()); - } - } - - /** - * Returns the type of the field as the Java type capitalized, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "Int"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as the Java type - */ - public String getCapJavaType(boolean hasInt52Ext) { - return Util.capitalize(getJavaType(hasInt52Ext)); - } - - /** - * Returns the type of the field as the boxed Java type, for example: - * <ul> - * <li>org.waveprotocol.pst.examples.Example1.Person.first_name = "String"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.age = "Integer"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.gender = "Gender"</li> - * <li>org.waveprotocol.pst.examples.Example1.Person.address = <ul> - * <li>"AddressMessage" (if template name is "message")</li> - * <li>"AddressMessageServerImpl" (if template name is "messageServerImpl")</li></ul></li> - * </ul> - * - * @return the type of the field as a boxed Java type - */ - public String getBoxedJavaType(boolean hasInt52Ext) { - switch (field.getJavaType()) { - case BOOLEAN: - return "Boolean"; - case DOUBLE: - return "Double"; - case FLOAT: - return "Float"; - case INT: - return "Integer"; - case LONG: - return hasInt52Ext && extraProperties.getUseInt52() ? "Double" : "Long"; - default: - return getJavaType(hasInt52Ext); - } - } - - /** - * Gets the default value of the field (null for objects, zero, false, etc). - * - * @return the "default value" of the field - */ - public String getDefaultValue() { - switch (field.getJavaType()) { - case BOOLEAN: - return "false"; - case BYTE_STRING: - return "null"; - case DOUBLE: - return "0.0"; - case ENUM: - return field.getEnumType().getName() + ".UNKNOWN"; - case FLOAT: - return "0.0f"; - case INT: - return "0"; - case LONG: - return "0L"; - case MESSAGE: - return "null"; - case STRING: - return "null"; - default: - throw new UnsupportedOperationException("Unsupported field type " + field.getJavaType()); - } - } - - /** - * @return this type as a message. - */ - public Message getMessage() { - if (messageType == null) { - messageType = adapt(field.getMessageType()); - } - return messageType; - } - - /** - * @return whether the field is a message - */ - public boolean isMessage() { - return field.getType().equals(FieldDescriptor.Type.MESSAGE); - } - - /** - * @return whether the field is an enum - */ - public boolean isEnum() { - return field.getType().equals(FieldDescriptor.Type.ENUM); - } - - /** - * @return whether the field is a byte string. - */ - public boolean isBlob() { - return field.getType().equals(FieldDescriptor.Type.BYTES); - } - - /** - * @return whether the field type is a Java primitive - */ - public boolean isPrimitive() { - switch (field.getJavaType()) { - case BOOLEAN: - case DOUBLE: - case FLOAT: - case INT: - case LONG: - return true; - default: - return false; - } - } - - private Message adapt(Descriptor d) { - return new Message(d, templateName, extraProperties); - } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } else if (o instanceof Type) { - Type t = (Type) o; - if (field.getType() == t.field.getType()) { - switch (field.getType()) { - case MESSAGE: - return field.getMessageType().equals(t.field.getMessageType()); - case ENUM: - return field.getEnumType().equals(t.field.getEnumType()); - default: - return true; - } - } else { - return false; - } - } else { - return false; - } - } - - @Override - public int hashCode() { - switch (field.getType()) { - case MESSAGE: - return field.getMessageType().hashCode(); - case ENUM: - return field.getEnumType().hashCode(); - default: - return field.getType().hashCode(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/051db092/pst/src/main/java/org/apache/wave/pst/model/Util.java ---------------------------------------------------------------------- diff --git a/pst/src/main/java/org/apache/wave/pst/model/Util.java b/pst/src/main/java/org/apache/wave/pst/model/Util.java deleted file mode 100644 index 373d3a7..0000000 --- a/pst/src/main/java/org/apache/wave/pst/model/Util.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * 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.wave.pst.model; - -/** - * Util methods for model objects. - * - * @author [email protected] (Benjamin Kalman) - */ -public final class Util { - - private Util() { - } - - /** - * @return the given string, capitalized ("fooBar" = "FooBar") - */ - public static String capitalize(String s) { - return s.isEmpty() ? "" : Character.toUpperCase(s.charAt(0)) + s.substring(1); - } - - /** - * @return the given string, uncapitalized ("FooBar" = "fooBar") - */ - public static String uncapitalize(String s) { - return s.isEmpty() ? "" : Character.toLowerCase(s.charAt(0)) + s.substring(1); - } -}
