123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /*
- * Copyright 2000-2016 Vaadin Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
- package com.vaadin.buildhelpers;
-
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.Date;
- import java.util.jar.Manifest;
-
- public class ManifestWriter {
- StringBuilder buffer = new StringBuilder();
-
- public ManifestWriter() {
- }
-
- /**
- * Writes a manifest attribute to a temporary buffer.
- *
- * @param name
- * Attribute name
- * @param value
- * Attribute value
- */
- public void writeAttribute(String name, String value) {
- int linelen = name.length() + 2;
- buffer.append(name);
- buffer.append(": ");
-
- String remainingValue = value;
- while (linelen + remainingValue.length() > 72) {
- int fitsLine = 72 - linelen;
- buffer.append(remainingValue.substring(0, fitsLine) + "\n ");
- remainingValue = remainingValue.substring(fitsLine);
- linelen = 1;
- }
- buffer.append(remainingValue + "\n");
- }
-
- /**
- * Writes the manifest to given JAR file.
- *
- * The manifest must be created with {@code #writeAttribute(String, String)}
- * before calling this write.
- *
- * @param jarFilename
- * File name of the JAR in which the manifest is written
- * @return 0 on success, nonzero value on error
- */
- int updateJar(String jarFilename) {
- int status = 0;
-
- // Determine a temporary file name
- String newMfPrefix = "vaadin-manifest-" + (new Date()).getTime();
- File newMfFile = null;
- try {
- newMfFile = File.createTempFile(newMfPrefix, ".mf");
- } catch (IOException e) {
- System.err.println("Creating temp file failed");
- status = 1;
- }
-
- // Write the manifest to the temporary file
- if (status == 0) {
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(newMfFile);
- fos.write(getBytes());
- fos.close();
- } catch (IOException e) {
- System.err.println(
- "Writing to file '" + newMfFile.getAbsolutePath()
- + "' failed because: " + e.getMessage());
- status = 1;
- }
- }
-
- // Check that the manifest is OK
- if (status == 0) {
- Manifest checkMf = new Manifest();
- FileInputStream is;
- try {
- is = new FileInputStream(newMfFile);
- checkMf.read(is);
- } catch (IOException e) {
- System.err.println(
- "Reading from file '" + newMfFile.getAbsolutePath()
- + "' failed because: " + e.getMessage());
- status = 1;
- }
- }
-
- // Update the manifest in the Jar
- if (status == 0) {
- System.out.println("Updating manifest in JAR " + jarFilename);
- try {
- // The "mf" order must correspond with manifest-jarfile order
- Process process = Runtime.getRuntime()
- .exec(new String[] { "jar", "umf",
- newMfFile.getAbsolutePath(), jarFilename });
- int exitValue = process.waitFor();
- if (exitValue != 0) {
- InputStream jarErr = process.getErrorStream();
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(jarErr));
- while (reader.ready()) {
- System.err.println("jar: " + reader.readLine());
- }
- System.err.println(
- "The 'jar' command returned with exit value "
- + exitValue);
- status = 1;
- }
- } catch (IOException e) {
- System.err.println(
- "Failed to execute 'jar' command. " + e.getMessage());
- status = 1;
- } catch (InterruptedException e) {
- System.err
- .println("Execution of 'jar' command was interrupted. "
- + e.getMessage());
- status = 1;
- }
- }
-
- // Remove the temporary file
- if (newMfFile != null) {
- newMfFile.delete();
- }
-
- return status;
- }
-
- @Override
- public String toString() {
- return buffer.toString();
- }
-
- public byte[] getBytes() {
- return buffer.toString().getBytes();
- }
- }
|