/**
* Copyright 2011 Steve Good [steve@stevegood.org]
*
* 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.muratools.eclipse.utils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import nu.xom.Attribute;
import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import nu.xom.ParsingException;
import com.muratools.eclipse.DisplayObject;
import com.muratools.eclipse.EventHandler;
import com.muratools.eclipse.GenericSetting;
import com.muratools.eclipse.GenericSettingAttribute;
import com.muratools.eclipse.PluginConfig;
import com.muratools.eclipse.SettingField;
/**
* @author steve
*
*/
public class PluginConfigUtility {
private File pluginConfigFile;
private PluginConfig pluginConfig;
private ArrayList<String> nodeList = new ArrayList<String>();
/**
*
*/
public PluginConfigUtility(File pluginConfigFile) {
this.pluginConfigFile = pluginConfigFile;
setupNodeList();
}
public PluginConfig getPluginConfig(){
if (pluginConfig == null){
pluginConfig = new PluginConfig();
}
Document configDoc = parseConfigFile();
if (configDoc != null){
Element root = configDoc.getRootElement();
parsePluginAttributes(root);
parseSettings(root);
parseEventHandlers(root);
parseDisplayObjects(root);
parseCustomElements(root);
}
return pluginConfig;
}
private Document parseConfigFile() {
Builder parser = new Builder();
Document doc = null;
try {
doc = parser.build(pluginConfigFile);
}
catch (ParsingException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return doc;
}
private void parsePluginAttributes(Element root){
Element name = root.getFirstChildElement("name");
Element pkg = root.getFirstChildElement("package");
Element loadPriority = root.getFirstChildElement("loadPriority");
if (loadPriority == null){
loadPriority = findElement(root, new String[]{"LoadPriority","loadpriority","Loadpriority"});
}
Element version = root.getFirstChildElement("version");
Element provider = root.getFirstChildElement("provider");
Element providerURL = root.getFirstChildElement("providerURL");
if (providerURL == null){
providerURL = findElement(root, new String[]{"ProviderURL","ProviderUrl","providerUrl","providerurl"});
}
Element category = root.getFirstChildElement("category");
pluginConfig.setName(name.getValue());
pluginConfig.setPackage(pkg.getValue());
pluginConfig.setLoadPriority(loadPriority.getValue());
pluginConfig.setVersion(version.getValue());
pluginConfig.setProvider(provider.getValue());
pluginConfig.setProviderURL(providerURL.getValue());
pluginConfig.setCategory(category.getValue());
}
private void parseSettings(Element root){
Element settingsRoot = root.getFirstChildElement("settings");
if (settingsRoot == null){
settingsRoot = findElement(root, new String[]{"Settings"});
}
if (settingsRoot != null){
Elements settings = settingsRoot.getChildElements();
for (int i=0; i < settings.size(); i++){
Element setting = settings.get(i);
Element name = setting.getFirstChildElement("name");
Element label = setting.getFirstChildElement("label");
Element hint = setting.getFirstChildElement("hint");
Element type = setting.getFirstChildElement("type");
Element required = setting.getFirstChildElement("required");
Element validation = setting.getFirstChildElement("validation");
Element regex = setting.getFirstChildElement("regex");
Element message = setting.getFirstChildElement("message");
Element defaultValue = setting.getFirstChildElement("defaultValue");
if (defaultValue == null){
defaultValue = findElement(setting, new String[] {"DefaultValue","Defaultvalue","defaultvalue"});
}
Element optionList = setting.getFirstChildElement("optionList");
if (optionList == null){
optionList = findElement(setting, new String[] {"OptionList","Optionlist","optionlist"});
}
Element optionLabelList = setting.getFirstChildElement("optionLabelList");
if (optionLabelList == null){
optionLabelList = findElement(setting, new String[] {"OptionLabelList","optionlabelList","optionlabellist","Optionlabellist","OptionLabellist","OptionlabelList","optionLabellist"});
}
SettingField sf = new SettingField();
sf.setName(name.getValue());
sf.setLabel(label.getValue());
sf.setHint(hint.getValue());
sf.setType(type.getValue());
sf.setRequired(new Boolean(required.getValue()));
sf.setValidation(validation.getValue());
sf.setRegEx(regex.getValue());
sf.setMessage(message.getValue());
sf.setDefaultValue(defaultValue.getValue());
sf.setOptionList(optionList.getValue());
sf.setOptionLabelList(optionLabelList.getValue());
pluginConfig.addSettingField(sf);
}
}
}
private void parseEventHandlers(Element root){
Element eventHandlersRoot = root.getFirstChildElement("EventHandlers");
if (eventHandlersRoot == null){
eventHandlersRoot = findElement(root, new String[] {"eventHandlers","eventhandlers","Eventhandlers"});
}
if (eventHandlersRoot != null){
for (String nodeName : new String[] {"eventHandler","EventHandler","eventhandler","Eventhandler"}){
Elements eventHandlers = eventHandlersRoot.getChildElements(nodeName);
for (int i=0; i < eventHandlers.size(); i++){
Element eventHandler = eventHandlers.get(i);
String event = eventHandler.getAttributeValue("event");
String component = eventHandler.getAttributeValue("component");
Boolean persist = new Boolean(eventHandler.getAttributeValue("persist"));
EventHandler eh = new EventHandler();
eh.setEvent(event);
eh.setComponent(component);
eh.setPersist(persist);
pluginConfig.addEventHandler(eh);
}
}
}
}
private void parseDisplayObjects(Element root){
// Get the location attribute from DisplayObjects
Element displayObjectsRoot = root.getFirstChildElement("DisplayObjects");
if (displayObjectsRoot == null){
displayObjectsRoot = findElement(root, new String[] {"displayObjects","displayobjects","Displayobjects"});
}
if (displayObjectsRoot != null){
String location = displayObjectsRoot.getAttributeValue("location");
if (location != null && location.length() > 0){
pluginConfig.setDisplayObjectsLocation(displayObjectsRoot.getAttributeValue("location"));
} else {
pluginConfig.setDisplayObjectsLocation("global");
}
for (String nodeName : new String[] {"displayObject","DisplayObject","displayobject","Displayobject"}){
Elements displayObjects = displayObjectsRoot.getChildElements(nodeName);
for (int i=0; i < displayObjects.size(); i++){
Element displayObject = displayObjects.get(i);
String name = displayObject.getAttributeValue("name");
String fileName = displayObject.getAttributeValue("displayobjectfile");
DisplayObject dspObj = new DisplayObject();
dspObj.setName(name);
dspObj.setFileName(fileName);
pluginConfig.addDisplayObject(dspObj);
}
}
}
}
private void parseCustomElements(Element root){
Elements els = root.getChildElements();
for (int i=0; i < els.size(); i++){
if (!nodeList.contains(els.get(i).getQualifiedName().toLowerCase())){
parseCustomElement(els.get(i), null);
}
}
}
private void parseCustomElement(Element el, GenericSetting parentSetting){
GenericSetting setting = new GenericSetting();
setting.setName(el.getQualifiedName());
setting.setValue(el.getValue());
for (int i=0; i < el.getAttributeCount(); i++){
Attribute attribute = el.getAttribute(i);
GenericSettingAttribute sAttribute = new GenericSettingAttribute();
sAttribute.setName(attribute.getQualifiedName());
sAttribute.setValue(attribute.getValue());
setting.addAttribute(sAttribute);
}
Elements kids = el.getChildElements();
for (int i=0; i < kids.size(); i++){
parseCustomElement(kids.get(i),setting);
}
if (parentSetting == null){
pluginConfig.addCustomSetting(setting);
} else {
parentSetting.addSetting(setting);
}
}
private void setupNodeList(){
ArrayList<String> _nodeList = new ArrayList<String>();
_nodeList.add("name");
_nodeList.add("package");
_nodeList.add("loadpriority");
_nodeList.add("version");
_nodeList.add("provider");
_nodeList.add("providerurl");
_nodeList.add("category");
_nodeList.add("settings");
_nodeList.add("eventhandlers");
_nodeList.add("displayobjects");
for (String name : _nodeList){
nodeList.add(name.toLowerCase());
}
}
private Element findElement(Element parent, String[] variants){
for (String elementName : variants){
Element attempt = parent.getFirstChildElement(elementName);
if (attempt != null){
return attempt;
}
}
return new Element(variants[0]);
}
}