/** * Licensed to the Austrian Association for Software Tool Integration (AASTI) * under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright * ownership. The AASTI 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.openengsb.ui.admin.connectorEditorPage; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import javax.inject.Named; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; import org.openengsb.core.api.ConnectorManager; import org.openengsb.core.api.ConnectorProvider; import org.openengsb.core.api.ConnectorValidationFailedException; import org.openengsb.core.api.Constants; import org.openengsb.core.api.OsgiUtilsService; import org.openengsb.core.api.descriptor.AttributeDefinition; import org.openengsb.core.api.descriptor.ServiceDescriptor; import org.openengsb.core.api.model.ConnectorDescription; import org.openengsb.core.api.security.annotation.SecurityAttribute; import org.openengsb.core.api.validation.FormValidator; import org.openengsb.core.util.FilterUtils; import org.openengsb.ui.admin.basePage.BasePage; import org.openengsb.ui.admin.serviceEditor.ServiceEditor; import org.openengsb.ui.admin.testClient.TestClient; import org.openengsb.ui.common.editor.ServiceEditorPanel; import org.openengsb.ui.common.model.LocalizableStringModel; import org.ops4j.pax.wicket.api.PaxWicketMountPoint; import org.osgi.framework.Filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SecurityAttribute(key = "org.openengsb.ui.component", value = "CONNECTOR_EDITOR") @PaxWicketMountPoint(mountPoint = "connectors/editor") public class ConnectorEditorPage extends BasePage { private static final long serialVersionUID = -8199301932270437500L; private static final Logger LOGGER = LoggerFactory.getLogger(ConnectorEditorPage.class); public static final String PAGE_NAME_KEY = "connectorEditorPage.tile"; public static final String PAGE_DESCRIPTION_KEY = "connectorEditorPage.title"; @Inject @Named("serviceManager") private ConnectorManager serviceManager; private ServiceDescriptor descriptor; private ServiceEditor editor; @Inject @Named("osgiUtilsService") private OsgiUtilsService serviceUtils; private final String domainType; private final String connectorType; @SuppressWarnings("serial") private final class ConnectorServiceEditor extends ServiceEditor { private final boolean createMode; private final Map<String, String> attributeMap; private ConnectorServiceEditor(String id, String domainType, String connectorType, List<AttributeDefinition> attributes, Map<String, String> attributeMap, Map<String, Object> properties, FormValidator validator) { super(id, domainType, connectorType, attributes, attributeMap, properties, validator); createMode = true; this.attributeMap = attributeMap; } private ConnectorServiceEditor(String id, String serviceId, List<AttributeDefinition> attributes, Map<String, String> attributeMap, Map<String, Object> properties, FormValidator validator) { super(id, serviceId, attributes, attributeMap, properties, validator); createMode = false; this.attributeMap = attributeMap; } @Override public void onSubmit() { ConnectorDescription connectorDescription = new ConnectorDescription(domainType, connectorType, attributeMap, properties); try { if (createMode) { if (isValidating()) { serviceManager.create(connectorDescription); } else { serviceManager.forceCreate(connectorDescription); } } else { if (isValidating()) { serviceManager.update(idModel.getObject(), connectorDescription); } else { serviceManager.forceUpdate(idModel.getObject(), connectorDescription); } } returnToTestClient(); } catch (IllegalArgumentException e) { LOGGER.error("Couldn't create service", e); error("The service already exists in the system. Please choose a different servcie id."); } catch (RuntimeException e) { for (Entry<String, String> entry : ((ConnectorValidationFailedException) e.getCause()) .getErrorMessages().entrySet()) { error(String.format("%s: %s", entry.getKey(), entry.getValue())); } } } @Override public void onCancel() { returnToTestClient(); } private void returnToTestClient() { setResponsePage(TestClient.class); } } private void retrieveDescriptor(String connectorType) { Filter filter = FilterUtils.makeFilter(ConnectorProvider.class, String.format("(%s=%s)", Constants.CONNECTOR_KEY, connectorType)); ConnectorProvider connectorProvider = serviceUtils.getOsgiServiceProxy(filter, ConnectorProvider.class); descriptor = connectorProvider.getDescriptor(); } /* * edit an existing connector */ public ConnectorEditorPage(String id) { ConnectorDescription desc = serviceManager.getAttributeValues(id); connectorType = desc.getConnectorType(); domainType = desc.getDomainType(); initEditor(); createEditor(id, desc); } public ConnectorEditorPage(PageParameters parameters) { super(parameters); domainType = parameters.get("domainType").toOptionalString(); connectorType = parameters.get("connectorType").toOptionalString(); initEditor(); StringValue idValue = parameters.get("id"); if (!idValue.isEmpty()) { String id = idValue.toString(); ConnectorDescription desc = serviceManager.getAttributeValues(id); createEditor(id, desc); } else { createEditor(); } } /* * create a new connector */ public ConnectorEditorPage(String domainType, String connectorType) { this.domainType = domainType; this.connectorType = connectorType; initEditor(); createEditor(); } private void initEditor() { retrieveDescriptor(connectorType); add(new Label("service.name", new LocalizableStringModel(this, descriptor.getName()))); add(new Label("service.description", new LocalizableStringModel(this, descriptor.getDescription()))); } private void createEditor() { List<AttributeDefinition> attributes = descriptor.getAttributes(); Map<String, String> values = new HashMap<String, String>(); for (AttributeDefinition def : attributes) { if (def.getDefaultValue() != null) { String value = def.getDefaultValue().getString(Locale.getDefault()); values.put(def.getId(), value); } } ConnectorDescription description = new ConnectorDescription(domainType, connectorType, values, null); editor = new ConnectorServiceEditor("editor", domainType, connectorType, attributes, description.getAttributes(), description.getProperties(), descriptor.getFormValidator()); add(editor); } private void createEditor(String id, ConnectorDescription description) { editor = new ConnectorServiceEditor("editor", id, descriptor.getAttributes(), description.getAttributes(), description.getProperties(), descriptor.getFormValidator()); add(editor); } public ServiceEditorPanel getEditorPanel() { return editor.getServiceEditorPanel(); } @Override public String getHeaderMenuItem() { return TestClient.class.getSimpleName(); } }