public Workflow doEdit()

in taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java [87:290]


	public Workflow doEdit() throws EditException {
		if (applied) {
			throw new EditException("Edit has already been applied!");
		}

		Activity splitter = null;
		Configuration splitterConfiguration = null;
		String sourcePortName = "";
		Processor sourceProcessor = null;

		String sinkPortName = "";
		Processor sinkProcessor = null;

		Processor activityProcessor = null;
		List<ProcessorBinding> processorBindingsToActivity = scufl2Tools
				.processorBindingsToActivity(activity);
		for (ProcessorBinding processorBinding : processorBindingsToActivity) {
			activityProcessor = processorBinding.getBoundProcessor();
			break;
		}
		if (activityProcessor == null) {
			throw new EditException("Cannot find the processor that the activity belongs to");
		}

		String displayName = portName;
		if (portName.equals("parameters")) {
			displayName = isInput ? "input" : "output";
		}
		String processorName = activityProcessor.getName();
		String candidateName;
		if (displayName.startsWith(processorName)) {
			// No need to make GetRequest_GetRequestResponse
			candidateName = displayName;
		} else {
			// Combine with processor name
			String displayProcessorName;
			if (activity.getType().equals(INPUT_SPLITTER_TYPE)
					|| activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
				// For splitters on splitters - avoid adding up blah_bluh_blih_more_stuff
				String[] processorNameSplit = processorName.replace("_input", "")
						.replace("_output", "").split("_");
				displayProcessorName = processorNameSplit[processorNameSplit.length - 1];
			} else {
				displayProcessorName = activityProcessor.getName();
			}
			candidateName = displayProcessorName + "_" + displayName;
		}

		Processor splitterProcessor = new Processor();
		splitterProcessor.setName(candidateName);

		CrossProduct crossProduct = new CrossProduct();
		crossProduct.setParent(splitterProcessor.getIterationStrategyStack());

		ProcessorBinding processorBinding = new ProcessorBinding();
		processorBinding.setBoundProcessor(splitterProcessor);

		try {
			if (activity.getType().equals(INPUT_SPLITTER_TYPE)) {
				if (!isInput) {
					throw new EditException(
							"Can only add an input splitter to another input splitter");
				}
				if (typeDescriptor instanceof ArrayTypeDescriptor
						&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
					typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
				}

				Element element = XMLSplitterSerialisationHelper
						.typeDescriptorToExtensionXML(typeDescriptor);
//				String wrappedType = new XMLOutputter().outputString(element);

				splitter = new Activity();
				splitter.setType(INPUT_SPLITTER_TYPE);
				splitterConfiguration = new Configuration();
				splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
				splitterConfiguration.setConfigures(splitter);
//				((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);

				JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
				splitterConfiguration.setJson(bean);

				XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
						processorBinding);

			} else if (activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
				if (isInput) {
					throw new EditException(
							"Can only add an output splitter to another output splitter");
				}
				if (typeDescriptor instanceof ArrayTypeDescriptor
						&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
					typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
				}

				Element element = XMLSplitterSerialisationHelper
						.typeDescriptorToExtensionXML(typeDescriptor);
//				String wrappedType = new XMLOutputter().outputString(element);

				splitter = new Activity();
				splitter.setType(OUTPUT_SPLITTER_TYPE);
				splitterConfiguration = new Configuration();
				splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
				splitterConfiguration.setConfigures(splitter);
//				((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);

				JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
				splitterConfiguration.setJson(bean);

				XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
						processorBinding);

			} else if (activity.getType().equals(WSDLServiceDescription.ACTIVITY_TYPE)) {
				if (isInput) {
					Element element = XMLSplitterSerialisationHelper
							.typeDescriptorToExtensionXML(typeDescriptor);
//					String wrappedType = new XMLOutputter().outputString(element);

					splitter = new Activity();
					splitter.setType(WSDLServiceDescription.INPUT_SPLITTER_TYPE);
					splitterConfiguration = new Configuration();
					splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
					splitterConfiguration.setConfigures(splitter);
//					((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);

					JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
					splitterConfiguration.setJson(bean);

					XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
							processorBinding);

				} else {
					Element element = XMLSplitterSerialisationHelper
							.typeDescriptorToExtensionXML(typeDescriptor);
//					String wrappedType = new XMLOutputter().outputString(element);

					splitter = new Activity();
					splitter.setType(WSDLServiceDescription.OUTPUT_SPLITTER_TYPE);
					splitterConfiguration = new Configuration();
					splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
					splitterConfiguration.setConfigures(splitter);
//					((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);

					JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
					splitterConfiguration.setJson(bean);

					XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
							processorBinding);
				}
			} else {
				throw new EditException(
						"The activity type is not suitable for adding xml processing processors");
			}
		} catch (Exception e) {
			throw new EditException(
					"An error occured whilst tyring to add an XMLSplitter to the activity:"
							+ activity, e);
		}

		if (isInput) {
			sourcePortName = "output";
			sinkPortName = portName;
			sinkProcessor = activityProcessor;
			sourceProcessor = splitterProcessor;
		} else {
			sourcePortName = portName;
			sinkPortName = "input";
			sinkProcessor = splitterProcessor;
			sourceProcessor = activityProcessor;
		}

		processorBinding.setBoundActivity(splitter);

		List<Edit<?>> editList = new ArrayList<Edit<?>>();
		editList.add(new AddChildEdit<Profile>(profile, splitter));
		editList.add(new AddChildEdit<Profile>(profile, splitterConfiguration));
		editList.add(new AddChildEdit<Profile>(profile, processorBinding));
		editList.add(new AddProcessorEdit(workflow, splitterProcessor));

		compoundEdit1 = new CompoundEdit(editList);
		compoundEdit1.doEdit();

		List<Edit<?>> linkUpEditList = new ArrayList<Edit<?>>();

		OutputProcessorPort source = sourceProcessor.getOutputPorts().getByName(sourcePortName);
		InputProcessorPort sink = sinkProcessor.getInputPorts().getByName(sinkPortName);

		if (source == null)
			throw new EditException("Unable to find the source port when linking up "
					+ sourcePortName + " to " + sinkPortName);
		if (sink == null)
			throw new EditException("Unable to find the sink port when linking up "
					+ sourcePortName + " to " + sinkPortName);

		DataLink dataLink = new DataLink();
		dataLink.setReceivesFrom(source);
		dataLink.setSendsTo(sink);
		linkUpEditList.add(new AddDataLinkEdit(workflow, dataLink));

		linkUpEdit = new CompoundEdit(linkUpEditList);
		linkUpEdit.doEdit();
		applied = true;
		return workflow;
	}