/*
* This file is part of the OSMembrane project.
* More informations under www.osmembrane.de
*
* The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
* for more details about the license see http://www.osmembrane.de/license/
*
* Source: $HeadURL$ ($Revision$)
* Last changed: $Date$
*/
package de.osmembrane.model.pipeline;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import de.osmembrane.Application;
import de.osmembrane.exceptions.ControlledException;
import de.osmembrane.exceptions.ExceptionSeverity;
import de.osmembrane.model.Identifier;
import de.osmembrane.model.persistence.FileException;
import de.osmembrane.model.persistence.PersistenceFactory;
import de.osmembrane.model.persistence.XMLOsmosisStructurePersistence;
import de.osmembrane.model.xml.XMLEnumValue;
import de.osmembrane.model.xml.XMLFunction;
import de.osmembrane.model.xml.XMLFunctionGroup;
import de.osmembrane.model.xml.XMLOsmosisStructure;
import de.osmembrane.model.xml.XMLParameter;
import de.osmembrane.model.xml.XMLPipe;
import de.osmembrane.model.xml.XMLTask;
/**
* Implementation of {@link AbstractFunctionPrototype}.
*
* @author jakob_jarosch
*/
public class FunctionPrototype extends AbstractFunctionPrototype {
private XMLOsmosisStructure xmlStruct = null;
private List<FunctionGroup> functionGroups = new ArrayList<FunctionGroup>();
private Map<Identifier, AbstractFunctionGroup> functionGroupMap = new HashMap<Identifier, AbstractFunctionGroup>();
private Map<AbstractFunctionGroup, Identifier> functionGroupIdentifierMap = new HashMap<AbstractFunctionGroup, Identifier>();
private Map<Identifier, XMLFunctionGroup> xmlFunctionGroupMap = new HashMap<Identifier, XMLFunctionGroup>();
private Map<Identifier, XMLFunction> xmlFunctionMap = new HashMap<Identifier, XMLFunction>();
private Map<Identifier, XMLTask> xmlTaskMap = new HashMap<Identifier, XMLTask>();
private Map<Identifier, XMLPipe> xmlPipeMap = new HashMap<Identifier, XMLPipe>();
private Map<Identifier, XMLParameter> xmlParameterMap = new HashMap<Identifier, XMLParameter>();
private Map<Identifier, XMLEnumValue> xmlEnumValueMap = new HashMap<Identifier, XMLEnumValue>();
private Map<Object, Identifier> identifiers = new HashMap<Object, Identifier>();
@Override
public void initiate(URL xmlFilename) {
try {
xmlStruct = (XMLOsmosisStructure) PersistenceFactory.getInstance()
.getPersistence(XMLOsmosisStructurePersistence.class)
.load(xmlFilename);
createMaps();
for (XMLFunctionGroup group : xmlStruct.getFunctionGroup()) {
FunctionGroup fg = new FunctionGroup(group);
functionGroups.add(fg);
/* add to the maps */
Identifier identifier = identifiers.get(group);
functionGroupIdentifierMap.put(fg, identifier);
}
} catch (FileException e) {
Application.handleException(new ControlledException(this,
ExceptionSeverity.CRITICAL_UNEXPECTED_BEHAVIOR, e,
"Could not load the OSMembrane xml file."));
}
}
private void createMaps() {
for (XMLFunctionGroup group : xmlStruct.getFunctionGroup()) {
Identifier groupIdentifier = new Identifier(group.getId());
xmlFunctionGroupMap.put(groupIdentifier, group);
identifiers.put(group, groupIdentifier);
for (XMLFunction function : group.getFunction()) {
Identifier functionIdentifier = new Identifier(groupIdentifier
+ "|" + function.getId());
xmlFunctionMap.put(functionIdentifier, function);
identifiers.put(function, functionIdentifier);
for (XMLTask task : function.getTask()) {
Identifier taskIdentifier = new Identifier(
functionIdentifier + "|" + task.getName());
xmlTaskMap.put(taskIdentifier, task);
identifiers.put(task, taskIdentifier);
for (XMLPipe inPipe : task.getInputPipe()) {
Identifier pipeIdentifier = new Identifier(
taskIdentifier + "|in|" + inPipe.getType()
+ inPipe.getIndex());
xmlPipeMap.put(pipeIdentifier, inPipe);
identifiers.put(inPipe, pipeIdentifier);
}
for (XMLPipe outPipe : task.getOutputPipe()) {
Identifier pipeIdentifier = new Identifier(
taskIdentifier + "|out|" + outPipe.getType()
+ outPipe.getIndex());
xmlPipeMap.put(pipeIdentifier, outPipe);
identifiers.put(outPipe, pipeIdentifier);
}
for (XMLParameter param : task.getParameter()) {
Identifier paramIdentifier = new Identifier(
taskIdentifier + "|" + param.getName());
xmlParameterMap.put(paramIdentifier, param);
identifiers.put(param, paramIdentifier);
for (XMLEnumValue enumValue : param.getEnumValue()) {
Identifier enumValueIdentifier = new Identifier(
paramIdentifier + "|enumValues|"
+ enumValue.getValue());
xmlEnumValueMap.put(enumValueIdentifier, enumValue);
identifiers.put(enumValue, enumValueIdentifier);
}
}
}
}
}
}
@Override
public AbstractFunctionGroup[] getFunctionGroups() {
FunctionGroup[] groups = new FunctionGroup[functionGroups.size()];
groups = functionGroups.toArray(groups);
return groups;
}
@Override
public AbstractFunction[] getFilteredFunctions(String matching) {
matching = matching.toLowerCase().trim();
/* remove all pre dashes, to optimize search results */
while (matching.length() > 0 && matching.substring(0, 1).equals("-")) {
matching = matching.substring(1);
}
List<AbstractFunction> matchingFunctions = new ArrayList<AbstractFunction>();
for (AbstractFunctionGroup group : getFunctionGroups()) {
for (AbstractFunction function : group.getFunctions()) {
boolean matched = false;
/* check if the function matches the String */
if (function.getId().toLowerCase().contains(matching)
|| function.getFriendlyName().toLowerCase()
.contains(matching)) {
matched = true;
}
/* check if a task matches the string */
for (AbstractTask task : function.getAvailableTasks()) {
if (task.getName().toLowerCase().contains(matching)
|| task.getFriendlyName().toLowerCase()
.contains(matching)) {
matched = true;
}
}
/* something matched, add the function */
if (matched) {
matchingFunctions.add(function);
}
}
}
AbstractFunction[] array = new AbstractFunction[matchingFunctions
.size()];
return matchingFunctions.toArray(array);
}
@Override
public AbstractFunction getMatchingFunctionForTaskName(String taskName) {
AbstractTask foundTask = null;
for (AbstractFunctionGroup group : getFunctionGroups()) {
for (AbstractFunction function : group.getFunctions()) {
for (AbstractTask task : function.getAvailableTasks()) {
if (task.getName().toLowerCase()
.equals(taskName.toLowerCase())) {
foundTask = task;
}
if (task.getShortName() != null) {
if (task.getShortName().toLowerCase()
.equals(taskName.toLowerCase())) {
foundTask = task;
}
}
}
if (foundTask != null) {
AbstractFunction functionCopy = function
.copy(CopyType.WITHOUT_VALUES_AND_POSITION);
for (AbstractTask task : functionCopy.getAvailableTasks()) {
if (task.getName().equals(foundTask.getName())) {
functionCopy.setActiveTask(task);
}
}
return functionCopy;
}
}
}
return null;
}
@Override
protected Identifier pushFGToMap(AbstractFunctionGroup fg,
XMLFunctionGroup xmlFG) {
Identifier ident = new Identifier(xmlFG.getId());
functionGroupMap.put(ident, fg);
identifiers.put(fg, ident);
return ident;
}
@Override
protected AbstractFunctionGroup getMatchingFunctionGroup(
Identifier identifier) {
return functionGroupMap.get(identifier);
}
@Override
protected Identifier getMatchingFunctionGroupIdentifier(
AbstractFunctionGroup identifier) {
return identifiers.get(identifier);
}
@Override
protected XMLFunction getMatchingXMLFunction(Identifier identifier) {
return xmlFunctionMap.get(identifier);
}
@Override
protected Identifier getMatchingXMLFunctionIdentifier(XMLFunction identifier) {
return identifiers.get(identifier);
}
@Override
protected XMLTask getMatchingXMLTask(Identifier identifier) {
return xmlTaskMap.get(identifier);
}
@Override
protected Identifier getMatchingXMLTaskIdentifier(XMLTask identifier) {
return identifiers.get(identifier);
}
@Override
protected XMLPipe getMatchingXMLPipe(Identifier identifier) {
return xmlPipeMap.get(identifier);
}
@Override
protected Identifier getMatchingXMLPipeIdentifier(XMLPipe identifier) {
return identifiers.get(identifier);
}
@Override
protected XMLParameter getMatchingXMLParameter(Identifier identifier) {
return xmlParameterMap.get(identifier);
}
@Override
protected Identifier getMatchingXMLParameterIdentifier(
XMLParameter identifier) {
return identifiers.get(identifier);
}
@Override
protected XMLEnumValue getMatchingXMLEnumValue(Identifier identifier) {
return xmlEnumValueMap.get(identifier);
}
@Override
protected Identifier getMatchingXMLEnumValueIdentifier(
XMLEnumValue identifier) {
return identifiers.get(identifier);
}
}