public static ProjectVulnerabilityRating updateProjectVulnerabilityRatingFromRequest( Optional<ProjectVulnerabilityRating> projectVulnerabilityRatings, ResourceRequest request) { String projectId = request.getParameter(PortalConstants.PROJECT_ID); ProjectVulnerabilityRating projectVulnerabilityRating = projectVulnerabilityRatings.orElse( new ProjectVulnerabilityRating() .setProjectId(projectId) .setVulnerabilityIdToReleaseIdToStatus(new HashMap<>())); String vulnerabilityId = request.getParameter(PortalConstants.VULNERABILITY_ID); String releaseId = request.getParameter(PortalConstants.RELEASE_ID); if (!projectVulnerabilityRating.isSetVulnerabilityIdToReleaseIdToStatus()) { projectVulnerabilityRating.setVulnerabilityIdToReleaseIdToStatus(new HashMap<>()); } Map<String, Map<String, List<VulnerabilityCheckStatus>>> vulnerabilityIdToReleaseIdToStatus = projectVulnerabilityRating.getVulnerabilityIdToReleaseIdToStatus(); if (!vulnerabilityIdToReleaseIdToStatus.containsKey(vulnerabilityId)) { vulnerabilityIdToReleaseIdToStatus.put(vulnerabilityId, new HashMap<>()); } if (!vulnerabilityIdToReleaseIdToStatus.get(vulnerabilityId).containsKey(releaseId)) { vulnerabilityIdToReleaseIdToStatus.get(vulnerabilityId).put(releaseId, new ArrayList<>()); } List<VulnerabilityCheckStatus> vulnerabilityCheckStatusHistory = vulnerabilityIdToReleaseIdToStatus.get(vulnerabilityId).get(releaseId); VulnerabilityCheckStatus vulnerabilityCheckStatus = newVulnerabilityCheckStatusFromRequest(request); vulnerabilityCheckStatusHistory.add(vulnerabilityCheckStatus); return projectVulnerabilityRating; }
static void optionalTest() { // 不要这样,这与!=null没什么区别 Optional<String> stringOptional = Optional.of("alibaba"); if (stringOptional.isPresent()) { System.out.println(stringOptional.get().length()); } Optional<String> optionalValue = Optional.of("alibaba"); // 下面是推荐的常用操作 optionalValue.ifPresent(s -> System.out.println(s + " contains red")); // 增加到集合汇总 List<String> results = Lists.newArrayList(); optionalValue.ifPresent(results::add); // 增加到集合中,并返回操作结果 Optional<Boolean> added = optionalValue.map(results::add); // 无值的optional Optional<String> optionalString = Optional.empty(); // 不存在值,返回“No word” String result = optionalValue.orElse("No word"); // 没值,计算一个默认值 result = optionalString.orElseGet(() -> System.getProperty("user.dir")); // 无值,抛一个异常 try { result = optionalString.orElseThrow(NoSuchElementException::new); } catch (Throwable t) { t.getCause(); } }
@Test public void _07_옵션_다루기() { final Optional<String> optional = words.stream().filter(w -> w.contains("red")).findFirst(); try { optional.ifPresent( v -> { throw new RuntimeException(); }); assert false; // 이 행은 실행되면 안됨. } catch (RuntimeException e) { } // 비어있는 경우는 실행되지 않음. Optional.empty() .ifPresent( v -> { throw new RuntimeException(); }); Set<String> results = new HashSet<>(); optional.ifPresent(results::add); assertThat(results.contains("tired"), is(true)); // 실행 결과를 받고 싶은 경우에는 map 사용. results = new HashSet<>(); Optional<Boolean> added = optional.map(results::add); assertThat(added, is(Optional.of(Boolean.TRUE))); // 대상이 빈경우에는 empty Optional 반환 Optional<Boolean> a = Optional.empty().map(v -> true); assertThat(a.isPresent(), is(false)); Optional<String> emptyOptional = Optional.empty(); // orElse로 기본값 지정 가능 String result = emptyOptional.orElse("기본값"); assertThat(result, is("기본값")); // 기본값 생성하는 코드 호출 가능 result = emptyOptional.orElseGet(() -> System.getProperty("user.dir")); assertThat(result, is(System.getProperty("user.dir"))); // 값이 없는 경우 예외 던지기 try { emptyOptional.orElseThrow(NoSuchElementException::new); assert false; } catch (NoSuchElementException e) { } }
public static Container setup( DataSource dataSource, Properties properties, Optional<ClassLoader> classLoader, Iterator<SystemAspect> aspects) throws IOException { ClassLoader loader = classLoader.orElse(Thread.currentThread().getContextClassLoader()); SimpleContainer container = new SimpleContainer("true".equals(properties.getProperty("revenj.resolveUnknown"))); container.registerInstance(properties); container.registerInstance(ServiceLocator.class, container, false); container.registerInstance(DataSource.class, dataSource, false); container.registerInstance(ClassLoader.class, loader, false); String ns = properties.getProperty("revenj.namespace"); SimpleDomainModel domainModel = new SimpleDomainModel(ns, loader); container.registerInstance(DomainModel.class, domainModel, false); container.registerFactory(DataContext.class, LocatorDataContext::asDataContext, false); container.registerFactory(UnitOfWork.class, LocatorDataContext::asUnitOfWork, false); PluginLoader plugins = new ServicesPluginLoader(loader); container.registerInstance(PluginLoader.class, plugins, false); PostgresDatabaseNotification databaseNotification = new PostgresDatabaseNotification( dataSource, Optional.of(domainModel), properties, container); container.registerInstance(EagerNotification.class, databaseNotification, false); container.registerInstance(DataChangeNotification.class, databaseNotification, true); ChangeNotification.registerContainer(container, databaseNotification); container.registerFactory(RepositoryBulkReader.class, PostgresBulkReader::create, false); container.registerInstance( PermissionManager.class, new RevenjPermissionManager(container), false); container.registerClass( new Generic<Serialization<String>>() {}.type, DslJsonSerialization.class, false); int total = 0; if (aspects != null) { JinqMetaModel.configure(container); while (aspects.hasNext()) { aspects.next().configure(container); total++; } } String nsAfter = properties.getProperty("revenj.namespace"); if (!Objects.equals(ns, nsAfter)) { domainModel.updateNamespace(nsAfter); } properties.setProperty("revenj.aspectsCount", Integer.toString(total)); return container; }
/** * @param payObjects покупки, суммарную стоимость которых нужно посчитать * @return суммарное колличество стоимости покупок */ public Integer getSumPrice(List<PayObject> payObjects) { Optional<Integer> optional = payObjects.stream().map(PayObject::getPrice).reduce((s1, s2) -> s1 + s2); return optional.orElse(0); }
/** * @param payObjects покупки, текст о которых нужно составить * @return сгрупированный текст о всех переданных покупок */ public String getTextPayObjects(List<PayObject> payObjects) { Optional<String> optional = payObjects.stream().map(PayObject::toString).reduce((s1, s2) -> s1 + "\n\n" + s2); return optional.orElse(""); }
@Override public VulnerabilityUpdateStatus updateForRelease(String releaseId) { Optional<Release> release = vulnerabilityConnector.getRelease(releaseId); Optional<VulnerabilityUpdateStatus> updateStatus = release.map(this::updateForRelease); return updateStatus.orElse(getEmptyVulnerabilityUpdateStatus(RequestStatus.FAILURE)); }