List of usage examples for com.fasterxml.jackson.core JsonGenerator writeArrayFieldStart
public final void writeArrayFieldStart(String fieldName) throws IOException, JsonGenerationException
From source file:com.google.openrtb.json.OpenRtbJsonWriter.java
@SuppressWarnings("deprecation") protected void writeVideoFields(Video video, JsonGenerator gen) throws IOException { if (checkRequired(video.getMimesCount())) { writeStrings("mimes", video.getMimesList(), gen); }//w w w .j a va 2 s . c o m if (video.hasMinduration()) { gen.writeNumberField("minduration", video.getMinduration()); } if (video.hasMaxduration()) { gen.writeNumberField("maxduration", video.getMaxduration()); } if (video.hasProtocol()) { gen.writeNumberField("protocol", video.getProtocol().getNumber()); } if (checkRequired(video.getProtocolsCount())) { writeEnums("protocols", video.getProtocolsList(), gen); } if (video.hasW()) { gen.writeNumberField("w", video.getW()); } if (video.hasH()) { gen.writeNumberField("h", video.getH()); } if (video.hasStartdelay()) { gen.writeNumberField("startdelay", video.getStartdelay()); } if (video.hasLinearity()) { gen.writeNumberField("linearity", video.getLinearity().getNumber()); } if (video.hasSequence()) { gen.writeNumberField("sequence", video.getSequence()); } writeEnums("battr", video.getBattrList(), gen); if (video.hasMaxextended()) { gen.writeNumberField("maxextended", video.getMaxextended()); } if (video.hasMinbitrate()) { gen.writeNumberField("minbitrate", video.getMinbitrate()); } if (video.hasMaxbitrate()) { gen.writeNumberField("maxbitrate", video.getMaxbitrate()); } if (video.hasBoxingallowed()) { writeIntBoolField("boxingallowed", video.getBoxingallowed(), gen); } writeEnums("playbackmethod", video.getPlaybackmethodList(), gen); writeEnums("delivery", video.getDeliveryList(), gen); if (video.hasPos()) { gen.writeNumberField("pos", video.getPos().getNumber()); } if (video.getCompanionadCount() != 0) { // OpenRTB 2.2+ gen.writeArrayFieldStart("companionad"); for (Banner companionad : video.getCompanionadList()) { writeBanner(companionad, gen); } gen.writeEndArray(); } if (video.hasCompanionad21()) { // OpenRTB 2.1- gen.writeFieldName("companionad"); writeCompanionAd21(video.getCompanionad21(), gen); } writeEnums("api", video.getApiList(), gen); writeEnums("companiontype", video.getCompaniontypeList(), gen); if (video.hasSkip()) { writeIntBoolField("skip", video.getSkip(), gen); } if (video.hasSkipmin()) { gen.writeNumberField("skipmin", video.getSkipmin()); } if (video.hasSkipafter()) { gen.writeNumberField("skipafter", video.getSkipafter()); } }
From source file:de.escalon.hypermedia.spring.de.escalon.hypermedia.spring.jackson.LinkListSerializer.java
private void recurseSupportedProperties(JsonGenerator jgen, String currentVocab, Class<?> beanType, ActionDescriptor actionDescriptor, ActionInputParameter actionInputParameter, Object currentCallValue) throws IntrospectionException, IOException { // TODO support Option provider by other method args? final BeanInfo beanInfo = Introspector.getBeanInfo(beanType); final PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); // TODO collection and map for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { final Method writeMethod = propertyDescriptor.getWriteMethod(); if (writeMethod == null) { continue; }//w w w .j a v a2 s . c o m final Class<?> propertyType = propertyDescriptor.getPropertyType(); // TODO: the property name must be a valid URI - need to check context for terms? String propertyName = getWritableExposedPropertyOrPropertyName(propertyDescriptor); if (DataType.isScalar(propertyType)) { final Property property = new Property(beanType, propertyDescriptor.getReadMethod(), propertyDescriptor.getWriteMethod(), propertyDescriptor.getName()); Object propertyValue = getPropertyValue(currentCallValue, propertyDescriptor); ActionInputParameter propertySetterInputParameter = new ActionInputParameter( new MethodParameter(propertyDescriptor.getWriteMethod(), 0), propertyValue); final Object[] possiblePropertyValues = actionInputParameter.getPossibleValues(property, actionDescriptor); writeSupportedProperty(jgen, currentVocab, propertySetterInputParameter, propertyName, property, possiblePropertyValues); } else { jgen.writeStartObject(); jgen.writeStringField("hydra:property", propertyName); // TODO: is the property required -> for bean props we need the Access annotation to express that jgen.writeObjectFieldStart(getPropertyOrClassNameInVocab(currentVocab, "rangeIncludes", JacksonHydraSerializer.HTTP_SCHEMA_ORG, "schema:")); Expose expose = AnnotationUtils.getAnnotation(propertyType, Expose.class); String subClass; if (expose != null) { subClass = expose.value(); } else { subClass = propertyType.getSimpleName(); } jgen.writeStringField(getPropertyOrClassNameInVocab(currentVocab, "subClassOf", "http://www.w3.org/2000/01/rdf-schema#", "rdfs:"), subClass); jgen.writeArrayFieldStart("hydra:supportedProperty"); Object propertyValue = getPropertyValue(currentCallValue, propertyDescriptor); recurseSupportedProperties(jgen, currentVocab, propertyType, actionDescriptor, actionInputParameter, propertyValue); jgen.writeEndArray(); jgen.writeEndObject(); jgen.writeEndObject(); } } }
From source file:org.codehaus.modello.plugin.jsonschema.JsonSchemaGenerator.java
private void writeClassDocumentation(JsonGenerator generator, ModelClass modelClass, boolean isRoot) throws IOException { if (!isRoot) { generator.writeObjectFieldStart(modelClass.getName()); }/* w w w . j a v a 2 s . co m*/ generator.writeStringField("id", modelClass.getName() + '#'); writeDescriptionField(generator, modelClass.getDescription()); writeTypeField(generator, "object"); generator.writeObjectFieldStart("properties"); List<String> required = new LinkedList<String>(); ModelClass reference = modelClass; // traverse the whole modelClass hierarchy to create the nested Builder instance while (reference != null) { // collect parameters and set them in the instance object for (ModelField modelField : reference.getFields(getGeneratedVersion())) { if (modelField.isRequired()) { required.add(modelField.getName()); } // each field is represented as object generator.writeObjectFieldStart(modelField.getName()); writeDescriptionField(generator, modelField.getDescription()); if (modelField instanceof ModelAssociation) { ModelAssociation modelAssociation = (ModelAssociation) modelField; if (modelAssociation.isOneMultiplicity()) { writeTypeField(generator, modelAssociation.getType()); } else { // MANY_MULTIPLICITY writeTypeField(generator, "array"); generator.writeObjectFieldStart("items"); String type = modelAssociation.getType(); String toType = modelAssociation.getTo(); if (ModelDefault.LIST.equals(type) || ModelDefault.SET.equals(type)) { writeTypeField(generator, toType); } else { // Map or Properties writeTypeField(generator, "object"); generator.writeObjectFieldStart("properties"); XmlAssociationMetadata xmlAssociationMetadata = (XmlAssociationMetadata) modelAssociation .getAssociationMetadata(XmlAssociationMetadata.ID); if (xmlAssociationMetadata.isMapExplode()) { // key generator.writeObjectFieldStart("key"); writeTypeField(generator, "string"); generator.writeEndObject(); // value generator.writeObjectFieldStart("value"); writeTypeField(generator, toType); generator.writeEndObject(); // properties generator.writeEndObject(); // required field generator.writeArrayFieldStart("required"); generator.writeString("key"); generator.writeString("value"); generator.writeEndArray(); } else { generator.writeObjectFieldStart("*"); writeTypeField(generator, toType); generator.writeEndObject(); } } // items generator.writeEndObject(); } } else { writeTypeField(generator, modelField.getType()); } generator.writeEndObject(); } if (reference.hasSuperClass()) { reference = reference.getModel().getClass(reference.getSuperClass(), getGeneratedVersion()); } else { reference = null; } } // end of `properties` element generator.writeEndObject(); // write `required` sequence if (!required.isEmpty()) { generator.writeArrayFieldStart("required"); for (String requiredField : required) { generator.writeString(requiredField); } generator.writeEndArray(); } // end definition if (!isRoot) { generator.writeEndObject(); } }
From source file:com.rhfung.P2PDictionary.DataConnection.java
private byte[] GetDictionaryAsJson() { ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonFactory jsonFactory = new JsonFactory(); // or, for data binding, org.codehaus.jackson.mapper.MappingJsonFactory JsonGenerator jg; try {/*from www . j av a 2 s. c o m*/ jg = jsonFactory.createJsonGenerator(stream, JsonEncoding.UTF8); } catch (IOException e) { // TODO Auto-generated catch block return new byte[0]; } // or Stream, Reader List<DataEntry> entries; // make a local copy for access without worry about changes thereafter this.dataLock.readLock().lock(); try { entries = new Vector<DataEntry>(this.data.size()); //entries.AddRange(this.data.Values.Where(x => x.subscribed)); entries.addAll(this.data.values()); } finally { this.dataLock.readLock().unlock(); } // write count of data entries //writer.write(DATA_NAMESPACE + "/\t" + this.local_uid + "\t0\tRW\t" + entries.size() + "\t" + this.local_uid + NEWLINE) ; try { jg.writeStartObject(); jg.writeObjectField("size", entries.size()); jg.writeObjectField("localid", this.local_uid); jg.writeArrayFieldStart("keys"); // write each data entry, converting simple data immediately // (pretend i don't know about these non-subscribed entries) for (DataEntry d : entries) { WriteJSONForEntry(jg, d); } jg.writeEndArray(); jg.writeEndObject(); jg.close(); } catch (JsonGenerationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return stream.toByteArray(); }
From source file:org.jbpm.designer.bpmn2.impl.Bpmn2JsonMarshaller.java
protected void marshallProcess(Process process, Definitions def, JsonGenerator generator, String preProcessingData) throws JsonGenerationException, IOException { BPMNPlane plane = null;// w ww. ja v a 2 s . c o m for (BPMNDiagram d : def.getDiagrams()) { if (d != null) { BPMNPlane p = d.getPlane(); if (p != null) { if (p.getBpmnElement() == process) { plane = p; break; } } } } if (plane == null) { throw new IllegalArgumentException("Could not find BPMNDI information"); } generator.writeArrayFieldStart("childShapes"); List<String> laneFlowElementsIds = new ArrayList<String>(); for (LaneSet laneSet : process.getLaneSets()) { for (Lane lane : laneSet.getLanes()) { // we only want to marshall lanes if we have the bpmndi info for them! if (findDiagramElement(plane, lane) != null) { laneFlowElementsIds.addAll(marshallLanes(lane, plane, generator, 0, 0, preProcessingData, def)); } } } for (FlowElement flowElement : process.getFlowElements()) { if (!laneFlowElementsIds.contains(flowElement.getId())) { marshallFlowElement(flowElement, plane, generator, 0, 0, preProcessingData, def); } } for (Artifact artifact : process.getArtifacts()) { marshallArtifact(artifact, plane, generator, 0, 0, preProcessingData, def); } generator.writeEndArray(); }
From source file:org.jbpm.designer.bpmn2.impl.Bpmn2JsonMarshaller.java
protected void marshallGroup(Group group, BPMNPlane plane, JsonGenerator generator, float xOffset, float yOffset, String preProcessingData, Definitions def) throws JsonGenerationException, IOException { Map<String, Object> properties = new LinkedHashMap<>(); if (group.getCategoryValueRef() != null && group.getCategoryValueRef().getValue() != null) { properties.put("name", unescapeXml(group.getCategoryValueRef().getValue())); }/* www .ja v a 2 s. c om*/ Documentation doc = getDocumentation(group); if (doc != null) { properties.put("documentation", doc.getText()); } marshallProperties(properties, generator); generator.writeObjectFieldStart("stencil"); generator.writeObjectField("id", "Group"); generator.writeEndObject(); generator.writeArrayFieldStart("childShapes"); generator.writeEndArray(); generator.writeArrayFieldStart("outgoing"); if (findOutgoingAssociation(plane, group) != null) { generator.writeStartObject(); generator.writeObjectField("resourceId", findOutgoingAssociation(plane, group).getId()); generator.writeEndObject(); } generator.writeEndArray(); Bounds bounds = ((BPMNShape) findDiagramElement(plane, group)).getBounds(); generator.writeObjectFieldStart("bounds"); generator.writeObjectFieldStart("lowerRight"); generator.writeObjectField("x", bounds.getX() + bounds.getWidth() - xOffset); generator.writeObjectField("y", bounds.getY() + bounds.getHeight() - yOffset); generator.writeEndObject(); generator.writeObjectFieldStart("upperLeft"); generator.writeObjectField("x", bounds.getX() - xOffset); generator.writeObjectField("y", bounds.getY() - yOffset); generator.writeEndObject(); generator.writeEndObject(); }
From source file:org.n52.tamis.core.json.serialize.processes.execute.ExtendedExecuteHttpPostBodySerializer.java
@Override public void serialize(Execute_HttpPostBody executeBody_short, JsonGenerator jsonGenerator, SerializerProvider serProvider) throws IOException, JsonProcessingException { logger.info("Start serialization of execute HTTP POST input body \"{}\"", executeBody_short); /*/* w w w . ja v a 2 s . co m*/ * the structure of the target JSON body looks like: * * { "Execute": { "Identifier": "org.n52.tamis.algorithm.interpolation", "Input": [ { "Input": [ { "Reference": { "_href": "http://fluggs.wupperverband.de/sos2/service?service=SOS&request=GetObservation&version=2.0.0&offering=Zeitreihen_2m_Tiefe&observedProperty=Grundwasserstand&responseFormat=http%3A//www.opengis.net/om/2.0", "_mimeType": "application/om+xml; version=2.0", "_schema": "http://schemas.opengis.net/om/2.0/observation.xsd" }, "_id": "gw1" }, { "Reference": { "_href": "http://fluggs.wupperverband.de/sos2/service?service=SOS&request=GetObservation&version=2.0.0&offering=Zeitreihen_2m_Tiefe&observedProperty=Sohlenwasserdruck&responseFormat=http%3A//www.opengis.net/om/2.0", "_mimeType": "application/om+xml; version=2.0", "_schema": "http://schemas.opengis.net/om/2.0/observation.xsd" }, "_id": "swd1" } ], "_id": "input-variables" }, { "Data": { "_mimeType": "text/xml", "_schema": "http://schemas.opengis.net/gml/3.2.1/base/feature.xsd", "__text": "<wfs:FeatureCollection xmlns:testbed11="http://opengeospatial.org" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wml2="http://www.opengis.net/waterml/2.0" xmlns:sf="http://www.opengis.net/sampling/2.0" xmlns:sams="http://www.opengis.net/samplingSpatial/2.0" numberOfFeatures="1" timeStamp="2016-02-15T16:24:55.640Z" xsi:schemaLocation="http://www.opengis.net/wfs http://geoprocessing.demo.52north.org:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"> <gml:featureMembers> <wml2:MonitoringPoint gml:id="xyz.1"> <gml:identifier codeSpace="http://www.opengis.net/def/nil/OGC/0/unknown">xyz</gml:identifier> <gml:name codeSpace="http://www.opengis.net/def/nil/OGC/0/unknown">xyz</gml:name> <sf:sampledFeature xlink:href="urn:ogc:def:nil:OGC:unknown" /> <sams:shape> <ns:Point xmlns:ns="http://www.opengis.net/gml/3.2" ns:id="point_xyz"> <ns:pos srsName="http://www.opengis.net/def/crs/EPSG/0/31466">5668202.8356 2595842.8958</ns:pos> </ns:Point> </sams:shape> </wml2:MonitoringPoint> </gml:featureMembers> </wfs:FeatureCollection>" }, "_id": "target-variable-point" } ], "output": { "_mimeType": "application/om+xml; version=2.0", "_schema": "http://schemas.opengis.net/om/2.0/observation.xsd", "_id": "estimated-values", "_transmission": "value" }, "_service": "WPS", "_version": "2.0.0"} } */ jsonGenerator.writeStartObject(); jsonGenerator.writeObjectFieldStart("Execute"); jsonGenerator.writeStringField("Identifier", executeBody_short.getProcessId()); jsonGenerator.writeArrayFieldStart("Input"); List<ExecuteInput> inputs = executeBody_short.getInputs(); for (ExecuteInput executeInput : inputs) { jsonGenerator.writeObject(executeInput); } jsonGenerator.writeEndArray(); /** * TODO is it really correct, that "output" starts with a small "o"? */ jsonGenerator.writeArrayFieldStart("output"); List<ExecuteOutput> outputs = executeBody_short.getOutputs(); for (ExecuteOutput executeOutput : outputs) { jsonGenerator.writeObject(executeOutput); } jsonGenerator.writeEndArray(); jsonGenerator.writeStringField("_service", Execute_HttpPostBody.service); jsonGenerator.writeStringField("_version", executeBody_short.getVersion()); jsonGenerator.writeEndObject(); jsonGenerator.writeEndObject(); logger.info("Serialization of execute HTTP POST input body ended."); }
From source file:de.escalon.hypermedia.spring.hydra.LinkListSerializer.java
@Override public void serialize(List<Link> links, JsonGenerator jgen, SerializerProvider serializerProvider) throws IOException { try {// w w w.j a v a 2s . com Collection<Link> simpleLinks = new ArrayList<Link>(); Collection<Affordance> affordances = new ArrayList<Affordance>(); Collection<Link> templatedLinks = new ArrayList<Link>(); Collection<Affordance> collectionAffordances = new ArrayList<Affordance>(); Link selfRel = null; for (Link link : links) { if (link instanceof Affordance) { final Affordance affordance = (Affordance) link; final List<ActionDescriptor> actionDescriptors = affordance.getActionDescriptors(); if (!actionDescriptors.isEmpty()) { // TODO: consider to use Link href for template even if it is not compatible if (affordance.getUriTemplateComponents().hasVariables()) { // TODO resolve rel against context if ("hydra:search".equals(affordance.getRel()) || Cardinality.SINGLE == affordance.getCardinality()) { templatedLinks.add(affordance); } else { collectionAffordances.add(affordance); } } else { // if all required variables are satisfied, the url can be used as identifier // by stripping optional variables if (!affordance.isSelfRel() && Cardinality.COLLECTION == affordance.getCardinality()) { collectionAffordances.add(affordance); } else { affordances.add(affordance); } } } else { if (affordance.isTemplated()) { templatedLinks.add(affordance); } else { simpleLinks.add(affordance); } } } else if (link.isTemplated()) { templatedLinks.add(link); } else { simpleLinks.add(link); } if ("self".equals(link.getRel())) { selfRel = link; } } for (Link templatedLink : templatedLinks) { // templated affordance might turn out to have all variables satisfied or // only optional unsatisfied variables ActionDescriptor actionDescriptorForHttpGet = getActionDescriptorForHttpGet(templatedLink); // TODO handle rev here String rel = templatedLink.getRel(); writeIriTemplate(rel, templatedLink.getHref(), templatedLink.getVariableNames(), actionDescriptorForHttpGet, jgen); } @SuppressWarnings("unchecked") Deque<LdContext> contextStack = (Deque<LdContext>) serializerProvider .getAttribute(JacksonHydraSerializer.KEY_LD_CONTEXT); String currentVocab = (contextStack != null && !contextStack.isEmpty()) ? contextStack.peek().vocab : null; // related collections if (!collectionAffordances.isEmpty()) { jgen.writeArrayFieldStart("hydra:collection"); for (Affordance collectionAffordance : collectionAffordances) { jgen.writeStartObject(); jgen.writeStringField(JsonLdKeywords.AT_TYPE, "hydra:Collection"); PartialUriTemplateComponents templateComponents = collectionAffordance .getUriTemplateComponents(); if (!collectionAffordance.isBaseUriTemplated() && !collectionAffordance.hasUnsatisfiedRequiredVariables()) { String collectionUri = templateComponents.getBaseUri() + templateComponents.getQueryHead(); jgen.writeStringField(JsonLdKeywords.AT_ID, collectionUri); } if (templateComponents.hasVariables()) { ActionDescriptor actionDescriptorForHttpGet = getActionDescriptorForHttpGet( collectionAffordance); writeIriTemplate("hydra:search", templateComponents.toString(), templateComponents.getVariableNames(), actionDescriptorForHttpGet, jgen); } jgen.writeObjectFieldStart("hydra:manages"); // do we have a collection holder which is not owner of the affordance? TypedResource collectionHolder = collectionAffordance.getCollectionHolder(); if (collectionAffordance.getRev() != null) { jgen.writeStringField("hydra:property", collectionAffordance.getRev()); if (collectionHolder != null) { // can't use writeObjectField, it won't inherit the context stack writeCollectionHolder("hydra:object", collectionHolder, jgen); } else if (selfRel != null) { jgen.writeStringField("hydra:object", selfRel.getHref()); } } else if (collectionAffordance.getRel() != null) { jgen.writeStringField("hydra:property", collectionAffordance.getRel()); if (collectionHolder != null) { // can't use writeObjectField, it won't inherit the context stack writeCollectionHolder("hydra:subject", collectionHolder, jgen); } else if (selfRel != null) { jgen.writeStringField("hydra:subject", selfRel.getHref()); } } jgen.writeEndObject(); // end manages List<ActionDescriptor> actionDescriptors = collectionAffordance.getActionDescriptors(); if (!actionDescriptors.isEmpty()) { jgen.writeArrayFieldStart("hydra:operation"); } writeActionDescriptors(jgen, currentVocab, actionDescriptors); if (!actionDescriptors.isEmpty()) { jgen.writeEndArray(); // end hydra:operation } jgen.writeEndObject(); // end collection } jgen.writeEndArray(); } for (Affordance affordance : affordances) { final String rel = affordance.getRel(); List<ActionDescriptor> actionDescriptors = affordance.getActionDescriptors(); if (!actionDescriptors.isEmpty()) { if (!Link.REL_SELF.equals(rel)) { jgen.writeObjectFieldStart(rel); // begin rel } jgen.writeStringField(JsonLdKeywords.AT_ID, affordance.getHref()); jgen.writeArrayFieldStart("hydra:operation"); } writeActionDescriptors(jgen, currentVocab, actionDescriptors); if (!actionDescriptors.isEmpty()) { jgen.writeEndArray(); // end hydra:operation if (!Link.REL_SELF.equals(rel)) { jgen.writeEndObject(); // end rel } } } for (Link simpleLink : simpleLinks) { final String rel = simpleLink.getRel(); if (Link.REL_SELF.equals(rel)) { jgen.writeStringField("@id", simpleLink.getHref()); } else { String linkAttributeName = IanaRels.isIanaRel(rel) ? IANA_REL_PREFIX + rel : rel; jgen.writeObjectFieldStart(linkAttributeName); jgen.writeStringField("@id", simpleLink.getHref()); jgen.writeEndObject(); } } } catch (IntrospectionException e) { throw new RuntimeException(e); } }
From source file:org.jbpm.designer.bpmn2.impl.Bpmn2JsonMarshaller.java
protected void marshallNode(FlowNode node, Map<String, Object> properties, String stencil, BPMNPlane plane, JsonGenerator generator, float xOffset, float yOffset) throws JsonGenerationException, IOException { if (properties == null) { properties = new LinkedHashMap<String, Object>(); }//from ww w . ja va2 s.c o m if (node.getDocumentation() != null && node.getDocumentation().size() > 0) { properties.put("documentation", node.getDocumentation().get(0).getText()); } if (node.getName() != null) { properties.put("name", unescapeXml(node.getName())); } else { if (node instanceof TextAnnotation) { if (((TextAnnotation) node).getText() != null) { properties.put("name", ((TextAnnotation) node).getText()); } else { properties.put("name", ""); } } else { properties.put("name", ""); } } // overwrite name if elementname extension element is present String elementName = Utils.getMetaDataValue(node.getExtensionValues(), "elementname"); if (elementName != null) { properties.put("name", elementName); } marshallProperties(properties, generator); generator.writeObjectFieldStart("stencil"); generator.writeObjectField("id", stencil); generator.writeEndObject(); generator.writeArrayFieldStart("childShapes"); generator.writeEndArray(); generator.writeArrayFieldStart("outgoing"); for (SequenceFlow outgoing : node.getOutgoing()) { generator.writeStartObject(); generator.writeObjectField("resourceId", outgoing.getId()); generator.writeEndObject(); } // we need to also add associations as outgoing elements Process process = (Process) plane.getBpmnElement(); writeAssociations(process, node.getId(), generator); // and boundary events for activities List<BoundaryEvent> boundaryEvents = new ArrayList<BoundaryEvent>(); findBoundaryEvents(process, boundaryEvents); for (BoundaryEvent be : boundaryEvents) { if (be.getAttachedToRef().getId().equals(node.getId())) { generator.writeStartObject(); generator.writeObjectField("resourceId", be.getId()); generator.writeEndObject(); } } generator.writeEndArray(); // boundary events have a docker if (node instanceof BoundaryEvent) { Iterator<FeatureMap.Entry> iter = node.getAnyAttribute().iterator(); boolean foundDockerInfo = false; while (iter.hasNext()) { FeatureMap.Entry entry = iter.next(); if (entry.getEStructuralFeature().getName().equals("dockerinfo")) { foundDockerInfo = true; String dockerInfoStr = String.valueOf(entry.getValue()); if (dockerInfoStr != null && dockerInfoStr.length() > 0) { if (dockerInfoStr.endsWith("|")) { dockerInfoStr = dockerInfoStr.substring(0, dockerInfoStr.length() - 1); String[] dockerInfoParts = dockerInfoStr.split("\\|"); String infoPartsToUse = dockerInfoParts[0]; String[] infoPartsToUseParts = infoPartsToUse.split("\\^"); if (infoPartsToUseParts != null && infoPartsToUseParts.length > 0) { generator.writeArrayFieldStart("dockers"); generator.writeStartObject(); generator.writeObjectField("x", Double.valueOf(infoPartsToUseParts[0])); generator.writeObjectField("y", Double.valueOf(infoPartsToUseParts[1])); generator.writeEndObject(); generator.writeEndArray(); } } } } } // backwards compatibility to older versions -- BZ 1196259 if (!foundDockerInfo) { // find the edge associated with this boundary event for (DiagramElement element : plane.getPlaneElement()) { if (element instanceof BPMNEdge && ((BPMNEdge) element).getBpmnElement() == node) { List<Point> waypoints = ((BPMNEdge) element).getWaypoint(); if (waypoints != null && waypoints.size() > 0) { // one per boundary event Point p = waypoints.get(0); if (p != null) { generator.writeArrayFieldStart("dockers"); generator.writeStartObject(); generator.writeObjectField("x", p.getX()); generator.writeObjectField("y", p.getY()); generator.writeEndObject(); generator.writeEndArray(); } } } } } } BPMNShape shape = (BPMNShape) findDiagramElement(plane, node); Bounds bounds = shape.getBounds(); correctEventNodeSize(shape); generator.writeObjectFieldStart("bounds"); generator.writeObjectFieldStart("lowerRight"); generator.writeObjectField("x", bounds.getX() + bounds.getWidth() - xOffset); generator.writeObjectField("y", bounds.getY() + bounds.getHeight() - yOffset); generator.writeEndObject(); generator.writeObjectFieldStart("upperLeft"); generator.writeObjectField("x", bounds.getX() - xOffset); generator.writeObjectField("y", bounds.getY() - yOffset); generator.writeEndObject(); generator.writeEndObject(); }