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

org.netbeans.modules.payara.jakartaee.ResourceModifier Maven / Gradle / Ivy

The newest version!
/*
 * 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.netbeans.modules.payara.jakartaee;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import org.netbeans.modules.xml.api.EncodingUtil;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileSystem;
import org.openide.filesystems.FileUtil;

/**
 *
 * @author Nitya Doraisamy
 */
public class ResourceModifier {
    public static void appendAttr(StringBuilder builder, String name, String value, boolean force) {
        if(force || (name != null && name.length() > 0)) {
            builder.append(name);
            builder.append("=\"");
            builder.append(value);
            builder.append("\" ");
        }
    }

    public static void appendProperty(StringBuilder builder, String name, String value, boolean force) {
        if(force || (value != null && value.length() > 0)) {
            builder.append("        \n");
        }
    }

    public static void appendResource(File sunResourcesXml, String fragment) throws IOException {
        String sunResourcesBuf = readResourceFile(sunResourcesXml);
        if (sunResourcesXml.getAbsolutePath().contains("sun-resources.xml")) {
            sunResourcesBuf = insertFragment(SUN_RESOURCES_XML_HEADER,sunResourcesBuf, fragment);
        } else {
            sunResourcesBuf = insertFragment(GF_RESOURCES_XML_HEADER,sunResourcesBuf, fragment);
        }
        writeResourceFile(sunResourcesXml, sunResourcesBuf);
    }

    private static final String SUN_RESOURCES_XML_HEADER =
        "\n" +
        "\n" +
        "\n";
    private static final String GF_RESOURCES_XML_HEADER =
        "" +
        "\n" +
//            "\"-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN\" " +
//            "\"http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd\">\n" +
        "\n";
    private static final String SUN_RESOURCES_XML_FOOTER =
        "\n";

    private static String insertFragment(String header, String sunResourcesBuf, String fragment) throws IOException {
        //String header = SUN_RESOURCES_XML_HEADER;
        String footer = SUN_RESOURCES_XML_FOOTER;
        boolean insertNewLine = false;

        if(sunResourcesBuf != null) {
            int closeIndex = sunResourcesBuf.indexOf("");
            if(closeIndex == -1) {
                throw new IOException("Malformed XML");
            }
            header = sunResourcesBuf.substring(0, closeIndex);
            footer = sunResourcesBuf.substring(closeIndex);

            if(closeIndex > 0 && sunResourcesBuf.charAt(closeIndex-1) != '\n') {
                insertNewLine = true;
            }
        }

        int length = header.length() + footer.length() + 2;
        if(fragment != null) {
            length += fragment.length();
        }

        StringBuilder builder = new StringBuilder(length);
        builder.append(header);

        if(insertNewLine) {
            String lineSeparator = System.getProperty("line.separator");
            builder.append(lineSeparator != null ? lineSeparator : "\n");
        }

        if(fragment != null) {
            builder.append(fragment);
        }

        builder.append(footer);
        return builder.toString();
    }

    private static String readResourceFile(File sunResourcesXml) throws IOException {
        String content = null;
        if(sunResourcesXml.exists()) {
            sunResourcesXml = FileUtil.normalizeFile(sunResourcesXml);
            FileObject sunResourcesFO = FileUtil.toFileObject(sunResourcesXml);

            if(sunResourcesFO != null) {
                InputStream is = null;
                Reader reader = null;
                try {
                    long flen = sunResourcesFO.getSize();
                    if(flen > 1000000) {
                        throw new IOException(sunResourcesXml.getAbsolutePath() + " is too long to update.");
                    }

                    int length = (int) (2 * flen + 32);
                    char [] buf = new char[length];
                    is = new BufferedInputStream(sunResourcesFO.getInputStream());
                    String encoding = EncodingUtil.detectEncoding(is);
                    reader = new InputStreamReader(is, encoding);
                    int max = reader.read(buf);
                    if(max > 0) {
                        content = new String(buf, 0, max);
                    }
                } finally {
                    if(is != null) {
                        try { is.close(); } catch(IOException ex) { }
                    }
                    if(reader != null) {
                        try { reader.close(); } catch(IOException ex) { }
                    }
                }
            } else {
                throw new IOException("Unable to get FileObject for " + sunResourcesXml.getAbsolutePath());
            }
        }
        return content;
    }

    private static void writeResourceFile(final File sunResourcesXml, final String content) throws IOException {
        FileObject parentFolder = FileUtil.createFolder(sunResourcesXml.getParentFile());
        FileSystem fs = parentFolder.getFileSystem();
        writeResourceFile(fs, sunResourcesXml, content);
    }

    private static void writeResourceFile(FileSystem fs, final File sunResourcesXml, final String content) throws IOException {
        fs.runAtomicAction(new FileSystem.AtomicAction() {
            public void run() throws IOException {
                FileLock lock = null;
                BufferedWriter writer = null;
                try {
                    FileObject sunResourcesFO = FileUtil.createData(sunResourcesXml);
                    lock = sunResourcesFO.lock();
                    writer = new BufferedWriter(new OutputStreamWriter(sunResourcesFO.getOutputStream(lock)));
                    writer.write(content);
                } finally {
                    if(writer != null) {
                        try { writer.close(); } catch(IOException ex) { }
                    }
                    if(lock != null) {
                        lock.releaseLock();
                    }
                }
            }
        });
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy