
org.broadleafcommerce.common.extensibility.context.merge.MergeManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of broadleaf-common Show documentation
Show all versions of broadleaf-common Show documentation
A collection of classes shared by broadleaf profile, cms, admin, and core.
/*
* #%L
* BroadleafCommerce Common Libraries
* %%
* Copyright (C) 2009 - 2013 Broadleaf Commerce
* %%
* 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.
* #L%
*/
package org.broadleafcommerce.common.extensibility.context.merge;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.broadleafcommerce.common.extensibility.context.ResourceInputStream;
import org.broadleafcommerce.common.extensibility.context.merge.exceptions.MergeException;
import org.broadleafcommerce.common.extensibility.context.merge.exceptions.MergeManagerSetupException;
import org.broadleafcommerce.common.extensibility.context.merge.handlers.MergeHandler;
import org.broadleafcommerce.common.extensibility.context.merge.handlers.MergeHandlerAdapter;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
/**
* This class manages all xml merge interactions with callers. It is responsible for
* not only loading the handler configurations, but also for cycling through the handlers
* in a prioritized fashion and exporting the final merged document.
*
* @author jfischer
*
*/
public class MergeManager {
/**
* Additional merge points may be added by the caller. Also default merge points
* may be overriden to change their current behavior. This is accomplished by
* specifying the system property denoted by the key MergeManager.MERGE_DEFINITION_SYSTEM_PROPERTY
* with a value stating the fully qualified path of user-created property file. Please refer
* to the default properties file located at org/broadleafcommerce/profile/extensibility/context/merge/default.properties
* for more details.
*
*/
public static final String MERGE_DEFINITION_SYSTEM_PROPERTY = "org.broadleafcommerce.extensibility.context.merge.handlers.merge.properties";
private static final Log LOG = LogFactory.getLog(MergeManager.class);
private static DocumentBuilder builder;
static {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
builder = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
LOG.error("Unable to create document builder", e);
throw new RuntimeException(e);
}
}
private MergeHandler[] handlers;
public MergeManager() throws MergeManagerSetupException {
try {
Properties props = loadProperties();
removeSkippedMergeComponents(props);
setHandlers(props);
} catch (IOException e) {
throw new MergeManagerSetupException(e);
} catch (ClassNotFoundException e) {
throw new MergeManagerSetupException(e);
} catch (IllegalAccessException e) {
throw new MergeManagerSetupException(e);
} catch (InstantiationException e) {
throw new MergeManagerSetupException(e);
}
}
private void removeSkippedMergeComponents(Properties props) {
InputStream inputStream = this.getClass().getClassLoader()
.getResourceAsStream("/broadleaf-commmerce/skipMergeComponents.txt");
if (inputStream != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("mergeClassOverrides file found.");
}
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
try {
while (bufferedReader.ready())
{
String line = bufferedReader.readLine();
if (LOG.isDebugEnabled()) {
LOG.debug("mergeComponentOverrides - overridding " + line);
}
removeSkipMergeComponents(props, line);
}
} catch (IOException e) {
LOG.error("Error reading resource - /broadleaf-commmerce/skipMergeComponents.txt", e);
} finally {
try {
bufferedReader.close();
} catch (IOException ioe) {
LOG.error("Error closing resource - /broadleaf-commmerce/skipMergeComponents.txt", ioe);
}
}
}
}
/**
* Examines the properties file for an entry with an id equal to the component that we want
* to ignore and then removes all keys that have the same number (e.g. if xpath.28 is the key
* then handler.28, xpath.28, and priority.28 will all be removed).
*
* @param props
* @param componentName
*/
private void removeSkipMergeComponents(Properties props, String componentName) {
String lookupName = "@id='" + componentName.trim() + "'";
String key = findComponentKey(lookupName, props);
while (key != null) {
removeItemsMatchingKey(key, props);
key = findComponentKey(lookupName, props);
}
}
/**
* Examines the properties file for an entry that contains the passed in component id string and returns its key
*
* to ignore.
*
* @param componentName
* @param props
* @return
*/
private String findComponentKey(String componentIdStr, Properties props) {
for (Map.Entry
© 2015 - 2025 Weber Informatics LLC | Privacy Policy