npanday.assembler.impl.DefaultAssemblyInfoMarshaller.java Source code

Java tutorial

Introduction

Here is the source code for npanday.assembler.impl.DefaultAssemblyInfoMarshaller.java

Source

package npanday.assembler.impl;

/*
 * 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.
 */

import npanday.assembler.AssemblyInfoException;
import npanday.assembler.AssemblyInfoMarshaller;
import npanday.assembler.AssemblyInfo;
import npanday.assembler.AssemblyInfo.TargetFramework;
import npanday.model.assembly.plugins.AssemblyPlugin;

import java.io.OutputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map.Entry;

import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;

/**
 * Provides services for writing out the AssemblyInfo entries using the bracket convention [assembly:
 *
 * @author Shane Isbell
 */
final class DefaultAssemblyInfoMarshaller implements AssemblyInfoMarshaller {

    /**
     * The assembly plugin model that contains information used in writing of the AssemblyInfo class.
     */
    private AssemblyPlugin plugin;

    /**
     * @see AssemblyInfoMarshaller#marshal(npanday.assembler.AssemblyInfo, org.apache.maven.project.MavenProject,
     *      java.io.OutputStream)
     */
    public void marshal(AssemblyInfo assemblyInfo, MavenProject mavenProject, OutputStream outputStream)
            throws AssemblyInfoException, IOException {
        StringBuffer sb = new StringBuffer();
        sb.append("using System.Reflection;\r\n").append("using System.Runtime.CompilerServices;\r\n");
        appendEntry(sb, "Description", assemblyInfo.getDescription());
        appendEntry(sb, "Title", assemblyInfo.getTitle());
        appendEntry(sb, "Company", assemblyInfo.getCompany());
        appendEntry(sb, "Product", assemblyInfo.getProduct());
        if (assemblyInfo.getCopyright() != null) {
            appendEntry(sb, "Copyright", assemblyInfo.getCopyright().replace("\"", "\\"));
        }
        appendEntry(sb, "Trademark", assemblyInfo.getTrademark());
        appendEntry(sb, "Culture", assemblyInfo.getCulture());
        appendEntry(sb, "Version", assemblyInfo.getVersion());
        appendEntry(sb, "InformationalVersion", assemblyInfo.getInformationalVersion());
        appendEntry(sb, "Configuration", assemblyInfo.getConfiguration());
        appendEntry(sb, "KeyName", assemblyInfo.getKeyName());

        if (assemblyInfo.getKeyFile() != null) {
            appendEntry(sb, "KeyFile", assemblyInfo.getKeyFile().getAbsolutePath().replace("\\", "\\\\"));
        }

        TargetFramework targetFramework = assemblyInfo.getTargetFramework();
        if (targetFramework != null) {
            String frameworkName = targetFramework.getFrameworkName();
            String frameworkDisplayName = targetFramework.getFrameworkDisplayName();
            sb.append("[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute").append("(\"")
                    .append(frameworkName).append("\"");
            if (frameworkDisplayName != null) {
                sb.append(",FrameworkDisplayName=\"").append(frameworkDisplayName).append("\"");
            }
            sb.append(")]").append("\r\n");
        }

        boolean wroteCustomStringAttribute = false;
        for (Entry<String, String> e : assemblyInfo.getCustomStringAttributes().entrySet()) {
            if (StringUtils.isEmpty(e.getValue()))
                continue;

            sb.append(createCustomStringEntry(e.getKey(), e.getValue()));
            wroteCustomStringAttribute = true;
        }

        if (wroteCustomStringAttribute) {
            final String customClass = "\n" + //
                    "[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple = true)]\n" + //
                    "class CustomStringAttribute : System.Attribute {\n" + //
                    "  public CustomStringAttribute(string name, string value) {\n" + //
                    "  }\n" + // 
                    "}\n"; //
            sb.append(customClass);
        }

        FileOutputStream man = null;
        try {
            if (outputStream == null) {
                String src = mavenProject.getBuild().getDirectory() + "/build-sources";
                String groupIdAsDir = mavenProject.getGroupId().replace(".", File.separator);
                File file = new File(src + "/META-INF/" + groupIdAsDir);
                file.mkdirs();
                man = new FileOutputStream(src + "/META-INF/" + groupIdAsDir + File.separator + "AssemblyInfo."
                        + plugin.getExtension());
                outputStream = man;
            }
            outputStream.write(sb.toString().getBytes());
        } catch (IOException e) {
            throw new AssemblyInfoException("NPANDAY-022-000: Failed to generate AssemblyInfo", e);
        } finally {
            if (man != null) {
                man.close();
            }
        }
    }

    /**
     * @see AssemblyInfoMarshaller#init(npanday.model.assembly.plugins.AssemblyPlugin)
     */
    public void init(AssemblyPlugin plugin) {
        this.plugin = plugin;
    }

    /**
     * @see AssemblyInfoMarshaller#unmarshall(java.io.InputStream)
     */
    public AssemblyInfo unmarshall(InputStream inputStream) throws IOException, AssemblyInfoException {
        AssemblyInfo assemblyInfo = new AssemblyInfo();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            if (!line.trim().startsWith("//")) {
                String[] tokens = line.split("[:]");

                if (tokens.length == 2) {
                    String[] assemblyTokens = tokens[1].split("[(]");
                    String name = assemblyTokens[0].trim();
                    String value = assemblyTokens[1].trim().split("[\"]")[1].trim();
                    setAssemblyInfo(assemblyInfo, name, value);
                }
            }
        }
        return assemblyInfo;
    }

    /**
     * Sets the specified value within the specified assembly info
     *
     * @param assemblyInfo the assembly info to set information on
     * @param name the name of the assembly info field: AssemblyTitle, AssemblyDescription, ...
     * @param value the value associated with the specified name
     * @throws IOException if the assembly info is invalid
     */
    private void setAssemblyInfo(AssemblyInfo assemblyInfo, String name, String value)
            throws AssemblyInfoException {
        if (!name.startsWith("Assembly")) {
            throw new AssemblyInfoException(
                    "NPANDAY-022-001: Invalid assembly info parameter: Name = " + name + ", Value = " + value);
        }
        if (name.equals("AssemblyDescription")) {
            assemblyInfo.setDescription(value);
        } else if (name.equals("AssemblyInformationalVersion")) {
            assemblyInfo.setInformationalVersion(value);
        } else if (name.equals("AssemblyTitle")) {
            assemblyInfo.setTitle(value);
        } else if (name.equals("AssemblyCompany")) {
            assemblyInfo.setCompany(value);
        } else if (name.equals("AssemblyProduct")) {
            assemblyInfo.setProduct(value);
        } else if (name.equals("AssemblyCopyright")) {
            assemblyInfo.setCopyright(value);
        } else if (name.equals("AssemblyTrademark")) {
            assemblyInfo.setTrademark(value);
        } else if (name.equals("AssemblyCulture")) {
            assemblyInfo.setCulture(value);
        } else if (name.equals("AssemblyVersion")) {
            assemblyInfo.setVersion(value);
        } else if (name.equals("AssemblyConfiguration")) {
            assemblyInfo.setConfiguration(value);
        } else if (name.equals("AssemblyKeyFile")) {
            assemblyInfo.setConfiguration(value);
        } else if (name.equals("AssemblyKeyName")) {
            assemblyInfo.setConfiguration(value);
        }
    }

    /**
     * Appends an assembly entry with a name-value pair surrounded by brackets.
     *
     * @param sb    the string buffer to be appended
     * @param name  the name of the assembly entry
     * @param value the value of the assembly entry
     */
    private void appendEntry(StringBuffer sb, String name, String value) {
        if (value != null) {
            sb.append("[assembly: Assembly").append(name).append("(\"").append(value).append("\")]").append("\r\n");
        }
    }

    private String createCustomStringEntry(String name, String value) {
        return "[assembly: CustomStringAttribute(\"" + name + "\", \"" + value + "\")]\r\n";
    }
}