/**
* Mule Development Kit
* Copyright 2010-2011 (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
*
* 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 org.mule.devkit.generation.mule.studio.editor;
import org.mule.api.annotations.Processor;
import org.mule.api.annotations.Source;
import org.mule.api.annotations.Transformer;
import org.mule.devkit.generation.AbstractMessageGenerator;
import org.mule.devkit.generation.DevKitTypeElement;
import org.mule.devkit.model.studio.EndpointType;
import org.mule.devkit.model.studio.GlobalType;
import org.mule.devkit.model.studio.NamespaceType;
import org.mule.devkit.model.studio.ObjectFactory;
import org.mule.devkit.model.studio.PatternType;
import javax.lang.model.element.ExecutableElement;
import java.util.List;
public class MuleStudioEditorXmlGenerator extends AbstractMessageGenerator {
public static final String EDITOR_XML_FILE_NAME = "editors.xml";
public static final String URI_PREFIX = "http://www.mulesoft.org/schema/mule/";
public static final String GLOBAL_CLOUD_CONNECTOR_LOCAL_ID = "config";
public static final String ATTRIBUTE_CATEGORY_DEFAULT_CAPTION = "General";
public static final String ATTRIBUTE_CATEGORY_DEFAULT_DESCRIPTION = "General";
public static final String CONNECTION_ATTRIBUTE_CATEGORY_CAPTION = "Connection";
public static final String GROUP_DEFAULT_CAPTION = "Generic";
private ObjectFactory objectFactory = new ObjectFactory();
@Override
protected boolean shouldGenerate(DevKitTypeElement typeElement) {
return !context.hasOption("skipStudioPluginPackage");
}
@Override
protected void doGenerate(DevKitTypeElement typeElement) {
String moduleName = typeElement.name();
NamespaceType namespace = new NamespaceType();
namespace.setPrefix(moduleName);
namespace.setUrl(URI_PREFIX + moduleName);
GlobalType globalCloudConnector = new GlobalCloudConnectorTypeBuilder(context, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalCloudConnector(globalCloudConnector));
namespace.getConnectorOrEndpointOrGlobal().add(new PatternTypeOperationsBuilder(context, typeElement, PatternTypes.CLOUD_CONNECTOR).build());
namespace.getConnectorOrEndpointOrGlobal().add(new ConfigRefBuilder(context, typeElement).build());
namespace.getConnectorOrEndpointOrGlobal().addAll(new NestedsBuilder(context, typeElement).build());
processProcessorMethods(typeElement, namespace);
processTransformerMethods(typeElement, namespace);
processSourceMethods(typeElement, namespace);
context.getStudioModel().setNamespaceType(namespace);
context.getStudioModel().setOutputFileName(EDITOR_XML_FILE_NAME);
}
private void processProcessorMethods(DevKitTypeElement typeElement, NamespaceType namespace) {
for (ExecutableElement processorMethod : typeElement.getMethodsAnnotatedWith(Processor.class)) {
PatternType cloudConnector = new PatternTypeBuilder(context, processorMethod, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeCloudConnector(cloudConnector));
namespace.getConnectorOrEndpointOrGlobal().addAll(new NestedsBuilder(context, processorMethod, typeElement).build());
}
}
private void processTransformerMethods(DevKitTypeElement typeElement, NamespaceType namespace) {
List<ExecutableElement> transformerMethods = typeElement.getMethodsAnnotatedWith(Transformer.class);
if (!transformerMethods.isEmpty()) {
namespace.getConnectorOrEndpointOrGlobal().add(new PatternTypeOperationsBuilder(context, typeElement, PatternTypes.TRANSFORMER).build());
namespace.getConnectorOrEndpointOrGlobal().add(new AbstractTransformerBuilder(context, typeElement).build());
GlobalType globalTransformer = new GlobalTransformerTypeOperationsBuilder(context, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalTransformer(globalTransformer));
}
for (ExecutableElement transformerMethod : transformerMethods) {
PatternType transformer = new PatternTypeBuilder(context, transformerMethod, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeTransformer(transformer));
GlobalType globalTransformer = new GlobalTransformerTypeBuilder(context, transformerMethod, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalTransformer(globalTransformer));
namespace.getConnectorOrEndpointOrGlobal().addAll(new NestedsBuilder(context, transformerMethod, typeElement).build());
}
}
private void processSourceMethods(DevKitTypeElement typeElement, NamespaceType namespace) {
List<ExecutableElement> sourceMethods = typeElement.getMethodsAnnotatedWith(Source.class);
if (!sourceMethods.isEmpty()) {
GlobalType abstractGlobalEndpoint = new GlobalEndpointTypeWithNameBuilder(context, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalEndpoint(abstractGlobalEndpoint));
EndpointType endpointTypeListingOps = new EndpointTypeOperationsBuilder(context, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createEndpoint(endpointTypeListingOps));
GlobalType globalEndpointListingOps = new GlobalEndpointTypeOperationsBuilder(context, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalEndpoint(globalEndpointListingOps));
}
for (ExecutableElement sourceMethod : sourceMethods) {
EndpointType endpoint = new EndpointTypeBuilder(context, sourceMethod, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createEndpoint(endpoint));
GlobalType globalEndpoint = new GlobalEndpointTypeBuilder(context, sourceMethod, typeElement).build();
namespace.getConnectorOrEndpointOrGlobal().add(objectFactory.createNamespaceTypeGlobalEndpoint(globalEndpoint));
namespace.getConnectorOrEndpointOrGlobal().addAll(new NestedsBuilder(context, sourceMethod, typeElement).build());
}
}
}