/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.platform.ui.command; import hr.fer.zemris.vhdllab.entity.File; import hr.fer.zemris.vhdllab.entity.FileType; import hr.fer.zemris.vhdllab.entity.Project; import hr.fer.zemris.vhdllab.platform.i18n.LocalizationSource; import hr.fer.zemris.vhdllab.service.Simulator; import hr.fer.zemris.vhdllab.service.WorkspaceService; import hr.fer.zemris.vhdllab.service.exception.NoAvailableProcessException; import hr.fer.zemris.vhdllab.service.exception.SimulatorTimeoutException; import hr.fer.zemris.vhdllab.service.result.CompilationMessage; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.CyclicBarrier; import javax.annotation.Resource; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import org.apache.commons.lang.UnhandledException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.richclient.command.ActionCommand; public class DevFloodWithCompliationRequestsCommand extends ActionCommand { public static final String ID = "floodWithCompliationRequestsCommand"; @Autowired private WorkspaceService workspaceService; @Autowired protected Simulator simulator; @Resource(name = "standaloneLocalizationSource") protected LocalizationSource localizationSource; public DevFloodWithCompliationRequestsCommand() { super(ID); setDisplaysInputDialog(true); } @Override protected void doExecuteCommand() { logger .info("Http client should be configured with MultiThreadedHttpConnectionManager and parameters that should be set are defaultMaxConnectionsPerHost and maxTotalConnections!!!"); Project project; String projectName = "development_compilation_flood_project"; project = workspaceService.persist(projectName); File file = createFile(project); try { floodWithCompilationRequests(file.getId(), file.getName()); } finally { // cleanup workspaceService.deleteProject(project.getId()); } } private void floodWithCompilationRequests(final Integer fileId, final String name) { String input = JOptionPane.showInputDialog("How many?", "30"); int floodCount = Integer.parseInt(input); final List<String> results = Collections .synchronizedList(new ArrayList<String>(floodCount)); final CyclicBarrier barrier = new CyclicBarrier(floodCount); List<Thread> threads = new ArrayList<Thread>(floodCount); long start = System.currentTimeMillis(); for (int i = 0; i < floodCount; i++) { Thread thread = new Thread(new Runnable() { @SuppressWarnings("synthetic-access") @Override public void run() { try { barrier.await(); } catch (Exception e) { throw new UnhandledException(e); } logger.info("sending at: " + System.currentTimeMillis()); List<CompilationMessage> messages; try { messages = simulator.compile(fileId); } catch (SimulatorTimeoutException e) { String message = localizationSource.getMessage( "simulator.compile.timout", new Object[] { name }); messages = Collections .singletonList(new CompilationMessage(message)); } catch (NoAvailableProcessException e) { String message = localizationSource.getMessage( "simulator.compile.no.processes", new Object[] { name }); messages = Collections .singletonList(new CompilationMessage(message)); } if (messages.isEmpty()) { results.add("Successful"); } else { results.add(messages.get(0).getText()); } } }); thread.start(); threads.add(thread); } logger.info("waiting for threads to complete..."); for (Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { throw new UnhandledException(e); } } long end = System.currentTimeMillis(); logger.info("ended in " + (end - start) + " ms"); showResults(results); } private void showResults(List<String> results) { logger.info(results); JList list = new JList(results.toArray()); JOptionPane.showOptionDialog(null, new JScrollPane(list), "Results", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); } private File createFile(Project project) { File file = new File("development_file_name", FileType.SOURCE, createData()); file.setProject(project); return workspaceService.createFile(project.getId(), "development_file_name", FileType.SOURCE, createData()) .getFile(); } private String createData() { StringBuilder sb = new StringBuilder(1000); sb.append("library IEEE;\n"); sb.append("use IEEE.STD_LOGIC_1164.ALL;\n"); sb.append("\n"); sb.append("-- note: entity name and resource name must match\n"); sb.append("ENTITY development_file_name IS PORT (\n"); sb.append("a : IN STD_LOGIC;\n"); sb.append("b : IN STD_LOGIC;\n"); sb.append("f : OUT STD_LOGIC);\n"); sb.append("end development_file_name;\n"); sb.append("\n"); sb.append("ARCHITECTURE arch OF development_file_name IS\n"); sb.append("\n"); sb.append("BEGIN\n"); sb.append("\n"); sb.append("END arch;\n"); return sb.toString(); } }