blob: 58112c8f4ed78c99402a48989a7e5aa868437755 [file] [log] [blame]
/**************************************************************
*
* 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.openoffice.setup.SetupData;
import org.openoffice.setup.InstallData;
import org.openoffice.setup.Util.Parser;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Christof Pintaske
*/
public class ProductDescription {
private class Pair {
public Pattern search;
public String replacement;
public Pair(Pattern key, String value) {
search = key;
replacement = value;
}
}
private Vector macro; /* macro list with precompiled regex patterns */
private HashMap map; /* conventional key-value pairs */
private String backslashText = "THIS_IS_A_BACKSLASH";
/**
* read properties from package description data
*/
protected ProductDescription(XMLPackageDescription descriptionData) {
macro = new Vector();
map = new HashMap();
parse(descriptionData);
}
/**
* retrieve information about general installation properties
*/
public void setNewMacro(String key, String value) {
if ((key != null) && (value != null)) {
String match = "\\$\\{" + key + "\\}";
Pattern pattern = Pattern.compile(match, Pattern.CASE_INSENSITIVE);
map.put(key, value);
Iterator m = map.entrySet().iterator();
// while ( m.hasNext() ) {
// Map.Entry entry = (Map.Entry) m.next();
// System.out.println( "MAP:" + entry.getKey() + ":" + entry.getValue() );
// }
// Does the pair with the same pattern already exist? Then it has to be removed
for (int i = 0; i < macro.size(); i++) {
Pair pair = (Pair) macro.get(i);
if ( pair.search.pattern().equals(match) ) {
macro.remove(i);
}
}
macro.add(new Pair(pattern, value));
// Inserting new Pair at the beginning of the macro vector. Then it will
// be used instead of older version during macro replacement.
// For example ${DIR} in the select dir dialog, if this is set more than once.
// macro.add(0, new Pair(pattern, value));
}
}
public void dumpMacros() {
for (int i = 0; i < macro.size(); i++) {
Pair pair = (Pair) macro.get(i);
System.out.println("Key: " + pair.search.pattern() + " Value: " + pair.replacement );
}
}
public String get(String key) {
return (String) map.get(key);
}
private boolean doMaskBackslash(String[] arr) {
boolean changed = false;
int index = arr[0].indexOf('\\');
if ( index >= 0 ) {
arr[0] = arr[0].replaceAll("\\", backslashText);
// arr[0] = arr[0].replace("\\", backslashText);
changed = true;
}
return changed;
}
private String doUnmaskBackslash(String s) {
s = s.replaceAll(backslashText, "\\");
// s = s.replace(backslashText, "\\");
return s;
}
public String replaceMacros(String s) {
String result = s;
for (int i = 0; i < macro.size(); i++) {
Pair pair = (Pair) macro.get(i);
Pattern pattern = pair.search;
Matcher matcher = pattern.matcher(result);
String replace = pair.replacement;
result = matcher.replaceAll(replace);
// masquerading backslashes in String replace (important for Windows pathes)
// String[] arr1 = { replace };
// boolean masked = doMaskBackslash(arr1);
// result = matcher.replaceAll(arr1[0]);
// if (masked) {
// result = doUnmaskBackslash(result);
// }
}
return result;
}
/**
* parse the wrapped package description
*/
private void parse(XMLPackageDescription data) {
XMLPackageDescription section;
/* product description is a leaf at the root */
if (!data.getKey().equals("product")) {
section = data.getElement("product");
if (section != null) {
parse(section);
}
} else {
InstallData installData = InstallData.getInstance();
/* check for a default installation directory */
section = data.getElement("defaultdir");
if (section != null) {
String value = section.getValue();
if (value != null) {
installData.setDefaultDir(value);
// installData.setInstallDir(value);
}
}
/* check for a default product directory */
section = data.getElement("productdir");
if (section != null) {
String value = section.getValue();
if (value != null) {
installData.setProductDir(value);
}
}
/* check for the package format of this installation set */
section = data.getElement("packageformat");
if (section != null) {
String value = section.getValue();
if (value != null) {
installData.setPackageFormat(value);
}
}
/* check for the package directory of this installation set */
section = data.getElement("packagedirectory");
if (section != null) {
String value = section.getValue();
if ((value != null) && (! value.equals(""))) {
installData.setPackageSubdir(value);
}
}
/* check for the architecture of this installation set */
section = data.getElement("architecture");
if (section != null) {
String value = section.getValue();
if ((value != null) && (! value.equals(""))) {
installData.setArchitecture(value);
}
}
section = data.getElement("multilingual");
if (section != null) {
String value = section.getValue();
if ((value != null) && (! value.equals(""))) {
boolean multilingualValue = Parser.parseBoolean(value);
installData.setIsMultiLingual(multilingualValue);
}
}
/* check for the update behaviour of this installation set */
section = data.getElement("dontupdate");
if (section != null) {
String value = section.getValue();
boolean dontupdate = false;
if ((value != null) && (! value.equals(""))) {
dontupdate = Parser.parseBoolean(value);
}
installData.setDontUpdate(dontupdate);
}
/* check for the Product Minor of this installation set */
section = data.getElement("productminor");
if (section != null) {
String value = section.getValue();
if (value != null) {
int intValue = Integer.parseInt(value);
installData.setProductMinor(intValue);
}
}
section = data.getElement("hideeula");
if (section != null) {
String value = section.getValue();
if ((value != null) && (! value.equals(""))) {
boolean hideeulaValue = Parser.parseBoolean(value);
installData.setHideEula(hideeulaValue);
}
}
/* check for any macro definitions */
for (Enumeration e = data.elements(); e.hasMoreElements(); ) {
XMLPackageDescription p = (XMLPackageDescription) e.nextElement();
if (p.getKey().equals("macro")) {
String key = p.getAttribute("key");
String value = p.getValue();
if ((key != null) && (value != null)) {
String match = "\\$\\{" + key + "\\}";
Pattern pattern = Pattern.compile(match, Pattern.CASE_INSENSITIVE);
map.put(key, value);
macro.add(new Pair(pattern, value));
}
}
}
}
}
}