/* * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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 org.apache.synapse.aspects.flow.statistics; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.aspects.ComponentType; import org.apache.synapse.aspects.flow.statistics.data.artifact.ArtifactHolder; import org.apache.synapse.aspects.flow.statistics.structuring.StructuringArtifact; import org.apache.synapse.aspects.flow.statistics.structuring.StructuringElement; import org.apache.synapse.config.SynapseConfiguration; public class StatisticIdentityGenerator { private static Log log = LogFactory.getLog(StatisticIdentityGenerator.class); private static SynapseConfiguration synapseConfiguration; public static void conclude(ArtifactHolder holder) { if (holder.getList().size() > 0) { String artifactName = holder.getParent(); StructuringArtifact structuringArtifact = new StructuringArtifact(holder.getHashCode(), artifactName, holder.getList()); if (synapseConfiguration != null) { synapseConfiguration.getCompletedStructureStore().putCompletedStatisticEntry(structuringArtifact); } } } public static String getIdForComponent(String name, ComponentType componentType, ArtifactHolder holder) { String idString = holder.getParent() + "@" + holder.getIdString() + ":" + name; holder.setHashCode(holder.getHashCode() + idString.hashCode()); if (log.isDebugEnabled()) { log.debug("Adding Component : " + idString); } process(idString, componentType, holder); return idString; } public static String getIdReferencingComponent(String name, ComponentType componentType, ArtifactHolder holder) { String idString = name + "@" + holder.getIdString() + ":" + name + "@indirect"; // String idString = name + "@0:" + name; // holder.setId(holder.getId()+1); holder.setHashCode(holder.getHashCode() + idString.hashCode()); if (log.isDebugEnabled()) { log.debug("Adding Referencing Component : " + idString); } process(idString, componentType, holder); return idString; } public static String getIdForFlowContinuableMediator(String mediatorName, ComponentType componentType, ArtifactHolder holder) { if (ComponentType.SEQUENCE == componentType && mediatorName.contains("AnonymousSequence")) { return null; } String idString = holder.getParent() + "@" + holder.getIdString() + ":" + mediatorName; holder.setHashCode(holder.getHashCode() + idString.hashCode()); if (log.isDebugEnabled()) { log.debug("Adding Flow Continuable Mediator : " + idString); } process(idString, componentType, holder); return idString; } public static void reportingBranchingEvents(ArtifactHolder holder) { if (log.isDebugEnabled()) { log.debug("Starts branching (then/else/targets)"); } holder.setLastParent(holder.getStack().peek().getId()); } public static void reportingEndEvent(String name, ComponentType componentType, ArtifactHolder holder) { if (log.isDebugEnabled()) { log.debug("Ending Component Initialization: " + name); } // If event is a SEQ or Proxy - pop from stack, then update parent if (ComponentType.SEQUENCE == componentType || ComponentType.PROXYSERVICE == componentType || ComponentType.API ==componentType || ComponentType.RESOURCE == componentType || ComponentType.INBOUNDENDPOINT == componentType) { holder.getStack().pop(); if (!holder.getStack().isEmpty()){ holder.setLastParent(holder.getStack().peek().getId()); } } if (ComponentType.MEDIATOR == componentType) { holder.getStack().pop(); } } public static void reportingFlowContinuableEndEvent(String mediatorId, ComponentType mediator, ArtifactHolder holder) { if (log.isDebugEnabled()) { log.debug("Ending Flow Continuable Mediator Initialization: " + mediatorId); } holder.setLastParent(holder.getStack().peek().getId()); holder.getStack().pop(); holder.setExitFromBox(true); } public static void reportingEndBranchingEvent(ArtifactHolder holder) { if (log.isDebugEnabled()) { log.debug("Ending Branching Event"); } } public static void setSynapseConfiguration(SynapseConfiguration synapseConfiguration) { StatisticIdentityGenerator.synapseConfiguration = synapseConfiguration; } private static void process(String name, ComponentType componentType, ArtifactHolder holder) { if (ComponentType.PROXYSERVICE == componentType || ComponentType.API == componentType || ComponentType.INBOUNDENDPOINT == componentType) { StructuringElement proxyElem = new StructuringElement(name, componentType); holder.getStack().push(proxyElem); holder.getList().add(proxyElem); holder.setLastParent(name); } if (ComponentType.SEQUENCE == componentType) { StructuringElement seqElem = new StructuringElement(name, componentType); if (holder.getStack().isEmpty()) { // This is directly deploying a sequence holder.getStack().push(seqElem); holder.getList().add(seqElem); } else { // There's a parent for sequence seqElem.setParentId(holder.getLastParent()); seqElem.setGroup(holder.getStack().peek().getId()); holder.getStack().push(seqElem); holder.getList().add(seqElem); } holder.setLastParent(name); } if (ComponentType.RESOURCE == componentType) { StructuringElement resourceElem = new StructuringElement(name, componentType); // There must be an API, which has this resource resourceElem.setParentId(holder.getStack().peek().getId()); resourceElem.setGroup(holder.getStack().peek().getId()); holder.getList().add(resourceElem); holder.setLastParent(name); holder.getStack().push(resourceElem); } if (ComponentType.MEDIATOR == componentType) { StructuringElement medElem = new StructuringElement(name, componentType); if (holder.getExitFromBox()){ holder.setExitFromBox(false); } medElem.setParentId(holder.getLastParent()); medElem.setGroup(holder.getStack().peek().getId()); if (holder.getStack().isEmpty()) { // This is not a desired situation! Mediators always lies inside a sequence log.error("Sequence is missing for mediator : " + name); } holder.getList().add(medElem); holder.setLastParent(name); holder.getStack().push(medElem); } if (ComponentType.ENDPOINT == componentType) { StructuringElement endpointElem = new StructuringElement(name, componentType); // Add parent only the endpoint is called by a mediator if (!holder.getStack().isEmpty()) { endpointElem.setParentId(holder.getStack().peek().getId()); endpointElem.setGroup(holder.getStack().peek().getId()); } holder.getList().add(endpointElem); } } }