Package it.eng.spagobi.utilities.service

Examples of it.eng.spagobi.utilities.service.JSONSuccess


      meta.put("description", analysisMetadata.getDescription());       
      meta.put("scope", analysisMetadata.getScope());
           
     
      try {
        writeBackToClient( new JSONSuccess(meta) );
      } catch (IOException e) {
        throw new SpagoBIServiceException(SERVICE_NAME, "Impossible to write back the responce to the client", e);
      }
     
    } catch(Throwable t) {
View Full Code Here


          throw new SpagoBIEngineServiceException(getActionName(), result);
        }
       
        try {
          String newSubobjectId = result.substring(5);
          JSONSuccess success = new JSONSuccess(newSubobjectId);
          writeBackToClient( success );
        } catch (IOException e) {
          String message = "Impossible to write back the responce to the client";
          throw new SpagoBIEngineServiceException(getActionName(), message, e);
        }
View Full Code Here

     
      dataSetWriter = new JSONDataWriter();
      gridDataFeed = (JSONObject)dataSetWriter.write(dataStore);
     
      try {
        writeBackToClient( new JSONSuccess(gridDataFeed) );
      } catch (IOException e) {
        String message = "Impossible to write back the responce to the client";
        throw new SpagoBIEngineServiceException(getActionName(), message, e);
      }
     
View Full Code Here

        node.put("attributes", nodeAttributes);
        nodes.put(node);
      }
     
      try {
        writeBackToClient( new JSONSuccess(nodes) );
      } catch (IOException e) {
        String message = "Impossible to write back the responce to the client";
        throw new SpagoBIEngineServiceException(getActionName(), message, e);
      }
     
View Full Code Here

        }
        */
      }
     
      try {
        writeBackToClient( new JSONSuccess(nodes) );
      } catch (IOException e) {
        String message = "Impossible to write back the responce to the client";
        throw new SpagoBIEngineServiceException(getActionName(), message, e);
      }
     
View Full Code Here

           
      dataSetWriter = new JSONDataWriter();
      gridDataFeed = (JSONObject)dataSetWriter.write(dataStore);
     
      try {
        writeBackToClient( new JSONSuccess(gridDataFeed) );
      } catch (IOException e) {
        String message = "Impossible to write back the responce to the client";
        throw new SpagoBIEngineServiceException(getActionName(), message, e);
      }
     
View Full Code Here

     
      serializer2 = new LookupStoreJSONSerializer();
      gridDataFeed = (JSONObject)serializer2.serialize(dataStore);
     
      try {
        writeBackToClient( new JSONSuccess(gridDataFeed) );
      } catch (IOException e) {
        String message = "Impossible to write back the responce to the client";
        throw new SpagoBIEngineServiceException(getActionName(), message, e);
      }
     
View Full Code Here

          kpis =cleanKpiListForRelation((ArrayList<Kpi>)kpis, kpiParent);
        }
        JSONArray resourcesJSON = (JSONArray) SerializerFactory.getSerializer("application/json").serialize(kpis, locale);
        JSONObject resourcesResponseJSON = createJSONResponseResources(resourcesJSON, totalItemsNum);

        writeBackToClient(new JSONSuccess(resourcesResponseJSON));

      } catch (Throwable e) {
        logger.error("Exception occurred while retrieving thresholds", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while retrieving thresholds", e);
      }
    } else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_INSERT)) {

      String id = getAttributeAsString(ID);
      String code = getAttributeAsString(CODE);
      String name = getAttributeAsString(NAME);
      String description = getAttributeAsString(DESCRIPTION);
      String weight = getAttributeAsString(WEIGHT);
      Boolean isAdditive = getAttributeAsBoolean(ISADDITIVE);
     
      String dsLabel = getAttributeAsString(DATASET);
      String thresholdCode = getAttributeAsString(THR);
      JSONArray docLabelsJSON = null;
      String docs = getAttributeAsString(DOCS);
      if(docs!=null && !docs.contains(",")){
        //Don't do anything
      }else{
        docLabelsJSON = getAttributeAsJSONArray(DOCS);
      }

      String interpretation = getAttributeAsString(INTERPRETATION);
      String algdesc = getAttributeAsString(ALGDESC);
      String inputAttr = getAttributeAsString(INPUT_ATTR);
      String modelReference = getAttributeAsString(MODEL_REFERENCE);
      String targetAudience = getAttributeAsString(TARGET_AUDIENCE);

      String kpiTypeCd = getAttributeAsString(KPI_TYPE_CD)
      String metricScaleCd = getAttributeAsString(METRIC_SCALE_TYPE_CD);
      String measureTypeCd = getAttributeAsString(MEASURE_TYPE_CD);       

      JSONArray udpValuesArrayJSon = getAttributeAsJSONArray(UDP_VALUE_LIST);

      List<Domain> domains = (List<Domain>)getSessionContainer().getAttribute("kpiTypesList");
      List<Domain> domains1 = (List<Domain>)getSessionContainer().getAttribute("measureTypesList");
      List<Domain> domains2 = (List<Domain>)getSessionContainer().getAttribute("metricScaleTypesList");
      domains.addAll(domains1);
      domains.addAll(domains2);

      HashMap<String, Integer> domainIds = new HashMap<String, Integer> ();
      if(domains != null){
        for(int i=0; i< domains.size(); i++){
          domainIds.put(domains.get(i).getValueCd(), domains.get(i).getValueId());
        }
      }

      Integer kpiTypeId = domainIds.get(kpiTypeCd);
      Integer metricScaleId = domainIds.get(metricScaleCd);
      Integer measureTypeId = domainIds.get(measureTypeCd);

      if (name != null && code != null) {
        Kpi k = new Kpi();

        try {

          k.setKpiName(name);
          k.setCode(code);

          if(description != null){
            k.setDescription(description);
          }
          if(weight != null && !weight.equalsIgnoreCase("")){
            k.setStandardWeight(Double.valueOf(weight));
         
          if(isAdditive != null && isAdditive.booleanValue()==true){
            k.setIsAdditive(new Boolean(true));
          }else{
            k.setIsAdditive(new Boolean(false));
          }
          if(dsLabel != null){
            k.setDsLabel(dsLabel);
            IDataSet ds = dsDao.loadActiveDataSetByLabel(dsLabel);

            if(ds!=null){
              int dsId = ds.getId();
              k.setKpiDsId(new Integer(dsId));
            }       
          }
          if(thresholdCode != null){
            Threshold t = thrDao.loadThresholdByCode(thresholdCode);
            k.setThreshold(t);
          }

          k.setKpiName(name);
          k.setCode(code);

          if(description != null){
            k.setDescription(description);
          }
          if(weight != null && !weight.equalsIgnoreCase("")){
            k.setStandardWeight(Double.valueOf(weight));
         
          if(dsLabel != null){
            k.setDsLabel(dsLabel);
            IDataSet ds = dsDao.loadActiveDataSetByLabel(dsLabel);

            if(ds!=null){
              int dsId = ds.getId();
              k.setKpiDsId(new Integer(dsId));
            }       
          }
          if(thresholdCode != null){
            Threshold t = thrDao.loadThresholdByCode(thresholdCode);
            k.setThreshold(t);
          }

          List docsList = null;
          if(docLabelsJSON != null){
            docsList = deserializeDocLabelsJSONArray(docLabelsJSON);
            k.setSbiKpiDocuments(docsList);
          }else if(docs!=null && !docs.equalsIgnoreCase("")){
            KpiDocuments d = new KpiDocuments();
            d.setBiObjLabel(docs);
            docsList = new ArrayList();
            docsList.add(d);
            k.setSbiKpiDocuments(docsList);
          }

          if(interpretation != null){
            k.setInterpretation(interpretation);
          }
          if(algdesc != null){
            k.setMetric(algdesc);
          }
          if(inputAttr != null){
            k.setInputAttribute(inputAttr);
          }
          if(modelReference != null){
            k.setModelReference(modelReference);
          }
          if(targetAudience != null){
            k.setTargetAudience(targetAudience);
          }
          if(kpiTypeCd != null){
            k.setKpiTypeCd(kpiTypeCd);
            k.setKpiTypeId(kpiTypeId);
          }
          if(metricScaleCd != null){
            k.setMetricScaleCd(metricScaleCd);
            k.setMetricScaleId(metricScaleId);
          }
          if(measureTypeCd != null){
            k.setMeasureTypeCd(measureTypeCd);
            k.setMeasureTypeId(measureTypeId);
          }   

          // add to Kpi Definition UDP Value list...
          //List udpValues = k.getUdpValues();
          List<UdpValue> udpValues = new ArrayList<UdpValue>()
          for(int i=0; i< udpValuesArrayJSon.length(); i++){
            JSONObject obj = (JSONObject)udpValuesArrayJSon.get(i);
            // only label and value information are retrieved by JSON object
            String label = obj.getString("name")
            String value = obj.getString("value")

            UdpValue udpValue = new UdpValue();

            // reference id is the kpi id
            Integer kpiId = k.getKpiId();

            //udpValue.setLabel(label);
            udpValue.setValue(value);
            udpValue.setReferenceId(kpiId);

            // get the UDP to get ID (otherwise could be taken in js page)
            Udp udp = DAOFactory.getUdpDAO().loadByLabelAndFamily(label, "KPI");
            Domain familyDomain = DAOFactory.getDomainDAO().loadDomainById(udp.getFamilyId());

            Integer idUdp = udp.getUdpId();

            udpValue.setLabel(udp.getLabel());
            udpValue.setName(udp.getName());
            udpValue.setFamily(familyDomain != null ? familyDomain.getValueCd() : null);
            udpValue.setUdpId(udp.getUdpId());

            udpValues.add(udpValue);
          }

          k.setUdpValues(udpValues);


          if(id != null && !id.equals("") && !id.equals("0")){             
            k.setKpiId(Integer.valueOf(id));
            kpiDao.modifyKpi(k);
            logger.debug("threshold "+id+" updated");
            JSONObject attributesResponseSuccessJSON = new JSONObject();
            attributesResponseSuccessJSON.put("success", true);
            attributesResponseSuccessJSON.put("responseText", "Operation succeded");
            attributesResponseSuccessJSON.put("id", id);
            writeBackToClient( new JSONSuccess(attributesResponseSuccessJSON) );
          }else{
            Integer kpiID = kpiDao.insertKpi(k);
            logger.debug("New threshold inserted");
            JSONObject attributesResponseSuccessJSON = new JSONObject();
            attributesResponseSuccessJSON.put("success", true);
            attributesResponseSuccessJSON.put("responseText", "Operation succeded");
            attributesResponseSuccessJSON.put("id", kpiID);
            writeBackToClient( new JSONSuccess(attributesResponseSuccessJSON) );
          }

        } catch(EMFUserError e){
          logger.error("EMFUserError");
          e.printStackTrace();
        } catch (JSONException e) {
          logger.error("JSONException");
          e.printStackTrace();
        } catch (IOException e) {
          logger.error("IOException");
          e.printStackTrace();
        }

      }else{
        logger.error("Resource name, code or type are missing");
        throw new SpagoBIServiceException(SERVICE_NAME,  "Please fill threshold name, code and type");
      }
    } else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_DELETE)) {
      Integer id = getAttributeAsInteger(ID);
      try {
        kpiDao.deleteKpi(id);
        logger.debug("Resource deleted");
        writeBackToClient( new JSONAcknowledge("Operation succeded") );
      } catch (Throwable e) {
        logger.error("Exception occurred while retrieving resource to delete", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while retrieving resource to delete", e);
      }
    }else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_LINKS)) {     
      try {
        Integer id =null;
        try{
          id = getAttributeAsInteger(ID);
        }catch (Exception e) {
          logger.debug("No Kpi Instance Id");
        }
        ArrayList <KpiRel> relations = new ArrayList<KpiRel>();
        //looks up for relations
        if(id != null){
          relations = (ArrayList <KpiRel>)kpiDao.loadKpiRelListByParentId(id);
          logger.debug("Kpi relations loaded");
 
          //looks up for dataset parameters       
          IDataSet dataSet = kpiDao.getDsFromKpiId(id);
          if(dataSet != null){
            String parametersString = dataSet.getParameters();
   
            ArrayList<String> parameters = new ArrayList<String>();
            logger.debug("Dataset Parameters loaded");
            if(parametersString != null){
              SourceBean source = SourceBean.fromXMLString(parametersString);
              if(source.getName().equals("PARAMETERSLIST")) {
                List<SourceBean> rows = source.getAttributeAsList("ROWS.ROW");
                for(int i=0; i< rows.size(); i++){
                  SourceBean row = rows.get(i);
                  String name = (String)row.getAttribute("name");
                  parameters.add(name);
                }
              }
              JSONArray paramsJSON = serializeParametersList(parameters, relations);
              JSONObject paramsResponseJSON = createJSONResponseResources(paramsJSON, parameters.size());
              writeBackToClient(new JSONSuccess(paramsResponseJSON));
            }else{
              writeBackToClient(new JSONSuccess(new JSONObject()));
            }
          }else{
            writeBackToClient(new JSONSuccess(new JSONObject()));
          }
        }else{
          writeBackToClient(new JSONSuccess(new JSONObject()));
        }

      } catch (Throwable e) {
        logger.error("Exception occurred while retrieving kpi links", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while retrieving kpi links", e);
      }
    } else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_LINKS_BY_DS)) {     
      try {
        String labelDS = getAttributeAsString("label");
        //looks up for relations
        ArrayList <KpiRel> relations = new ArrayList <KpiRel>();

        //looks up for dataset parameters       
        IDataSet dataSet = DAOFactory.getDataSetDAO().loadActiveDataSetByLabel(labelDS);
        String parametersString = dataSet.getParameters();

        ArrayList<String> parameters = new ArrayList<String>();
        logger.debug("Dataset Parameters loaded");
        if(parametersString != null){
          SourceBean source = SourceBean.fromXMLString(parametersString);
          if(source.getName().equals("PARAMETERSLIST")) {
            List<SourceBean> rows = source.getAttributeAsList("ROWS.ROW");
            for(int i=0; i< rows.size(); i++){
              SourceBean row = rows.get(i);
              String name = (String)row.getAttribute("name");
              parameters.add(name);
            }
          }
          JSONArray paramsJSON = serializeParametersList(parameters, relations);
          JSONObject paramsResponseJSON = createJSONResponseResources(paramsJSON, parameters.size());
          writeBackToClient(new JSONSuccess(paramsResponseJSON));
        }else{
          writeBackToClient(new JSONSuccess(new JSONObject()));
        }

      } catch (Throwable e) {
        logger.error("Exception occurred while retrieving kpi links", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while retrieving kpi links", e);
      }
    }
    else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_LINK_SAVE)) {

      Integer kpiParentId = getAttributeAsInteger("kpiParentId");
      Integer kpiLinked = getAttributeAsInteger("kpiLinked");
      String parameter = getAttributeAsString("parameter");


      try {
        try{
          Integer relId = getAttributeAsInteger("relId");
          if(relId != null){
            boolean res = kpiDao.deleteKpiRel(relId);
          }
        }catch(Throwable t){
          logger.debug("Insert new relation");
        }
        Integer idRel = kpiDao.setKpiRel(kpiParentId, kpiLinked, parameter);
        logger.debug("Resource deleted");
        writeBackToClient( new JSONSuccess(new JSONObject("{id: "+idRel.intValue()+"}")) );
      } catch (Throwable e) {
        logger.error("Exception occurred while saving kpis link", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while saving kpis link", e);
      }
    }else if (serviceType != null  && serviceType.equalsIgnoreCase(KPI_LINK_DELETE)) {

      Integer kpiRelId = getAttributeAsInteger("relId");
      try {
        boolean res = kpiDao.deleteKpiRel(kpiRelId);
        logger.debug("Resource deleted");
        writeBackToClient( new JSONSuccess("Operation succeded") );
      } catch (Throwable e) {
        logger.error("Exception occurred while deleting kpis link", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while saving kpis link", e);
      }
View Full Code Here

        logger.debug("Loaded thresholds list");
        JSONArray resourcesJSON = (JSONArray) SerializerFactory.getSerializer("application/json").serialize(thresholds, locale);
        JSONObject resourcesResponseJSON = createJSONResponseResources(resourcesJSON, totalItemsNum);
 
        writeBackToClient(new JSONSuccess(resourcesResponseJSON));
 
      } catch (Throwable e) {
        logger.error("Exception occurred while retrieving thresholds", e);
        throw new SpagoBIServiceException(SERVICE_NAME,
            "Exception occurred while retrieving thresholds", e);
      }
    } else if (serviceType != null  && serviceType.equalsIgnoreCase(THRESHOLD_INSERT)) {
      String id = getAttributeAsString(ID);
      String code = getAttributeAsString(CODE);
      String name = getAttributeAsString(NAME);
      String description = getAttributeAsString(DESCRIPTION);
      String typeCD = getAttributeAsString(NODE_TYPE_CODE)
     
      JSONArray thrValuesJSON = null;
      Integer position = null;
      String thrValId = null;
      String label = null;     
      String colourString = null;
      Double value = null;
      String severityCd = null;
      Boolean minClosed = null;
      Double minValue = null;
      Boolean maxClosed = null;
      Double maxValue = null;
     
      if(typeCD!=null && typeCD.equals("RANGE")){
       
        thrValuesJSON = getAttributeAsJSONArray(THRESHOLD_VALUES);
       
      }else if(typeCD!=null && (typeCD.equals("MINIMUM") || typeCD.equals("MAXIMUM")) ){
       
        String pos = getAttributeAsString(THR_VAL_POSITION)
        if(pos!=null && !pos.equals("")){
          position = new Integer(pos);
        }       
        thrValId = getAttributeAsString(THR_VAL_ID);
        label = getAttributeAsString(THR_VAL_LABEL);
        colourString = getAttributeAsString(THR_VAL_COLOR);
        String valueS = getAttributeAsString(THR_VAL_VALUE);       
        if(valueS!=null && !valueS.equals("")){
          value = new Double(valueS);
        }
        severityCd = getAttributeAsString(THR_VAL_SEVERITY_CD);
        String minC = getAttributeAsString(THR_VAL_MIN_INCLUDED)
        if(minC!=null && !minC.equals("")){
          minClosed = new Boolean(minC);
        }else{
          minClosed = new Boolean("false");
        }
        String minValueS = getAttributeAsString(THR_VAL_MIN);
        if(minValueS!=null && !minValueS.equals("")){
          minValue = new Double(minValueS);
        }
       
        String maxValueS = getAttributeAsString(THR_VAL_MAX);       
        if(maxValueS!=null && !maxValueS.equals("")){
          maxValue = new Double(maxValueS);
        }
        String maxC = getAttributeAsString(THR_VAL_MAX_INCLUDED)
        if(maxC!=null && !maxC.equals("")){
          maxClosed = new Boolean(maxC);
        }else{
          maxClosed = new Boolean("false");
        }
      }

      List<Domain> domains = (List<Domain>)getSessionContainer().getAttribute("thrTypesList");
      List<Domain> domainsthrValues = (List<Domain>)getSessionContainer().getAttribute("thrSeverityTypes");
      domains.addAll(domainsthrValues);
     
        HashMap<String, Integer> domainIds = new HashMap<String, Integer> ();
        if(domains != null){
          for(int i=0; i< domains.size(); i++){
            domainIds.put(domains.get(i).getValueCd(), domains.get(i).getValueId());
          }
        }
       
        Integer typeID = domainIds.get(typeCD);
        if(typeID == null){
          logger.error("Threshold type CD does not exist");
          throw new SpagoBIServiceException(SERVICE_NAME,  "Threshold Type ID is undefined");
        }
 
      if (name != null && typeID != null && code != null) {
        Threshold thr = new Threshold();
        thr.setName(name);
        thr.setThresholdTypeCode(typeCD);
        thr.setThresholdTypeId(typeID);
        thr.setCode(code);
 
        if(description != null){
          thr.setDescription(description);
       
       
        List thrValuesList = new ArrayList();
        if(typeCD != null){
          if(typeCD.equals("MINIMUM") || typeCD.equals("MAXIMUM")){
            ThresholdValue tVal = new ThresholdValue();
            if(thrValId!= null && !thrValId.equals("") && !thrValId.equals("0")){
              tVal.setId(Integer.valueOf(thrValId));
            }
            tVal.setLabel(label);           
            tVal.setPosition(position);
            tVal.setColourString(colourString);
            tVal.setValue(value);
            tVal.setSeverityCd(severityCd);
            if(severityCd!=null && !severityCd.equals("")){
              Integer severityId = domainIds.get(severityCd);   
              tVal.setSeverityId(severityId);   
            }

            if(typeCD.equals("MINIMUM")){
              tVal.setMinClosed(minClosed);
              tVal.setMinValue(minValue);
            }else if(typeCD.equals("MAXIMUM")){
              tVal.setMaxClosed(maxClosed);
              tVal.setMaxValue(maxValue);
           
            thrValuesList.add(tVal);
                       
          }else if(typeCD.equals("RANGE")){
            if(thrValuesJSON!=null){
              try {
                thrValuesList = deserializeThresholdValuesJSONArray(thrValuesJSON, domainIds);
              } catch (JSONException e) {
                logger.error("JSON Exception");
                e.printStackTrace();
              }
            }
          }
          thr.setThresholdValues(thrValuesList);
        }
     
        try {

          Integer idToReturnToClient = null;
         
          if(id != null && !id.equals("") && !id.equals("0")){ 
            //modify
            thr.setId(Integer.valueOf(id));
            try{
              thrDao.modifyThreshold(thr);
            }catch(EMFUserError e){
              logger.error(e.getMessage(), e);
              throw e;
             
            }
            idToReturnToClient = Integer.valueOf(id);           
          }else{
            //insert new
            idToReturnToClient = thrDao.insertThreshold(thr);   
          }
         
          List thrValueIds = new ArrayList();
          if(thrValuesList!=null && !thrValuesList.isEmpty()){             
            Iterator it = thrValuesList.iterator();
            while(it.hasNext()){
              ThresholdValue tVal = (ThresholdValue)it.next();
              tVal.setThresholdId(Integer.valueOf(idToReturnToClient));             
              //insert or update all threshold values
              Integer thrValueId = null;
              thrValueId = tDao.saveOrUpdateThresholdValue(tVal);               
              tVal.setId(thrValueId);
              thrValueIds.add(thrValueId);
            }       
          }
         
          logger.debug("Threshold inserted or updated");
          JSONObject attributesResponseSuccessJSON = new JSONObject();
          attributesResponseSuccessJSON.put("success", true);
          attributesResponseSuccessJSON.put("responseText", "Operation succeded");
          attributesResponseSuccessJSON.put("id", idToReturnToClient);
          if(thrValueIds!=null && !thrValueIds.isEmpty()){
            if(thrValueIds.size()==1){
              attributesResponseSuccessJSON.put("idThrVal", thrValueIds.get(0));
            }else{
              JSONArray thrValsJSONArray = (JSONArray) SerializerFactory.getSerializer("application/json").serialize(thrValuesList, locale);     
              attributesResponseSuccessJSON.put("thrValues", thrValsJSONArray);
            }
          }
          writeBackToClient( new JSONSuccess(attributesResponseSuccessJSON) );
 
        } catch (Throwable e) {
          logger.error(e.getMessage(), e);
          if(e instanceof EMFUserError && ((EMFUserError)e).getCode() == 10119){
            String descr = e.getLocalizedMessage();
View Full Code Here

       
      }
      try {
        JSONObject results = new JSONObject();
        results.put("result", "OK");
        writeBackToClient( new JSONSuccess( results ) );
      } catch (IOException e) {
        throw new SpagoBIServiceException(SERVICE_NAME, "Impossible to write back the responce to the client", e);
      } catch (JSONException e) {
        throw new SpagoBIServiceException(SERVICE_NAME, "Cannot serialize objects into a JSON object", e);
      }
View Full Code Here

TOP

Related Classes of it.eng.spagobi.utilities.service.JSONSuccess

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.