Merge branch 'master' into feature_boot_13_sec_41
This commit is contained in:
@@ -8,9 +8,12 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.simulator;
|
||||
|
||||
import static java.util.concurrent.Executors.newScheduledThreadPool;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.security.DigestOutputStream;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.KeyStoreException;
|
||||
@@ -20,7 +23,6 @@ import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -56,9 +58,10 @@ import com.google.common.io.ByteStreams;
|
||||
*/
|
||||
@Service
|
||||
public class DeviceSimulatorUpdater {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(DeviceSimulatorUpdater.class);
|
||||
|
||||
private static final ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(8);
|
||||
private static final ScheduledExecutorService threadPool = newScheduledThreadPool(8);
|
||||
|
||||
@Autowired
|
||||
private SpSenderService spSenderService;
|
||||
@@ -118,14 +121,9 @@ public class DeviceSimulatorUpdater {
|
||||
}
|
||||
|
||||
private static final class DeviceSimulatorUpdateThread implements Runnable {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
private static final String BUT_GOT_LOG_MESSAGE = " but got: ";
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final String DOWNLOAD_LOG_MESSAGE = "Download ";
|
||||
|
||||
private static final int MINIMUM_TOKENLENGTH_FOR_HINT = 6;
|
||||
@@ -279,13 +277,17 @@ public class DeviceSimulatorUpdater {
|
||||
|
||||
private static long getOverallRead(final CloseableHttpResponse response, final MessageDigest md)
|
||||
throws IOException {
|
||||
|
||||
long overallread;
|
||||
try (final BufferedOutputStream bdos = new BufferedOutputStream(
|
||||
new DigestOutputStream(ByteStreams.nullOutputStream(), md))) {
|
||||
|
||||
try (final OutputStream os = ByteStreams.nullOutputStream();
|
||||
final BufferedOutputStream bos = new BufferedOutputStream(new DigestOutputStream(os, md))) {
|
||||
|
||||
try (BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent())) {
|
||||
overallread = ByteStreams.copy(bis, bdos);
|
||||
overallread = ByteStreams.copy(bis, bos);
|
||||
}
|
||||
}
|
||||
|
||||
return overallread;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,10 @@ import java.util.Map;
|
||||
* An interface for declaring the name of the field described in the database
|
||||
* which is used as string representation of the field, e.g. for sorting the
|
||||
* fields over REST.
|
||||
*
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface FieldNameProvider {
|
||||
|
||||
/**
|
||||
* Separator for the sub attributes
|
||||
*/
|
||||
@@ -32,64 +33,18 @@ public interface FieldNameProvider {
|
||||
|
||||
/**
|
||||
* Contains the sub entity the given field.
|
||||
*
|
||||
*
|
||||
* @param propertyField
|
||||
* the given field
|
||||
* @return <true> contains <false> contains not
|
||||
*/
|
||||
default boolean containsSubEntityAttribute(final String propertyField) {
|
||||
return FieldNameProvider.containsSubEntityAttribute(propertyField, getSubEntityAttributes());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return all sub entities attributes.
|
||||
*/
|
||||
default List<String> getSubEntityAttributes() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
* the database column for the key
|
||||
*
|
||||
* @return key fieldname
|
||||
*/
|
||||
default String getKeyFieldName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* the database column for the value
|
||||
*
|
||||
* @return key fieldname
|
||||
*/
|
||||
default String getValueFieldName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the entity field a {@link Map}.
|
||||
*
|
||||
* @return <true> is a map <false> is not a map
|
||||
*/
|
||||
default boolean isMap() {
|
||||
return getKeyFieldName() != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a sub attribute exists.
|
||||
*
|
||||
* @param propertyField
|
||||
* the sub property field.
|
||||
* @param subEntityAttribues
|
||||
* the list of available properties
|
||||
* @return <true> property exists <false> not exists
|
||||
*/
|
||||
static boolean containsSubEntityAttribute(final String propertyField, final List<String> subEntityAttribues) {
|
||||
if (subEntityAttribues.contains(propertyField)) {
|
||||
final List<String> subEntityAttributes = getSubEntityAttributes();
|
||||
if (subEntityAttributes.contains(propertyField)) {
|
||||
return true;
|
||||
}
|
||||
for (final String attribute : subEntityAttribues) {
|
||||
for (final String attribute : subEntityAttributes) {
|
||||
final String[] graph = attribute.split("\\" + SUB_ATTRIBUTE_SEPERATOR);
|
||||
|
||||
for (final String subAttribute : graph) {
|
||||
@@ -102,4 +57,37 @@ public interface FieldNameProvider {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all sub entities attributes.
|
||||
*/
|
||||
default List<String> getSubEntityAttributes() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
* The database column for the key
|
||||
*
|
||||
* @return key fieldname
|
||||
*/
|
||||
default String getKeyFieldName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The database column for the value
|
||||
*
|
||||
* @return key fieldname
|
||||
*/
|
||||
default String getValueFieldName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the entity field a {@link Map}.
|
||||
*
|
||||
* @return <true> is a map <false> is not a map
|
||||
*/
|
||||
default boolean isMap() {
|
||||
return getKeyFieldName() != null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,12 +243,16 @@ public class AmqpConfiguration {
|
||||
|
||||
/**
|
||||
* Create amqp handler service bean.
|
||||
*
|
||||
* @param amqpMessageDispatcherService
|
||||
* to sending events to DMF client
|
||||
*
|
||||
* @return handler service bean
|
||||
*/
|
||||
@Bean
|
||||
public AmqpMessageHandlerService amqpMessageHandlerService() {
|
||||
return new AmqpMessageHandlerService(rabbitTemplate());
|
||||
public AmqpMessageHandlerService amqpMessageHandlerService(
|
||||
final AmqpMessageDispatcherService amqpMessageDispatcherService) {
|
||||
return new AmqpMessageHandlerService(rabbitTemplate(), amqpMessageDispatcherService);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -41,6 +41,7 @@ import org.eclipse.hawkbit.repository.RepositoryConstants;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.TargetAssignDistributionSetEvent;
|
||||
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
|
||||
import org.eclipse.hawkbit.repository.exception.TenantNotExistException;
|
||||
import org.eclipse.hawkbit.repository.exception.ToManyStatusEntriesException;
|
||||
import org.eclipse.hawkbit.repository.model.Action;
|
||||
import org.eclipse.hawkbit.repository.model.Action.Status;
|
||||
import org.eclipse.hawkbit.repository.model.ActionStatus;
|
||||
@@ -73,8 +74,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.core.context.SecurityContextImpl;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
|
||||
/**
|
||||
*
|
||||
* {@link AmqpMessageHandlerService} handles all incoming AMQP messages for the
|
||||
@@ -85,6 +84,8 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(AmqpMessageHandlerService.class);
|
||||
|
||||
private final AmqpMessageDispatcherService amqpMessageDispatcherService;
|
||||
|
||||
@Autowired
|
||||
private ControllerManagement controllerManagement;
|
||||
|
||||
@@ -94,9 +95,6 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
@Autowired
|
||||
private ArtifactManagement artifactManagement;
|
||||
|
||||
@Autowired
|
||||
private EventBus eventBus;
|
||||
|
||||
@Autowired
|
||||
@Qualifier(CacheConstants.DOWNLOAD_ID_CACHE)
|
||||
private Cache cache;
|
||||
@@ -115,9 +113,13 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
*
|
||||
* @param defaultTemplate
|
||||
* the configured amqp template.
|
||||
* @param amqpMessageDispatcherService
|
||||
* to sending events to DMF client
|
||||
*/
|
||||
public AmqpMessageHandlerService(final RabbitTemplate defaultTemplate) {
|
||||
public AmqpMessageHandlerService(final RabbitTemplate defaultTemplate,
|
||||
final AmqpMessageDispatcherService amqpMessageDispatcherService) {
|
||||
super(defaultTemplate);
|
||||
this.amqpMessageDispatcherService = amqpMessageDispatcherService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -153,8 +155,8 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
return handleAuthentifiactionMessage(message);
|
||||
} catch (final IllegalArgumentException ex) {
|
||||
throw new AmqpRejectAndDontRequeueException("Invalid message!", ex);
|
||||
} catch (final TenantNotExistException teex) {
|
||||
throw new AmqpRejectAndDontRequeueException(teex);
|
||||
} catch (final TenantNotExistException | ToManyStatusEntriesException e) {
|
||||
throw new AmqpRejectAndDontRequeueException(e);
|
||||
} finally {
|
||||
SecurityContextHolder.setContext(oldContext);
|
||||
}
|
||||
@@ -352,9 +354,9 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
final List<SoftwareModule> softwareModuleList = controllerManagement
|
||||
.findSoftwareModulesByDistributionSet(distributionSet);
|
||||
final String targetSecurityToken = systemSecurityContext.runAsSystem(() -> target.getSecurityToken());
|
||||
eventBus.post(new TargetAssignDistributionSetEvent(target.getOptLockRevision(), target.getTenant(),
|
||||
target.getControllerId(), action.getId(), softwareModuleList, target.getTargetInfo().getAddress(),
|
||||
targetSecurityToken));
|
||||
amqpMessageDispatcherService.targetAssignDistributionSet(new TargetAssignDistributionSetEvent(
|
||||
target.getOptLockRevision(), target.getTenant(), target.getControllerId(), action.getId(),
|
||||
softwareModuleList, target.getTargetInfo().getAddress(), targetSecurityToken));
|
||||
|
||||
}
|
||||
|
||||
@@ -385,6 +387,7 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
final Action action = checkActionExist(message, actionUpdateStatus);
|
||||
|
||||
final ActionStatus actionStatus = createActionStatus(message, actionUpdateStatus, action);
|
||||
updateLastPollTime(action.getTarget());
|
||||
|
||||
switch (actionUpdateStatus.getActionStatus()) {
|
||||
case DOWNLOAD:
|
||||
@@ -422,6 +425,10 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
}
|
||||
}
|
||||
|
||||
private void updateLastPollTime(final Target target) {
|
||||
controllerManagement.updateTargetStatus(target.getTargetInfo(), null, System.currentTimeMillis(), null);
|
||||
}
|
||||
|
||||
private ActionStatus createActionStatus(final Message message, final ActionUpdateStatus actionUpdateStatus,
|
||||
final Action action) {
|
||||
final ActionStatus actionStatus = entityFactory.generateActionStatus();
|
||||
@@ -508,10 +515,6 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
|
||||
this.cache = cache;
|
||||
}
|
||||
|
||||
void setEventBus(final EventBus eventBus) {
|
||||
this.eventBus = eventBus;
|
||||
}
|
||||
|
||||
void setEntityFactory(final EntityFactory entityFactory) {
|
||||
this.entityFactory = entityFactory;
|
||||
}
|
||||
|
||||
@@ -74,7 +74,8 @@ public class AmqpControllerAuthenticationTest {
|
||||
messageConverter = new Jackson2JsonMessageConverter();
|
||||
final RabbitTemplate rabbitTemplate = mock(RabbitTemplate.class);
|
||||
when(rabbitTemplate.getMessageConverter()).thenReturn(messageConverter);
|
||||
amqpMessageHandlerService = new AmqpMessageHandlerService(rabbitTemplate);
|
||||
amqpMessageHandlerService = new AmqpMessageHandlerService(rabbitTemplate,
|
||||
mock(AmqpMessageDispatcherService.class));
|
||||
|
||||
authenticationManager = new AmqpControllerAuthentfication();
|
||||
authenticationManager.setControllerManagement(mock(ControllerManagement.class));
|
||||
|
||||
@@ -51,6 +51,7 @@ import org.eclipse.hawkbit.repository.model.Action.Status;
|
||||
import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.repository.model.TargetInfo;
|
||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||
import org.eclipse.hawkbit.security.SecurityTokenGenerator;
|
||||
import org.eclipse.hawkbit.security.SystemSecurityContext;
|
||||
import org.junit.Before;
|
||||
@@ -69,8 +70,6 @@ import org.springframework.amqp.support.converter.MessageConverter;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
|
||||
import ru.yandex.qatools.allure.annotations.Description;
|
||||
import ru.yandex.qatools.allure.annotations.Features;
|
||||
import ru.yandex.qatools.allure.annotations.Stories;
|
||||
@@ -86,6 +85,9 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
private MessageConverter messageConverter;
|
||||
|
||||
@Mock
|
||||
private AmqpMessageDispatcherService amqpMessageDispatcherServiceMock;
|
||||
|
||||
@Mock
|
||||
private ControllerManagement controllerManagementMock;
|
||||
|
||||
@@ -107,9 +109,6 @@ public class AmqpMessageHandlerServiceTest {
|
||||
@Mock
|
||||
private HostnameResolver hostnameResolverMock;
|
||||
|
||||
@Mock
|
||||
private EventBus eventBus;
|
||||
|
||||
@Mock
|
||||
private RabbitTemplate rabbitTemplate;
|
||||
|
||||
@@ -120,13 +119,12 @@ public class AmqpMessageHandlerServiceTest {
|
||||
public void before() throws Exception {
|
||||
messageConverter = new Jackson2JsonMessageConverter();
|
||||
when(rabbitTemplate.getMessageConverter()).thenReturn(messageConverter);
|
||||
amqpMessageHandlerService = new AmqpMessageHandlerService(rabbitTemplate);
|
||||
amqpMessageHandlerService = new AmqpMessageHandlerService(rabbitTemplate, amqpMessageDispatcherServiceMock);
|
||||
amqpMessageHandlerService.setControllerManagement(controllerManagementMock);
|
||||
amqpMessageHandlerService.setAuthenticationManager(authenticationManagerMock);
|
||||
amqpMessageHandlerService.setArtifactManagement(artifactManagementMock);
|
||||
amqpMessageHandlerService.setCache(cacheMock);
|
||||
amqpMessageHandlerService.setHostnameResolver(hostnameResolverMock);
|
||||
amqpMessageHandlerService.setEventBus(eventBus);
|
||||
amqpMessageHandlerService.setEntityFactory(entityFactoryMock);
|
||||
amqpMessageHandlerService.setSystemSecurityContext(systemSecurityContextMock);
|
||||
|
||||
@@ -134,7 +132,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests not allowed content-type in message")
|
||||
public void testWrongContentType() {
|
||||
public void wrongContentType() {
|
||||
final MessageProperties messageProperties = new MessageProperties();
|
||||
messageProperties.setContentType("xml");
|
||||
final Message message = new Message(new byte[0], messageProperties);
|
||||
@@ -147,7 +145,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the creation of a target/thing by calling the same method that incoming RabbitMQ messages would access.")
|
||||
public void testCreateThing() {
|
||||
public void createThing() {
|
||||
final String knownThingId = "1";
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.THING_CREATED);
|
||||
messageProperties.setHeader(MessageHeaderKey.THING_ID, "1");
|
||||
@@ -168,7 +166,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the creation of a thing without a 'reply to' header in message.")
|
||||
public void testCreateThingWitoutReplyTo() {
|
||||
public void createThingWitoutReplyTo() {
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.THING_CREATED, null);
|
||||
messageProperties.setHeader(MessageHeaderKey.THING_ID, "1");
|
||||
final Message message = messageConverter.toMessage("", messageProperties);
|
||||
@@ -184,7 +182,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the creation of a target/thing without a thingID by calling the same method that incoming RabbitMQ messages would access.")
|
||||
public void testCreateThingWithoutID() {
|
||||
public void createThingWithoutID() {
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.THING_CREATED);
|
||||
final Message message = messageConverter.toMessage(new byte[0], messageProperties);
|
||||
try {
|
||||
@@ -197,7 +195,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the call of the same method that incoming RabbitMQ messages would access with an unknown message type.")
|
||||
public void testUnknownMessageType() {
|
||||
public void unknownMessageType() {
|
||||
final String type = "bumlux";
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.THING_CREATED);
|
||||
messageProperties.setHeader(MessageHeaderKey.THING_ID, "");
|
||||
@@ -213,7 +211,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests a invalid message without event topic")
|
||||
public void testInvalidEventTopic() {
|
||||
public void invalidEventTopic() {
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.EVENT);
|
||||
final Message message = new Message(new byte[0], messageProperties);
|
||||
try {
|
||||
@@ -241,7 +239,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the update of an action of a target without a exist action id")
|
||||
public void testUpdateActionStatusWithoutActionId() {
|
||||
public void updateActionStatusWithoutActionId() {
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.EVENT);
|
||||
messageProperties.setHeader(MessageHeaderKey.TOPIC, EventTopic.UPDATE_ACTION_STATUS.name());
|
||||
final ActionUpdateStatus actionUpdateStatus = new ActionUpdateStatus();
|
||||
@@ -259,7 +257,7 @@ public class AmqpMessageHandlerServiceTest {
|
||||
|
||||
@Test
|
||||
@Description("Tests the update of an action of a target without a exist action id")
|
||||
public void testUpdateActionStatusWithoutExistActionId() {
|
||||
public void updateActionStatusWithoutExistActionId() {
|
||||
final MessageProperties messageProperties = createMessageProperties(MessageType.EVENT);
|
||||
messageProperties.setHeader(MessageHeaderKey.TOPIC, EventTopic.UPDATE_ACTION_STATUS.name());
|
||||
final ActionUpdateStatus actionUpdateStatus = createActionUpdateStatus(ActionStatus.DOWNLOAD);
|
||||
@@ -384,9 +382,13 @@ public class AmqpMessageHandlerServiceTest {
|
||||
amqpMessageHandlerService.onMessage(message, MessageType.EVENT.name(), TENANT, "vHost");
|
||||
|
||||
// verify
|
||||
verify(controllerManagementMock).updateTargetStatus(Matchers.any(TargetInfo.class),
|
||||
Matchers.isNull(TargetUpdateStatus.class), Matchers.isNotNull(Long.class), Matchers.isNull(URI.class));
|
||||
|
||||
final ArgumentCaptor<TargetAssignDistributionSetEvent> captorTargetAssignDistributionSetEvent = ArgumentCaptor
|
||||
.forClass(TargetAssignDistributionSetEvent.class);
|
||||
verify(eventBus, times(1)).post(captorTargetAssignDistributionSetEvent.capture());
|
||||
verify(amqpMessageDispatcherServiceMock, times(1))
|
||||
.targetAssignDistributionSet(captorTargetAssignDistributionSetEvent.capture());
|
||||
final TargetAssignDistributionSetEvent targetAssignDistributionSetEvent = captorTargetAssignDistributionSetEvent
|
||||
.getValue();
|
||||
|
||||
|
||||
@@ -8,8 +8,9 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* {@link Map} with attributes of SP Target.
|
||||
*
|
||||
*/
|
||||
public class MgmtTargetAttributes extends HashMap<String, String> {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
}
|
||||
|
||||
@@ -52,9 +52,7 @@ import org.eclipse.hawkbit.rest.json.model.ExceptionInfo;
|
||||
import org.eclipse.hawkbit.rest.util.JsonBuilder;
|
||||
import org.eclipse.hawkbit.rest.util.MockMvcResultPrinter;
|
||||
import org.eclipse.hawkbit.util.IpUtil;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Slice;
|
||||
@@ -80,7 +78,6 @@ public class MgmtTargetResourceTest extends AbstractRestIntegrationTest {
|
||||
|
||||
private static final String TARGET_DESCRIPTION_TEST = "created in test";
|
||||
|
||||
// json paths
|
||||
private static final String JSON_PATH_ROOT = "$";
|
||||
|
||||
// fields, attributes
|
||||
@@ -633,69 +630,8 @@ public class MgmtTargetResourceTest extends AbstractRestIntegrationTest {
|
||||
final String knownName = "someName";
|
||||
createSingleTarget(knownControllerId, knownName);
|
||||
|
||||
// test
|
||||
|
||||
mvc.perform(get(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + knownControllerId + "/installedDS"))
|
||||
.andExpect(status().isNoContent()).andExpect(content().string(""));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void getInstalledDistributionSetOfTarget() throws JSONException, Exception {
|
||||
// create first a target which can be retrieved by rest interface
|
||||
final String knownControllerId = "1";
|
||||
final String knownName = "someName";
|
||||
createSingleTarget(knownControllerId, knownName);
|
||||
final DistributionSet ds = testdataFactory.createDistributionSet("");
|
||||
// assign ds to target
|
||||
final Long actionId = deploymentManagement.assignDistributionSet(ds.getId(), knownControllerId).getActions()
|
||||
.get(0);
|
||||
// give feedback, so installedDS is in SNYC
|
||||
feedbackToByInSync(actionId);
|
||||
// test
|
||||
|
||||
final SoftwareModule os = ds.findFirstModuleByType(osType);
|
||||
final SoftwareModule jvm = ds.findFirstModuleByType(runtimeType);
|
||||
final SoftwareModule bApp = ds.findFirstModuleByType(appType);
|
||||
mvc.perform(get(MgmtRestConstants.TARGET_V1_REQUEST_MAPPING + "/" + knownControllerId + "/installedDS"))
|
||||
.andDo(MockMvcResultPrinter.print()).andExpect(status().isOk())
|
||||
.andExpect(jsonPath(JSON_PATH_ID, equalTo(ds.getId().intValue())))
|
||||
.andExpect(jsonPath(JSON_PATH_NAME, equalTo(ds.getName())))
|
||||
.andExpect(jsonPath(JSON_PATH_DESCRIPTION, equalTo(ds.getDescription())))
|
||||
// os
|
||||
.andExpect(
|
||||
jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].id", equalTo(os.getId().intValue())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].name", equalTo(os.getName())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].description",
|
||||
equalTo(os.getDescription())))
|
||||
.andExpect(
|
||||
jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].version", equalTo(os.getVersion())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].vendor", equalTo(os.getVendor())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + osType.getKey() + ")][0].type", equalTo("os")))
|
||||
// jvm
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].id",
|
||||
equalTo(jvm.getId().intValue())))
|
||||
.andExpect(
|
||||
jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].name", equalTo(jvm.getName())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].description",
|
||||
equalTo(jvm.getDescription())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].version",
|
||||
equalTo(jvm.getVersion())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].vendor",
|
||||
equalTo(jvm.getVendor())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + runtimeType.getKey() + ")][0].type", equalTo("runtime")))
|
||||
// baseApp
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].id",
|
||||
equalTo(bApp.getId().intValue())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].name", equalTo(bApp.getName())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].description",
|
||||
equalTo(bApp.getDescription())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].version",
|
||||
equalTo(bApp.getVersion())))
|
||||
.andExpect(
|
||||
jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].vendor", equalTo(bApp.getVendor())))
|
||||
.andExpect(jsonPath("$modules.[?(@.type==" + appType.getKey() + ")][0].type", equalTo("application")));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -13,6 +13,7 @@ import java.util.List;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.AssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* A bean which holds a complex result of an service operation to combine the
|
||||
@@ -61,6 +62,10 @@ public class DistributionSetAssignmentResult extends AssignmentResult<Target> {
|
||||
|
||||
@Override
|
||||
public List<Target> getAssignedEntity() {
|
||||
if (CollectionUtils.isEmpty(assignedTargets)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
return targetManagement.findTargetByControllerID(assignedTargets);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,18 +20,18 @@ import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
|
||||
public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extends AbstractBaseEntityEvent<E> {
|
||||
|
||||
private static final long serialVersionUID = -3671601415138242311L;
|
||||
private final transient Map<String, Values> changeSet;
|
||||
private final transient Map<String, PropertyChange> changeSet;
|
||||
|
||||
/**
|
||||
* Initialize base entity and property changed with old and new value.
|
||||
*
|
||||
*
|
||||
* @param baseEntity
|
||||
* entity changed
|
||||
* @param changeSetValues
|
||||
* details of properties changed and old value and new value of
|
||||
* the changed properties
|
||||
*/
|
||||
public AbstractPropertyChangeEvent(final E baseEntity, final Map<String, Values> changeSetValues) {
|
||||
public AbstractPropertyChangeEvent(final E baseEntity, final Map<String, PropertyChange> changeSetValues) {
|
||||
super(baseEntity);
|
||||
this.changeSet = changeSetValues;
|
||||
}
|
||||
@@ -39,27 +39,27 @@ public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extend
|
||||
/**
|
||||
* @return the changeSet
|
||||
*/
|
||||
public Map<String, Values> getChangeSet() {
|
||||
public Map<String, PropertyChange> getChangeSet() {
|
||||
return changeSet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Carries old value and new value of a property .
|
||||
*
|
||||
*/
|
||||
public class Values {
|
||||
public static class PropertyChange {
|
||||
|
||||
private final Object oldValue;
|
||||
private final Object newValue;
|
||||
|
||||
/**
|
||||
* Initialize old value and new changes value of property.
|
||||
*
|
||||
*
|
||||
* @param oldValue
|
||||
* old value before change
|
||||
* @param newValue
|
||||
* new value after change
|
||||
*/
|
||||
public Values(final Object oldValue, final Object newValue) {
|
||||
public PropertyChange(final Object oldValue, final Object newValue) {
|
||||
super();
|
||||
this.oldValue = oldValue;
|
||||
this.newValue = newValue;
|
||||
@@ -78,6 +78,5 @@ public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extend
|
||||
public Object getNewValue() {
|
||||
return newValue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,8 +22,7 @@ public class ActionPropertyChangeEvent extends AbstractPropertyChangeEvent<Actio
|
||||
* @param action
|
||||
* @param changeSetValues
|
||||
*/
|
||||
public ActionPropertyChangeEvent(final Action action,
|
||||
final Map<String, AbstractPropertyChangeEvent<Action>.Values> changeSetValues) {
|
||||
public ActionPropertyChangeEvent(final Action action, final Map<String, PropertyChange> changeSetValues) {
|
||||
super(action, changeSetValues);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,12 +20,12 @@ public class RolloutGroupPropertyChangeEvent extends AbstractPropertyChangeEvent
|
||||
private static final long serialVersionUID = 4026477044419472686L;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param rolloutGroup
|
||||
* @param changeSetValues
|
||||
*/
|
||||
public RolloutGroupPropertyChangeEvent(final RolloutGroup rolloutGroup,
|
||||
final Map<String, AbstractPropertyChangeEvent<RolloutGroup>.Values> changeSetValues) {
|
||||
final Map<String, PropertyChange> changeSetValues) {
|
||||
super(rolloutGroup, changeSetValues);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,11 @@ public class RolloutPropertyChangeEvent extends AbstractPropertyChangeEvent<Roll
|
||||
private static final long serialVersionUID = 1056221355466373514L;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param rollout
|
||||
* @param changeSetValues
|
||||
*/
|
||||
public RolloutPropertyChangeEvent(final Rollout rollout,
|
||||
final Map<String, AbstractPropertyChangeEvent<Rollout>.Values> changeSetValues) {
|
||||
public RolloutPropertyChangeEvent(final Rollout rollout, final Map<String, PropertyChange> changeSetValues) {
|
||||
super(rollout, changeSetValues);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,16 +12,9 @@ import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* An abstract report series.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class AbstractReportSeries implements Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final String name;
|
||||
|
||||
@@ -14,13 +14,11 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* A simple list report series which just contains a list of values of a report.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class ListReportSeries extends AbstractReportSeries {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final List<Number> data = new ArrayList<>();
|
||||
|
||||
/**
|
||||
@@ -50,8 +48,8 @@ public class ListReportSeries extends AbstractReportSeries {
|
||||
* @param values
|
||||
*/
|
||||
private void setData(final Number... values) {
|
||||
this.data.clear();
|
||||
Collections.addAll(this.data, values);
|
||||
data.clear();
|
||||
Collections.addAll(data, values);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -299,8 +299,6 @@ public class JpaControllerManagement implements ControllerManagement {
|
||||
case CANCELED:
|
||||
case WARNING:
|
||||
case RUNNING:
|
||||
handleIntermediateFeedback(mergedAction, mergedTarget);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -312,16 +310,6 @@ public class JpaControllerManagement implements ControllerManagement {
|
||||
return actionRepository.save(mergedAction);
|
||||
}
|
||||
|
||||
private void handleIntermediateFeedback(final JpaAction mergedAction, final JpaTarget mergedTarget) {
|
||||
// we change the target state only if the action is still running
|
||||
// otherwise this is considered as late feedback that does not have
|
||||
// an impact on the state anymore.
|
||||
if (mergedAction.isActive()) {
|
||||
DeploymentHelper.updateTargetInfo(mergedTarget, TargetUpdateStatus.PENDING, false, targetInfoRepository,
|
||||
entityManager);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleErrorOnAction(final JpaAction mergedAction, final JpaTarget mergedTarget) {
|
||||
mergedAction.setActive(false);
|
||||
mergedAction.setStatus(Status.ERROR);
|
||||
@@ -349,15 +337,17 @@ public class JpaControllerManagement implements ControllerManagement {
|
||||
action.setStatus(Status.FINISHED);
|
||||
final JpaTargetInfo targetInfo = (JpaTargetInfo) target.getTargetInfo();
|
||||
final JpaDistributionSet ds = (JpaDistributionSet) entityManager.merge(action.getDistributionSet());
|
||||
|
||||
targetInfo.setInstalledDistributionSet(ds);
|
||||
if (target.getAssignedDistributionSet() != null && targetInfo.getInstalledDistributionSet() != null && target
|
||||
.getAssignedDistributionSet().getId().equals(targetInfo.getInstalledDistributionSet().getId())) {
|
||||
targetInfo.setInstallationDate(System.currentTimeMillis());
|
||||
|
||||
// check if the assigned set is equal to the installed set (not
|
||||
// necessarily the case as another update might be pending already).
|
||||
if (target.getAssignedDistributionSet() != null && target.getAssignedDistributionSet().getId()
|
||||
.equals(targetInfo.getInstalledDistributionSet().getId())) {
|
||||
targetInfo.setUpdateStatus(TargetUpdateStatus.IN_SYNC);
|
||||
targetInfo.setInstallationDate(System.currentTimeMillis());
|
||||
} else {
|
||||
targetInfo.setUpdateStatus(TargetUpdateStatus.PENDING);
|
||||
targetInfo.setInstallationDate(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
targetInfoRepository.save(targetInfo);
|
||||
entityManager.detach(ds);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,6 @@ import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Slice;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Isolation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@@ -599,11 +598,16 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
||||
|
||||
@Override
|
||||
public Page<Action> findActionsByTarget(final String rsqlParam, final Target target, final Pageable pageable) {
|
||||
final Specification<JpaAction> specification = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
||||
|
||||
return convertAcPage(actionRepository.findAll((Specification<JpaAction>) (root, query, cb) -> cb
|
||||
.and(specification.toPredicate(root, query, cb), cb.equal(root.get(JpaAction_.target), target)),
|
||||
pageable), pageable);
|
||||
final Specification<JpaAction> byTargetSpec = createSpecificationFor(target, rsqlParam);
|
||||
final Page<JpaAction> actions = actionRepository.findAll(byTargetSpec, pageable);
|
||||
return convertAcPage(actions, pageable);
|
||||
}
|
||||
|
||||
private Specification<JpaAction> createSpecificationFor(final Target target, final String rsqlParam) {
|
||||
final Specification<JpaAction> spec = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
||||
return (root, query, cb) -> cb.and(spec.toPredicate(root, query, cb),
|
||||
cb.equal(root.get(JpaAction_.target), target));
|
||||
}
|
||||
|
||||
private static Page<Action> convertAcPage(final Page<JpaAction> findAll, final Pageable pageable) {
|
||||
@@ -642,10 +646,7 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
||||
|
||||
@Override
|
||||
public Long countActionsByTarget(final String rsqlParam, final Target target) {
|
||||
final Specification<JpaAction> spec = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
||||
|
||||
return actionRepository.count((root, query, cb) -> cb.and(spec.toPredicate(root, query, cb),
|
||||
cb.equal(root.get(JpaAction_.target), target)));
|
||||
return actionRepository.count(createSpecificationFor(target, rsqlParam));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -483,7 +483,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
|
||||
if (distributionSetMetadataRepository.exists(metadata.getId())) {
|
||||
throwMetadataKeyAlreadyExists(metadata.getId().getKey());
|
||||
}
|
||||
|
||||
|
||||
touch(metadata.getDistributionSet());
|
||||
return distributionSetMetadataRepository.save(metadata);
|
||||
}
|
||||
@@ -515,7 +515,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
|
||||
findOne(metadata.getDistributionSet(), metadata.getKey());
|
||||
// touch it to update the lock revision because we are modifying the
|
||||
// DS indirectly
|
||||
touch(metadata.getDistributionSet());;
|
||||
touch(metadata.getDistributionSet());
|
||||
return distributionSetMetadataRepository.save(metadata);
|
||||
}
|
||||
|
||||
@@ -528,8 +528,11 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the latest distribution set based on ds ID after the metadata changes for that distribution set.
|
||||
* @param distributionSet Distribution set
|
||||
* Method to get the latest distribution set based on ds ID after the
|
||||
* metadata changes for that distribution set.
|
||||
*
|
||||
* @param distributionSet
|
||||
* Distribution set
|
||||
*/
|
||||
private void touch(final DistributionSet distributionSet) {
|
||||
final DistributionSet latestDistributionSet = findDistributionSetById(distributionSet.getId());
|
||||
@@ -552,7 +555,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
|
||||
|
||||
@Override
|
||||
public List<DistributionSetMetadata> findDistributionSetMetadataByDistributionSetId(final Long distributionSetId) {
|
||||
return new ArrayList<DistributionSetMetadata>(distributionSetMetadataRepository
|
||||
return new ArrayList<>(distributionSetMetadataRepository
|
||||
.findAll((Specification<JpaDistributionSetMetadata>) (root, query, cb) -> cb.equal(
|
||||
root.get(JpaDistributionSetMetadata_.distributionSet).get(JpaDistributionSet_.id),
|
||||
distributionSetId)));
|
||||
|
||||
@@ -599,7 +599,7 @@ public class JpaRolloutManagement implements RolloutManagement {
|
||||
/**
|
||||
* Get count of targets in different status in rollout.
|
||||
*
|
||||
* @param page
|
||||
* @param pageable
|
||||
* the page request to sort and limit the result
|
||||
* @return a list of rollouts with details of targets count for different
|
||||
* statuses
|
||||
|
||||
@@ -26,7 +26,6 @@ import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.data.jpa.domain.Specifications;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Isolation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
@@ -46,6 +46,7 @@ import org.springframework.transaction.TransactionSystemException;
|
||||
*/
|
||||
@Aspect
|
||||
public class ExceptionMappingAspectHandler implements Ordered {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ExceptionMappingAspectHandler.class);
|
||||
|
||||
private static final Map<String, String> EXCEPTION_MAPPING = new HashMap<>();
|
||||
@@ -63,6 +64,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
||||
private final SQLStateSQLExceptionTranslator sqlStateExceptionTranslator = new SQLStateSQLExceptionTranslator();
|
||||
|
||||
static {
|
||||
|
||||
MAPPED_EXCEPTION_ORDER.add(DuplicateKeyException.class);
|
||||
MAPPED_EXCEPTION_ORDER.add(DataIntegrityViolationException.class);
|
||||
MAPPED_EXCEPTION_ORDER.add(ConcurrencyFailureException.class);
|
||||
@@ -90,9 +92,11 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
||||
+ " || execution( * org.eclipse.hawkbit.controller.*.*(..)) "
|
||||
+ " || execution( * org.eclipse.hawkbit.rest.resource.*.*(..)) "
|
||||
+ " || execution( * org.eclipse.hawkbit.service.*.*(..)) )", throwing = "ex")
|
||||
// Exception squid:S00112 - Is aspectJ proxy
|
||||
@SuppressWarnings({ "squid:S00112" })
|
||||
// Exception for squid:S00112, squid:S1162
|
||||
// It is a AspectJ proxy which deals with exceptions.
|
||||
@SuppressWarnings({ "squid:S00112", "squid:S1162" })
|
||||
public void catchAndWrapJpaExceptionsService(final Exception ex) throws Throwable {
|
||||
|
||||
LOG.trace("exception occured", ex);
|
||||
Exception translatedAccessException = translateEclipseLinkExceptionIfPossible(ex);
|
||||
|
||||
@@ -122,6 +126,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LOG.trace("mapped exception {} to {}", translatedAccessException.getClass(), mappingException.getClass());
|
||||
throw mappingException;
|
||||
}
|
||||
@@ -138,7 +143,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
||||
* translate the exception by the sql error code. Luckily, there we can use
|
||||
* {@link SQLStateSQLExceptionTranslator} if we can get a
|
||||
* {@link SQLException}.
|
||||
*
|
||||
*
|
||||
* @param accessException
|
||||
* the base access exception from jpa
|
||||
* @return the translated accessException
|
||||
|
||||
@@ -43,11 +43,11 @@ public class EntityPropertyChangeListener extends DescriptorEventAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isEventAwareEntity(final Object object) {
|
||||
private static boolean isEventAwareEntity(final Object object) {
|
||||
return object instanceof EventAwareEntity;
|
||||
}
|
||||
|
||||
private void doNotifiy(final Runnable runnable) {
|
||||
private static void doNotifiy(final Runnable runnable) {
|
||||
AfterTransactionCommitExecutorHolder.getInstance().getAfterCommit().afterCommit(runnable);
|
||||
}
|
||||
|
||||
|
||||
@@ -98,8 +98,8 @@ public class JpaActionStatus extends AbstractJpaTenantAwareBaseEntity implements
|
||||
* the status for this action status
|
||||
* @param occurredAt
|
||||
* the occurred timestamp
|
||||
* @param messages
|
||||
* the messages which should be added to this action status
|
||||
* @param message
|
||||
* the message which should be added to this action status
|
||||
*/
|
||||
public JpaActionStatus(final JpaAction action, final Status status, final Long occurredAt, final String message) {
|
||||
this.action = action;
|
||||
|
||||
@@ -34,7 +34,7 @@ import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.UniqueConstraint;
|
||||
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent.PropertyChange;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.DistributionCreatedEvent;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.DistributionDeletedEvent;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.DistributionSetUpdateEvent;
|
||||
@@ -299,8 +299,8 @@ public class JpaDistributionSet extends AbstractJpaNamedVersionedEntity implemen
|
||||
@Override
|
||||
public void fireUpdateEvent(final DescriptorEvent descriptorEvent) {
|
||||
|
||||
final Map<String, AbstractPropertyChangeEvent<JpaDistributionSet>.Values> changeSet = EntityPropertyChangeHelper
|
||||
.getChangeSet(JpaDistributionSet.class, descriptorEvent);
|
||||
final Map<String, PropertyChange> changeSet = EntityPropertyChangeHelper.getChangeSet(JpaDistributionSet.class,
|
||||
descriptorEvent);
|
||||
EventBusHolder.getInstance().getEventBus().post(new DistributionSetUpdateEvent(this));
|
||||
|
||||
if (changeSet.containsKey(DELETED_PROPERTY)) {
|
||||
|
||||
@@ -70,6 +70,7 @@ import org.springframework.data.domain.Persistable;
|
||||
// sub entities
|
||||
@SuppressWarnings("squid:S2160")
|
||||
public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Long>, Target, EventAwareEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Column(name = "controller_id", length = 64)
|
||||
@@ -185,7 +186,7 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Lon
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isNew
|
||||
* @param entityNew
|
||||
* the isNew to set
|
||||
*/
|
||||
public void setNew(final boolean entityNew) {
|
||||
|
||||
@@ -122,7 +122,7 @@ public class JpaTargetInfo implements Persistable<Long>, TargetInfo, EventAwareE
|
||||
private boolean requestControllerAttributes = true;
|
||||
|
||||
/**
|
||||
* Constructor for {@link TargetStatus}.
|
||||
* Constructor for {@link JpaTargetInfo}.
|
||||
*
|
||||
* @param target
|
||||
* related to this status.
|
||||
@@ -149,7 +149,7 @@ public class JpaTargetInfo implements Persistable<Long>, TargetInfo, EventAwareE
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isNew
|
||||
* @param entityNew
|
||||
* the isNew to set
|
||||
*/
|
||||
public void setNew(final boolean entityNew) {
|
||||
|
||||
@@ -11,7 +11,7 @@ package org.eclipse.hawkbit.repository.jpa.model.helper;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent;
|
||||
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent.PropertyChange;
|
||||
import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
|
||||
import org.eclipse.persistence.descriptors.DescriptorEvent;
|
||||
import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
|
||||
@@ -32,15 +32,14 @@ public class EntityPropertyChangeHelper<T extends TenantAwareBaseEntity> {
|
||||
* @param event
|
||||
* @return the map of the changeSet
|
||||
*/
|
||||
public static <T extends TenantAwareBaseEntity> Map<String, AbstractPropertyChangeEvent<T>.Values> getChangeSet(
|
||||
final Class<T> clazz, final DescriptorEvent event) {
|
||||
public static <T extends TenantAwareBaseEntity> Map<String, PropertyChange> getChangeSet(final Class<T> clazz,
|
||||
final DescriptorEvent event) {
|
||||
final T rolloutGroup = clazz.cast(event.getObject());
|
||||
final ObjectChangeSet changeSet = ((UpdateObjectQuery) event.getQuery()).getObjectChangeSet();
|
||||
return changeSet.getChanges().stream().filter(record -> record instanceof DirectToFieldChangeRecord)
|
||||
.map(record -> (DirectToFieldChangeRecord) record)
|
||||
.collect(Collectors.toMap(record -> record.getAttribute(),
|
||||
record -> new AbstractPropertyChangeEvent<T>(rolloutGroup, null).new Values(
|
||||
record.getOldValue(), record.getNewValue())));
|
||||
record -> new PropertyChange(record.getOldValue(), record.getNewValue())));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.repository.jpa.rsql;
|
||||
|
||||
import static org.eclipse.hawkbit.repository.FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
@@ -15,7 +17,6 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Expression;
|
||||
@@ -49,7 +50,7 @@ import cz.jirutka.rsql.parser.ast.RSQLVisitor;
|
||||
* A utility class which is able to parse RSQL strings into an spring data
|
||||
* {@link Specification} which then can be enhanced sql queries to filter
|
||||
* entities. RSQL parser library: https://github.com/jirutka/rsql-parser
|
||||
*
|
||||
*
|
||||
* <ul>
|
||||
* <li>Equal to : ==</li>
|
||||
* <li>Not equal to : !=</li>
|
||||
@@ -83,14 +84,12 @@ public final class RSQLUtility {
|
||||
/**
|
||||
* parses an RSQL valid string into an JPA {@link Specification} which then
|
||||
* can be used to filter for JPA entities with the given RSQL query.
|
||||
*
|
||||
*
|
||||
* @param rsql
|
||||
* the rsql query
|
||||
* @param fieldNameProvider
|
||||
* the enum class type which implements the
|
||||
* {@link FieldNameProvider}
|
||||
* @param entityManager
|
||||
* {@link EntityManager}
|
||||
* @return an specification which can be used with JPA
|
||||
* @throws RSQLParameterUnsupportedFieldException
|
||||
* if a field in the RSQL string is used but not provided by the
|
||||
@@ -105,10 +104,10 @@ public final class RSQLUtility {
|
||||
|
||||
/**
|
||||
* Validate the given rsql string regarding existence and correct syntax.
|
||||
*
|
||||
*
|
||||
* @param rsql
|
||||
* the rsql string to get validated
|
||||
*
|
||||
*
|
||||
*/
|
||||
public static void isValid(final String rsql) {
|
||||
parseRsql(rsql);
|
||||
@@ -156,7 +155,7 @@ public final class RSQLUtility {
|
||||
/**
|
||||
* An implementation of the {@link RSQLVisitor} to visit the parsed tokens
|
||||
* and build jpa where clauses.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param <A>
|
||||
@@ -205,7 +204,7 @@ public final class RSQLUtility {
|
||||
}
|
||||
|
||||
private String getAndValidatePropertyFieldName(final A propertyEnum, final ComparisonNode node) {
|
||||
String finalProperty = propertyEnum.getFieldName();
|
||||
|
||||
final String[] graph = node.getSelector().split("\\" + FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR);
|
||||
|
||||
validateMapParamter(propertyEnum, node, graph);
|
||||
@@ -215,9 +214,12 @@ public final class RSQLUtility {
|
||||
throw createRSQLParameterUnsupportedException(node);
|
||||
}
|
||||
|
||||
final StringBuilder fieldNameBuilder = new StringBuilder(propertyEnum.getFieldName());
|
||||
|
||||
for (int i = 1; i < graph.length; i++) {
|
||||
|
||||
final String propertyField = graph[i];
|
||||
finalProperty += FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR + propertyField;
|
||||
fieldNameBuilder.append(SUB_ATTRIBUTE_SEPERATOR).append(propertyField);
|
||||
|
||||
// the key of map is not in the graph
|
||||
if (propertyEnum.isMap() && graph.length == (i + 1)) {
|
||||
@@ -229,7 +231,7 @@ public final class RSQLUtility {
|
||||
}
|
||||
}
|
||||
|
||||
return finalProperty;
|
||||
return fieldNameBuilder.toString();
|
||||
}
|
||||
|
||||
private void validateMapParamter(final A propertyEnum, final ComparisonNode node, final String[] graph) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.hawkbit.repository.DistributionSetAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.exception.DistributionSetTypeUndefinedException;
|
||||
import org.eclipse.hawkbit.repository.exception.EntityAlreadyExistsException;
|
||||
@@ -197,7 +198,7 @@ public class DistributionSetManagementTest extends AbstractJpaIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Verfies that a DS is of default type if not specified explicitly at creation time.")
|
||||
@Description("Verifies that a DS is of default type if not specified explicitly at creation time.")
|
||||
public void createDistributionSetWithImplicitType() {
|
||||
final DistributionSet set = distributionSetManagement
|
||||
.createDistributionSet(new JpaDistributionSet("newtypesoft", "1", "", null, null));
|
||||
@@ -208,7 +209,7 @@ public class DistributionSetManagementTest extends AbstractJpaIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Verfies that multiple DS are of default type if not specified explicitly at creation time.")
|
||||
@Description("Verifies that multiple DS are of default type if not specified explicitly at creation time.")
|
||||
public void createMultipleDistributionSetsWithImplicitType() {
|
||||
|
||||
List<DistributionSet> sets = new ArrayList<>();
|
||||
@@ -228,7 +229,7 @@ public class DistributionSetManagementTest extends AbstractJpaIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Verfies that a DS entity cannot be used for creation.")
|
||||
@Description("Verifies that a DS entity cannot be used for creation.")
|
||||
public void createDistributionSetFailsOnExistingEntity() {
|
||||
final DistributionSet set = distributionSetManagement
|
||||
.createDistributionSet(new JpaDistributionSet("newtypesoft", "1", "", null, null));
|
||||
@@ -818,6 +819,27 @@ public class DistributionSetManagementTest extends AbstractJpaIntegrationTest {
|
||||
.isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Verify that the DistributionSetAssignmentResult not contains already assigned targets.")
|
||||
public void verifyDistributionSetAssignmentResultNotContainsAlreadyAssignedTargets() {
|
||||
DistributionSet dsToTargetAssigned = testdataFactory.createDistributionSet("ds-3");
|
||||
|
||||
// create assigned DS
|
||||
dsToTargetAssigned = distributionSetManagement.findDistributionSetByNameAndVersion(dsToTargetAssigned.getName(),
|
||||
dsToTargetAssigned.getVersion());
|
||||
final Target target = new JpaTarget("4712");
|
||||
final Target savedTarget = targetManagement.createTarget(target);
|
||||
final List<Target> toAssign = Lists.newArrayList(savedTarget);
|
||||
DistributionSetAssignmentResult assignmentResult = deploymentManagement
|
||||
.assignDistributionSet(dsToTargetAssigned, toAssign);
|
||||
assertThat(assignmentResult.getAssignedEntity()).hasSize(1);
|
||||
|
||||
assignmentResult = deploymentManagement.assignDistributionSet(dsToTargetAssigned, toAssign);
|
||||
assertThat(assignmentResult.getAssignedEntity()).hasSize(0);
|
||||
|
||||
assertThat(distributionSetRepository.findAll()).hasSize(1);
|
||||
}
|
||||
|
||||
private Rollout createRolloutByVariables(final String rolloutName, final String rolloutDescription,
|
||||
final int groupSize, final String filterQuery, final DistributionSet distributionSet,
|
||||
final String successCondition, final String errorCondition) {
|
||||
|
||||
@@ -9,11 +9,24 @@
|
||||
package org.eclipse.hawkbit.rest.util;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.net.HttpHeaders.ACCEPT_RANGES;
|
||||
import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION;
|
||||
import static com.google.common.net.HttpHeaders.CONTENT_LENGTH;
|
||||
import static com.google.common.net.HttpHeaders.CONTENT_RANGE;
|
||||
import static com.google.common.net.HttpHeaders.ETAG;
|
||||
import static com.google.common.net.HttpHeaders.IF_RANGE;
|
||||
import static com.google.common.net.HttpHeaders.LAST_MODIFIED;
|
||||
import static java.math.RoundingMode.DOWN;
|
||||
import static javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT;
|
||||
import static org.eclipse.hawkbit.rest.util.ByteRange.MULTIPART_BOUNDARY;
|
||||
import static org.springframework.http.HttpStatus.OK;
|
||||
import static org.springframework.http.HttpStatus.PARTIAL_CONTENT;
|
||||
import static org.springframework.http.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE;
|
||||
import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -27,23 +40,19 @@ import org.eclipse.hawkbit.repository.model.ActionStatus;
|
||||
import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import com.google.common.math.DoubleMath;
|
||||
import com.google.common.net.HttpHeaders;
|
||||
|
||||
/**
|
||||
* Utility class for the Rest Source API.
|
||||
*
|
||||
*/
|
||||
public final class RestResourceConversionHelper {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(RestResourceConversionHelper.class);
|
||||
|
||||
private static final int BUFFER_SIZE = 4096;
|
||||
|
||||
// utility class, private constructor.
|
||||
private RestResourceConversionHelper() {
|
||||
|
||||
}
|
||||
@@ -92,7 +101,8 @@ public final class RestResourceConversionHelper {
|
||||
*
|
||||
* @return http code
|
||||
*
|
||||
* @see https://tools.ietf.org/html/rfc7233
|
||||
* @see <a href="https://tools.ietf.org/html/rfc7233">https://tools.ietf.org
|
||||
* /html/rfc7233</a>
|
||||
*/
|
||||
public static ResponseEntity<InputStream> writeFileResponse(final LocalArtifact artifact,
|
||||
final HttpServletResponse response, final HttpServletRequest request, final DbArtifact file,
|
||||
@@ -107,11 +117,11 @@ public final class RestResourceConversionHelper {
|
||||
|
||||
response.reset();
|
||||
response.setBufferSize(BUFFER_SIZE);
|
||||
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFilename());
|
||||
response.setHeader(HttpHeaders.ETAG, etag);
|
||||
response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
|
||||
response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||
response.setHeader(CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFilename());
|
||||
response.setHeader(ETAG, etag);
|
||||
response.setHeader(ACCEPT_RANGES, "bytes");
|
||||
response.setDateHeader(LAST_MODIFIED, lastModified);
|
||||
response.setContentType(APPLICATION_OCTET_STREAM_VALUE);
|
||||
|
||||
final ByteRange full = new ByteRange(0, length - 1, length);
|
||||
final List<ByteRange> ranges = new ArrayList<>();
|
||||
@@ -123,9 +133,9 @@ public final class RestResourceConversionHelper {
|
||||
|
||||
// Range header matches"bytes=n-n,n-n,n-n..."
|
||||
if (!range.matches("^bytes=\\d*-\\d*(,\\d*-\\d*)*$")) {
|
||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes */" + length);
|
||||
response.setHeader(CONTENT_RANGE, "bytes */" + length);
|
||||
LOG.debug("range header for filename ({}) is not satisfiable: ", artifact.getFilename());
|
||||
return new ResponseEntity<>(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||
return new ResponseEntity<>(REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||
}
|
||||
|
||||
// RFC: if the representation is unchanged, send me the part(s) that
|
||||
@@ -144,32 +154,31 @@ public final class RestResourceConversionHelper {
|
||||
// full request - no range
|
||||
if (ranges.isEmpty() || ranges.get(0).equals(full)) {
|
||||
LOG.debug("filename ({}) results into a full request: ", artifact.getFilename());
|
||||
fullfileRequest(artifact, response, file, controllerManagement, statusId, full);
|
||||
result = new ResponseEntity<>(HttpStatus.OK);
|
||||
handleFullFileRequest(artifact, response, file, controllerManagement, statusId, full);
|
||||
result = new ResponseEntity<>(OK);
|
||||
}
|
||||
// standard range request
|
||||
else if (ranges.size() == 1) {
|
||||
LOG.debug("filename ({}) results into a standard range request: ", artifact.getFilename());
|
||||
standardRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||
result = new ResponseEntity<>(HttpStatus.PARTIAL_CONTENT);
|
||||
handleStandardRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||
result = new ResponseEntity<>(PARTIAL_CONTENT);
|
||||
}
|
||||
// multipart range request
|
||||
else {
|
||||
LOG.debug("filename ({}) results into a multipart range request: ", artifact.getFilename());
|
||||
multipartRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||
result = new ResponseEntity<>(HttpStatus.PARTIAL_CONTENT);
|
||||
handleMultipartRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||
result = new ResponseEntity<>(PARTIAL_CONTENT);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
private static void fullfileRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
private static void handleFullFileRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||
final ByteRange full) {
|
||||
final ByteRange r = full;
|
||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||
response.setHeader(CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||
response.setHeader(CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||
|
||||
try {
|
||||
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
||||
@@ -182,7 +191,7 @@ public final class RestResourceConversionHelper {
|
||||
|
||||
private static ResponseEntity<InputStream> extractRange(final HttpServletResponse response, final long length,
|
||||
final List<ByteRange> ranges, final String range) {
|
||||
ResponseEntity<InputStream> result = null;
|
||||
|
||||
if (ranges.isEmpty()) {
|
||||
for (final String part : range.substring(6).split(",")) {
|
||||
long start = sublong(part, 0, part.indexOf('-'));
|
||||
@@ -198,9 +207,8 @@ public final class RestResourceConversionHelper {
|
||||
// Check if Range is syntactically valid. If not, then return
|
||||
// 416.
|
||||
if (start > end) {
|
||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes */" + length);
|
||||
result = new ResponseEntity<>(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||
return result;
|
||||
response.setHeader(CONTENT_RANGE, "bytes */" + length);
|
||||
return new ResponseEntity<>(REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||
}
|
||||
|
||||
// Add range.
|
||||
@@ -218,10 +226,10 @@ public final class RestResourceConversionHelper {
|
||||
|
||||
private static void checkForShortcut(final HttpServletRequest request, final String etag, final long lastModified,
|
||||
final ByteRange full, final List<ByteRange> ranges) {
|
||||
final String ifRange = request.getHeader(HttpHeaders.IF_RANGE);
|
||||
final String ifRange = request.getHeader(IF_RANGE);
|
||||
if (ifRange != null && !ifRange.equals(etag)) {
|
||||
try {
|
||||
final long ifRangeTime = request.getDateHeader(HttpHeaders.IF_RANGE);
|
||||
final long ifRangeTime = request.getDateHeader(IF_RANGE);
|
||||
if (ifRangeTime != -1 && ifRangeTime + 1000 < lastModified) {
|
||||
ranges.add(full);
|
||||
}
|
||||
@@ -232,17 +240,17 @@ public final class RestResourceConversionHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private static void multipartRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
private static void handleMultipartRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||
final List<ByteRange> ranges) {
|
||||
response.setContentType("multipart/byteranges; boundary=" + ByteRange.MULTIPART_BOUNDARY);
|
||||
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
|
||||
response.setContentType("multipart/byteranges; boundary=" + MULTIPART_BOUNDARY);
|
||||
response.setStatus(SC_PARTIAL_CONTENT);
|
||||
|
||||
try {
|
||||
for (final ByteRange r : ranges) {
|
||||
// Add multipart boundary and header fields for every range.
|
||||
response.getOutputStream().println();
|
||||
response.getOutputStream().println("--" + ByteRange.MULTIPART_BOUNDARY);
|
||||
response.getOutputStream().println("--" + MULTIPART_BOUNDARY);
|
||||
response.getOutputStream()
|
||||
.println("Content-Range: bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||
|
||||
@@ -253,20 +261,20 @@ public final class RestResourceConversionHelper {
|
||||
|
||||
// End with final multipart boundary.
|
||||
response.getOutputStream().println();
|
||||
response.getOutputStream().print("--" + ByteRange.MULTIPART_BOUNDARY + "--");
|
||||
response.getOutputStream().print("--" + MULTIPART_BOUNDARY + "--");
|
||||
} catch (final IOException e) {
|
||||
LOG.error("multipartRangeRequest of file ({}) failed!", artifact.getFilename(), e);
|
||||
throw new FileSteamingFailedException(artifact.getFilename());
|
||||
}
|
||||
}
|
||||
|
||||
private static void standardRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
private static void handleStandardRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||
final List<ByteRange> ranges) {
|
||||
final ByteRange r = ranges.get(0);
|
||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
|
||||
response.setHeader(CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||
response.setHeader(CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||
response.setStatus(SC_PARTIAL_CONTENT);
|
||||
|
||||
try {
|
||||
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
||||
@@ -315,7 +323,7 @@ public final class RestResourceConversionHelper {
|
||||
}
|
||||
|
||||
if (controllerManagement != null) {
|
||||
final int newPercent = DoubleMath.roundToInt(total * 100.0 / length, RoundingMode.DOWN);
|
||||
final int newPercent = DoubleMath.roundToInt(total * 100.0 / length, DOWN);
|
||||
|
||||
// every 10 percent an event
|
||||
if (newPercent == 100 || newPercent > progressPercent + 10) {
|
||||
|
||||
@@ -100,7 +100,8 @@ public class DosFilter extends OncePerRequestFilter {
|
||||
|
||||
boolean processChain;
|
||||
|
||||
final String ip = IpUtil.getClientIpFromRequest(request, forwardHeader, true).getHost();
|
||||
final String ip = IpUtil.getClientIpFromRequest(request, forwardHeader).getHost();
|
||||
|
||||
if (checkIpFails(ip)) {
|
||||
processChain = handleMissingIpAddress(response);
|
||||
} else {
|
||||
@@ -121,7 +122,6 @@ public class DosFilter extends OncePerRequestFilter {
|
||||
if (processChain) {
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -44,7 +44,7 @@ public final class IpUtil {
|
||||
* {@link HttpServletRequest} by either the
|
||||
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
||||
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
||||
*
|
||||
*
|
||||
* @param request
|
||||
* the {@link HttpServletRequest} to determine the IP address
|
||||
* where this request has been sent from
|
||||
@@ -65,21 +65,23 @@ public final class IpUtil {
|
||||
* {@link HttpServletRequest} by either the
|
||||
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
||||
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
||||
*
|
||||
*
|
||||
* @param request
|
||||
* the {@link HttpServletRequest} to determine the IP address
|
||||
* where this request has been sent from
|
||||
* @param forwardHeader
|
||||
* the header name containing the IP address e.g. forwarded by a
|
||||
* proxy {@code x-forwarded-for}
|
||||
*
|
||||
* @param trackRemoteIp
|
||||
* to <code>true</code> if remote IP should be tracked.
|
||||
* @return the {@link URI} based IP address from the client which sent the
|
||||
* request
|
||||
*/
|
||||
public static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader,
|
||||
public static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader) {
|
||||
return getClientIpFromRequest(request, forwardHeader, true);
|
||||
}
|
||||
|
||||
private static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader,
|
||||
final boolean trackRemoteIp) {
|
||||
|
||||
String ip;
|
||||
|
||||
if (trackRemoteIp) {
|
||||
@@ -113,7 +115,7 @@ public final class IpUtil {
|
||||
|
||||
/**
|
||||
* Create a {@link URI} with scheme and host.
|
||||
*
|
||||
*
|
||||
* @param scheme
|
||||
* the scheme
|
||||
* @param host
|
||||
@@ -132,7 +134,7 @@ public final class IpUtil {
|
||||
|
||||
/**
|
||||
* Create a {@link URI} with amqp scheme and host.
|
||||
*
|
||||
*
|
||||
* @param host
|
||||
* the host
|
||||
* @param exchange
|
||||
@@ -147,7 +149,7 @@ public final class IpUtil {
|
||||
|
||||
/**
|
||||
* Create a {@link URI} with http scheme and host.
|
||||
*
|
||||
*
|
||||
* @param host
|
||||
* the host
|
||||
* @return the {@link URI}
|
||||
@@ -160,7 +162,7 @@ public final class IpUtil {
|
||||
|
||||
/**
|
||||
* Check if scheme contains http and uri ist not <code>null</code>.
|
||||
*
|
||||
*
|
||||
* @param uri
|
||||
* the uri
|
||||
* @return true = is http host false = not
|
||||
@@ -171,7 +173,7 @@ public final class IpUtil {
|
||||
|
||||
/**
|
||||
* Check if host scheme amqp and uri ist not <code>null</code>.
|
||||
*
|
||||
*
|
||||
* @param uri
|
||||
* the uri
|
||||
* @return true = is http host false = not
|
||||
@@ -183,7 +185,7 @@ public final class IpUtil {
|
||||
/**
|
||||
* Check if the IP address of that {@link URI} is known, i.e. not an AQMP
|
||||
* exchange in DMF case and not HIDDEN_IP in DDI case.
|
||||
*
|
||||
*
|
||||
* @param uri
|
||||
* the uri
|
||||
* @return <code>true</code> if IP address is actually known by the server
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.util;
|
||||
|
||||
import static com.google.common.net.HttpHeaders.X_FORWARDED_FOR;
|
||||
import static org.fest.assertions.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
@@ -21,13 +22,13 @@ import java.net.URI;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.eclipse.hawkbit.security.HawkbitSecurityProperties;
|
||||
import org.eclipse.hawkbit.security.HawkbitSecurityProperties.Clients;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
|
||||
import com.google.common.net.HttpHeaders;
|
||||
|
||||
import ru.yandex.qatools.allure.annotations.Description;
|
||||
import ru.yandex.qatools.allure.annotations.Features;
|
||||
import ru.yandex.qatools.allure.annotations.Stories;
|
||||
@@ -37,69 +38,73 @@ import ru.yandex.qatools.allure.annotations.Stories;
|
||||
@Stories("IP Util Test")
|
||||
public class IpUtilTest {
|
||||
|
||||
private static final String KNOWN_REQUEST_HEADER = "bumlux";
|
||||
|
||||
@Mock
|
||||
private HttpServletRequest requestMock;
|
||||
|
||||
@Mock
|
||||
private Clients clientMock;
|
||||
|
||||
@Mock
|
||||
private HawkbitSecurityProperties securityPropertyMock;
|
||||
|
||||
@Test
|
||||
@Description("Tests create uri from request")
|
||||
public void getRemoteAddrFromRequestIfForwaredHeaderNotPresent() {
|
||||
// known values
|
||||
|
||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("127.0.0.1");
|
||||
// mock
|
||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(null);
|
||||
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(null);
|
||||
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
||||
|
||||
// test
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "bumlux", true);
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, KNOWN_REQUEST_HEADER);
|
||||
|
||||
// verify
|
||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||
.isEqualTo(knownRemoteClientIP);
|
||||
verify(requestMock, times(1)).getHeader("bumlux");
|
||||
verify(requestMock, times(1)).getHeader(KNOWN_REQUEST_HEADER);
|
||||
verify(requestMock, times(1)).getRemoteAddr();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Tests create uri from request with masked IP when IP tracking is disabled")
|
||||
public void maskRemoteAddrIfDisabled() {
|
||||
// known values
|
||||
|
||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("***");
|
||||
// mock
|
||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(null);
|
||||
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(null);
|
||||
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
||||
when(securityPropertyMock.getClients()).thenReturn(clientMock);
|
||||
when(clientMock.getRemoteIpHeader()).thenReturn(KNOWN_REQUEST_HEADER);
|
||||
when(clientMock.isTrackRemoteIp()).thenReturn(false);
|
||||
|
||||
// test
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "bumlux", false);
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, securityPropertyMock);
|
||||
|
||||
// verify
|
||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||
.isEqualTo(knownRemoteClientIP);
|
||||
verify(requestMock, times(0)).getHeader("bumlux");
|
||||
verify(requestMock, times(0)).getHeader(KNOWN_REQUEST_HEADER);
|
||||
verify(requestMock, times(0)).getRemoteAddr();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Tests create uri from x forward header")
|
||||
public void getRemoteAddrFromXForwardedForHeader() {
|
||||
// known values
|
||||
|
||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("10.99.99.1");
|
||||
// mock
|
||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(knownRemoteClientIP.getHost());
|
||||
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(knownRemoteClientIP.getHost());
|
||||
when(requestMock.getRemoteAddr()).thenReturn(null);
|
||||
|
||||
// test
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "X-Forwarded-For", true);
|
||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "X-Forwarded-For");
|
||||
|
||||
// verify
|
||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||
.isEqualTo(knownRemoteClientIP);
|
||||
verify(requestMock, times(1)).getHeader(HttpHeaders.X_FORWARDED_FOR);
|
||||
verify(requestMock, times(1)).getHeader(X_FORWARDED_FOR);
|
||||
verify(requestMock, times(0)).getRemoteAddr();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description("Tests create http uri ipv4 and ipv6")
|
||||
public void testCreateHttpUri() {
|
||||
|
||||
final String ipv4 = "10.99.99.1";
|
||||
URI httpUri = IpUtil.createHttpUri(ipv4);
|
||||
assertHttpUri(ipv4, httpUri);
|
||||
@@ -111,7 +116,6 @@ public class IpUtilTest {
|
||||
final String ipv6 = "0:0:0:0:0:0:0:1";
|
||||
httpUri = IpUtil.createHttpUri(ipv6);
|
||||
assertHttpUri("[" + ipv6 + "]", httpUri);
|
||||
|
||||
}
|
||||
|
||||
private void assertHttpUri(final String host, final URI httpUri) {
|
||||
@@ -124,6 +128,7 @@ public class IpUtilTest {
|
||||
@Test
|
||||
@Description("Tests create amqp uri ipv4 and ipv6")
|
||||
public void testCreateAmqpUri() {
|
||||
|
||||
final String ipv4 = "10.99.99.1";
|
||||
URI amqpUri = IpUtil.createAmqpUri(ipv4, "path");
|
||||
assertAmqpUri(ipv4, amqpUri);
|
||||
@@ -138,6 +143,7 @@ public class IpUtilTest {
|
||||
}
|
||||
|
||||
private void assertAmqpUri(final String host, final URI amqpUri) {
|
||||
|
||||
assertTrue("The given URI is an AMQP scheme", IpUtil.isAmqpUri(amqpUri));
|
||||
assertFalse("The given URI is not an HTTP scheme", IpUtil.isHttpUri(amqpUri));
|
||||
assertEquals("The given host matches the URI host", host, amqpUri.getHost());
|
||||
@@ -148,17 +154,19 @@ public class IpUtilTest {
|
||||
@Test
|
||||
@Description("Tests create invalid uri")
|
||||
public void testCreateInvalidUri() {
|
||||
|
||||
final String host = "10.99.99.1";
|
||||
final URI testUri = IpUtil.createUri("test", host);
|
||||
|
||||
assertFalse("The given URI is not an AMQP address", IpUtil.isAmqpUri(testUri));
|
||||
assertFalse("The given URI is not an HTTP address", IpUtil.isHttpUri(testUri));
|
||||
assertEquals("The given host matches the URI host", host, testUri.getHost());
|
||||
|
||||
try {
|
||||
IpUtil.createUri(":/", host);
|
||||
fail("Missing expected IllegalArgumentException due invalid URI");
|
||||
} catch (final IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.artifacts.details;
|
||||
|
||||
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
|
||||
import static org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil.isNotNullOrEmpty;
|
||||
import static org.springframework.data.domain.Sort.Direction.ASC;
|
||||
import static org.springframework.data.domain.Sort.Direction.DESC;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -15,7 +20,6 @@ import org.eclipse.hawkbit.repository.ArtifactManagement;
|
||||
import org.eclipse.hawkbit.repository.EntityFactory;
|
||||
import org.eclipse.hawkbit.repository.OffsetBasedPageRequest;
|
||||
import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SpringContextHelper;
|
||||
import org.springframework.data.domain.Page;
|
||||
@@ -39,7 +43,7 @@ public class ArtifactBeanQuery extends AbstractBeanQuery<LocalArtifact> {
|
||||
|
||||
/**
|
||||
* Parametric Constructor.
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* as Def
|
||||
* @param queryConfig
|
||||
@@ -51,18 +55,18 @@ public class ArtifactBeanQuery extends AbstractBeanQuery<LocalArtifact> {
|
||||
*/
|
||||
public ArtifactBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||
final Object[] sortIds, final boolean[] sortStates) {
|
||||
|
||||
super(definition, queryConfig, sortIds, sortStates);
|
||||
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (isNotNullOrEmpty(queryConfig)) {
|
||||
baseSwModuleId = (Long) queryConfig.get(SPUIDefinitions.BY_BASE_SOFTWARE_MODULE);
|
||||
}
|
||||
|
||||
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
|
||||
// Initalize Sor
|
||||
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortIds[0]);
|
||||
// Add sort.
|
||||
if (!isEmpty(sortStates)) {
|
||||
sort = new Sort(sortStates[0] ? ASC : DESC, (String) sortIds[0]);
|
||||
|
||||
for (int targetId = 1; targetId < sortIds.length; targetId++) {
|
||||
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC, (String) sortIds[targetId]));
|
||||
sort.and(new Sort(sortStates[targetId] ? ASC : DESC, (String) sortIds[targetId]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
||||
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
@@ -149,8 +150,8 @@ public class ArtifactDetailsLayout extends VerticalLayout {
|
||||
final SoftwareModule softwareModule = artifactUploadState.getSelectedBaseSoftwareModule().get();
|
||||
labelStr = HawkbitCommonUtil.getFormattedNameVersion(softwareModule.getName(), softwareModule.getVersion());
|
||||
}
|
||||
titleOfArtifactDetails = SPUIComponentProvider.getLabel(
|
||||
HawkbitCommonUtil.getArtifactoryDetailsLabelId(labelStr), SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
titleOfArtifactDetails = new LabelBuilder().name(HawkbitCommonUtil.getArtifactoryDetailsLabelId(labelStr))
|
||||
.buildCaptionLabel();
|
||||
titleOfArtifactDetails.setContentMode(ContentMode.HTML);
|
||||
titleOfArtifactDetails.setSizeFull();
|
||||
titleOfArtifactDetails.setImmediate(true);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.artifacts.event;
|
||||
|
||||
/**
|
||||
*
|
||||
* Holds the upload file status.
|
||||
@@ -14,24 +15,36 @@ package org.eclipse.hawkbit.ui.artifacts.event;
|
||||
*/
|
||||
public class UploadStatusEvent {
|
||||
|
||||
/**
|
||||
* Event type definition of events during the artifact upload life-cycle
|
||||
* from receiving the upload until the process end.
|
||||
*/
|
||||
public enum UploadStatusEventType {
|
||||
UPLOAD_FAILED, UPLOAD_IN_PROGRESS, UPLOAD_STARTED, UPLOAD_FINISHED, UPLOAD_SUCCESSFUL, UPLOAD_STREAMING_FAILED, UPLOAD_STREAMING_FINISHED, ABORT_UPLOAD
|
||||
RECEIVE_UPLOAD, UPLOAD_FAILED, UPLOAD_IN_PROGRESS, UPLOAD_STARTED, UPLOAD_FINISHED, UPLOAD_SUCCESSFUL, UPLOAD_STREAMING_FAILED, UPLOAD_STREAMING_FINISHED, ABORT_UPLOAD
|
||||
}
|
||||
|
||||
private UploadStatusEventType uploadProgressEventType;
|
||||
private final UploadStatusEventType uploadProgressEventType;
|
||||
|
||||
private UploadFileStatus uploadStatus;
|
||||
|
||||
public UploadStatusEvent(UploadStatusEventType eventType, UploadFileStatus entity) {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param eventType
|
||||
* the type of the event
|
||||
* @param uploadStatus
|
||||
* the upload status of this event
|
||||
*/
|
||||
public UploadStatusEvent(final UploadStatusEventType eventType, final UploadFileStatus uploadStatus) {
|
||||
this.uploadProgressEventType = eventType;
|
||||
this.uploadStatus = entity;
|
||||
this.uploadStatus = uploadStatus;
|
||||
}
|
||||
|
||||
public UploadFileStatus getUploadStatus() {
|
||||
return uploadStatus;
|
||||
}
|
||||
|
||||
public void setUploadStatus(UploadFileStatus uploadStatus) {
|
||||
public void setUploadStatus(final UploadFileStatus uploadStatus) {
|
||||
this.uploadStatus = uploadStatus;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ public class BaseSwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSoftwareMo
|
||||
|
||||
/**
|
||||
* Parametric Constructor.
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* as Def
|
||||
* @param queryConfig
|
||||
@@ -56,7 +56,7 @@ public class BaseSwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSoftwareMo
|
||||
public BaseSwModuleBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||
final Object[] sortIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortIds, sortStates);
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(queryConfig)) {
|
||||
type = (SoftwareModuleType) queryConfig.get(SPUIDefinitions.BY_SOFTWARE_MODULE_TYPE);
|
||||
searchText = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_TEXT);
|
||||
if (!Strings.isNullOrEmpty(searchText)) {
|
||||
|
||||
@@ -18,9 +18,11 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.SoftwareModuleTypeBeanQuery;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
@@ -118,26 +120,17 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se
|
||||
}
|
||||
|
||||
private void createRequiredComponents() {
|
||||
/* name textfield */
|
||||
nameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY,
|
||||
true, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
nameTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_NAME);
|
||||
|
||||
/* version text field */
|
||||
versionTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.version"), "",
|
||||
ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("textfield.version"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
versionTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_VERSION);
|
||||
nameTextField = createTextField("textfield.name", SPUIComponentIdProvider.SOFT_MODULE_NAME);
|
||||
|
||||
/* Vendor text field */
|
||||
vendorTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.vendor"), "", ValoTheme.TEXTFIELD_TINY,
|
||||
false, null, i18n.get("textfield.vendor"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
vendorTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_VENDOR);
|
||||
versionTextField = createTextField("textfield.version", SPUIComponentIdProvider.SOFT_MODULE_VERSION);
|
||||
|
||||
descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style",
|
||||
ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"),
|
||||
SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
descTextArea.setId(SPUIComponentIdProvider.ADD_SW_MODULE_DESCRIPTION);
|
||||
vendorTextField = createTextField("textfield.vendor", SPUIComponentIdProvider.SOFT_MODULE_VENDOR);
|
||||
vendorTextField.setRequired(false);
|
||||
|
||||
descTextArea = new TextAreaBuilder().caption(i18n.get("textfield.description")).style("text-area-style")
|
||||
.prompt(i18n.get("textfield.description")).id(SPUIComponentIdProvider.ADD_SW_MODULE_DESCRIPTION)
|
||||
.buildTextComponent();
|
||||
|
||||
typeComboBox = SPUIComponentProvider.getComboBox(i18n.get("upload.swmodule.type"), "", "", null, null, true,
|
||||
null, i18n.get("upload.swmodule.type"));
|
||||
@@ -148,6 +141,11 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se
|
||||
populateTypeNameCombo();
|
||||
}
|
||||
|
||||
private TextField createTextField(final String in18Key, final String id) {
|
||||
return new TextFieldBuilder().caption(i18n.get(in18Key)).required(true).prompt(i18n.get(in18Key))
|
||||
.immediate(true).id(id).buildTextComponent();
|
||||
}
|
||||
|
||||
private void populateTypeNameCombo() {
|
||||
typeComboBox.setContainerDataSource(HawkbitCommonUtil.createLazyQueryContainer(
|
||||
new BeanQueryFactory<SoftwareModuleTypeBeanQuery>(SoftwareModuleTypeBeanQuery.class)));
|
||||
@@ -181,8 +179,11 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se
|
||||
|
||||
setCompositionRoot(formLayout);
|
||||
|
||||
window = SPUIWindowDecorator.getWindow(i18n.get("upload.caption.add.new.swmodule"), null,
|
||||
SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveOrUpdate(), null, null, formLayout, i18n);
|
||||
window = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW)
|
||||
.caption(i18n.get("upload.caption.add.new.swmodule")).content(this)
|
||||
.saveButtonClickListener(event -> saveOrUpdate()).layout(formLayout).i18n(i18n)
|
||||
.buildCommonDialogWindow();
|
||||
|
||||
window.getButtonsLayout().removeStyleName("actionButtonsMargin");
|
||||
|
||||
nameTextField.setEnabled(!editSwModule);
|
||||
|
||||
@@ -40,7 +40,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||
import com.vaadin.data.Container;
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
@@ -52,8 +51,8 @@ import com.vaadin.ui.UI;
|
||||
/**
|
||||
* Header of Software module table.
|
||||
*/
|
||||
@SpringComponent
|
||||
@ViewScope
|
||||
@SpringComponent
|
||||
public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModule, Long> {
|
||||
|
||||
private static final long serialVersionUID = 6469417305487144809L;
|
||||
@@ -66,7 +65,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
|
||||
@Autowired
|
||||
private UploadViewAcceptCriteria uploadViewAcceptCriteria;
|
||||
|
||||
|
||||
@Autowired
|
||||
private SwMetadataPopupLayout swMetadataPopupLayout;
|
||||
|
||||
@@ -162,7 +161,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
void onEvent(final UploadArtifactUIEvent event) {
|
||||
if (event == UploadArtifactUIEvent.DELETED_ALL_SOFWARE) {
|
||||
UI.getCurrent().access(() -> refreshFilter());
|
||||
UI.getCurrent().access(this::refreshFilter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,12 +196,12 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
public Object generateCell(final Table source, final Object itemId, final Object columnId) {
|
||||
final String nameVersionStr = getNameAndVerion(itemId);
|
||||
final Button manageMetaDataBtn = createManageMetadataButton(nameVersionStr);
|
||||
manageMetaDataBtn.addClickListener(event -> showMetadataDetails((Long) itemId, nameVersionStr));
|
||||
manageMetaDataBtn.addClickListener(event -> showMetadataDetails((Long) itemId));
|
||||
return manageMetaDataBtn;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected List<TableColumn> getTableVisibleColumns() {
|
||||
final List<TableColumn> columnList = super.getTableVisibleColumns();
|
||||
@@ -215,21 +214,13 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DropHandler getTableDropHandler() {
|
||||
return new DropHandler() {
|
||||
protected AcceptCriterion getDropAcceptCriterion() {
|
||||
return uploadViewAcceptCriteria;
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public AcceptCriterion getAcceptCriterion() {
|
||||
return uploadViewAcceptCriteria;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(final DragAndDropEvent event) {
|
||||
/* Not required */
|
||||
}
|
||||
};
|
||||
@Override
|
||||
protected boolean isDropValid(final DragAndDropEvent dragEvent) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -237,8 +228,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
artifactUploadState.setNoDataAvilableSoftwareModule(!available);
|
||||
}
|
||||
|
||||
|
||||
private Button createManageMetadataButton(String nameVersionStr) {
|
||||
private Button createManageMetadataButton(final String nameVersionStr) {
|
||||
final Button manageMetadataBtn = SPUIComponentProvider.getButton(
|
||||
SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
|
||||
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
|
||||
@@ -246,17 +236,17 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
||||
manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon"));
|
||||
return manageMetadataBtn;
|
||||
}
|
||||
|
||||
|
||||
private String getNameAndVerion(final Object itemId) {
|
||||
final Item item = getItem(itemId);
|
||||
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
||||
final String version = (String) item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).getValue();
|
||||
return name + "." + version;
|
||||
}
|
||||
|
||||
private void showMetadataDetails(Long itemId, String nameVersionStr) {
|
||||
SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
||||
/* display the window */
|
||||
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule,null));
|
||||
|
||||
private void showMetadataDetails(final Long itemId) {
|
||||
final SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
||||
/* display the window */
|
||||
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,9 @@ import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper;
|
||||
import org.eclipse.hawkbit.ui.common.SoftwareModuleTypeBeanQuery;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.layouts.CreateUpdateTypeLayout;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
@@ -35,6 +37,7 @@ import com.vaadin.spring.annotation.ViewScope;
|
||||
import com.vaadin.ui.Button.ClickEvent;
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.OptionGroup;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.components.colorpicker.ColorChangeListener;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
@@ -74,29 +77,28 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout {
|
||||
|
||||
singleAssignStr = i18n.get("label.singleAssign.type");
|
||||
multiAssignStr = i18n.get("label.multiAssign.type");
|
||||
singleAssign = SPUIComponentProvider.getLabel(singleAssignStr, null);
|
||||
multiAssign = SPUIComponentProvider.getLabel(multiAssignStr, null);
|
||||
singleAssign = new LabelBuilder().name(singleAssignStr).buildLabel();
|
||||
|
||||
tagName = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_NAME, true, "", i18n.get("textfield.name"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
tagName.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_NAME);
|
||||
multiAssign = new LabelBuilder().name(multiAssignStr).buildLabel();
|
||||
|
||||
typeKey = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_KEY, true, "", i18n.get("textfield.key"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
typeKey.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_KEY);
|
||||
tagName = createTextField("textfield.name", SPUIDefinitions.TYPE_NAME, SPUIDefinitions.NEW_SOFTWARE_TYPE_NAME);
|
||||
|
||||
tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_DESC, false, "",
|
||||
i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
tagDesc.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_DESC);
|
||||
tagDesc.setImmediate(true);
|
||||
typeKey = createTextField("textfield.key", SPUIDefinitions.TYPE_KEY, SPUIDefinitions.NEW_SOFTWARE_TYPE_KEY);
|
||||
|
||||
tagDesc = new TextAreaBuilder().caption(i18n.get("textfield.description"))
|
||||
.styleName(ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_DESC)
|
||||
.prompt(i18n.get("textfield.description")).immediate(true).id(SPUIDefinitions.NEW_SOFTWARE_TYPE_DESC)
|
||||
.buildTextComponent();
|
||||
tagDesc.setNullRepresentation("");
|
||||
|
||||
singleMultiOptionGroup();
|
||||
}
|
||||
|
||||
private TextField createTextField(final String in18Key, final String styleName, final String id) {
|
||||
return new TextFieldBuilder().caption(i18n.get(in18Key)).styleName(ValoTheme.TEXTFIELD_TINY + " " + styleName)
|
||||
.required(true).prompt(i18n.get(in18Key)).immediate(true).id(id).buildTextComponent();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildLayout() {
|
||||
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.artifacts.upload;
|
||||
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.FAILED;
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.SUCCESS;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -23,6 +26,7 @@ import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.CustomFile;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleTiny;
|
||||
@@ -56,13 +60,13 @@ import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Artifact upload confirmation popup.
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
public class UploadConfirmationWindow implements Button.ClickListener {
|
||||
|
||||
private static final long serialVersionUID = -1679035890140031740L;
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(UploadConfirmationwindow.class);
|
||||
private static final Logger LOG = LoggerFactory.getLogger(UploadConfirmationWindow.class);
|
||||
|
||||
private static final String MD5_CHECKSUM = "md5Checksum";
|
||||
|
||||
@@ -114,13 +118,13 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
|
||||
/**
|
||||
* Initialize the upload confirmation window.
|
||||
*
|
||||
*
|
||||
* @param artifactUploadView
|
||||
* reference of upload layout.
|
||||
* @param artifactUploadState
|
||||
* reference of session variable {@link ArtifactUploadState}.
|
||||
*/
|
||||
public UploadConfirmationwindow(final UploadLayout artifactUploadView,
|
||||
public UploadConfirmationWindow(final UploadLayout artifactUploadView,
|
||||
final ArtifactUploadState artifactUploadState) {
|
||||
this.uploadLayout = artifactUploadView;
|
||||
this.artifactUploadState = artifactUploadState;
|
||||
@@ -245,29 +249,27 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
deleteIcon.setData(itemId);
|
||||
newItem.getItemProperty(ACTION).setValue(deleteIcon);
|
||||
|
||||
final TextField sha1 = SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY, false, null,
|
||||
null, true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
sha1.setId(swNameVersion + "/" + customFile.getFileName() + "/sha1");
|
||||
final TextField sha1 = createTextField(swNameVersion + "/" + customFile.getFileName() + "/sha1");
|
||||
|
||||
final TextField md5 = SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY, false, null,
|
||||
null, true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
md5.setId(swNameVersion + "/" + customFile.getFileName() + "/md5");
|
||||
final TextField md5 = createTextField(swNameVersion + "/" + customFile.getFileName() + "/md5");
|
||||
|
||||
createTextField(swNameVersion + "/" + customFile.getFileName() + "/customFileName");
|
||||
|
||||
final TextField customFileName = SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY,
|
||||
false, null, null, true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
customFileName.setId(swNameVersion + "/" + customFile.getFileName() + "/customFileName");
|
||||
newItem.getItemProperty(SHA1_CHECKSUM).setValue(sha1);
|
||||
newItem.getItemProperty(MD5_CHECKSUM).setValue(md5);
|
||||
newItem.getItemProperty(CUSTOM_FILE).setValue(customFile);
|
||||
}
|
||||
}
|
||||
|
||||
private static TextField createTextField(final String id) {
|
||||
return new TextFieldBuilder().immediate(true).id(id).buildTextComponent();
|
||||
}
|
||||
|
||||
private void addFileNameLayout(final Item newItem, final String baseSoftwareModuleNameVersion,
|
||||
final String customFileName, final String itemId) {
|
||||
final HorizontalLayout horizontalLayout = new HorizontalLayout();
|
||||
final TextField fileNameTextField = SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY,
|
||||
false, null, null, true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
fileNameTextField.setId(baseSoftwareModuleNameVersion + "/" + customFileName + "/customFileName");
|
||||
final TextField fileNameTextField = createTextField(
|
||||
baseSoftwareModuleNameVersion + "/" + customFileName + "/customFileName");
|
||||
fileNameTextField.setData(baseSoftwareModuleNameVersion + "/" + customFileName);
|
||||
fileNameTextField.setValue(customFileName);
|
||||
|
||||
@@ -615,6 +617,7 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
|
||||
private void createLocalArtifact(final String itemId, final String filePath,
|
||||
final ArtifactManagement artifactManagement, final SoftwareModule baseSw) {
|
||||
|
||||
final File newFile = new File(filePath);
|
||||
final Item item = tabelContainer.getItem(itemId);
|
||||
final String sha1Checksum = ((TextField) item.getItemProperty(SHA1_CHECKSUM).getValue()).getValue();
|
||||
@@ -624,27 +627,25 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
final String[] itemDet = itemId.split("/");
|
||||
final String swModuleNameVersion = itemDet[0];
|
||||
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = new FileInputStream(newFile);
|
||||
try (FileInputStream fis = new FileInputStream(newFile)) {
|
||||
|
||||
artifactManagement.createLocalArtifact(fis, baseSw.getId(), providedFileName,
|
||||
HawkbitCommonUtil.trimAndNullIfEmpty(md5Checksum),
|
||||
HawkbitCommonUtil.trimAndNullIfEmpty(sha1Checksum), true, customFile.getMimeType());
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.SUCCESS, "");
|
||||
} catch (final FileNotFoundException e) {
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||
} catch (final ArtifactUploadFailedException e) {
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||
} catch (final InvalidSHA1HashException e) {
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||
} catch (final InvalidMD5HashException e) {
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, SUCCESS, "");
|
||||
|
||||
} catch (final ArtifactUploadFailedException | InvalidSHA1HashException | InvalidMD5HashException
|
||||
| FileNotFoundException e) {
|
||||
|
||||
saveUploadStatus(providedFileName, swModuleNameVersion, FAILED, e.getMessage());
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||
|
||||
} catch (final IOException ex) {
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, ex);
|
||||
} finally {
|
||||
closeFileStream(fis, newFile);
|
||||
if (newFile.exists() && !newFile.delete()) {
|
||||
LOG.error("Could not delete temporary file: {}", newFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -659,21 +660,6 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
||||
|
||||
}
|
||||
|
||||
private static void closeFileStream(final FileInputStream fis, final File newFile) {
|
||||
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (final IOException e) {
|
||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||
}
|
||||
}
|
||||
if (newFile.exists() && !newFile.delete()) {
|
||||
LOG.error("Could not delete temporary file: {}", newFile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Table getUploadDetailsTable() {
|
||||
return uploadDetailsTable;
|
||||
}
|
||||
@@ -71,10 +71,10 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
private transient EventBus.SessionEventBus eventBus;
|
||||
private final SoftwareModule selectedSw;
|
||||
private SoftwareModule selectedSwForUpload;
|
||||
private ArtifactUploadState artifactUploadState;
|
||||
private final ArtifactUploadState artifactUploadState;
|
||||
|
||||
UploadHandler(final String fileName, final long fileSize, final UploadLayout view, final long maxSize,
|
||||
final Upload upload, final String mimeType, SoftwareModule selectedSw) {
|
||||
final Upload upload, final String mimeType, final SoftwareModule selectedSw) {
|
||||
super();
|
||||
this.aborted = false;
|
||||
this.fileName = fileName;
|
||||
@@ -142,7 +142,11 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
try {
|
||||
if (view.checkIfSoftwareModuleIsSelected() && !view.checkForDuplicate(fileName, selectedSwForUpload)) {
|
||||
view.increaseNumberOfFileUploadsExpected();
|
||||
return view.saveUploadedFileDetails(fileName, 0, mimeType, selectedSwForUpload);
|
||||
final OutputStream saveUploadedFileDetails = view.saveUploadedFileDetails(fileName, 0, mimeType,
|
||||
selectedSwForUpload);
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.RECEIVE_UPLOAD,
|
||||
new UploadFileStatus(fileName, 0, -1, selectedSwForUpload)));
|
||||
return saveUploadedFileDetails;
|
||||
}
|
||||
} catch (final ArtifactUploadFailedException e) {
|
||||
LOG.error("Atifact upload failed {} ", e);
|
||||
@@ -163,8 +167,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
@Override
|
||||
public void uploadSucceeded(final SucceededEvent event) {
|
||||
LOG.debug("Streaming finished for file :{}", event.getFilename());
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_SUCCESSFUL, new UploadFileStatus(
|
||||
event.getFilename(), 0, event.getLength(), selectedSwForUpload)));
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_SUCCESSFUL,
|
||||
new UploadFileStatus(event.getFilename(), 0, event.getLength(), selectedSwForUpload)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -190,8 +194,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
@Override
|
||||
public void uploadFinished(final FinishedEvent event) {
|
||||
LOG.debug("Upload finished for file :{}", event.getFilename());
|
||||
eventBus.publish(this,
|
||||
new UploadStatusEvent(UploadStatusEventType.UPLOAD_FINISHED, new UploadFileStatus(event.getFilename())));
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_FINISHED,
|
||||
new UploadFileStatus(event.getFilename())));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -202,8 +206,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
@Override
|
||||
public void streamingStarted(final StreamingStartEvent event) {
|
||||
LOG.debug("Streaming started for file :{}", fileName);
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_STARTED, new UploadFileStatus(
|
||||
fileName, 0, 0, selectedSw)));
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_STARTED,
|
||||
new UploadFileStatus(fileName, 0, 0, selectedSw)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -214,8 +218,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
@Override
|
||||
public void uploadStarted(final StartedEvent event) {
|
||||
uploadInterrupted = false;
|
||||
selectedSwForUpload = artifactUploadState.getSelectedBaseSoftwareModule().isPresent() ? artifactUploadState
|
||||
.getSelectedBaseSoftwareModule().get() : null;
|
||||
selectedSwForUpload = artifactUploadState.getSelectedBaseSoftwareModule().isPresent()
|
||||
? artifactUploadState.getSelectedBaseSoftwareModule().get() : null;
|
||||
|
||||
if (view.isSoftwareModuleSelected()) {
|
||||
// single file session
|
||||
@@ -223,9 +227,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
LOG.debug("Upload started for file :{}", event.getFilename());
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_STARTED,
|
||||
new UploadFileStatus(event.getFilename(), 0, 0, selectedSwForUpload)));
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
} else {
|
||||
failureReason = i18n.get("message.upload.failed");
|
||||
upload.interruptUpload();
|
||||
// actual interrupt will happen a bit late so setting the below
|
||||
@@ -291,8 +294,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
interruptFileStreaming();
|
||||
return;
|
||||
}
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_IN_PROGRESS, new UploadFileStatus(
|
||||
fileName, event.getBytesReceived(), event.getContentLength(), selectedSw)));
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_IN_PROGRESS,
|
||||
new UploadFileStatus(fileName, event.getBytesReceived(), event.getContentLength(), selectedSw)));
|
||||
// Logging to solve sonar issue
|
||||
LOG.trace("Streaming in progress for file :{}", event.getFileName());
|
||||
}
|
||||
@@ -332,8 +335,8 @@ public class UploadHandler implements StreamVariable, Receiver, SucceededListene
|
||||
if (failureReason == null) {
|
||||
failureReason = event.getReason().getMessage();
|
||||
}
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_FAILED, new UploadFileStatus(
|
||||
fileName, failureReason, selectedSwForUpload)));
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.UPLOAD_FAILED,
|
||||
new UploadFileStatus(fileName, failureReason, selectedSwForUpload)));
|
||||
if (!aborted) {
|
||||
LOG.info("Upload failed for file :{}", event.getFilename());
|
||||
LOG.info("Upload failed for file :{}", event.getReason());
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadFileStatus;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadStatusEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadStatusEvent.UploadStatusEventType;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
||||
@@ -109,7 +110,7 @@ public class UploadLayout extends VerticalLayout {
|
||||
|
||||
private Button discardBtn;
|
||||
|
||||
private UploadConfirmationwindow currentUploadConfirmationwindow;
|
||||
private UploadConfirmationWindow currentUploadConfirmationwindow;
|
||||
|
||||
private VerticalLayout dropAreaLayout;
|
||||
|
||||
@@ -273,6 +274,10 @@ public class UploadLayout extends VerticalLayout {
|
||||
private void processFile(final Html5File file, final SoftwareModule selectedSw) {
|
||||
if (!isDirectory(file)) {
|
||||
if (!checkForDuplicate(file.getFileName(), selectedSw)) {
|
||||
|
||||
eventBus.publish(this, new UploadStatusEvent(UploadStatusEventType.RECEIVE_UPLOAD,
|
||||
new UploadFileStatus(file.getFileName(), 0, -1, selectedSw)));
|
||||
|
||||
artifactUploadState.getNumberOfFileUploadsExpected().incrementAndGet();
|
||||
file.setStreamVariable(createStreamVariable(file, selectedSw));
|
||||
}
|
||||
@@ -634,7 +639,7 @@ public class UploadLayout extends VerticalLayout {
|
||||
if (artifactUploadState.getFileSelected().isEmpty()) {
|
||||
uiNotification.displayValidationError(i18n.get("message.error.noFileSelected"));
|
||||
} else {
|
||||
currentUploadConfirmationwindow = new UploadConfirmationwindow(this, artifactUploadState);
|
||||
currentUploadConfirmationwindow = new UploadConfirmationWindow(this, artifactUploadState);
|
||||
UI.getCurrent().addWindow(currentUploadConfirmationwindow.getUploadConfrimationWindow());
|
||||
setConfirmationPopupHeightWidth(Page.getCurrent().getBrowserWindowWidth(),
|
||||
Page.getCurrent().getBrowserWindowHeight());
|
||||
@@ -656,7 +661,7 @@ public class UploadLayout extends VerticalLayout {
|
||||
return spInfo;
|
||||
}
|
||||
|
||||
void setCurrentUploadConfirmationwindow(final UploadConfirmationwindow currentUploadConfirmationwindow) {
|
||||
void setCurrentUploadConfirmationwindow(final UploadConfirmationWindow currentUploadConfirmationwindow) {
|
||||
this.currentUploadConfirmationwindow = currentUploadConfirmationwindow;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ import javax.annotation.PreDestroy;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadFileStatus;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadStatusEvent;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadStatusEvent.UploadStatusEventType;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
||||
@@ -56,11 +57,7 @@ import elemental.json.JsonValue;
|
||||
|
||||
/**
|
||||
* Shows upload status during upload.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@ViewScope
|
||||
@SpringComponent
|
||||
public class UploadStatusInfoWindow extends Window {
|
||||
@@ -135,26 +132,36 @@ public class UploadStatusInfoWindow extends Window {
|
||||
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
void onEvent(final UploadStatusEvent event) {
|
||||
if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_IN_PROGRESS) {
|
||||
UI.getCurrent().access(
|
||||
() -> updateProgress(event.getUploadStatus().getFileName(), event.getUploadStatus().getBytesRead(),
|
||||
event.getUploadStatus().getContentLength(), event.getUploadStatus().getSoftwareModule()));
|
||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STARTED) {
|
||||
UI.getCurrent().access(() -> onStartOfUpload(event));
|
||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FAILED) {
|
||||
ui.access(() -> uploadFailed(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
||||
.getFailureReason(), event.getUploadStatus().getSoftwareModule()));
|
||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_SUCCESSFUL) {
|
||||
UI.getCurrent().access(
|
||||
() -> uploadSucceeded(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
||||
.getSoftwareModule()));
|
||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FINISHED) {
|
||||
ui.access(() -> uploadSucceeded(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
||||
.getSoftwareModule()));
|
||||
|
||||
final UploadFileStatus uploadStatus = event.getUploadStatus();
|
||||
switch (event.getUploadProgressEventType()) {
|
||||
case UPLOAD_IN_PROGRESS:
|
||||
ui.access(() -> updateProgress(uploadStatus.getFileName(), uploadStatus.getBytesRead(),
|
||||
uploadStatus.getContentLength(), uploadStatus.getSoftwareModule()));
|
||||
break;
|
||||
case UPLOAD_STARTED:
|
||||
ui.access(() -> onStartOfUpload(event));
|
||||
break;
|
||||
case UPLOAD_STREAMING_FAILED:
|
||||
ui.access(() -> uploadFailed(uploadStatus.getFileName(), uploadStatus.getFailureReason(),
|
||||
uploadStatus.getSoftwareModule()));
|
||||
break;
|
||||
case UPLOAD_SUCCESSFUL:
|
||||
// fall through here
|
||||
case UPLOAD_STREAMING_FINISHED:
|
||||
ui.access(() -> uploadSucceeded(uploadStatus.getFileName(), uploadStatus.getSoftwareModule()));
|
||||
break;
|
||||
case RECEIVE_UPLOAD:
|
||||
uploadRecevied(uploadStatus.getFileName(), uploadStatus.getSoftwareModule());
|
||||
break;
|
||||
case UPLOAD_FINISHED:
|
||||
case ABORT_UPLOAD:
|
||||
case UPLOAD_FAILED:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
private void onStartOfUpload(UploadStatusEvent event) {
|
||||
private void onStartOfUpload(final UploadStatusEvent event) {
|
||||
uploadSessionStarted();
|
||||
uploadStarted(event.getUploadStatus().getFileName(), event.getUploadStatus().getSoftwareModule());
|
||||
}
|
||||
@@ -169,19 +176,23 @@ public class UploadStatusInfoWindow extends Window {
|
||||
}
|
||||
|
||||
private void restoreState() {
|
||||
Indexed container = grid.getContainerDataSource();
|
||||
final Indexed container = grid.getContainerDataSource();
|
||||
if (container.getItemIds().isEmpty()) {
|
||||
container.removeAllItems();
|
||||
for (UploadStatusObject statusObject : artifactUploadState.getUploadedFileStatusList()) {
|
||||
Item item = container.addItem(getItemid(statusObject.getFilename(),
|
||||
statusObject.getSelectedSoftwareModule()));
|
||||
for (final UploadStatusObject statusObject : artifactUploadState.getUploadedFileStatusList()) {
|
||||
final Item item = container
|
||||
.addItem(getItemid(statusObject.getFilename(), statusObject.getSelectedSoftwareModule()));
|
||||
item.getItemProperty(REASON).setValue(statusObject.getReason() != null ? statusObject.getReason() : "");
|
||||
item.getItemProperty(STATUS).setValue(statusObject.getStatus());
|
||||
item.getItemProperty(PROGRESS).setValue(statusObject.getProgress());
|
||||
if (statusObject.getStatus() != null) {
|
||||
item.getItemProperty(STATUS).setValue(statusObject.getStatus());
|
||||
}
|
||||
if (statusObject.getProgress() != null) {
|
||||
item.getItemProperty(PROGRESS).setValue(statusObject.getProgress());
|
||||
}
|
||||
item.getItemProperty(FILE_NAME).setValue(statusObject.getFilename());
|
||||
SoftwareModule sw = statusObject.getSelectedSoftwareModule();
|
||||
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(
|
||||
HawkbitCommonUtil.getFormattedNameVersion(sw.getName(), sw.getVersion()));
|
||||
final SoftwareModule sw = statusObject.getSelectedSoftwareModule();
|
||||
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION)
|
||||
.setValue(HawkbitCommonUtil.getFormattedNameVersion(sw.getName(), sw.getVersion()));
|
||||
}
|
||||
if (artifactUploadState.isUploadCompleted()) {
|
||||
minimizeButton.setEnabled(false);
|
||||
@@ -209,7 +220,7 @@ public class UploadStatusInfoWindow extends Window {
|
||||
}
|
||||
|
||||
private Grid createGrid() {
|
||||
Grid statusGrid = new Grid(uploads);
|
||||
final Grid statusGrid = new Grid(uploads);
|
||||
statusGrid.addStyleName(SPUIStyleDefinitions.UPLOAD_STATUS_GRID);
|
||||
statusGrid.setSelectionMode(SelectionMode.NONE);
|
||||
statusGrid.setHeaderVisible(true);
|
||||
@@ -219,7 +230,7 @@ public class UploadStatusInfoWindow extends Window {
|
||||
}
|
||||
|
||||
private IndexedContainer getGridContainer() {
|
||||
IndexedContainer uploadContainer = new IndexedContainer();
|
||||
final IndexedContainer uploadContainer = new IndexedContainer();
|
||||
uploadContainer.addContainerProperty(STATUS, String.class, "Active");
|
||||
uploadContainer.addContainerProperty(FILE_NAME, String.class, null);
|
||||
uploadContainer.addContainerProperty(PROGRESS, Double.class, 0D);
|
||||
@@ -321,72 +332,72 @@ public class UploadStatusInfoWindow extends Window {
|
||||
restoreState();
|
||||
}
|
||||
|
||||
void uploadStarted(final String filename, final SoftwareModule softwareModule) {
|
||||
private void uploadRecevied(final String filename, final SoftwareModule softwareModule) {
|
||||
final Item item = uploads.addItem(getItemid(filename, softwareModule));
|
||||
if (item != null) {
|
||||
item.getItemProperty(FILE_NAME).setValue(filename);
|
||||
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(
|
||||
HawkbitCommonUtil.getFormattedNameVersion(softwareModule.getName(), softwareModule.getVersion()));
|
||||
final UploadStatusObject uploadStatus = new UploadStatusObject(filename, softwareModule);
|
||||
uploadStatus.setStatus("Active");
|
||||
artifactUploadState.getUploadedFileStatusList().add(uploadStatus);
|
||||
}
|
||||
grid.scrollToEnd();
|
||||
UploadStatusObject uploadStatus = new UploadStatusObject(filename, softwareModule);
|
||||
uploadStatus.setStatus("Active");
|
||||
artifactUploadState.getUploadedFileStatusList().add(uploadStatus);
|
||||
}
|
||||
|
||||
void uploadStarted(final String filename, final SoftwareModule softwareModule) {
|
||||
grid.scrollTo(getItemid(filename, softwareModule));
|
||||
}
|
||||
|
||||
void updateProgress(final String filename, final long readBytes, final long contentLength,
|
||||
final SoftwareModule softwareModule) {
|
||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||
double progress = (double) readBytes / (double) contentLength;
|
||||
final double progress = (double) readBytes / (double) contentLength;
|
||||
if (item != null) {
|
||||
item.getItemProperty(PROGRESS).setValue(progress);
|
||||
}
|
||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
||||
.collect(Collectors.toList());
|
||||
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||
if (!uploadStatusObjectList.isEmpty()) {
|
||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
uploadStatusObject.setProgress(progress);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when each file upload is success.
|
||||
*
|
||||
*
|
||||
* @param filename
|
||||
* of the uploaded file.
|
||||
* @param softwareModule
|
||||
* selected software module
|
||||
*/
|
||||
public void uploadSucceeded(final String filename, SoftwareModule softwareModule) {
|
||||
public void uploadSucceeded(final String filename, final SoftwareModule softwareModule) {
|
||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||
String status = "Finished";
|
||||
final String status = "Finished";
|
||||
if (item != null) {
|
||||
item.getItemProperty(STATUS).setValue(status);
|
||||
}
|
||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
||||
.collect(Collectors.toList());
|
||||
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||
if (!uploadStatusObjectList.isEmpty()) {
|
||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
uploadStatusObject.setStatus(status);
|
||||
uploadStatusObject.setProgress(1d);
|
||||
}
|
||||
}
|
||||
|
||||
void uploadFailed(final String filename, final String errorReason, SoftwareModule softwareModule) {
|
||||
void uploadFailed(final String filename, final String errorReason, final SoftwareModule softwareModule) {
|
||||
errorOccured = true;
|
||||
String status = "Failed";
|
||||
final String status = "Failed";
|
||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||
if (item != null) {
|
||||
item.getItemProperty(REASON).setValue(errorReason);
|
||||
item.getItemProperty(STATUS).setValue(status);
|
||||
}
|
||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
||||
.collect(Collectors.toList());
|
||||
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||
if (!uploadStatusObjectList.isEmpty()) {
|
||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||
uploadStatusObject.setStatus(status);
|
||||
uploadStatusObject.setReason(errorReason);
|
||||
}
|
||||
@@ -428,8 +439,8 @@ public class UploadStatusInfoWindow extends Window {
|
||||
return resizeBtn;
|
||||
}
|
||||
|
||||
private void resizeWindow(ClickEvent event) {
|
||||
if (event.getButton().getIcon() == FontAwesome.EXPAND) {
|
||||
private void resizeWindow(final ClickEvent event) {
|
||||
if (FontAwesome.EXPAND.equals(event.getButton().getIcon())) {
|
||||
event.getButton().setIcon(FontAwesome.COMPRESS);
|
||||
setWindowMode(WindowMode.MAXIMIZED);
|
||||
resetColumnWidth();
|
||||
|
||||
@@ -16,15 +16,17 @@ import javax.annotation.PostConstruct;
|
||||
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
|
||||
import org.eclipse.hawkbit.repository.model.MetaData;
|
||||
import org.eclipse.hawkbit.repository.model.NamedVersionedEntity;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -48,7 +50,6 @@ import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.VerticalLayout;
|
||||
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -115,9 +116,11 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
|
||||
public CommonDialogWindow getWindow(final E entity, final M metaData) {
|
||||
selectedEntity = entity;
|
||||
final String nameVersion = HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
|
||||
metadataWindow = SPUIWindowDecorator.getWindow(getMetadataCaption(nameVersion), null,
|
||||
SPUIDefinitions.CUSTOM_METADATA_WINDOW, this, event -> onSave(), event -> onCancel(), null, mainLayout,
|
||||
i18n);
|
||||
|
||||
metadataWindow = new WindowBuilder(SPUIDefinitions.CUSTOM_METADATA_WINDOW)
|
||||
.caption(getMetadataCaption(nameVersion)).content(this).saveButtonClickListener(event -> onSave())
|
||||
.cancelButtonClickListener(event -> onCancel()).layout(mainLayout).i18n(i18n).buildCommonDialogWindow();
|
||||
|
||||
metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID);
|
||||
metadataWindow.setHeight(550, Unit.PIXELS);
|
||||
metadataWindow.setWidth(800, Unit.PIXELS);
|
||||
@@ -204,9 +207,9 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
|
||||
}
|
||||
|
||||
private TextField createKeyTextField() {
|
||||
final TextField keyField = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "",
|
||||
ValoTheme.TEXTFIELD_TINY, true, "", i18n.get("textfield.key"), true, 128);
|
||||
keyField.setId(SPUIComponentIdProvider.METADATA_KEY_FIELD_ID);
|
||||
final TextField keyField = new TextFieldBuilder().caption(i18n.get("textfield.key")).required(true)
|
||||
.prompt(i18n.get("textfield.key")).immediate(true).id(SPUIComponentIdProvider.METADATA_KEY_FIELD_ID)
|
||||
.maxLengthAllowed(128).buildTextComponent();
|
||||
keyField.addTextChangeListener(event -> onKeyChange(event));
|
||||
keyField.setTextChangeEventMode(TextChangeEventMode.EAGER);
|
||||
keyField.setWidth("100%");
|
||||
@@ -214,9 +217,9 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
|
||||
}
|
||||
|
||||
private TextArea createValueTextField() {
|
||||
valueTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.value"), null, ValoTheme.TEXTAREA_TINY,
|
||||
true, null, i18n.get("textfield.value"), 4000);
|
||||
valueTextArea.setId(SPUIComponentIdProvider.METADATA_VALUE_ID);
|
||||
valueTextArea = new TextAreaBuilder().caption(i18n.get("textfield.value")).required(true)
|
||||
.prompt(i18n.get("textfield.value")).immediate(true).id(SPUIComponentIdProvider.METADATA_VALUE_ID)
|
||||
.maxLengthAllowed(4000).buildTextComponent();
|
||||
valueTextArea.setNullRepresentation("");
|
||||
valueTextArea.setSizeFull();
|
||||
valueTextArea.setHeight(100, Unit.PERCENTAGE);
|
||||
@@ -301,7 +304,7 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
return SPUIComponentProvider.getLabel(i18n.get("caption.metadata"), SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return new LabelBuilder().name(i18n.get("caption.metadata")).buildCaptionLabel();
|
||||
}
|
||||
|
||||
private static IndexedContainer getMetadataContainer() {
|
||||
@@ -407,9 +410,9 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
|
||||
|
||||
private String getMetadataCaption(final String nameVersionStr) {
|
||||
final StringBuilder caption = new StringBuilder();
|
||||
caption.append(HawkbitCommonUtil.DIV_DESCRIPTION + i18n.get("caption.metadata.popup") + " "
|
||||
caption.append(HawkbitCommonUtil.DIV_DESCRIPTION_START + i18n.get("caption.metadata.popup") + " "
|
||||
+ HawkbitCommonUtil.getBoldHTMLText(nameVersionStr));
|
||||
caption.append(HawkbitCommonUtil.DIV_CLOSE);
|
||||
caption.append(HawkbitCommonUtil.DIV_DESCRIPTION_END);
|
||||
return caption.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ package org.eclipse.hawkbit.ui.common;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
@@ -70,7 +69,7 @@ import com.vaadin.ui.themes.ValoTheme;
|
||||
* corner and a save and cancel button at the bottom. Is not intended to reuse.
|
||||
*
|
||||
*/
|
||||
public class CommonDialogWindow extends Window implements Serializable {
|
||||
public class CommonDialogWindow extends Window {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
@@ -13,10 +13,6 @@ import com.vaadin.ui.AbstractColorPicker.Coordinates2Color;
|
||||
|
||||
/**
|
||||
* Converts 2d-coordinates to a Color.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class CoordinatesToColor implements Coordinates2Color {
|
||||
|
||||
@@ -30,32 +26,31 @@ public class CoordinatesToColor implements Coordinates2Color {
|
||||
@Override
|
||||
public int[] calculate(final Color color) {
|
||||
final float[] hsv = color.getHSV();
|
||||
final int x = Math.round(hsv[0] * 220f);
|
||||
int y = 0;
|
||||
y = calculateYCoordinateOfColor(hsv);
|
||||
final int x = Math.round(hsv[0] * 220F);
|
||||
final int y = calculateYCoordinateOfColor(hsv);
|
||||
return new int[] { x, y };
|
||||
}
|
||||
|
||||
private Color calculateHSVColor(final int x, final int y) {
|
||||
final float h = x / 220f;
|
||||
float s = 1f;
|
||||
float v = 1f;
|
||||
private static Color calculateHSVColor(final int x, final int y) {
|
||||
final float h = x / 220F;
|
||||
float s = 1F;
|
||||
float v = 1F;
|
||||
if (y < 110) {
|
||||
s = y / 110f;
|
||||
s = y / 110F;
|
||||
} else if (y > 110) {
|
||||
v = 1f - (y - 110f) / 110f;
|
||||
v = 1F - (y - 110F) / 110F;
|
||||
}
|
||||
return new Color(Color.HSVtoRGB(h, s, v));
|
||||
}
|
||||
|
||||
private int calculateYCoordinateOfColor(final float[] hsv) {
|
||||
private static int calculateYCoordinateOfColor(final float[] hsv) {
|
||||
int y;
|
||||
// lower half
|
||||
/* Assuming hsv[] array value will have in the range of 0 to 1 */
|
||||
if (hsv[1] < 1f) {
|
||||
y = Math.round(hsv[1] * 110f);
|
||||
if (hsv[1] < 1F) {
|
||||
y = Math.round(hsv[1] * 110F);
|
||||
} else {
|
||||
y = Math.round(110f - (hsv[1] + hsv[2]) * 110f);
|
||||
y = Math.round(110F - (hsv[1] + hsv[2]) * 110F);
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.builder;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.vaadin.ui.AbstractTextField;
|
||||
|
||||
/**
|
||||
* Abstract Text field builder.
|
||||
*
|
||||
* @param <E>
|
||||
* the concrete text component
|
||||
*/
|
||||
public abstract class AbstractTextFieldBuilder<E extends AbstractTextField> {
|
||||
|
||||
private String caption;
|
||||
private String style;
|
||||
private String styleName;
|
||||
private String prompt;
|
||||
private String id;
|
||||
private boolean immediate;
|
||||
private boolean required;
|
||||
private int maxLengthAllowed;
|
||||
|
||||
/**
|
||||
* @param caption
|
||||
* the caption to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> caption(final String caption) {
|
||||
this.caption = caption;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param style
|
||||
* the style to set * @return the builder
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> style(final String style) {
|
||||
this.style = style;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param styleName
|
||||
* the styleName to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> styleName(final String styleName) {
|
||||
this.styleName = styleName;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param required
|
||||
* the required to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> required(final boolean required) {
|
||||
this.required = required;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param prompt
|
||||
* the prompt to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> prompt(final String prompt) {
|
||||
this.prompt = prompt;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param immediate
|
||||
* the immediate to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> immediate(final boolean immediate) {
|
||||
this.immediate = immediate;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param maxLengthAllowed
|
||||
* the maxLengthAllowed to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> maxLengthAllowed(final int maxLengthAllowed) {
|
||||
this.maxLengthAllowed = maxLengthAllowed;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the id to set
|
||||
* @return the builder
|
||||
*/
|
||||
public AbstractTextFieldBuilder<E> id(final String id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a textfield
|
||||
*
|
||||
* @return textfield
|
||||
*/
|
||||
public E buildTextComponent() {
|
||||
final E textComponent = createTextComponent();
|
||||
|
||||
textComponent.setRequired(required);
|
||||
textComponent.setImmediate(immediate);
|
||||
|
||||
if (StringUtils.isNotEmpty(caption)) {
|
||||
textComponent.setCaption(caption);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(style)) {
|
||||
textComponent.setStyleName(style);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(styleName)) {
|
||||
textComponent.addStyleName(styleName);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(prompt)) {
|
||||
textComponent.setInputPrompt(prompt);
|
||||
}
|
||||
|
||||
if (maxLengthAllowed > 0) {
|
||||
textComponent.setMaxLength(maxLengthAllowed);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(id)) {
|
||||
textComponent.setId(id);
|
||||
}
|
||||
|
||||
return textComponent;
|
||||
}
|
||||
|
||||
protected abstract E createTextComponent();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.builder;
|
||||
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Label Builder.
|
||||
*
|
||||
*/
|
||||
public class LabelBuilder {
|
||||
|
||||
private String name;
|
||||
|
||||
private String id;
|
||||
|
||||
private boolean visible = true;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* the name to set
|
||||
* @return builder
|
||||
*/
|
||||
public LabelBuilder name(final String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the id to set
|
||||
* @return builder
|
||||
*/
|
||||
public LabelBuilder id(final String id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param visible
|
||||
* the visible to set
|
||||
* @return builder
|
||||
*/
|
||||
public LabelBuilder visible(final boolean visible) {
|
||||
this.visible = visible;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build caption label.
|
||||
*
|
||||
* @return Label
|
||||
*/
|
||||
public Label buildCaptionLabel() {
|
||||
final Label label = createLabel();
|
||||
label.setValue(name);
|
||||
label.addStyleName("header-caption");
|
||||
return label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build label.
|
||||
*
|
||||
* @return Label
|
||||
*/
|
||||
public Label buildLabel() {
|
||||
final Label label = createLabel();
|
||||
label.setImmediate(false);
|
||||
label.setWidth("-1px");
|
||||
label.setHeight("-1px");
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
private Label createLabel() {
|
||||
final Label label = new Label(name);
|
||||
label.setVisible(visible);
|
||||
final StringBuilder style = new StringBuilder(ValoTheme.LABEL_SMALL);
|
||||
style.append(' ');
|
||||
style.append(ValoTheme.LABEL_BOLD);
|
||||
label.addStyleName(style.toString());
|
||||
if (id != null) {
|
||||
label.setId(id);
|
||||
}
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.builder;
|
||||
|
||||
import com.vaadin.ui.TextArea;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* TextArea builder.
|
||||
*
|
||||
*/
|
||||
public class TextAreaBuilder extends AbstractTextFieldBuilder<TextArea> {
|
||||
|
||||
private static final int TEXT_AREA_DEFAULT_MAX_LENGTH = 512;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public TextAreaBuilder() {
|
||||
maxLengthAllowed(TEXT_AREA_DEFAULT_MAX_LENGTH);
|
||||
styleName(ValoTheme.TEXTAREA_TINY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TextArea createTextComponent() {
|
||||
final TextArea textArea = new TextArea();
|
||||
textArea.addStyleName(ValoTheme.TEXTAREA_SMALL);
|
||||
return textArea;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.builder;
|
||||
|
||||
import com.vaadin.event.FieldEvents.TextChangeListener;
|
||||
import com.vaadin.server.Sizeable.Unit;
|
||||
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Textfield builder.
|
||||
*
|
||||
*/
|
||||
public class TextFieldBuilder extends AbstractTextFieldBuilder<TextField> {
|
||||
|
||||
private static final int TEXT_FIELD_DEFAULT_MAX_LENGTH = 64;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public TextFieldBuilder() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param id
|
||||
* the id
|
||||
*/
|
||||
public TextFieldBuilder(final String id) {
|
||||
maxLengthAllowed(TEXT_FIELD_DEFAULT_MAX_LENGTH);
|
||||
styleName(ValoTheme.TEXTAREA_TINY);
|
||||
id(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a search text field.
|
||||
*
|
||||
* @param textChangeListener
|
||||
* listener when text is changed.
|
||||
* @return the textfield
|
||||
*/
|
||||
public TextField createSearchField(final TextChangeListener textChangeListener) {
|
||||
final TextField textField = style("filter-box").styleName("text-style filter-box-hide").buildTextComponent();
|
||||
textField.setWidth(100.0F, Unit.PERCENTAGE);
|
||||
textField.addTextChangeListener(textChangeListener);
|
||||
textField.setTextChangeEventMode(TextChangeEventMode.LAZY);
|
||||
// 1 seconds timeout.
|
||||
textField.setTextChangeTimeout(1000);
|
||||
return textField;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TextField createTextComponent() {
|
||||
final TextField textField = new TextField();
|
||||
textField.addStyleName(ValoTheme.TEXTFIELD_SMALL);
|
||||
return textField;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.builder;
|
||||
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.CustomCommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
|
||||
import com.vaadin.ui.AbstractLayout;
|
||||
import com.vaadin.ui.Button.ClickListener;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.Window;
|
||||
|
||||
/**
|
||||
* Builder for Window.
|
||||
*/
|
||||
public class WindowBuilder {
|
||||
|
||||
private String caption;
|
||||
private Component content;
|
||||
private ClickListener saveButtonClickListener;
|
||||
private ClickListener cancelButtonClickListener;
|
||||
private String helpLink;
|
||||
private AbstractLayout layout;
|
||||
private I18N i18n;
|
||||
private final String type;
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param type
|
||||
* window type
|
||||
*/
|
||||
public WindowBuilder(final String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the caption.
|
||||
*
|
||||
* @param caption
|
||||
* the caption
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder caption(final String caption) {
|
||||
this.caption = caption;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the content.
|
||||
*
|
||||
* @param content
|
||||
* the content
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder content(final Component content) {
|
||||
this.content = content;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the saveButtonClickListener.
|
||||
*
|
||||
* @param saveButtonClickListener
|
||||
* the saveButtonClickListener
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder saveButtonClickListener(final ClickListener saveButtonClickListener) {
|
||||
this.saveButtonClickListener = saveButtonClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the cancelButtonClickListener.
|
||||
*
|
||||
* @param cancelButtonClickListener
|
||||
* the cancelButtonClickListener
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder cancelButtonClickListener(final ClickListener cancelButtonClickListener) {
|
||||
this.cancelButtonClickListener = cancelButtonClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the helpLink.
|
||||
*
|
||||
* @param helpLink
|
||||
* the helpLink
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder helpLink(final String helpLink) {
|
||||
this.helpLink = helpLink;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the layout.
|
||||
*
|
||||
* @param layout
|
||||
* the layout
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder layout(final AbstractLayout layout) {
|
||||
this.layout = layout;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the i18n.
|
||||
*
|
||||
* @param i18n
|
||||
* the i18n
|
||||
* @return the window builder
|
||||
*/
|
||||
public WindowBuilder i18n(final I18N i18n) {
|
||||
this.i18n = i18n;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the id to set * @return the window builder
|
||||
*/
|
||||
public WindowBuilder id(final String id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the common dialog window.
|
||||
*
|
||||
* @return the window.
|
||||
*/
|
||||
public CommonDialogWindow buildCommonDialogWindow() {
|
||||
CommonDialogWindow window;
|
||||
|
||||
if (SPUIDefinitions.CUSTOM_METADATA_WINDOW.equals(type)) {
|
||||
window = new CustomCommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
||||
cancelButtonClickListener, layout, i18n);
|
||||
window.setDraggable(true);
|
||||
window.setClosable(true);
|
||||
return window;
|
||||
}
|
||||
window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener, cancelButtonClickListener,
|
||||
layout, i18n);
|
||||
|
||||
decorateWindow(window);
|
||||
|
||||
return window;
|
||||
|
||||
}
|
||||
|
||||
private void decorateWindow(final Window window) {
|
||||
if (id != null) {
|
||||
window.setId(id);
|
||||
}
|
||||
|
||||
if (SPUIDefinitions.CONFIRMATION_WINDOW.equals(type)) {
|
||||
window.setDraggable(false);
|
||||
window.setClosable(true);
|
||||
window.addStyleName(SPUIStyleDefinitions.CONFIRMATION_WINDOW_CAPTION);
|
||||
|
||||
} else if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
||||
window.setDraggable(true);
|
||||
window.setClosable(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build window based on type.
|
||||
*
|
||||
* @return Window
|
||||
*/
|
||||
public Window buildWindow() {
|
||||
final Window window = new Window(caption);
|
||||
window.setContent(content);
|
||||
window.setSizeUndefined();
|
||||
window.setModal(true);
|
||||
window.setResizable(false);
|
||||
|
||||
decorateWindow(window);
|
||||
|
||||
if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
||||
window.setClosable(false);
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import java.util.Map.Entry;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
@@ -51,6 +52,9 @@ public abstract class AbstractConfirmationWindowLayout extends VerticalLayout {
|
||||
@Autowired
|
||||
protected transient EventBus.SessionEventBus eventBus;
|
||||
|
||||
/**
|
||||
* PostConstruct.
|
||||
*/
|
||||
@PostConstruct
|
||||
public void initialize() {
|
||||
removeAllComponents();
|
||||
@@ -65,10 +69,9 @@ public abstract class AbstractConfirmationWindowLayout extends VerticalLayout {
|
||||
}
|
||||
|
||||
private void createActionMessgaeLabel() {
|
||||
actionMessage = SPUIComponentProvider.getLabel("", null);
|
||||
actionMessage = new LabelBuilder().name("").id(SPUIComponentIdProvider.ACTION_LABEL).visible(false)
|
||||
.buildLabel();
|
||||
actionMessage.addStyleName(SPUIStyleDefinitions.CONFIRM_WINDOW_INFO_BOX);
|
||||
actionMessage.setId(SPUIComponentIdProvider.ACTION_LABEL);
|
||||
actionMessage.setVisible(false);
|
||||
}
|
||||
|
||||
private void createAccordian() {
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.repository.model.NamedEntity;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
@@ -25,7 +26,6 @@ import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
@@ -183,7 +183,7 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
return SPUIComponentProvider.getLabel(getDefaultCaption(), SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return new LabelBuilder().name(getDefaultCaption()).buildCaptionLabel();
|
||||
}
|
||||
|
||||
protected VerticalLayout getTabLayout() {
|
||||
|
||||
@@ -33,7 +33,7 @@ import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* DistributionSet Metadata details layout.
|
||||
*
|
||||
*/
|
||||
@@ -44,14 +44,14 @@ public class DistributionSetMetadatadetailslayout extends Table {
|
||||
|
||||
private static final long serialVersionUID = 2913758299611837718L;
|
||||
|
||||
private DistributionSetManagement distributionSetManagement;
|
||||
|
||||
private DsMetadataPopupLayout dsMetadataPopupLayout;
|
||||
|
||||
private static final String METADATA_KEY = "Key";
|
||||
|
||||
private static final String VIEW = "view";
|
||||
|
||||
private transient DistributionSetManagement distributionSetManagement;
|
||||
|
||||
private DsMetadataPopupLayout dsMetadataPopupLayout;
|
||||
|
||||
private SpPermissionChecker permissionChecker;
|
||||
|
||||
private transient EntityFactory entityFactory;
|
||||
@@ -61,7 +61,7 @@ public class DistributionSetMetadatadetailslayout extends Table {
|
||||
private Long selectedDistSetId;
|
||||
|
||||
/**
|
||||
* Initialize the component.
|
||||
*
|
||||
* @param i18n
|
||||
* @param permissionChecker
|
||||
* @param distributionSetManagement
|
||||
@@ -82,7 +82,7 @@ public class DistributionSetMetadatadetailslayout extends Table {
|
||||
|
||||
/**
|
||||
* Populate software module metadata.
|
||||
*
|
||||
*
|
||||
* @param distributionSet
|
||||
*/
|
||||
public void populateDSMetadata(final DistributionSet distributionSet) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.filterlayout;
|
||||
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUIDefinitions.NO_TAG_BUTTON_ID;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -50,7 +52,7 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
|
||||
/**
|
||||
* Initialize layout of filter buttons.
|
||||
*
|
||||
*
|
||||
* @param filterButtonClickBehaviour
|
||||
* click behaviour of filter buttons.
|
||||
*/
|
||||
@@ -95,16 +97,12 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
container.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, null, true, true);
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
protected void addColumn() {
|
||||
addGeneratedColumn(FILTER_BUTTON_COLUMN, (source, itemId, columnId) -> addGeneratedCell(itemId));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param itemId
|
||||
* @return
|
||||
*/
|
||||
private DragAndDropWrapper addGeneratedCell(final Object itemId) {
|
||||
|
||||
final Item item = getItem(itemId);
|
||||
final Long id = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_ID).getValue();
|
||||
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
||||
@@ -116,16 +114,18 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
? item.getItemProperty(SPUILabelDefinitions.VAR_COLOR).getValue().toString() : DEFAULT_GREEN;
|
||||
final Button typeButton = createFilterButton(id, name, desc, color, itemId);
|
||||
typeButton.addClickListener(event -> filterButtonClickBehaviour.processFilterButtonClick(event));
|
||||
if (typeButton.getData().equals(SPUIDefinitions.NO_TAG_BUTTON_ID) && isNoTagSateSelected()) {
|
||||
filterButtonClickBehaviour.setDefaultClickedButton(typeButton);
|
||||
} else if (id != null && isClickedByDefault(name)) {
|
||||
|
||||
if ((NO_TAG_BUTTON_ID.equals(typeButton.getData()) && isNoTagStateSelected())
|
||||
|| (id != null && isClickedByDefault(name))) {
|
||||
|
||||
filterButtonClickBehaviour.setDefaultClickedButton(typeButton);
|
||||
}
|
||||
|
||||
return createDragAndDropWrapper(typeButton, name, id);
|
||||
}
|
||||
|
||||
protected boolean isNoTagSateSelected() {
|
||||
return Boolean.FALSE;
|
||||
protected boolean isNoTagStateSelected() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private DragAndDropWrapper createDragAndDropWrapper(final Button tagButton, final String name, final Long id) {
|
||||
@@ -195,21 +195,21 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
|
||||
/**
|
||||
* Id of the buttons table to be used in test cases.
|
||||
*
|
||||
*
|
||||
* @return Id of the Button table.
|
||||
*/
|
||||
protected abstract String getButtonsTableId();
|
||||
|
||||
/**
|
||||
* create new lazyquery container to display the buttons.
|
||||
*
|
||||
*
|
||||
* @return reference of {@link LazyQueryContainer}
|
||||
*/
|
||||
protected abstract LazyQueryContainer createButtonsLazyQueryContainer();
|
||||
|
||||
/**
|
||||
* Check if button should be displayed as clicked by default.
|
||||
*
|
||||
*
|
||||
* @param buttonCaption
|
||||
* button caption
|
||||
* @return true if button is clicked
|
||||
@@ -218,7 +218,7 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
|
||||
/**
|
||||
* Get filter button Id.
|
||||
*
|
||||
*
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
@@ -226,7 +226,7 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
|
||||
/**
|
||||
* Get Drop Handler for Filter Buttons.
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract DropHandler getFilterButtonDropHandler();
|
||||
@@ -234,14 +234,14 @@ public abstract class AbstractFilterButtons extends Table {
|
||||
/**
|
||||
* Get prefix Id of Button Wrapper to be used for drag and drop, delete and
|
||||
* test cases.
|
||||
*
|
||||
*
|
||||
* @return prefix Id of Button Wrapper
|
||||
*/
|
||||
protected abstract String getButttonWrapperIdPrefix();
|
||||
|
||||
/**
|
||||
* Get info to be set for the button wrapper.
|
||||
*
|
||||
*
|
||||
* @return button wrapper info.
|
||||
*/
|
||||
protected abstract String getButtonWrapperData();
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package org.eclipse.hawkbit.ui.common.filterlayout;
|
||||
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
@@ -91,7 +92,7 @@ public abstract class AbstractFilterHeader extends VerticalLayout {
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
return SPUIComponentProvider.getLabel(getTitle(), SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return new LabelBuilder().name(getTitle()).buildCaptionLabel();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,6 +12,7 @@ import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmall;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
@@ -215,11 +216,10 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
|
||||
if (!hasUnsavedActions()) {
|
||||
return;
|
||||
}
|
||||
unsavedActionsWindow = SPUIComponentProvider.getWindow(getUnsavedActionsWindowCaption(),
|
||||
SPUIComponentIdProvider.SAVE_ACTIONS_POPUP, SPUIDefinitions.CONFIRMATION_WINDOW);
|
||||
unsavedActionsWindow = new WindowBuilder(SPUIDefinitions.CONFIRMATION_WINDOW)
|
||||
.caption(getUnsavedActionsWindowCaption()).id(SPUIComponentIdProvider.CONFIRMATION_POPUP_ID)
|
||||
.content(getUnsavedActionsWindowContent()).buildWindow();
|
||||
unsavedActionsWindow.addCloseListener(event -> unsavedActionsWindowClosed());
|
||||
unsavedActionsWindow.setContent(getUnsavedActionsWindowContent());
|
||||
unsavedActionsWindow.setId(SPUIComponentIdProvider.CONFIRMATION_POPUP_ID);
|
||||
UI.getCurrent().addWindow(unsavedActionsWindow);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,16 +8,15 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common.grid;
|
||||
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
|
||||
import com.vaadin.ui.Alignment;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
@@ -61,7 +60,7 @@ public abstract class AbstractGridHeader extends VerticalLayout {
|
||||
private void createComponents() {
|
||||
headerCaptionLayout = getHeaderCaptionLayout();
|
||||
if (isRollout()) {
|
||||
searchField = createSearchField();
|
||||
searchField = new TextFieldBuilder(getSearchBoxId()).createSearchField(event -> searchBy(event.getText()));
|
||||
searchResetIcon = createSearchResetIcon();
|
||||
addButton = createAddButton();
|
||||
}
|
||||
@@ -92,7 +91,7 @@ public abstract class AbstractGridHeader extends VerticalLayout {
|
||||
addStyleName("no-border-bottom");
|
||||
}
|
||||
|
||||
private HorizontalLayout createHeaderFilterIconLayout() {
|
||||
private static HorizontalLayout createHeaderFilterIconLayout() {
|
||||
final HorizontalLayout titleFilterIconsLayout = new HorizontalLayout();
|
||||
titleFilterIconsLayout.addStyleName(SPUIStyleDefinitions.WIDGET_TITLE);
|
||||
titleFilterIconsLayout.setSpacing(false);
|
||||
@@ -101,17 +100,6 @@ public abstract class AbstractGridHeader extends VerticalLayout {
|
||||
return titleFilterIconsLayout;
|
||||
}
|
||||
|
||||
private TextField createSearchField() {
|
||||
final TextField textField = SPUIComponentProvider.getTextField("", "filter-box", "text-style filter-box-hide",
|
||||
false, "", "", false, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
textField.setId(getSearchBoxId());
|
||||
textField.setWidth(100.0f, Unit.PERCENTAGE);
|
||||
textField.addTextChangeListener(event -> searchBy(event.getText()));
|
||||
textField.setTextChangeEventMode(TextChangeEventMode.LAZY);
|
||||
textField.setTextChangeTimeout(1000);
|
||||
return textField;
|
||||
}
|
||||
|
||||
private SPUIButton createSearchResetIcon() {
|
||||
final SPUIButton button = (SPUIButton) SPUIComponentProvider.getButton(getSearchRestIconId(), "", "", null,
|
||||
false, FontAwesome.SEARCH, SPUIButtonStyleSmallNoBorder.class);
|
||||
|
||||
@@ -15,6 +15,8 @@ import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
||||
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
|
||||
/**
|
||||
* Abstract table to handling {@link NamedVersionedEntity}
|
||||
@@ -54,4 +56,30 @@ public abstract class AbstractNamedVersionTable<E extends NamedVersionedEntity,
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(baseEntity.getVersion());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDropEventFromTable(final DragAndDropEvent event) {
|
||||
// subclass can implement
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDropEventFromWrapper(final DragAndDropEvent event) {
|
||||
// subclass can implement
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasDropPermission() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getDropTableId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean validateDragAndDropWrapper(final DragAndDropWrapper wrapperSource) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -26,13 +26,20 @@ import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
|
||||
import com.google.gwt.thirdparty.guava.common.collect.Iterables;
|
||||
import com.google.gwt.thirdparty.guava.common.collect.Sets;
|
||||
import com.vaadin.data.Container;
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.Transferable;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
import com.vaadin.ui.Table;
|
||||
import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
@@ -51,12 +58,17 @@ public abstract class AbstractTable<E extends NamedEntity, I> extends Table {
|
||||
|
||||
private static final long serialVersionUID = 4856562746502217630L;
|
||||
|
||||
protected static final String ACTION_NOT_ALLOWED_MSG = "message.action.not.allowed";
|
||||
|
||||
@Autowired
|
||||
protected transient EventBus.SessionEventBus eventBus;
|
||||
|
||||
@Autowired
|
||||
protected I18N i18n;
|
||||
|
||||
@Autowired
|
||||
protected UINotification notification;
|
||||
|
||||
/**
|
||||
* Initialize the components.
|
||||
*/
|
||||
@@ -359,12 +371,100 @@ public abstract class AbstractTable<E extends NamedEntity, I> extends Table {
|
||||
return DEFAULT_COLUMN_NAME_MIN_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get drop handler for the table.
|
||||
*
|
||||
* @return reference of {@link DropHandler}
|
||||
*/
|
||||
protected abstract DropHandler getTableDropHandler();
|
||||
private DropHandler getTableDropHandler() {
|
||||
return new DropHandler() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public AcceptCriterion getAcceptCriterion() {
|
||||
return getDropAcceptCriterion();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(final DragAndDropEvent event) {
|
||||
if (!isDropValid(event)) {
|
||||
return;
|
||||
}
|
||||
if (event.getTransferable().getSourceComponent() instanceof Table) {
|
||||
onDropEventFromTable(event);
|
||||
} else if (event.getTransferable().getSourceComponent() instanceof DragAndDropWrapper) {
|
||||
onDropEventFromWrapper(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected Set<I> getDraggedTargetList(final DragAndDropEvent event) {
|
||||
final com.vaadin.event.dd.TargetDetails targetDet = event.getTargetDetails();
|
||||
final Table targetTable = (Table) targetDet.getTarget();
|
||||
final Set<I> targetSelected = getTableValue(targetTable);
|
||||
|
||||
final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails();
|
||||
final Object targetItemId = dropData.getItemIdOver();
|
||||
|
||||
if (!targetSelected.contains(targetItemId)) {
|
||||
return Sets.newHashSet((I) targetItemId);
|
||||
}
|
||||
|
||||
return targetSelected;
|
||||
}
|
||||
|
||||
private Set<Object> getDraggedTargetList(final TableTransferable transferable, final Table source) {
|
||||
@SuppressWarnings("unchecked")
|
||||
final AbstractTable<NamedEntity, Object> table = (AbstractTable<NamedEntity, Object>) source;
|
||||
return table.getDeletedEntityByTransferable(transferable);
|
||||
}
|
||||
|
||||
private boolean validateDropList(final Set<?> droplist) {
|
||||
if (droplist.isEmpty()) {
|
||||
final String actionDidNotWork = i18n.get("message.action.did.not.work", new Object[] {});
|
||||
notification.displayValidationError(actionDidNotWork);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean isDropValid(final DragAndDropEvent dragEvent) {
|
||||
final Transferable transferable = dragEvent.getTransferable();
|
||||
final Component compsource = transferable.getSourceComponent();
|
||||
|
||||
if (!hasDropPermission()) {
|
||||
notification.displayValidationError(i18n.get("message.permission.insufficient"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (compsource instanceof Table) {
|
||||
return validateTable((Table) compsource)
|
||||
&& validateDropList(getDraggedTargetList((TableTransferable) transferable, (Table) compsource));
|
||||
}
|
||||
|
||||
if (compsource instanceof DragAndDropWrapper) {
|
||||
return validateDragAndDropWrapper((DragAndDropWrapper) compsource)
|
||||
&& validateDropList(getDraggedTargetList(dragEvent));
|
||||
}
|
||||
notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG));
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean validateTable(final Table compsource) {
|
||||
if (!compsource.getId().equals(getDropTableId())) {
|
||||
notification.displayValidationError(ACTION_NOT_ALLOWED_MSG);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected abstract boolean hasDropPermission();
|
||||
|
||||
protected abstract boolean validateDragAndDropWrapper(final DragAndDropWrapper wrapperSource);
|
||||
|
||||
protected abstract void onDropEventFromWrapper(DragAndDropEvent event);
|
||||
|
||||
protected abstract void onDropEventFromTable(DragAndDropEvent event);
|
||||
|
||||
protected abstract String getDropTableId();
|
||||
|
||||
protected abstract AcceptCriterion getDropAcceptCriterion();
|
||||
|
||||
protected abstract void setDataAvailable(boolean available);
|
||||
|
||||
|
||||
@@ -12,20 +12,20 @@ import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
|
||||
import com.vaadin.ui.Alignment;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
@@ -86,7 +86,7 @@ public abstract class AbstractTableHeader extends VerticalLayout {
|
||||
|
||||
private void createComponents() {
|
||||
headerCaption = createHeaderCaption();
|
||||
searchField = createSearchField();
|
||||
searchField = new TextFieldBuilder(getSearchBoxId()).createSearchField(event -> searchBy(event.getText()));
|
||||
|
||||
searchResetIcon = createSearchResetIcon();
|
||||
|
||||
@@ -203,21 +203,7 @@ public abstract class AbstractTableHeader extends VerticalLayout {
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
final Label captionLabel = SPUIComponentProvider.getLabel(getHeaderCaption(),
|
||||
SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return captionLabel;
|
||||
}
|
||||
|
||||
private TextField createSearchField() {
|
||||
final TextField textField = SPUIComponentProvider.getTextField("", "filter-box", "text-style filter-box-hide",
|
||||
false, "", "", false, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
textField.setId(getSearchBoxId());
|
||||
textField.setWidth(100.0f, Unit.PERCENTAGE);
|
||||
textField.addTextChangeListener(event -> searchBy(event.getText()));
|
||||
textField.setTextChangeEventMode(TextChangeEventMode.LAZY);
|
||||
// 1 seconds timeout.
|
||||
textField.setTextChangeTimeout(1000);
|
||||
return textField;
|
||||
return new LabelBuilder().name(getHeaderCaption()).buildCaptionLabel();
|
||||
}
|
||||
|
||||
private SPUIButton createSearchResetIcon() {
|
||||
@@ -322,7 +308,7 @@ public abstract class AbstractTableHeader extends VerticalLayout {
|
||||
maxMinIcon.setData(Boolean.FALSE);
|
||||
}
|
||||
|
||||
private HorizontalLayout createHeaderFilterIconLayout() {
|
||||
private static HorizontalLayout createHeaderFilterIconLayout() {
|
||||
final HorizontalLayout titleFilterIconsLayout = new HorizontalLayout();
|
||||
titleFilterIconsLayout.addStyleName(SPUIStyleDefinitions.WIDGET_TITLE);
|
||||
titleFilterIconsLayout.setSpacing(false);
|
||||
|
||||
@@ -21,7 +21,7 @@ import com.vaadin.ui.VerticalLayout;
|
||||
|
||||
/**
|
||||
* Attributes Vertical layout for Target.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
@@ -30,10 +30,10 @@ public class SPTargetAttributesLayout {
|
||||
|
||||
/**
|
||||
* Parametric constructor.
|
||||
*
|
||||
*
|
||||
* @param controllerAttibs
|
||||
* controller attributes
|
||||
*
|
||||
*
|
||||
*/
|
||||
public SPTargetAttributesLayout(final Map<String, String> controllerAttibs) {
|
||||
targetAttributesLayout = new VerticalLayout();
|
||||
@@ -44,7 +44,7 @@ public class SPTargetAttributesLayout {
|
||||
|
||||
/**
|
||||
* Custom Decorate.
|
||||
*
|
||||
*
|
||||
* @param controllerAttibs
|
||||
*/
|
||||
private void decorate(final Map<String, String> controllerAttibs) {
|
||||
@@ -52,7 +52,7 @@ public class SPTargetAttributesLayout {
|
||||
final Label title = new Label(i18n.get("label.target.controller.attrs"), ContentMode.HTML);
|
||||
title.addStyleName(SPUIDefinitions.TEXT_STYLE);
|
||||
targetAttributesLayout.addComponent(title);
|
||||
if (HawkbitCommonUtil.mapCheckStrings(controllerAttibs)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(controllerAttibs)) {
|
||||
for (final Map.Entry<String, String> entry : controllerAttibs.entrySet()) {
|
||||
targetAttributesLayout.addComponent(
|
||||
SPUIComponentProvider.createNameValueLabel(entry.getKey() + ": ", entry.getValue()));
|
||||
@@ -62,7 +62,7 @@ public class SPTargetAttributesLayout {
|
||||
|
||||
/**
|
||||
* GET Target Attributes Layout.
|
||||
*
|
||||
*
|
||||
* @return VerticalLayout as UI
|
||||
*/
|
||||
public VerticalLayout getTargetAttributesLayout() {
|
||||
|
||||
@@ -17,11 +17,6 @@ import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIComboBoxDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.HeaderLayoutDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUILabelDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUITextAreaDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUITextFieldDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.slf4j.Logger;
|
||||
@@ -34,15 +29,11 @@ import com.vaadin.shared.ui.label.ContentMode;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.CheckBox;
|
||||
import com.vaadin.ui.ComboBox;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.Link;
|
||||
import com.vaadin.ui.Panel;
|
||||
import com.vaadin.ui.TabSheet;
|
||||
import com.vaadin.ui.TextArea;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.VerticalLayout;
|
||||
import com.vaadin.ui.Window;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
@@ -61,152 +52,9 @@ public final class SPUIComponentProvider {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param className
|
||||
* @return
|
||||
*/
|
||||
public static HorizontalLayout getHorizontalLayout(final Class<? extends HorizontalLayout> className) {
|
||||
HorizontalLayout hLayout = null;
|
||||
try {
|
||||
|
||||
hLayout = className.newInstance();
|
||||
} catch (final InstantiationException exception) {
|
||||
LOG.error("Error occured while creating HorizontalLayout-" + className, exception);
|
||||
} catch (final IllegalAccessException exception) {
|
||||
LOG.error("Error occured while acessing HorizontalLayout-" + className, exception);
|
||||
}
|
||||
|
||||
return hLayout;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HorizontalLayout UI component.
|
||||
*
|
||||
* @param className
|
||||
* as Layout
|
||||
* @return HorizontalLayout as UI
|
||||
*/
|
||||
public static HorizontalLayout getHorizontalLayout() {
|
||||
HorizontalLayout hLayout = null;
|
||||
try {
|
||||
hLayout = HorizontalLayout.class.newInstance();
|
||||
} catch (final InstantiationException exception) {
|
||||
LOG.error("Error occured while creating HorizontalLayout-", exception);
|
||||
} catch (final IllegalAccessException exception) {
|
||||
LOG.error("Error occured while acessing HorizontalLayout-", exception);
|
||||
}
|
||||
|
||||
return hLayout;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tableHeaderLayoutDecorator
|
||||
* @return
|
||||
*/
|
||||
public static HorizontalLayout getHeaderLayout(
|
||||
final Class<? extends HeaderLayoutDecorator> tableHeaderLayoutDecorator) {
|
||||
// Do we really need this???
|
||||
HorizontalLayout hLayout = getHorizontalLayout(new SPUIHorizontalLayout().getUiHorizontalLayout().getClass());
|
||||
|
||||
if (tableHeaderLayoutDecorator == null) {
|
||||
return hLayout;
|
||||
}
|
||||
|
||||
try {
|
||||
final HeaderLayoutDecorator layoutDecorator = tableHeaderLayoutDecorator.newInstance();
|
||||
hLayout = layoutDecorator.decorate(hLayout);
|
||||
|
||||
} catch (final InstantiationException | IllegalAccessException exception) {
|
||||
LOG.error("Error occured while creating horizontal decorator " + HeaderLayoutDecorator.class,
|
||||
exception);
|
||||
}
|
||||
|
||||
return hLayout;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Label UI component.
|
||||
*
|
||||
* @param name
|
||||
* label caption
|
||||
* @param type
|
||||
* string simple|Confirm|Message
|
||||
* @return Label
|
||||
*/
|
||||
public static Label getLabel(final String name, final String type) {
|
||||
return SPUILabelDecorator.getDeocratedLabel(name, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get window component.
|
||||
*
|
||||
* @param caption
|
||||
* window caption
|
||||
* @param id
|
||||
* window id
|
||||
* @param type
|
||||
* type of window
|
||||
* @return Window
|
||||
*/
|
||||
public static Window getWindow(final String caption, final String id, final String type) {
|
||||
return SPUIWindowDecorator.getDeocratedWindow(caption, id, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Label UI component.
|
||||
*
|
||||
* @param caption
|
||||
* set the caption of the textfield
|
||||
* @param style
|
||||
* set style
|
||||
* @param styleName
|
||||
* add style
|
||||
* @param required
|
||||
* to set field as mandatory
|
||||
* @param data
|
||||
* component data
|
||||
* @param prompt
|
||||
* prompt user for input
|
||||
* @param immediate
|
||||
* set component's immediate mode specified mode
|
||||
* @param maxLengthAllowed
|
||||
* maximum characters allowed
|
||||
* @return TextField text field
|
||||
*/
|
||||
public static TextField getTextField(final String caption, final String style, final String styleName,
|
||||
final boolean required, final String data, final String prompt, final boolean immediate,
|
||||
final int maxLengthAllowed) {
|
||||
return SPUITextFieldDecorator.decorate(caption, style, styleName, required, data, prompt, immediate,
|
||||
maxLengthAllowed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Label UI component. *
|
||||
*
|
||||
* @param caption
|
||||
* set the caption of the textArea
|
||||
* @param style
|
||||
* set style
|
||||
* @param styleName
|
||||
* add style
|
||||
* @param required
|
||||
* to set field as mandatory
|
||||
* @param data
|
||||
* component data
|
||||
* @param promt
|
||||
* prompt user for input
|
||||
* @param maxLength
|
||||
* maximum characters allowed
|
||||
* @return TextArea text area
|
||||
*/
|
||||
public static TextArea getTextArea(final String caption, final String style, final String styleName,
|
||||
final boolean required, final String data, final String promt, final int maxLength) {
|
||||
return SPUITextAreaDecorator.decorate(caption, style, styleName, required, data, promt, maxLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Label UI component.
|
||||
*
|
||||
* @param caption
|
||||
* caption of the combo box
|
||||
* @param height
|
||||
@@ -252,7 +100,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get Button - Factory Approach for decoration.
|
||||
*
|
||||
*
|
||||
* @param id
|
||||
* as string
|
||||
* @param buttonName
|
||||
@@ -289,7 +137,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get the style required.
|
||||
*
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static String getPinButtonStyle() {
|
||||
@@ -305,7 +153,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get DistributionSet Info Panel.
|
||||
*
|
||||
*
|
||||
* @param distributionSet
|
||||
* as DistributionSet
|
||||
* @param caption
|
||||
@@ -323,7 +171,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Method to CreateName value labels.
|
||||
*
|
||||
*
|
||||
* @param label
|
||||
* as string
|
||||
* @param values
|
||||
@@ -356,7 +204,7 @@ public final class SPUIComponentProvider {
|
||||
/**
|
||||
* Create label which represents the {@link BaseEntity#getCreatedBy()} by
|
||||
* user name
|
||||
*
|
||||
*
|
||||
* @param i18n
|
||||
* the i18n
|
||||
* @param baseEntity
|
||||
@@ -371,7 +219,7 @@ public final class SPUIComponentProvider {
|
||||
/**
|
||||
* Create label which represents the
|
||||
* {@link BaseEntity#getLastModifiedBy()()} by user name
|
||||
*
|
||||
*
|
||||
* @param i18n
|
||||
* the i18n
|
||||
* @param baseEntity
|
||||
@@ -385,7 +233,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get Bold Text.
|
||||
*
|
||||
*
|
||||
* @param text
|
||||
* as String
|
||||
* @return String as bold
|
||||
@@ -396,7 +244,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get the layout for Target:Controller Attributes.
|
||||
*
|
||||
*
|
||||
* @param controllerAttibs
|
||||
* as Map
|
||||
* @return VerticalLayout
|
||||
@@ -407,7 +255,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Get Tabsheet.
|
||||
*
|
||||
*
|
||||
* @return SPUITabSheet
|
||||
*/
|
||||
public static TabSheet getDetailsTabSheet() {
|
||||
@@ -416,7 +264,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Layout of tabs in detail tabsheet.
|
||||
*
|
||||
*
|
||||
* @return VerticalLayout
|
||||
*/
|
||||
public static VerticalLayout getDetailTabLayout() {
|
||||
@@ -429,7 +277,7 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Method to create a link.
|
||||
*
|
||||
*
|
||||
* @param id
|
||||
* of the link
|
||||
* @param name
|
||||
@@ -465,10 +313,10 @@ public final class SPUIComponentProvider {
|
||||
|
||||
/**
|
||||
* Generates help/documentation links from within management UI.
|
||||
*
|
||||
*
|
||||
* @param uri
|
||||
* to documentation site
|
||||
*
|
||||
*
|
||||
* @return generated link
|
||||
*/
|
||||
public static Link getHelpLink(final String uri) {
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.components;
|
||||
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
|
||||
/**
|
||||
* Plain Horizontal Layout.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
public class SPUIHorizontalLayout {
|
||||
private final HorizontalLayout uiHorizontalLayout;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public SPUIHorizontalLayout() {
|
||||
uiHorizontalLayout = new HorizontalLayout();
|
||||
decorate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decorate.
|
||||
*/
|
||||
private void decorate() {
|
||||
uiHorizontalLayout.setImmediate(false);
|
||||
uiHorizontalLayout.setMargin(false);
|
||||
uiHorizontalLayout.setSpacing(true);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HorizontalLayout.
|
||||
*
|
||||
* @return HorizontalLayout as UI
|
||||
*/
|
||||
public HorizontalLayout getUiHorizontalLayout() {
|
||||
return uiHorizontalLayout;
|
||||
}
|
||||
}
|
||||
@@ -17,21 +17,22 @@ import com.vaadin.client.renderers.ClickableRenderer.RendererClickHandler;
|
||||
import com.vaadin.shared.ui.Connect;
|
||||
|
||||
import elemental.json.JsonObject;
|
||||
|
||||
/**
|
||||
* A connector for {@link CustomObjectRenderer }.
|
||||
*
|
||||
*/
|
||||
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer.class)
|
||||
public class RolloutRendererConnector extends ClickableRendererConnector<RolloutRendererData> {
|
||||
private static final long serialVersionUID = 7734682321931830566L;
|
||||
private static final long serialVersionUID = 7734682321931830566L;
|
||||
|
||||
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
|
||||
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
|
||||
}
|
||||
@Override
|
||||
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
|
||||
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HandlerRegistration addClickHandler(
|
||||
RendererClickHandler<JsonObject> handler) {
|
||||
@Override
|
||||
protected HandlerRegistration addClickHandler(final RendererClickHandler<JsonObject> handler) {
|
||||
return getRenderer().addClickHandler(handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,52 +11,49 @@ package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* RendererData class with Name and Status.
|
||||
*
|
||||
* RendererData class with name and status.
|
||||
*/
|
||||
|
||||
public class RolloutRendererData implements Serializable {
|
||||
private static final long serialVersionUID = -5018181529953620263L;
|
||||
|
||||
private String name;
|
||||
private static final long serialVersionUID = -5018181529953620263L;
|
||||
|
||||
private String status;
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* Initialize the RendererData.
|
||||
*/
|
||||
public RolloutRendererData() {
|
||||
private String status;
|
||||
|
||||
}
|
||||
/**
|
||||
* Initialize the RendererData empty.
|
||||
*/
|
||||
public RolloutRendererData() {
|
||||
// Needed by Vaadin for compiling the widget set.
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the RendererData.
|
||||
*
|
||||
* @param name
|
||||
* Name of the Rollout.
|
||||
* @param status
|
||||
* Status of Rollout.
|
||||
*/
|
||||
public RolloutRendererData(String name, String status) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.status = status;
|
||||
}
|
||||
/**
|
||||
* Initialize the RendererData.
|
||||
*
|
||||
* @param name
|
||||
* Name of the Rollout.
|
||||
* @param status
|
||||
* Status of Rollout.
|
||||
*/
|
||||
public RolloutRendererData(final String name, final String status) {
|
||||
this.name = name;
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(final String status) {
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,46 +16,44 @@ import com.vaadin.ui.renderers.ClickableRenderer;
|
||||
import elemental.json.JsonValue;
|
||||
|
||||
/**
|
||||
* Renders button with provided CustomObject.
|
||||
* Used to display button with link.
|
||||
*
|
||||
* Renders button with provided CustomObject. Used to display button with link.
|
||||
*/
|
||||
|
||||
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData> {
|
||||
|
||||
private static final long serialVersionUID = -8754180585906263554L;
|
||||
private static final long serialVersionUID = -8754180585906263554L;
|
||||
|
||||
/**
|
||||
* Creates a new custom object renderer.
|
||||
*/
|
||||
public RolloutRenderer() {
|
||||
super(RolloutRendererData.class, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize custom object renderer with {@link Class<CustomObject>}
|
||||
*
|
||||
* @param presentationType
|
||||
* Class<CustomObject>
|
||||
*/
|
||||
/**
|
||||
* Creates a new custom object renderer.
|
||||
*/
|
||||
public RolloutRenderer() {
|
||||
super(RolloutRendererData.class, null);
|
||||
}
|
||||
|
||||
public RolloutRenderer(Class<RolloutRendererData> presentationType) {
|
||||
super(presentationType);
|
||||
}
|
||||
/**
|
||||
* Initialize custom object renderer with the given type.
|
||||
*
|
||||
* @param presentationType
|
||||
* Class<CustomObject>
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates a new custom object renderer and adds the given click listener to it.
|
||||
*
|
||||
* @param listener
|
||||
* the click listener to register
|
||||
*/
|
||||
public RolloutRenderer(RendererClickListener listener) {
|
||||
this();
|
||||
addClickListener(listener);
|
||||
}
|
||||
public RolloutRenderer(final Class<RolloutRendererData> presentationType) {
|
||||
super(presentationType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonValue encode(RolloutRendererData resource) {
|
||||
return super.encode(resource, RolloutRendererData.class);
|
||||
}
|
||||
/**
|
||||
* Creates a new custom object renderer and adds the given click listener to
|
||||
* it.
|
||||
*
|
||||
* @param listener
|
||||
* the click listener to register
|
||||
*/
|
||||
public RolloutRenderer(final RendererClickListener listener) {
|
||||
this();
|
||||
addClickListener(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonValue encode(final RolloutRendererData resource) {
|
||||
return super.encode(resource, RolloutRendererData.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.decorators;
|
||||
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
|
||||
import com.vaadin.shared.ui.label.ContentMode;
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Simple Decorator for the label.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public final class SPUILabelDecorator {
|
||||
|
||||
/**
|
||||
* Private Constructor.
|
||||
*/
|
||||
private SPUILabelDecorator() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple decorator.
|
||||
*
|
||||
* @param name
|
||||
* as String
|
||||
* @param type
|
||||
* as String
|
||||
* @return Label
|
||||
*/
|
||||
public static Label getDeocratedLabel(final String name, final String type) {
|
||||
final Label spUILabel = new Label(name);
|
||||
// Set style.
|
||||
final StringBuilder style = new StringBuilder(ValoTheme.LABEL_SMALL);
|
||||
style.append(' ');
|
||||
style.append(ValoTheme.LABEL_BOLD);
|
||||
spUILabel.addStyleName(style.toString());
|
||||
if (SPUILabelDefinitions.SP_WIDGET_CAPTION.equalsIgnoreCase(type)) {
|
||||
spUILabel.setValue(name);
|
||||
spUILabel.addStyleName("header-caption");
|
||||
} else if (SPUILabelDefinitions.SP_LABEL_MESSAGE.equalsIgnoreCase(type)) {
|
||||
spUILabel.setContentMode(ContentMode.HTML);
|
||||
spUILabel.addStyleName(SPUILabelDefinitions.SP_LABEL_MESSAGE_STYLE);
|
||||
} else {
|
||||
spUILabel.setImmediate(false);
|
||||
spUILabel.setWidth("-1px");
|
||||
spUILabel.setHeight("-1px");
|
||||
}
|
||||
|
||||
return spUILabel;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.decorators;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.vaadin.ui.TextArea;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* TextArea with required style.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public final class SPUITextAreaDecorator {
|
||||
|
||||
/**
|
||||
* Private Constrcutor.
|
||||
*/
|
||||
private SPUITextAreaDecorator() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Decorate.
|
||||
*
|
||||
* @param style
|
||||
* set style
|
||||
* @param styleName
|
||||
* add style
|
||||
* @param required
|
||||
* to set field as mandatory
|
||||
* @param data
|
||||
* component data
|
||||
* @param prompt
|
||||
* as user for input
|
||||
* @param maxLength
|
||||
* maximum characters allowed
|
||||
* @return TextArea as comp
|
||||
*/
|
||||
public static TextArea decorate(final String caption, final String style, final String styleName,
|
||||
final boolean required, final String data, final String prompt, final int maxLength) {
|
||||
final TextArea spUITxtArea = new TextArea();
|
||||
// Default settings
|
||||
spUITxtArea.setRequired(false);
|
||||
spUITxtArea.addStyleName(ValoTheme.TEXTAREA_SMALL);
|
||||
if (StringUtils.isNotEmpty(caption)) {
|
||||
spUITxtArea.setCaption(caption);
|
||||
}
|
||||
if (required) {
|
||||
spUITxtArea.setRequired(true);
|
||||
}
|
||||
// Add style
|
||||
if (StringUtils.isNotEmpty(style)) {
|
||||
spUITxtArea.setStyleName(style);
|
||||
}
|
||||
// Add style Name
|
||||
if (StringUtils.isNotEmpty(styleName)) {
|
||||
spUITxtArea.addStyleName(styleName);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(prompt)) {
|
||||
spUITxtArea.setInputPrompt(prompt);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(data)) {
|
||||
spUITxtArea.setData(data);
|
||||
}
|
||||
|
||||
if (maxLength > 0) {
|
||||
spUITxtArea.setMaxLength(maxLength);
|
||||
}
|
||||
return spUITxtArea;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.decorators;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Decorate TextField with required style.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public final class SPUITextFieldDecorator {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
private SPUITextFieldDecorator() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param caption
|
||||
* set the caption of the textfield
|
||||
* @param style
|
||||
* set style
|
||||
* @param styleName
|
||||
* add style
|
||||
* @param required
|
||||
* to set field as mandatory
|
||||
* @param data
|
||||
* component data
|
||||
* @param prompt
|
||||
* prompt user for input
|
||||
* @param immediate
|
||||
* as for display
|
||||
* @param maxLengthAllowed
|
||||
* maximum characters allowed
|
||||
* @return Text field as decorated
|
||||
*/
|
||||
public static TextField decorate(final String caption, final String style, final String styleName,
|
||||
final boolean required, final String data, final String prompt, final boolean immediate,
|
||||
final int maxLengthAllowed) {
|
||||
final TextField spUITxtFld = new TextField();
|
||||
if (StringUtils.isNotEmpty(caption)) {
|
||||
spUITxtFld.setCaption(caption);
|
||||
}
|
||||
// Default settings
|
||||
spUITxtFld.setRequired(false);
|
||||
spUITxtFld.addStyleName(ValoTheme.TEXTFIELD_SMALL);
|
||||
if (required) {
|
||||
spUITxtFld.setRequired(true);
|
||||
}
|
||||
if (immediate) {
|
||||
spUITxtFld.setImmediate(true);
|
||||
}
|
||||
// Add style
|
||||
if (StringUtils.isNotEmpty(style)) {
|
||||
spUITxtFld.setStyleName(style);
|
||||
}
|
||||
// Add style Name
|
||||
if (StringUtils.isNotEmpty(styleName)) {
|
||||
spUITxtFld.addStyleName(styleName);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(prompt)) {
|
||||
spUITxtFld.setInputPrompt(prompt);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(data)) {
|
||||
spUITxtFld.setData(data);
|
||||
}
|
||||
if (maxLengthAllowed > 0) {
|
||||
spUITxtFld.setMaxLength(maxLengthAllowed);
|
||||
}
|
||||
|
||||
return spUITxtFld;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.decorators;
|
||||
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.CustomCommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
|
||||
import com.vaadin.ui.AbstractLayout;
|
||||
import com.vaadin.ui.Button.ClickListener;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.Window;
|
||||
|
||||
/**
|
||||
* Decorator for Window.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
public final class SPUIWindowDecorator {
|
||||
|
||||
/**
|
||||
* Private Constructor.
|
||||
*/
|
||||
private SPUIWindowDecorator() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Decorates window based on type.
|
||||
*
|
||||
* @param caption
|
||||
* window caption
|
||||
* @param id
|
||||
* window id
|
||||
* @param type
|
||||
* window type
|
||||
* @return Window
|
||||
*/
|
||||
public static CommonDialogWindow getWindow(final String caption, final String id, final String type,
|
||||
final Component content, final ClickListener saveButtonClickListener,
|
||||
final ClickListener cancelButtonClickListener, final String helpLink, final AbstractLayout layout,
|
||||
final I18N i18n) {
|
||||
CommonDialogWindow window = null;
|
||||
if (SPUIDefinitions.CUSTOM_METADATA_WINDOW.equals(type)) {
|
||||
window = new CustomCommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
||||
cancelButtonClickListener, layout, i18n);
|
||||
window.setDraggable(true);
|
||||
window.setClosable(true);
|
||||
} else {
|
||||
window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
||||
cancelButtonClickListener, layout, i18n);
|
||||
if (null != id) {
|
||||
window.setId(id);
|
||||
}
|
||||
if (SPUIDefinitions.CONFIRMATION_WINDOW.equals(type)) {
|
||||
window.setDraggable(false);
|
||||
window.setClosable(true);
|
||||
window.addStyleName(SPUIStyleDefinitions.CONFIRMATION_WINDOW_CAPTION);
|
||||
|
||||
} else if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
||||
window.setDraggable(true);
|
||||
window.setClosable(true);
|
||||
}
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decorates window based on type.
|
||||
*
|
||||
* @param caption
|
||||
* window caption
|
||||
* @param id
|
||||
* window id
|
||||
* @param type
|
||||
* window type
|
||||
* @return Window
|
||||
*/
|
||||
public static Window getDeocratedWindow(final String caption, final String id, final String type) {
|
||||
final Window window = new Window(caption);
|
||||
window.setSizeUndefined();
|
||||
window.setModal(true);
|
||||
window.setResizable(false);
|
||||
if (null != id) {
|
||||
window.setId(id);
|
||||
}
|
||||
if (SPUIDefinitions.CONFIRMATION_WINDOW.equals(type)) {
|
||||
window.setDraggable(false);
|
||||
window.setClosable(true);
|
||||
window.addStyleName(SPUIStyleDefinitions.CONFIRMATION_WINDOW_CAPTION);
|
||||
|
||||
} else if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
||||
window.setDraggable(true);
|
||||
window.setClosable(false);
|
||||
}
|
||||
return window;
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,8 @@ import org.eclipse.hawkbit.repository.model.DistributionSetType;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper;
|
||||
import org.eclipse.hawkbit.ui.common.DistributionSetTypeBeanQuery;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.distributions.event.DistributionSetTypeEvent;
|
||||
@@ -45,6 +47,7 @@ import com.vaadin.ui.CheckBox;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Table;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.VerticalLayout;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
@@ -84,24 +87,24 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout {
|
||||
|
||||
super.createRequiredComponents();
|
||||
|
||||
tagName = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_NAME, true, "",
|
||||
i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
tagName.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_NAME);
|
||||
tagName = createTextField("textfield.name", SPUIDefinitions.DIST_SET_TYPE_NAME,
|
||||
SPUIDefinitions.NEW_DISTRIBUTION_TYPE_NAME);
|
||||
|
||||
typeKey = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_KEY, true, "", i18n.get("textfield.key"),
|
||||
true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
typeKey.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_KEY);
|
||||
typeKey = createTextField("textfield.key", SPUIDefinitions.DIST_SET_TYPE_KEY,
|
||||
SPUIDefinitions.NEW_DISTRIBUTION_TYPE_KEY);
|
||||
|
||||
tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_DESC, false, "",
|
||||
i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
tagDesc.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_DESC);
|
||||
tagDesc.setImmediate(true);
|
||||
tagDesc = new TextAreaBuilder().caption(i18n.get("textfield.description"))
|
||||
.styleName(ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_DESC)
|
||||
.prompt(i18n.get("textfield.description")).immediate(true)
|
||||
.id(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_DESC).buildTextComponent();
|
||||
tagDesc.setNullRepresentation("");
|
||||
}
|
||||
|
||||
private TextField createTextField(final String in18Key, final String styleName, final String id) {
|
||||
return new TextFieldBuilder().caption(i18n.get(in18Key)).styleName(ValoTheme.TEXTFIELD_TINY + " " + styleName)
|
||||
.required(true).prompt(i18n.get(in18Key)).immediate(true).id(id).buildTextComponent();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildLayout() {
|
||||
|
||||
|
||||
@@ -117,5 +117,4 @@ public class DSTypeFilterButtons extends AbstractFilterButtons {
|
||||
private void refreshTypeTable() {
|
||||
setContainerDataSource(createButtonsLazyQueryContainer());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -48,7 +48,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -61,7 +60,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||
import com.vaadin.data.Container;
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
@@ -100,9 +98,6 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
@Autowired
|
||||
private DistributionsViewAcceptCriteria distributionsViewAcceptCriteria;
|
||||
|
||||
@Autowired
|
||||
private UINotification notification;
|
||||
|
||||
@Autowired
|
||||
private transient TargetManagement targetManagement;
|
||||
|
||||
@@ -231,25 +226,12 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DropHandler getTableDropHandler() {
|
||||
return new DropHandler() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public AcceptCriterion getAcceptCriterion() {
|
||||
return distributionsViewAcceptCriteria;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(final DragAndDropEvent event) {
|
||||
if (doValidation(event)) {
|
||||
onDrop(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
public AcceptCriterion getDropAcceptCriterion() {
|
||||
return distributionsViewAcceptCriteria;
|
||||
}
|
||||
|
||||
private void onDrop(final DragAndDropEvent event) {
|
||||
@Override
|
||||
protected void onDropEventFromTable(final DragAndDropEvent event) {
|
||||
final TableTransferable transferable = (TableTransferable) event.getTransferable();
|
||||
@SuppressWarnings("unchecked")
|
||||
final AbstractTable<?, Long> source = (AbstractTable<SoftwareModule, Long>) transferable.getSourceComponent();
|
||||
@@ -262,6 +244,22 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
if (item != null && item.getItemProperty("id") != null && item.getItemProperty("name") != null) {
|
||||
handleDropEvent(source, softwareModulesIdList, item);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDropEventFromWrapper(final DragAndDropEvent event) {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDropValid(final DragAndDropEvent dragEvent) {
|
||||
final Component compsource = dragEvent.getTransferable().getSourceComponent();
|
||||
if (!(compsource instanceof Table)) {
|
||||
notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG));
|
||||
return false;
|
||||
}
|
||||
return super.isDropValid(dragEvent);
|
||||
}
|
||||
|
||||
private void handleDropEvent(final Table source, final Set<Long> softwareModulesIdList, final Item item) {
|
||||
@@ -364,7 +362,8 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
}
|
||||
|
||||
if (distributionSetManagement.isDistributionSetInUse(ds)) {
|
||||
notification.displayValidationError(i18n.get("message.error.notification.ds.target.assigned", ds.getName(), ds.getVersion()));
|
||||
notification.displayValidationError(
|
||||
i18n.get("message.error.notification.ds.target.assigned", ds.getName(), ds.getVersion()));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -415,31 +414,14 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate event.
|
||||
*
|
||||
* @param dragEvent
|
||||
* as event
|
||||
* @return boolean as flag
|
||||
*/
|
||||
private Boolean doValidation(final DragAndDropEvent dragEvent) {
|
||||
if (!permissionChecker.hasUpdateDistributionPermission()) {
|
||||
notification.displayValidationError(i18n.get("message.permission.insufficient"));
|
||||
return false;
|
||||
} else {
|
||||
final Component compsource = dragEvent.getTransferable().getSourceComponent();
|
||||
final Table source = (Table) compsource;
|
||||
if (compsource instanceof Table) {
|
||||
if (!source.getId().equals(SPUIComponentIdProvider.UPLOAD_SOFTWARE_MODULE_TABLE)) {
|
||||
notification.displayValidationError(i18n.get("message.action.not.allowed"));
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
notification.displayValidationError(i18n.get("message.action.not.allowed"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@Override
|
||||
protected String getDropTableId() {
|
||||
return SPUIComponentIdProvider.UPLOAD_SOFTWARE_MODULE_TABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasDropPermission() {
|
||||
return permissionChecker.hasUpdateDistributionPermission();
|
||||
}
|
||||
|
||||
private void addTableStyleGenerator() {
|
||||
@@ -550,7 +532,7 @@ public class DistributionSetTable extends AbstractNamedVersionTable<Distribution
|
||||
|
||||
private void showMetadataDetails(final Long itemId) {
|
||||
final DistributionSet ds = distributionSetManagement.findDistributionSetByIdWithDetails(itemId);
|
||||
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds,null));
|
||||
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds, null));
|
||||
}
|
||||
|
||||
private String getNameAndVerion(final Object itemId) {
|
||||
|
||||
@@ -50,7 +50,7 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
||||
private DistributionSetType distributionSetType = null;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* @param queryConfig
|
||||
* @param sortPropertyIds
|
||||
@@ -60,7 +60,7 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
||||
final Object[] sortPropertyIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortPropertyIds, sortStates);
|
||||
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(queryConfig)) {
|
||||
searchText = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_TEXT);
|
||||
if (!Strings.isNullOrEmpty(searchText)) {
|
||||
searchText = String.format("%%%s%%", searchText);
|
||||
|
||||
@@ -15,11 +15,9 @@ import org.eclipse.hawkbit.repository.SoftwareManagement;
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata;
|
||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
||||
import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout;
|
||||
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent;
|
||||
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent.MetadataUIEvent;
|
||||
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
@@ -27,7 +25,6 @@ import com.vaadin.spring.annotation.ViewScope;
|
||||
|
||||
/**
|
||||
* Pop up layout to display software module metadata.
|
||||
*
|
||||
*/
|
||||
@SpringComponent
|
||||
@ViewScope
|
||||
@@ -39,39 +36,35 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
|
||||
private transient SoftwareManagement softwareManagement;
|
||||
|
||||
@Autowired
|
||||
private ArtifactUploadState artifactUploadState;
|
||||
|
||||
@Autowired
|
||||
private EntityFactory entityFactory;
|
||||
|
||||
@Autowired
|
||||
private ManageDistUIState manageDistUIState;
|
||||
private transient EntityFactory entityFactory;
|
||||
|
||||
@Autowired
|
||||
protected SpPermissionChecker permChecker;
|
||||
|
||||
@Override
|
||||
protected void checkForDuplicate(SoftwareModule entity, String value) {
|
||||
protected void checkForDuplicate(final SoftwareModule entity, final String value) {
|
||||
softwareManagement.findSoftwareModuleMetadata(entity, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create metadata for SWModule.
|
||||
*/
|
||||
* Create metadata for SWModule.
|
||||
*/
|
||||
@Override
|
||||
protected SoftwareModuleMetadata createMetadata(SoftwareModule entity, String key, String value) {
|
||||
SoftwareModuleMetadata swMetadata = softwareManagement.createSoftwareModuleMetadata(entityFactory
|
||||
.generateSoftwareModuleMetadata(entity, key, value));
|
||||
protected SoftwareModuleMetadata createMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||
final SoftwareModuleMetadata swMetadata = softwareManagement
|
||||
.createSoftwareModuleMetadata(entityFactory.generateSoftwareModuleMetadata(entity, key, value));
|
||||
setSelectedEntity(swMetadata.getSoftwareModule());
|
||||
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA, swMetadata));
|
||||
return swMetadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update metadata for SWModule.
|
||||
* Update metadata for SWModule.
|
||||
*/
|
||||
@Override
|
||||
protected SoftwareModuleMetadata updateMetadata(SoftwareModule entity, String key, String value) {
|
||||
SoftwareModuleMetadata swMetadata = softwareManagement.updateSoftwareModuleMetadata(entityFactory
|
||||
.generateSoftwareModuleMetadata(entity, key, value));
|
||||
protected SoftwareModuleMetadata updateMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||
final SoftwareModuleMetadata swMetadata = softwareManagement
|
||||
.updateSoftwareModuleMetadata(entityFactory.generateSoftwareModuleMetadata(entity, key, value));
|
||||
setSelectedEntity(swMetadata.getSoftwareModule());
|
||||
return swMetadata;
|
||||
}
|
||||
@@ -80,25 +73,24 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
|
||||
protected List<SoftwareModuleMetadata> getMetadataList() {
|
||||
return getSelectedEntity().getMetadata();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* delete metadata for SWModule.
|
||||
*/
|
||||
@Override
|
||||
protected void deleteMetadata(SoftwareModule entity, String key, String value) {
|
||||
SoftwareModuleMetadata swMetadata = entityFactory.generateSoftwareModuleMetadata(entity, key, value);
|
||||
protected void deleteMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||
final SoftwareModuleMetadata swMetadata = entityFactory.generateSoftwareModuleMetadata(entity, key, value);
|
||||
softwareManagement.deleteSoftwareModuleMetadata(entity, key);
|
||||
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA, swMetadata));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean hasCreatePermission() {
|
||||
return permChecker.hasCreateDistributionPermission();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean hasUpdatePermission() {
|
||||
return permChecker.hasUpdateDistributionPermission();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public class SwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSwModuleItem>
|
||||
|
||||
/**
|
||||
* Parametric Constructor.
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* as Def
|
||||
* @param queryConfig
|
||||
@@ -55,7 +55,7 @@ public class SwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSwModuleItem>
|
||||
public SwModuleBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||
final Object[] sortIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortIds, sortStates);
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(queryConfig)) {
|
||||
type = (SoftwareModuleType) queryConfig.get(SPUIDefinitions.BY_SOFTWARE_MODULE_TYPE);
|
||||
searchText = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_TEXT);
|
||||
if (!Strings.isNullOrEmpty(searchText)) {
|
||||
|
||||
@@ -43,7 +43,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||
import com.vaadin.data.Container;
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.server.Page;
|
||||
@@ -78,7 +77,7 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
|
||||
@Autowired
|
||||
private ArtifactDetailsLayout artifactDetailsLayout;
|
||||
|
||||
|
||||
@Autowired
|
||||
private SwMetadataPopupLayout swMetadataPopupLayout;
|
||||
|
||||
@@ -180,9 +179,10 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
|
||||
addGeneratedColumn(SPUILabelDefinitions.ARTIFACT_ICON, new ColumnGenerator() {
|
||||
private static final long serialVersionUID = -5982361782989980277L;
|
||||
|
||||
@Override
|
||||
public Object generateCell(final Table source, final Object itemId, final Object columnId) {
|
||||
HorizontalLayout iconLayout = new HorizontalLayout();
|
||||
final HorizontalLayout iconLayout = new HorizontalLayout();
|
||||
// add artifactory details popup
|
||||
final String nameVersionStr = getNameAndVerion(itemId);
|
||||
final Button showArtifactDtlsBtn = createShowArtifactDtlsButton(nameVersionStr);
|
||||
@@ -214,7 +214,7 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
@Override
|
||||
protected void publishEntityAfterValueChange(final SoftwareModule selectedLastEntity) {
|
||||
eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.SELECTED_ENTITY, selectedLastEntity));
|
||||
if(selectedLastEntity!=null){
|
||||
if (selectedLastEntity != null) {
|
||||
manageDistUIState.setSelectedBaseSwModuleId(selectedLastEntity.getId());
|
||||
}
|
||||
}
|
||||
@@ -252,21 +252,13 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DropHandler getTableDropHandler() {
|
||||
return new DropHandler() {
|
||||
protected AcceptCriterion getDropAcceptCriterion() {
|
||||
return distributionsViewAcceptCriteria;
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = -6175865860867652573L;
|
||||
|
||||
@Override
|
||||
public AcceptCriterion getAcceptCriterion() {
|
||||
return distributionsViewAcceptCriteria;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(final DragAndDropEvent event) {
|
||||
/* sw module dont accept drops */
|
||||
}
|
||||
};
|
||||
@Override
|
||||
protected boolean isDropValid(final DragAndDropEvent dragEvent) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* All Private Methods */
|
||||
@@ -326,7 +318,7 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
return showArtifactDtlsBtn;
|
||||
}
|
||||
|
||||
private Button createManageMetadataButton(String nameVersionStr) {
|
||||
private Button createManageMetadataButton(final String nameVersionStr) {
|
||||
final Button manageMetadataBtn = SPUIComponentProvider.getButton(
|
||||
SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
|
||||
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
|
||||
@@ -407,9 +399,9 @@ public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Lon
|
||||
|
||||
}
|
||||
|
||||
private void showMetadataDetails(Long itemId) {
|
||||
SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
||||
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule,null));
|
||||
private void showMetadataDetails(final Long itemId) {
|
||||
final SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
||||
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.distributions.smtype;
|
||||
|
||||
import static org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.ADD_SOFTWARE_MODULE_TYPE;
|
||||
import static org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.UPDATE_SOFTWARE_MODULE_TYPE;
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider.SW_MODULE_TYPE_TABLE_ID;
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.VAR_NAME;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -19,7 +24,6 @@ import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent;
|
||||
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
|
||||
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
|
||||
@@ -35,10 +39,9 @@ import com.vaadin.spring.annotation.ViewScope;
|
||||
|
||||
/**
|
||||
* Software Module Type filter buttons.
|
||||
*
|
||||
*/
|
||||
@SpringComponent
|
||||
@ViewScope
|
||||
@SpringComponent
|
||||
public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
|
||||
private static final long serialVersionUID = 6804534533362387433L;
|
||||
@@ -51,7 +54,7 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
|
||||
@Override
|
||||
protected String getButtonsTableId() {
|
||||
return SPUIComponentIdProvider.SW_MODULE_TYPE_TABLE_ID;
|
||||
return SW_MODULE_TYPE_TABLE_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,7 +63,7 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
final BeanQueryFactory<SoftwareModuleTypeBeanQuery> typeQF = new BeanQueryFactory<>(
|
||||
SoftwareModuleTypeBeanQuery.class);
|
||||
typeQF.setQueryConfiguration(queryConfig);
|
||||
return new LazyQueryContainer(new LazyQueryDefinition(true, 20, SPUILabelDefinitions.VAR_NAME), typeQF);
|
||||
return new LazyQueryContainer(new LazyQueryDefinition(true, 20, VAR_NAME), typeQF);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -70,8 +73,8 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
|
||||
@Override
|
||||
protected boolean isClickedByDefault(final String typeName) {
|
||||
return manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().isPresent()
|
||||
&& manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().get().getName().equals(typeName);
|
||||
return manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().isPresent() && manageDistUIState
|
||||
.getSoftwareModuleFilters().getSoftwareModuleType().get().getName().equals(typeName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,13 +107,16 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
void onEvent(final SoftwareModuleTypeEvent event) {
|
||||
if (event.getSoftwareModuleTypeEnum() == SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.ADD_SOFTWARE_MODULE_TYPE
|
||||
|| event.getSoftwareModuleTypeEnum() == SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.UPDATE_SOFTWARE_MODULE_TYPE
|
||||
&& event.getSoftwareModuleType() != null) {
|
||||
if (isCreateOrUpdate(event) && event.getSoftwareModuleType() != null) {
|
||||
refreshTypeTable();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isCreateOrUpdate(final SoftwareModuleTypeEvent event) {
|
||||
return event.getSoftwareModuleTypeEnum() == ADD_SOFTWARE_MODULE_TYPE
|
||||
|| event.getSoftwareModuleTypeEnum() == UPDATE_SOFTWARE_MODULE_TYPE;
|
||||
}
|
||||
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
void onEvent(final SaveActionWindowEvent event) {
|
||||
if (event == SaveActionWindowEvent.SAVED_DELETE_SW_MODULE_TYPES) {
|
||||
@@ -121,6 +127,4 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||
private void refreshTypeTable() {
|
||||
setContainerDataSource(createButtonsLazyQueryContainer());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -8,8 +8,9 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.distributions.state;
|
||||
|
||||
import static java.util.Collections.emptySet;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
@@ -49,7 +50,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
|
||||
private DistributionSetIdName lastSelectedDistribution;
|
||||
|
||||
private Set<Long> selectedSoftwareModules = Collections.emptySet();
|
||||
private Set<Long> selectedSoftwareModules = emptySet();
|
||||
|
||||
private Set<String> selectedDeleteDistSetTypes = new HashSet<>();
|
||||
|
||||
@@ -57,23 +58,23 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
|
||||
private Long selectedBaseSwModuleId;
|
||||
|
||||
private boolean distTypeFilterClosed = Boolean.FALSE;
|
||||
private boolean distTypeFilterClosed;
|
||||
|
||||
private boolean swTypeFilterClosed = Boolean.FALSE;
|
||||
private boolean swTypeFilterClosed;
|
||||
|
||||
private final Map<Long, String> deleteSofwareModulesList = new HashMap<>();
|
||||
|
||||
private boolean swModuleTableMaximized = Boolean.FALSE;
|
||||
private boolean swModuleTableMaximized;
|
||||
|
||||
private boolean dsTableMaximized = Boolean.FALSE;
|
||||
private boolean dsTableMaximized;
|
||||
|
||||
private final Map<String, SoftwareModuleIdName> assignedSoftwareModuleDetails = new HashMap<>();
|
||||
|
||||
private final Map<DistributionSetIdName, HashMap<Long, HashSet<SoftwareModuleIdName>>> consolidatedDistSoftwarewList = new HashMap<>();
|
||||
|
||||
private boolean noDataAvilableSwModule = Boolean.FALSE;
|
||||
private boolean noDataAvilableSwModule;
|
||||
|
||||
private boolean noDataAvailableDist = Boolean.FALSE;
|
||||
private boolean noDataAvailableDist;
|
||||
|
||||
/**
|
||||
* @return the manageDistFilters
|
||||
@@ -117,6 +118,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
this.lastSelectedDistribution = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedEnitities(final Set<DistributionSetIdName> values) {
|
||||
selectedDistributions = values;
|
||||
}
|
||||
@@ -223,7 +225,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
/***
|
||||
* Set isDsModuleTableMaximized.
|
||||
*
|
||||
* @param isDsModuleTableMaximized
|
||||
* @param dsModuleTableMaximized
|
||||
*/
|
||||
public void setDsTableMaximized(final boolean dsModuleTableMaximized) {
|
||||
dsTableMaximized = dsModuleTableMaximized;
|
||||
@@ -241,7 +243,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isSwModuleTableMaximized
|
||||
* @param swModuleTableMaximized
|
||||
* the isSwModuleTableMaximized to set
|
||||
*/
|
||||
public void setSwModuleTableMaximized(final boolean swModuleTableMaximized) {
|
||||
@@ -271,8 +273,8 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
||||
}
|
||||
|
||||
/**
|
||||
* @param noDilableDist
|
||||
* the noDataAvailableDist to set
|
||||
* @param noDataAvailableDist
|
||||
* the isNoDataAvailableDist to set
|
||||
*/
|
||||
public void setNoDataAvailableDist(final boolean noDataAvailableDist) {
|
||||
this.noDataAvailableDist = noDataAvailableDist;
|
||||
|
||||
@@ -18,6 +18,8 @@ import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
|
||||
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
@@ -217,10 +219,9 @@ public class CreateOrUpdateFilterHeader extends VerticalLayout implements Button
|
||||
|
||||
breadcrumbButton = createBreadcrumbButton();
|
||||
|
||||
headerCaption = SPUIComponentProvider.getLabel(SPUILabelDefinitions.VAR_CREATE_FILTER,
|
||||
SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
headerCaption = new LabelBuilder().name(SPUILabelDefinitions.VAR_CREATE_FILTER).buildCaptionLabel();
|
||||
|
||||
nameLabel = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
nameLabel = new LabelBuilder().name("").buildLabel();
|
||||
nameLabel.setId(SPUIComponentIdProvider.TARGET_FILTER_QUERY_NAME_LABEL_ID);
|
||||
|
||||
nameTextField = createNameTextField();
|
||||
@@ -249,10 +250,9 @@ public class CreateOrUpdateFilterHeader extends VerticalLayout implements Button
|
||||
}
|
||||
|
||||
private TextField createNameTextField() {
|
||||
final TextField nameField = SPUIComponentProvider.getTextField(i18n.get("textfield.customfiltername"), "",
|
||||
ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.customfiltername"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
nameField.setId(SPUIComponentIdProvider.CUSTOM_FILTER_ADD_NAME);
|
||||
final TextField nameField = new TextFieldBuilder().caption(i18n.get("textfield.customfiltername"))
|
||||
.prompt(i18n.get("textfield.customfiltername")).immediate(true)
|
||||
.id(SPUIComponentIdProvider.CUSTOM_FILTER_ADD_NAME).buildTextComponent();
|
||||
nameField.setPropertyDataSource(nameLabel);
|
||||
nameField.addTextChangeListener(this::onFilterNameChange);
|
||||
return nameField;
|
||||
@@ -307,7 +307,7 @@ public class CreateOrUpdateFilterHeader extends VerticalLayout implements Button
|
||||
breadcrumbLayout = new HorizontalLayout();
|
||||
breadcrumbLayout.addComponent(breadcrumbButton);
|
||||
breadcrumbLayout.addComponent(new Label(">"));
|
||||
breadcrumbName = SPUIComponentProvider.getLabel(null, SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
breadcrumbName = new LabelBuilder().buildCaptionLabel();
|
||||
breadcrumbLayout.addComponent(breadcrumbName);
|
||||
breadcrumbName.addStyleName("breadcrumbPaddingLeft");
|
||||
|
||||
@@ -450,10 +450,9 @@ public class CreateOrUpdateFilterHeader extends VerticalLayout implements Button
|
||||
return button;
|
||||
}
|
||||
|
||||
private TextField createSearchField() {
|
||||
final TextField textField = SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY, false, "",
|
||||
"", true, SPUILabelDefinitions.TARGET_FILTER_QUERY_TEXT_FIELD_LENGTH);
|
||||
textField.setId("custom.query.text.Id");
|
||||
private static TextField createSearchField() {
|
||||
final TextField textField = new TextFieldBuilder().immediate(true).id("custom.query.text.Id")
|
||||
.maxLengthAllowed(SPUILabelDefinitions.TARGET_FILTER_QUERY_TEXT_FIELD_LENGTH).buildTextComponent();
|
||||
textField.addStyleName("target-filter-textfield");
|
||||
textField.setWidth(900.0F, Unit.PIXELS);
|
||||
textField.setTextChangeEventMode(TextChangeEventMode.LAZY);
|
||||
|
||||
@@ -19,7 +19,7 @@ import javax.annotation.PreDestroy;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.filtermanagement.event.CustomFilterUIEvent;
|
||||
import org.eclipse.hawkbit.ui.filtermanagement.state.FilterManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.AssignInstalledDSTooltipGenerator;
|
||||
@@ -209,7 +209,7 @@ public class CreateOrUpdateFilterTable extends Table {
|
||||
final Item row1 = getItem(itemId);
|
||||
final TargetUpdateStatus targetStatus = (TargetUpdateStatus) row1
|
||||
.getItemProperty(SPUILabelDefinitions.VAR_TARGET_STATUS).getValue();
|
||||
final Label label = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
final Label label = new LabelBuilder().name("").buildLabel();
|
||||
label.setContentMode(ContentMode.HTML);
|
||||
if (targetStatus == TargetUpdateStatus.PENDING) {
|
||||
label.setDescription("Pending");
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.filtermanagement;
|
||||
|
||||
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
|
||||
import static org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil.isNotNullOrEmpty;
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUIDefinitions.FILTER_BY_QUERY;
|
||||
import static org.springframework.data.domain.Sort.Direction.ASC;
|
||||
import static org.springframework.data.domain.Sort.Direction.DESC;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -47,7 +53,7 @@ public class CustomTargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
|
||||
/**
|
||||
* Parametric Constructor.
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* as Def
|
||||
* @param queryConfig
|
||||
@@ -61,38 +67,25 @@ public class CustomTargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
final Object[] sortIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortIds, sortStates);
|
||||
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
filterQuery = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_QUERY);
|
||||
if (isNotNullOrEmpty(queryConfig)) {
|
||||
filterQuery = (String) queryConfig.get(FILTER_BY_QUERY);
|
||||
}
|
||||
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
|
||||
// Initalize Sor
|
||||
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortIds[0]);
|
||||
// Add sort.
|
||||
|
||||
if (!isEmpty(sortStates)) {
|
||||
|
||||
sort = new Sort(sortStates[0] ? ASC : DESC, (String) sortIds[0]);
|
||||
|
||||
for (int targetId = 1; targetId < sortIds.length; targetId++) {
|
||||
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC, (String) sortIds[targetId]));
|
||||
sort.and(new Sort(sortStates[targetId] ? ASC : DESC, (String) sortIds[targetId]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#constructBean()
|
||||
*/
|
||||
@Override
|
||||
protected ProxyTarget constructBean() {
|
||||
|
||||
return new ProxyTarget();
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#loadBeans(int,
|
||||
* int)
|
||||
*/
|
||||
@Override
|
||||
protected List<ProxyTarget> loadBeans(final int startIndex, final int count) {
|
||||
Slice<Target> targetBeans;
|
||||
@@ -131,23 +124,11 @@ public class CustomTargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
return proxyTargetBeans;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#saveBeans(java
|
||||
* .util.List, java.util.List, java.util.List)
|
||||
*/
|
||||
@Override
|
||||
protected void saveBeans(final List<ProxyTarget> arg0, final List<ProxyTarget> arg1, final List<ProxyTarget> arg2) {
|
||||
// CRUD operations on Target will be done through repository methods
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#size()
|
||||
*/
|
||||
@Override
|
||||
public int size() {
|
||||
long size = 0;
|
||||
@@ -184,5 +165,4 @@ public class CustomTargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
}
|
||||
return i18N;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
|
||||
private transient TargetFilterQueryManagement targetFilterQueryManagement;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* @param queryConfig
|
||||
* @param sortPropertyIds
|
||||
@@ -53,7 +53,7 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
|
||||
public TargetFilterBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||
final Object[] sortPropertyIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortPropertyIds, sortStates);
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(queryConfig)) {
|
||||
searchText = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_TEXT);
|
||||
if (!Strings.isNullOrEmpty(searchText)) {
|
||||
searchText = String.format("%%%s%%", searchText);
|
||||
|
||||
@@ -11,6 +11,8 @@ package org.eclipse.hawkbit.ui.filtermanagement;
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
@@ -18,7 +20,6 @@ import org.eclipse.hawkbit.ui.filtermanagement.event.CustomFilterUIEvent;
|
||||
import org.eclipse.hawkbit.ui.filtermanagement.state.FilterManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
@@ -26,7 +27,6 @@ import org.vaadin.spring.events.EventBus;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
import com.vaadin.spring.annotation.ViewScope;
|
||||
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
|
||||
import com.vaadin.ui.Alignment;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
@@ -78,8 +78,7 @@ public class TargetFilterHeader extends VerticalLayout {
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
return SPUIComponentProvider.getLabel(SPUIDefinitions.TARGET_FILTER_LIST_HEADER_CAPTION,
|
||||
SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return new LabelBuilder().name(SPUIDefinitions.TARGET_FILTER_LIST_HEADER_CAPTION).buildCaptionLabel();
|
||||
}
|
||||
|
||||
private void buildLayout() {
|
||||
@@ -121,14 +120,9 @@ public class TargetFilterHeader extends VerticalLayout {
|
||||
}
|
||||
|
||||
private TextField createSearchField() {
|
||||
final TextField campSearchTextField = SPUIComponentProvider.getTextField(null, "filter-box",
|
||||
"text-style filter-box-hide", false, "", "", false, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
campSearchTextField.setId("target.filter.search.text.Id");
|
||||
campSearchTextField.setWidth(500.0f, Unit.PIXELS);
|
||||
campSearchTextField.addTextChangeListener(event -> searchBy(event.getText()));
|
||||
campSearchTextField.setTextChangeEventMode(TextChangeEventMode.LAZY);
|
||||
// 1 seconds timeout.
|
||||
campSearchTextField.setTextChangeTimeout(1000);
|
||||
final TextField campSearchTextField = new TextFieldBuilder("target.filter.search.text.Id")
|
||||
.createSearchField(event -> searchBy(event.getText()));
|
||||
campSearchTextField.setWidth(500.0F, Unit.PIXELS);
|
||||
return campSearchTextField;
|
||||
}
|
||||
|
||||
@@ -156,7 +150,6 @@ public class TargetFilterHeader extends VerticalLayout {
|
||||
}
|
||||
|
||||
private void openSearchTextField() {
|
||||
//
|
||||
searchResetIcon.addStyleName(SPUIDefinitions.FILTER_RESET_ICON);
|
||||
searchResetIcon.togleIcon(FontAwesome.TIMES);
|
||||
searchResetIcon.setData(Boolean.TRUE);
|
||||
|
||||
@@ -19,13 +19,15 @@ import org.eclipse.hawkbit.ui.colorpicker.ColorPickerConstants;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerLayout;
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
@@ -114,10 +116,8 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent
|
||||
|
||||
/**
|
||||
* Discard the changes and close the popup.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
protected void discard(final Button.ClickEvent event) {
|
||||
protected void discard() {
|
||||
UI.getCurrent().removeWindow(window);
|
||||
}
|
||||
|
||||
@@ -149,20 +149,20 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent
|
||||
|
||||
createTagStr = i18n.get("label.create.tag");
|
||||
updateTagStr = i18n.get("label.update.tag");
|
||||
comboLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.tag"), null);
|
||||
colorLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.tag.color"), null);
|
||||
comboLabel = new LabelBuilder().name(i18n.get("label.choose.tag")).buildLabel();
|
||||
colorLabel = new LabelBuilder().name(i18n.get("label.choose.tag.color")).buildLabel();
|
||||
colorLabel.addStyleName(SPUIDefinitions.COLOR_LABEL_STYLE);
|
||||
|
||||
tagName = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_NAME, true, "", i18n.get("textfield.name"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
tagName.setId(SPUIDefinitions.NEW_TARGET_TAG_NAME);
|
||||
tagName = new TextFieldBuilder().caption(i18n.get("textfield.name"))
|
||||
.styleName(ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_NAME).required(true)
|
||||
.prompt(i18n.get("textfield.name")).immediate(true).id(SPUIDefinitions.NEW_TARGET_TAG_NAME)
|
||||
.buildTextComponent();
|
||||
|
||||
tagDesc = new TextAreaBuilder().caption(i18n.get("textfield.description"))
|
||||
.styleName(ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_DESC)
|
||||
.prompt(i18n.get("textfield.description")).immediate(true).id(SPUIDefinitions.NEW_TARGET_TAG_DESC)
|
||||
.buildTextComponent();
|
||||
|
||||
tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "",
|
||||
ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_DESC, false, "", i18n.get("textfield.description"),
|
||||
SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
tagDesc.setId(SPUIDefinitions.NEW_TARGET_TAG_DESC);
|
||||
tagDesc.setImmediate(true);
|
||||
tagDesc.setNullRepresentation("");
|
||||
|
||||
tagNameComboBox = SPUIComponentProvider.getComboBox(null, "", "", null, null, false, "",
|
||||
@@ -462,8 +462,10 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent
|
||||
|
||||
public CommonDialogWindow getWindow() {
|
||||
reset();
|
||||
window = SPUIWindowDecorator.getWindow(getWindowCaption(), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this,
|
||||
this::save, this::discard, null, mainLayout, i18n);
|
||||
window = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).caption(getWindowCaption()).content(this)
|
||||
.saveButtonClickListener(this::save).cancelButtonClickListener(event -> discard()).layout(mainLayout)
|
||||
.i18n(i18n).buildCommonDialogWindow();
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.eclipse.hawkbit.repository.model.NamedEntity;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerConstants;
|
||||
import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
@@ -56,8 +57,9 @@ public abstract class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayo
|
||||
|
||||
createTypeStr = i18n.get("label.create.type");
|
||||
updateTypeStr = i18n.get("label.update.type");
|
||||
comboLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.type"), null);
|
||||
colorLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.type.color"), null);
|
||||
comboLabel = new LabelBuilder().name(i18n.get("label.choose.type")).buildLabel();
|
||||
colorLabel = new LabelBuilder().name(i18n.get("label.choose.type.color")).buildLabel();
|
||||
|
||||
colorLabel.addStyleName(SPUIDefinitions.COLOR_LABEL_STYLE);
|
||||
|
||||
tagNameComboBox = SPUIComponentProvider.getComboBox(i18n.get("label.combobox.type"), "", "", null, null, false,
|
||||
|
||||
@@ -10,6 +10,7 @@ package org.eclipse.hawkbit.ui.management.actionhistory;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
@@ -17,7 +18,6 @@ import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
|
||||
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.vaadin.spring.events.EventBus;
|
||||
@@ -63,8 +63,9 @@ public class ActionHistoryHeader extends VerticalLayout {
|
||||
private void buildComponent() {
|
||||
// create default title - it will be shown even when no data is
|
||||
// available
|
||||
titleOfActionHistory = SPUIComponentProvider.getLabel(HawkbitCommonUtil.getArtifactoryDetailsLabelId(""),
|
||||
SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
titleOfActionHistory = new LabelBuilder().name(HawkbitCommonUtil.getArtifactoryDetailsLabelId(""))
|
||||
.buildCaptionLabel();
|
||||
|
||||
titleOfActionHistory.setImmediate(true);
|
||||
titleOfActionHistory.setContentMode(ContentMode.HTML);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.eclipse.hawkbit.repository.model.ActionStatus;
|
||||
import org.eclipse.hawkbit.repository.model.ActionWithStatusCount;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
|
||||
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
@@ -36,7 +37,6 @@ import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -357,7 +357,7 @@ public class ActionHistoryTable extends TreeTable {
|
||||
private Component getForcedColumn(final Object itemId) {
|
||||
final Action actionWithActiveStatus = (Action) hierarchicalContainer.getItem(itemId)
|
||||
.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_FORCED).getValue();
|
||||
final Label actionLabel = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
final Label actionLabel = new LabelBuilder().name("").buildCaptionLabel();
|
||||
actionLabel.setContentMode(ContentMode.HTML);
|
||||
actionLabel.setStyleName("action-history-table-col-forced-label");
|
||||
if (actionWithActiveStatus != null && actionWithActiveStatus.getActionType() == ActionType.FORCED) {
|
||||
@@ -522,7 +522,7 @@ public class ActionHistoryTable extends TreeTable {
|
||||
* @return Label as UI
|
||||
*/
|
||||
private Label getStatusIcon(final Action.Status status) {
|
||||
final Label label = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
final Label label = new LabelBuilder().name("").buildLabel();
|
||||
final String statusIconPending = "statusIconPending";
|
||||
label.setContentMode(ContentMode.HTML);
|
||||
if (Action.Status.FINISHED == status) {
|
||||
@@ -576,13 +576,11 @@ public class ActionHistoryTable extends TreeTable {
|
||||
final long currentTimeMillis = System.currentTimeMillis();
|
||||
|
||||
final HorizontalLayout hLayout = new HorizontalLayout();
|
||||
final Label autoForceLabel = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
final Label autoForceLabel = new LabelBuilder().name("").id("action.history.table.timedforceId").buildLabel();
|
||||
|
||||
actionLabel.setValue(FontAwesome.BOLT.getHtml());
|
||||
autoForceLabel.setContentMode(ContentMode.HTML);
|
||||
autoForceLabel.setValue(FontAwesome.HISTORY.getHtml());
|
||||
// setted Id for TimedForced.
|
||||
autoForceLabel.setId("action.history.table.timedforceId");
|
||||
|
||||
hLayout.addComponent(actionLabel);
|
||||
hLayout.addComponent(autoForceLabel);
|
||||
@@ -608,8 +606,8 @@ public class ActionHistoryTable extends TreeTable {
|
||||
* as String
|
||||
* @return Labeal as UI
|
||||
*/
|
||||
private Label createActiveStatusLabel(final String activeValue, final boolean endedWithError) {
|
||||
final Label label = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE);
|
||||
private static Label createActiveStatusLabel(final String activeValue, final boolean endedWithError) {
|
||||
final Label label = new LabelBuilder().name("").buildLabel();
|
||||
label.setContentMode(ContentMode.HTML);
|
||||
if (SPUIDefinitions.SCHEDULED.equals(activeValue)) {
|
||||
label.setDescription("Scheduled");
|
||||
|
||||
@@ -25,9 +25,11 @@ import org.eclipse.hawkbit.repository.model.TenantMetaData;
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.DistributionSetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.DistributionSetTypeBeanQuery;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.distributions.dstable.DistributionSetTable;
|
||||
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.DragEvent;
|
||||
@@ -124,16 +126,8 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent {
|
||||
* Create required UI components.
|
||||
*/
|
||||
private void createRequiredComponents() {
|
||||
distNameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY,
|
||||
true, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
distNameTextField.setId(SPUIComponentIdProvider.DIST_ADD_NAME);
|
||||
distNameTextField.setNullRepresentation("");
|
||||
|
||||
distVersionTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.version"), "",
|
||||
ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("textfield.version"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
distVersionTextField.setId(SPUIComponentIdProvider.DIST_ADD_VERSION);
|
||||
distVersionTextField.setNullRepresentation("");
|
||||
distNameTextField = createTextField("textfield.name", SPUIComponentIdProvider.DIST_ADD_NAME);
|
||||
distVersionTextField = createTextField("textfield.version", SPUIComponentIdProvider.DIST_ADD_VERSION);
|
||||
|
||||
distsetTypeNameComboBox = SPUIComponentProvider.getComboBox(i18n.get("label.combobox.type"), "", "", null, "",
|
||||
false, "", i18n.get("label.combobox.type"));
|
||||
@@ -142,10 +136,9 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent {
|
||||
distsetTypeNameComboBox.setId(SPUIComponentIdProvider.DIST_ADD_DISTSETTYPE);
|
||||
populateDistSetTypeNameCombo();
|
||||
|
||||
descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style",
|
||||
ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"),
|
||||
SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
descTextArea.setId(SPUIComponentIdProvider.DIST_ADD_DESC);
|
||||
descTextArea = new TextAreaBuilder().caption(i18n.get("textfield.description")).style("text-area-style")
|
||||
.prompt(i18n.get("textfield.description")).immediate(true).id(SPUIComponentIdProvider.DIST_ADD_DESC)
|
||||
.buildTextComponent();
|
||||
descTextArea.setNullRepresentation("");
|
||||
|
||||
reqMigStepCheckbox = SPUIComponentProvider.getCheckBox(i18n.get("checkbox.dist.required.migration.step"),
|
||||
@@ -154,6 +147,13 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent {
|
||||
reqMigStepCheckbox.setId(SPUIComponentIdProvider.DIST_ADD_MIGRATION_CHECK);
|
||||
}
|
||||
|
||||
private TextField createTextField(final String in18Key, final String id) {
|
||||
final TextField buildTextField = new TextFieldBuilder().caption(i18n.get(in18Key)).required(true)
|
||||
.prompt(i18n.get(in18Key)).immediate(true).id(id).buildTextComponent();
|
||||
buildTextField.setNullRepresentation("");
|
||||
return buildTextField;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the LazyQueryContainer instance for DistributionSetTypes.
|
||||
*
|
||||
@@ -332,8 +332,11 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent {
|
||||
resetComponents();
|
||||
populateDistSetTypeNameCombo();
|
||||
populateValuesOfDistribution(editDistId);
|
||||
window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.dist"), null,
|
||||
SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), null, null, formLayout, i18n);
|
||||
|
||||
window = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).caption(i18n.get("caption.add.new.dist"))
|
||||
.content(this).saveButtonClickListener(event -> saveDistribution()).layout(formLayout).i18n(i18n)
|
||||
.buildCommonDialogWindow();
|
||||
|
||||
window.getButtonsLayout().removeStyleName("actionButtonsMargin");
|
||||
return window;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution>
|
||||
final Object[] sortPropertyIds, final boolean[] sortStates) {
|
||||
super(definition, queryConfig, sortPropertyIds, sortStates);
|
||||
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (HawkbitCommonUtil.isNotNullOrEmpty(queryConfig)) {
|
||||
distributionTags = (Collection<String>) queryConfig.get(SPUIDefinitions.FILTER_BY_TAG);
|
||||
searchText = (String) queryConfig.get(SPUIDefinitions.FILTER_BY_TEXT);
|
||||
noTagClicked = (Boolean) queryConfig.get(SPUIDefinitions.FILTER_BY_NO_TAG);
|
||||
|
||||
@@ -60,14 +60,12 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||
import com.vaadin.data.Container;
|
||||
import com.vaadin.data.Item;
|
||||
import com.vaadin.event.dd.DragAndDropEvent;
|
||||
import com.vaadin.event.dd.DropHandler;
|
||||
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
import com.vaadin.spring.annotation.ViewScope;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.Button.ClickEvent;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Table;
|
||||
@@ -356,36 +354,23 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DropHandler getTableDropHandler() {
|
||||
return new DropHandler() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public AcceptCriterion getAcceptCriterion() {
|
||||
return managementViewAcceptCriteria;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(final DragAndDropEvent event) {
|
||||
if (doValidation(event)) {
|
||||
if (event.getTransferable().getSourceComponent() instanceof Table) {
|
||||
assignTargetToDs(event);
|
||||
} else if (event.getTransferable().getSourceComponent() instanceof DragAndDropWrapper) {
|
||||
processWrapperDrop(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
public AcceptCriterion getDropAcceptCriterion() {
|
||||
return managementViewAcceptCriteria;
|
||||
}
|
||||
|
||||
private void processWrapperDrop(final DragAndDropEvent event) {
|
||||
@Override
|
||||
protected void onDropEventFromTable(final DragAndDropEvent event) {
|
||||
assignTargetToDs(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDropEventFromWrapper(final DragAndDropEvent event) {
|
||||
if (event.getTransferable().getSourceComponent().getId()
|
||||
.startsWith(SPUIDefinitions.DISTRIBUTION_TAG_ID_PREFIXS)) {
|
||||
assignDsTag(event);
|
||||
} else {
|
||||
assignTargetTag(event);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void assignDsTag(final DragAndDropEvent event) {
|
||||
@@ -458,42 +443,26 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
|
||||
}
|
||||
}
|
||||
|
||||
private Boolean doValidation(final DragAndDropEvent dragEvent) {
|
||||
final Component compsource = dragEvent.getTransferable().getSourceComponent();
|
||||
if (compsource instanceof Table) {
|
||||
return validateTable(compsource);
|
||||
} else if (compsource instanceof DragAndDropWrapper) {
|
||||
return validateDragAndDropWrapper(compsource);
|
||||
} else {
|
||||
notification.displayValidationError(notAllowedMsg);
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
protected boolean hasDropPermission() {
|
||||
return permissionChecker.hasUpdateTargetPermission();
|
||||
}
|
||||
|
||||
private Boolean validateTable(final Component compsource) {
|
||||
if (!permissionChecker.hasUpdateTargetPermission()) {
|
||||
notification.displayValidationError(i18n.get("message.permission.insufficient"));
|
||||
return false;
|
||||
} else {
|
||||
if (compsource instanceof Table && !compsource.getId().equals(SPUIComponentIdProvider.TARGET_TABLE_ID)) {
|
||||
notification.displayValidationError(notAllowedMsg);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@Override
|
||||
protected String getDropTableId() {
|
||||
return SPUIComponentIdProvider.TARGET_TABLE_ID;
|
||||
}
|
||||
|
||||
private Boolean validateDragAndDropWrapper(final Component compsource) {
|
||||
final DragAndDropWrapper wrapperSource = (DragAndDropWrapper) compsource;
|
||||
@Override
|
||||
protected boolean validateDragAndDropWrapper(final DragAndDropWrapper wrapperSource) {
|
||||
final String tagData = wrapperSource.getData().toString();
|
||||
if (wrapperSource.getId().startsWith(SPUIDefinitions.DISTRIBUTION_TAG_ID_PREFIXS)) {
|
||||
return !isNoTagButton(tagData, SPUIDefinitions.DISTRIBUTION_TAG_BUTTON);
|
||||
} else if (wrapperSource.getId().startsWith(SPUIDefinitions.TARGET_TAG_ID_PREFIXS)) {
|
||||
return !isNoTagButton(tagData, SPUIDefinitions.TARGET_TAG_BUTTON);
|
||||
} else {
|
||||
notification.displayValidationError(notAllowedMsg);
|
||||
return false;
|
||||
}
|
||||
notification.displayValidationError(notAllowedMsg);
|
||||
return false;
|
||||
}
|
||||
|
||||
private Boolean isNoTagButton(final String tagData, final String targetNoTagData) {
|
||||
|
||||
@@ -118,12 +118,10 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat
|
||||
|
||||
/**
|
||||
* RESET.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void discard(final ClickEvent event) {
|
||||
super.discard(event);
|
||||
public void discard() {
|
||||
super.discard();
|
||||
resetDistTagValues();
|
||||
}
|
||||
|
||||
@@ -144,7 +142,7 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat
|
||||
/**
|
||||
* Select tag & set tag name & tag desc values corresponding to selected
|
||||
* tag.
|
||||
*
|
||||
*
|
||||
* @param distTagSelected
|
||||
* as the selected tag from combo
|
||||
*/
|
||||
|
||||
@@ -121,7 +121,7 @@ public class DistributionTagButtons extends AbstractFilterButtons {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isNoTagSateSelected() {
|
||||
protected boolean isNoTagStateSelected() {
|
||||
return managementUIState.getDistributionTableFilters().isNoTagSelected();
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ import org.vaadin.spring.events.EventBus;
|
||||
import org.vaadin.spring.events.EventScope;
|
||||
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.shared.ui.label.ContentMode;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
@@ -43,7 +44,7 @@ import com.vaadin.ui.Label;
|
||||
/**
|
||||
* Count message label which display current filter details and details on
|
||||
* pinning.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
@SpringComponent
|
||||
@@ -82,7 +83,7 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Event Listener to show the message count.
|
||||
*
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
@@ -104,7 +105,7 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Event Listener for Pinning Distribution.
|
||||
*
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
@@ -119,7 +120,7 @@ public class CountMessageLabel extends Label {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
private void applyStyle() {
|
||||
/* Create label for Targets count message displaying below the table */
|
||||
@@ -220,7 +221,7 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Get Status Message.
|
||||
*
|
||||
*
|
||||
* @param status
|
||||
* as status
|
||||
* @return String as msg.
|
||||
@@ -231,7 +232,7 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Get Tags Message.
|
||||
*
|
||||
*
|
||||
* @param noTargetTagSelected
|
||||
* @param tags
|
||||
* as tags
|
||||
@@ -244,18 +245,18 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Get Search Text Message.
|
||||
*
|
||||
*
|
||||
* @param searchTxt
|
||||
* as search text
|
||||
* @return String as msg.
|
||||
*/
|
||||
private static String getSerachMsg(final String searchTxt, final String param) {
|
||||
return HawkbitCommonUtil.checkValidString(searchTxt) ? param : HawkbitCommonUtil.SP_STRING_SPACE;
|
||||
return Strings.isNullOrEmpty(searchTxt) ? HawkbitCommonUtil.SP_STRING_SPACE : param;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Dist set Message.
|
||||
*
|
||||
*
|
||||
* @param distId
|
||||
* as serach
|
||||
* @return String as msg.
|
||||
@@ -266,7 +267,7 @@ public class CountMessageLabel extends Label {
|
||||
|
||||
/**
|
||||
* Get the custom target filter message.
|
||||
*
|
||||
*
|
||||
* @param targetFilterQuery
|
||||
* @param param
|
||||
* @return
|
||||
|
||||
@@ -390,22 +390,22 @@ public class BulkUploadHandler extends CustomComponent
|
||||
eventBus.publish(this, new BulkUploadValidationMessageEvent(errorMessage.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addNewTarget(final String controllerId, final String name) {
|
||||
final String newControllerId = HawkbitCommonUtil.trimAndNullIfEmpty(controllerId);
|
||||
if (mandatoryCheck(newControllerId) && duplicateCheck(newControllerId)) {
|
||||
final String newName = HawkbitCommonUtil.trimAndNullIfEmpty(name);
|
||||
final String newDesc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue());
|
||||
private void addNewTarget(final String controllerId, final String name) {
|
||||
final String newControllerId = HawkbitCommonUtil.trimAndNullIfEmpty(controllerId);
|
||||
if (mandatoryCheck(newControllerId) && duplicateCheck(newControllerId)) {
|
||||
final String newName = HawkbitCommonUtil.trimAndNullIfEmpty(name);
|
||||
final String newDesc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue());
|
||||
|
||||
/* create new target entity */
|
||||
final Target newTarget = entityFactory.generateTarget(newControllerId);
|
||||
setTargetValues(newTarget, newName, newDesc);
|
||||
targetManagement.createTarget(newTarget);
|
||||
managementUIState.getTargetTableFilters().getBulkUpload().getTargetsCreated().add(newControllerId);
|
||||
successfullTargetCount++;
|
||||
}
|
||||
|
||||
/* create new target entity */
|
||||
final Target newTarget = entityFactory.generateTarget(newControllerId);
|
||||
setTargetValues(newTarget, newName, newDesc);
|
||||
targetManagement.createTarget(newTarget);
|
||||
managementUIState.getTargetTableFilters().getBulkUpload().getTargetsCreated().add(newControllerId);
|
||||
successfullTargetCount++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void setTargetValues(final Target target, final String name, final String description) {
|
||||
|
||||
@@ -16,16 +16,16 @@ import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.repository.model.TargetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.management.event.DragEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||
import org.eclipse.hawkbit.ui.utils.SpringContextHelper;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
@@ -39,7 +39,6 @@ import com.vaadin.ui.FormLayout;
|
||||
import com.vaadin.ui.TextArea;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.Window;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Add and Update Target.
|
||||
@@ -82,30 +81,22 @@ public class TargetAddUpdateWindowLayout extends CustomComponent {
|
||||
}
|
||||
|
||||
private void createRequiredComponents() {
|
||||
/* Textfield for controller Id */
|
||||
controllerIDTextField = SPUIComponentProvider.getTextField(i18n.get("prompt.target.id"), "",
|
||||
ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("prompt.target.id"), true,
|
||||
SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
controllerIDTextField.setId(SPUIComponentIdProvider.TARGET_ADD_CONTROLLER_ID);
|
||||
/* Textfield for target name */
|
||||
nameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY,
|
||||
false, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH);
|
||||
nameTextField.setId(SPUIComponentIdProvider.TARGET_ADD_NAME);
|
||||
controllerIDTextField = createTextField("prompt.target.id", SPUIComponentIdProvider.TARGET_ADD_CONTROLLER_ID);
|
||||
nameTextField = createTextField("textfield.name", SPUIComponentIdProvider.TARGET_ADD_NAME);
|
||||
nameTextField.setRequired(false);
|
||||
|
||||
/* Textarea for target description */
|
||||
descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style",
|
||||
ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.description"),
|
||||
SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
descTextArea.setId(SPUIComponentIdProvider.TARGET_ADD_DESC);
|
||||
descTextArea = new TextAreaBuilder().caption(i18n.get("textfield.description")).style("text-area-style")
|
||||
.prompt(i18n.get("textfield.description")).immediate(true).id(SPUIComponentIdProvider.TARGET_ADD_DESC)
|
||||
.buildTextComponent();
|
||||
descTextArea.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY);
|
||||
}
|
||||
|
||||
private void buildLayout() {
|
||||
private TextField createTextField(final String in18Key, final String id) {
|
||||
return new TextFieldBuilder().caption(i18n.get(in18Key)).required(true).prompt(i18n.get(in18Key))
|
||||
.immediate(true).id(id).buildTextComponent();
|
||||
}
|
||||
|
||||
/*
|
||||
* The main layout of the window contains mandatory info, textboxes
|
||||
* (controller Id, name & description) and action buttons layout
|
||||
*/
|
||||
private void buildLayout() {
|
||||
setSizeUndefined();
|
||||
formLayout = new FormLayout();
|
||||
formLayout.addComponent(controllerIDTextField);
|
||||
@@ -166,8 +157,10 @@ public class TargetAddUpdateWindowLayout extends CustomComponent {
|
||||
|
||||
public Window getWindow() {
|
||||
eventBus.publish(this, DragEvent.HIDE_DROP_HINT);
|
||||
window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.target"), null,
|
||||
SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), null, null, formLayout, i18n);
|
||||
window = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).caption(i18n.get("caption.add.new.target"))
|
||||
.content(this).saveButtonClickListener(event -> saveTargetListner()).layout(formLayout).i18n(i18n)
|
||||
.buildCommonDialogWindow();
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.management.targettable;
|
||||
|
||||
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
|
||||
import static org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil.isNotNullOrEmpty;
|
||||
import static org.eclipse.hawkbit.ui.utils.SPUIDefinitions.TARGET_TABLE_CREATE_AT_SORT_ORDER;
|
||||
import static org.springframework.data.domain.Sort.Direction.ASC;
|
||||
import static org.springframework.data.domain.Sort.Direction.DESC;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -30,7 +36,6 @@ import org.eclipse.hawkbit.ui.utils.SpringContextHelper;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Slice;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.domain.Sort.Direction;
|
||||
import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery;
|
||||
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
||||
|
||||
@@ -39,11 +44,12 @@ import com.google.common.base.Strings;
|
||||
/**
|
||||
* Simple implementation of generics bean query which dynamically loads a batch
|
||||
* of beans.
|
||||
*
|
||||
*/
|
||||
public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
|
||||
private static final long serialVersionUID = -5645680058303167558L;
|
||||
private Sort sort = new Sort(SPUIDefinitions.TARGET_TABLE_CREATE_AT_SORT_ORDER, "createdAt");
|
||||
|
||||
private Sort sort = new Sort(TARGET_TABLE_CREATE_AT_SORT_ORDER, "createdAt");
|
||||
private transient Collection<TargetUpdateStatus> status = null;
|
||||
private String[] targetTags = null;
|
||||
private Long distributionId = null;
|
||||
@@ -57,7 +63,7 @@ public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
|
||||
/**
|
||||
* Parametric Constructor.
|
||||
*
|
||||
*
|
||||
* @param definition
|
||||
* as Def
|
||||
* @param queryConfig
|
||||
@@ -69,9 +75,10 @@ public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
*/
|
||||
public TargetBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||
final Object[] sortIds, final boolean[] sortStates) {
|
||||
|
||||
super(definition, queryConfig, sortIds, sortStates);
|
||||
|
||||
if (HawkbitCommonUtil.mapCheckStrKey(queryConfig)) {
|
||||
if (isNotNullOrEmpty(queryConfig)) {
|
||||
status = (Collection<TargetUpdateStatus>) queryConfig.get(SPUIDefinitions.FILTER_BY_STATUS);
|
||||
targetTags = (String[]) queryConfig.get(SPUIDefinitions.FILTER_BY_TAG);
|
||||
noTagClicked = (Boolean) queryConfig.get(SPUIDefinitions.FILTER_BY_NO_TAG);
|
||||
@@ -84,12 +91,12 @@ public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
pinnedDistId = (Long) queryConfig.get(SPUIDefinitions.ORDER_BY_DISTRIBUTION);
|
||||
}
|
||||
|
||||
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
|
||||
// Initalize Sor
|
||||
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortIds[0]);
|
||||
// Add sort.
|
||||
if (!isEmpty(sortStates)) {
|
||||
|
||||
sort = new Sort(sortStates[0] ? ASC : DESC, (String) sortIds[0]);
|
||||
|
||||
for (int targetId = 1; targetId < sortIds.length; targetId++) {
|
||||
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC, (String) sortIds[targetId]));
|
||||
sort.and(new Sort(sortStates[targetId] ? ASC : DESC, (String) sortIds[targetId]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -220,5 +227,4 @@ public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
}
|
||||
return i18N;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ import org.eclipse.hawkbit.repository.DeploymentManagement;
|
||||
import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.DistributionSetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.builder.TextAreaBuilder;
|
||||
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||
import org.eclipse.hawkbit.ui.management.dstable.DistributionBeanQuery;
|
||||
@@ -192,10 +194,9 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent {
|
||||
}
|
||||
|
||||
private TextArea getDescriptionTextArea() {
|
||||
final TextArea description = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"),
|
||||
"text-area-style", ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.description"),
|
||||
SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH);
|
||||
description.setId(SPUIComponentIdProvider.BULK_UPLOAD_DESC);
|
||||
final TextArea description = new TextAreaBuilder().caption(i18n.get("textfield.description"))
|
||||
.style("text-area-style").prompt(i18n.get("textfield.description")).immediate(true)
|
||||
.id(SPUIComponentIdProvider.BULK_UPLOAD_DESC).buildTextComponent();
|
||||
description.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY);
|
||||
description.setWidth("100%");
|
||||
return description;
|
||||
@@ -358,10 +359,11 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent {
|
||||
*/
|
||||
public Window getWindow() {
|
||||
managementUIState.setBulkUploadWindowMinimised(false);
|
||||
bulkUploadWindow = SPUIComponentProvider.getWindow("", null, SPUIDefinitions.CREATE_UPDATE_WINDOW);
|
||||
|
||||
bulkUploadWindow = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).caption("").content(this)
|
||||
.buildWindow();
|
||||
bulkUploadWindow.addStyleName("bulk-upload-window");
|
||||
bulkUploadWindow.setImmediate(true);
|
||||
bulkUploadWindow.setContent(this);
|
||||
if (isNoBulkUploadInProgress()) {
|
||||
bulkUploader.getUpload().setEnabled(true);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user