package proto.bdaccess; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import javax.naming.NamingException; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Instantiate; import org.apache.felix.ipojo.annotations.Invalidate; import org.apache.felix.ipojo.annotations.Provides; import org.apache.felix.ipojo.annotations.Validate; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import org.ow2.jasmine.event.beans.JasmineEventEB; /** * */ @Component(name = "bdaccess") @Instantiate @Provides public class AdapterService { private Date dateFrom; private Date dateTo; private List<BusinessSLA> businessSLA; private ExportREST exportREST= new ExportREST(); /** * Constructor. */ public AdapterService() { } /** * constructor for test purpose * @param businessSLA */ public AdapterService(List<BusinessSLA> businessSLA) { this.businessSLA = businessSLA; } /** * start of the osgi bundle. * Read the json config file. */ @Validate public void start() { businessSLA = new ArrayList<BusinessSLA>(); /* * BusinessSLA temp = new BusinessSLA(70, 70, 70, new HoursPeriod(0, * 1440), new HoursPeriod(420, 1320), new HoursPeriod(600, 1080), * "smarttravel.com", "meteo_service"); businessSLA.add(temp); temp = * new BusinessSLA(70, 60, 50, new HoursPeriod(0, 1440), new * HoursPeriod(420, 1320), new HoursPeriod(600, 1080), * "smarttravel.com", "exchg_rate_service"); businessSLA.add(temp); temp * = new BusinessSLA(70, 60, 50, new HoursPeriod(0, 1440), new * HoursPeriod(420, 1320), new HoursPeriod(600, 1080), * "smarttravel.com", "translation_service"); businessSLA.add(temp); */ SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd_HH:mm"); try { System.out.println("Processing jasmine QoS events data"); String path = System.getenv("JONAS_BASE") + System.getProperty("file.separator") + "conf" + System.getProperty("file.separator") + "easysoa-adapter.json"; InputStream inputStream; JSONObject config; try { inputStream = new FileInputStream(path); JSONTokener tokener = new JSONTokener(new InputStreamReader( inputStream)); config = new JSONObject(tokener); dateFrom = formate.parse(config.getString("from")); dateTo = formate.parse(config.getString("to")); JSONArray sla = config.getJSONArray("BusinessSLA"); for (int i = 0; i < sla.length(); i++) { businessSLA.add(readSLA(sla.getJSONObject(i))); } inputStream.close(); exportData(dateFrom, dateTo); calculIndicatorsFromTo(dateFrom, dateTo); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } catch (ParseException e) { e.printStackTrace(); } calculTodayIndicators(); } /** * read all the sla json object and make a java object of it. * * @param obj * @return * @throws JSONException */ private BusinessSLA readSLA(JSONObject obj) throws JSONException { int maxGold = obj.getInt("maxGold"); int maxSilver = obj.getInt("maxSilver"); int maxBronze = obj.getInt("maxBronze"); HoursPeriod goldPeriod = new HoursPeriod(obj .getJSONObject("goldPeriod").getInt("beginning"), obj .getJSONObject("goldPeriod").getInt("end")); HoursPeriod silverPeriod = new HoursPeriod(obj.getJSONObject( "silverPeriod").getInt("beginning"), obj.getJSONObject( "silverPeriod").getInt("end")); HoursPeriod bronzePeriod = new HoursPeriod(obj.getJSONObject( "bronzePeriod").getInt("beginning"), obj.getJSONObject( "bronzePeriod").getInt("end")); String provider = obj.getString("provider"); String service = obj.getString("service"); // read new field: SlaOrOlaName String slaOrOlaName= obj.getString("slaOrOlaName"); BusinessSLA temp = new BusinessSLA(maxGold, maxSilver, maxBronze, goldPeriod, silverPeriod, bronzePeriod, provider, service, slaOrOlaName); return temp; } /** * Export the QoS data between date1 and date2 from jasmine database to a file. * * @param date1 * @param date2 */ public void exportData(Date date1, Date date2) { SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd_HH-mm-sss"); String date = formate.format(new Date(System.currentTimeMillis())); // creating file path String path = System.getenv("JONAS_BASE") + System.getProperty("file.separator") + "logs" + System.getProperty("file.separator") + "qos-event-" + date; try { File f = new File(path); // open the file PrintWriter pw = new PrintWriter(new FileWriter(f), true); // print the header pw.println("Qos events from " + date1 + " to " + date2); DataBaseEventExtractor db = new DataBaseEventExtractor(); // extracting data from database JasmineEventEB[] events = db.getQoSEvents(date1, date2, 1200); // print every data for (JasmineEventEB ev : events) { pw.println(ev.getTimestamp() + " " + ev.getProbe() + " : " + ev.getValue()); } // close the file pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } catch (NamingException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } /** * compute today indicator with the database and store them in a file. */ public void calculTodayIndicators() { try { // get today date Date today = new Date(); // calcul today start Calendar cal = Calendar.getInstance(); Date todayStart = new Date( today.getTime() - ((cal.get(Calendar.HOUR_OF_DAY) * 60 * 60 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND)) * 1000)); // extract today qos events from the database DataBaseEventExtractor db = new DataBaseEventExtractor(); JasmineEventEB[] events = db.getQoSEvents(todayStart, today, 12000); // calculate the indicators from the events String res = calculIndicators(events); // Store the result, creating file name SimpleDateFormat formate = new SimpleDateFormat( "yyyy-MM-dd_HH-mm-ss"); String date = formate.format(new Date(System.currentTimeMillis())); String path = System.getenv("JONAS_BASE") + System.getProperty("file.separator") + "logs" + System.getProperty("file.separator") + "service-level-" + date; // open the file File f = new File(path); PrintWriter pw = new PrintWriter(new FileWriter(f), true); // print result in the file pw.println(res); // close the file pw.flush(); pw.close(); } catch (NamingException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * Compute the indicator between from to to with the database and store them in a file. * * @param from * @param to */ public void calculIndicatorsFromTo(Date from, Date to) { try { DataBaseEventExtractor db = new DataBaseEventExtractor(); JasmineEventEB[] events = db.getQoSEvents(from, to, 12000); String res = calculIndicators(events); // Store the result SimpleDateFormat formate = new SimpleDateFormat( "yyyy-MM-dd_HH-mm-ss"); String fromS = formate.format(from); String toS = formate.format(to); String path = System.getenv("JONAS_BASE") + System.getProperty("file.separator") + "logs" + System.getProperty("file.separator") + "service-level-from-" + fromS + "-to-" + toS; File f = new File(path); PrintWriter pw = new PrintWriter(new FileWriter(f), true); pw.println(res); pw.flush(); pw.close(); } catch (NamingException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * Export the QoS data between date1 and date2 from jasmine database to EasySOA via a REST call. * */ public void calculAndExportIndicatorsFromTo() { try { // extract data from the DB Jasmine DataBaseEventExtractor db = new DataBaseEventExtractor(); JasmineEventEB[] events = db.getQoSEvents(dateFrom, dateTo, 12000); // calculate biz SLA indicators of services based on event coming from Jasmine List<ServiceBizSLAResult> listServiceBizSLAResult= calculIndicatorsService(events); // the REST url target base of EasySOA String urlTarget="todo:"; // export each biz SLA level service to esaySOA (REST call) for (ServiceBizSLAResult servBizSLAResult : listServiceBizSLAResult) { // for each service, export the data indicators // exportData(Date dateFrom, Date dateTo, String endPointId, String slaOrOlaName, String level) exportREST.exportData(dateFrom, dateTo , servBizSLAResult.getBusinessSLA().getProvider(), servBizSLAResult.getBusinessSLA().getSlaOrOlaName(), servBizSLAResult.getBusinessServiceLevel().toString()); } } catch (IOException e) { e.printStackTrace(); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * compute indicators for each service in the events. * * @param events * @return */ public String calculIndicators(JasmineEventEB[] events) { // if no events return nothing if (events == null) return ""; // a hashmap to store the result Hashtable<String, BusinessServiceLevel> serviceLevels = new Hashtable<String, BusinessServiceLevel>(); // for each events for (JasmineEventEB ev : events) { // parsing the database line String probe = ev.getProbe(); String[] evProp = probe.split("\\."); String provider = evProp[1] + "." + evProp[2]; String service = evProp[3]; String identifier = service + "@" + provider; String dataType = evProp[4]; // if it s a response time event if (dataType.equals("ResponseTime")) { // finding corresponding BusinessSLA Iterator<BusinessSLA> it = businessSLA.iterator(); BusinessSLA sla = null; int k = 0; while (it.hasNext() && (!(sla = it.next()).getProvider().equals(provider) || !sla .getService().equals(service))) { k++; } // there is a SLA if (k < businessSLA.size()) { // Checking SLA BusinessServiceLevel level = sla.computeServiceLevel( Long.parseLong((String) ev.getValue()), ev.getTimestamp()); // update SL of the service if it worse than actual BusinessServiceLevel oldLevel = serviceLevels .get(identifier); if (oldLevel == null || level.isWorse(oldLevel)) { serviceLevels.put(identifier, level); } } } } // building response string StringBuffer res = new StringBuffer(); Enumeration<String> serviceIdentifiers = serviceLevels.keys(); while (serviceIdentifiers.hasMoreElements()) { String serviceIdentifier = serviceIdentifiers.nextElement(); BusinessServiceLevel level = serviceLevels.get(serviceIdentifier); res.append(serviceIdentifier + " is " + level + " level"); res.append("\n"); } return res.toString(); } /** * compute indicators for each service in the events. * * return list of serviceBizSLA and level calculate (from jasmine events). * * @param events * @return */ public List<ServiceBizSLAResult> calculIndicatorsService(JasmineEventEB[] events) { // to store SLA result for services List<ServiceBizSLAResult> listServiceBizSLAResult= new ArrayList<ServiceBizSLAResult>(); // if no events return nothing if (events == null) return listServiceBizSLAResult; // a hashmap to store the result Hashtable<String, BusinessServiceLevel> serviceLevels = new Hashtable<String, BusinessServiceLevel>(); // for each events for (JasmineEventEB ev : events) { // parsing the database line String probe = ev.getProbe(); String[] evProp = probe.split("\\."); String provider = evProp[1] + "." + evProp[2]; String service = evProp[3]; String identifier = service + "@" + provider; String dataType = evProp[4]; // if its a response time event if (dataType.equals("ResponseTime")) { // finding corresponding BusinessSLA Iterator<BusinessSLA> it = businessSLA.iterator(); BusinessSLA sla = null; int k = 0; while (it.hasNext() && (!(sla = it.next()).getProvider().equals(provider) || !sla.getService().equals(service))) { k++; } // there is a SLA if (k < businessSLA.size()) { // Checking SLA BusinessServiceLevel level = sla.computeServiceLevel( Long.parseLong((String) ev.getValue()), ev.getTimestamp()); // update SL of the service if it worse than actual BusinessServiceLevel oldLevel = serviceLevels.get(identifier); if (oldLevel == null || level.isWorse(oldLevel)) { serviceLevels.put(identifier, level); // save the result: the level indicator calculate and the service biz SLA ServiceBizSLAResult serviceBizSLAResult = new ServiceBizSLAResult(sla, level); } } } } return listServiceBizSLAResult; } /** * things done when the osgi service stop */ @Invalidate public void stop() { System.out.println("stop"); } }