创建一个新数据库,并希望通过js在其中设置xsp.properties

时间:2014-05-05 22:28:23

标签: properties xpages xpages-ssjs

我正在通过操作按钮上的JS代码创建一个新数据库,然后我将一组XPages,Custom Controls等复制到新数据库中。虽然我这样做,但我想将xsp.properties的内容设置为一组已知的属性。我不确定如何从js访问xsp.properties文件。 我已经创建了所有设计元素的Notes视图,并且可以看到WEB-INF / xsp.properties下列出的三个或四个元素,但不确定要从哪个元素中读取。我真正想做的是让新数据库中的xsp.properties与我复制的数据库相同。

由于

3 个答案:

答案 0 :(得分:2)

您可以通过Java NAPI执行此操作。为此,您必须创建一个新的Java类:

package ch.hasselba.xpages.util;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Properties;

import com.ibm.designer.domino.napi.NotesAPIException;
import com.ibm.designer.domino.napi.NotesDatabase;
import com.ibm.designer.domino.napi.NotesNote;
import com.ibm.designer.domino.napi.NotesSession;
import com.ibm.designer.domino.napi.design.FileAccess;

public class Toolbox {

    /**
     * loads the properties from a file
     * 
     * @param dbPath full path of the database
     * @param fileName name of the file to load
     * @return the properties object
     */
    public Properties loadProperties(final String dbPath, final String fileName) {
        try {
            // load the file
            InputStream inStream = getFile( dbPath, fileName );

            // if file exists, init a properties object
            if (inStream != null) {
                Properties props = new Properties();
                props.load( inStream );
                return props;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * saves a property file to a database
     * 
     * @author Sven Hasselbach
     * 
     * @param dbPath full path of the database
     * @param fileName name of the file to load
     * @param props the properties object
     */
    public void saveProperties(final String dbPath, final String fileName, final Properties props) {
        try {
            // init Notes objects
            NotesSession nSession = new NotesSession();
            NotesDatabase nDB = nSession.getDatabaseByPath(dbPath);
            nDB.open();

            // store properties in byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            props.store(bos, "My XSP Properties");

            // save the property file
            NotesNote nFile = FileAccess.getFileByPath(nDB, fileName);
            FileAccess.saveData(nFile, fileName, bos.toByteArray() );

            // recycle the objects
            nFile.recycle();
            nDB.recycle();
            nSession.recycle();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * loads a property file from a database
     * 
     * @author Sven Hasselbach
     * @param dbPath full path of the database
     * @param fileName name of the file to load
     * @return InputStream content of the file
     */
    private InputStream getFile(final String dbPath, final String fileName) {
        try {
            // init Notes objects
            NotesSession nSession = new NotesSession();
            NotesDatabase nDB = nSession.getDatabaseByPath(dbPath);
            nDB.open();

            // get the file
            NotesNote nNote = FileAccess.getFileByPath(nDB, fileName);
            InputStream inStream = FileAccess.readFileContentAsInputStream(nNote);

            // recycle the objects
            nNote.recycle();
            nDB.recycle();
            nSession.recycle();

            return inStream;
        } catch (NotesAPIException apiEx) {
            apiEx.printStackTrace();
        }
        return null;
    }

}

要编译此类,您必须将Jar lwpd.domino.napi.jar 添加到构建路径。

现在您可以创建一个这样的按钮:

<xp:button
    value="Add property"
    id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="complete">
        <xp:this.action>
            <![CDATA[#{javascript:
                importPackage( ch.hasselba.xpages.util );
                var toolbox:ch.hasselba.xpages.utils.Toolbox = new Toolbox();
                var props:java.util.Properties = toolbox.loadProperties( database.getFilePath(), "WEB-INF/xsp.properties" );

                props.put( "Test", "123" );

                toolbox.saveProperties( database.getFilePath(), "WEB-INF/xsp.properties", props );
            }]]>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>

答案 1 :(得分:1)

最简单的方法是不复制设计元素,而是从模板创建数据库。创建一个模板,其中包含您创建的所有数据库中应该相同的所有内容。给它一个模板名称并根据模板创建数据库(那里有一个调用)

答案 2 :(得分:0)

用Java眼睛看它。

属性文件是J2EE应用程序的标准资源,其own API。因此,根据this,您只需在Java / SSJS中读取和写入属性:

    public void saveParamChanges() {
        try {
            Properties props = new Properties();
            props.setProperty("ServerAddress", serverAddr);
            props.setProperty("ServerPort", ""+serverPort);
            props.setProperty("ThreadCount", ""+threadCnt);
            File f = new File("server.properties");
            OutputStream out = new FileOutputStream( f );
            props.store(out, "This is an optional header comment string");
        }
        catch (Exception e ) {
            e.printStackTrace();
        }
    }

this snippet似乎也在起作用。

我几乎肯定你需要调整安全策略......