Legacy code refactoring

I have inherited a swing Applet project and there's a bunch of dodgy code, once of them is that the first parameter in most of the constructors is an "owner" reference to the Japplet extension.
Because the code parts are not decoupled it is hard to extract functional units in order to use them for tests, demos or to re-use them in other projects.
Looking at the code (30 .java modules) about half of the units reference the "owner" to access up to 50 different properties and methods. It's been suggested that I uses the interface segregation principle ("Refactoring: Improving the Design of Existing Code", Martin Fowler) to refactor to use an interface rather than the applet reference.
Are there any other suggestions on how to reference the Applet in the other Java units without the code being so coupled?
All comments are appreciated.
Thanks, Tom.

I would use interfaces, but I would also look at the code and wonder why 30 classes need to access 50 methods in this monster class. You might be able to move some logical code together or create some utility classes.

Similar Messages

  • Unit testing legacy code - best approach?

    Hi,
    I've got a project full of legacy code (by this I simply mean untested) and I'm experimenting with retrofitting unit testing to it. I'm sure this entails a great many problems, but here's the first one.
    We have a central class with the Singleton pattern - it's instantiated once and then fetched all over the code. It's a concrete class at the moment, not an interface. Let's call this CentralControl.
    Because the code I want to test relies on the presence of this class, and yet it's too complex/heavyweight to properly instantiate in a test scenario, I need to mock it.
    I guess the ideal way is to turn what's now CentralControl into an interface, and have both a real and mock implementation. The code that enforces the singleton behaviour could have a new method to instantiate the mock version rather than the real thing.
    Would you do this yourself rather than alternatives like extending it, and are there any tools to help automate the process?
    Thanks,
    Rob

    I guess the ideal way is to turn what's now CentralControl into an interface...I think that's the better idea, but you can mock classes as well as interfaces; e.g., EasyMock 2.2.2 and higher.
    ~

  • Does VECTOR exist only for legacy code support??

    My colleague informed me that the VECTOR class was a JAVA 1.0/1.1 implementaiton and is only still around for legacy code support in JAVA 2. Is that a valid statement?? Does SUN publish anything about this issue??

    In JDK1.3 doc it says Arraylist is faster than Vector but unsynchronized. So I guess it's better off using Arraylist in most cases, but Vector is still more convenient to use to ensure threadsafe.

  • Discovering the Design Behind Legacy Code

    Hi all,
    There are lots of tools and utilities out there to help us design good code, and lots of design patterns and good methodologies for us to follow. However, when you're looking at legacy code, is there any "standard" way of trying to work out what's going on?
    At the moment I'm just going through each class as it is called and trying to work out what it does and what it depends on - but this is really time consuming (not to mention tedious).
    Does anyone know of a better way?

    Do you have a UML tool that will allow you to build a model of the code, and then use that model to generate additional views?
    � {�                                                                                                                                                                                                                                                                       

  • Code refactoring / Indenting

    Are there any code refactoring tools available in the new code editor for Flash Professional CC? Sometimes I like to write in pure actionscript, in which case I'll use FlashBuilder. But a lot of times when I work with an artist who makes layouts and assets in Flash Professional, it would be nice to just be able to just work completely in flash without having to switch back and forth to FB.
    I like the new fast, streamlined code editor in Flash CC, but it is missing some great tools (as far as I can tell):
    From most important to least important:
    Refactoring (easily rename methods, properties and references.. This is a big one for me.)
    Correct Indentation
    Generate Getter / Setter
    Organize Imports
    I don't need the full robust tool set of Flash Builder, but at least a couple of simple tools would go a long way to making the code editor more powerful.
    Thanks!

    Are there any code refactoring tools available in the new code editor for Flash Professional CC? Sometimes I like to write in pure actionscript, in which case I'll use FlashBuilder. But a lot of times when I work with an artist who makes layouts and assets in Flash Professional, it would be nice to just be able to just work completely in flash without having to switch back and forth to FB.
    I like the new fast, streamlined code editor in Flash CC, but it is missing some great tools (as far as I can tell):
    From most important to least important:
    Refactoring (easily rename methods, properties and references.. This is a big one for me.)
    Correct Indentation
    Generate Getter / Setter
    Organize Imports
    I don't need the full robust tool set of Flash Builder, but at least a couple of simple tools would go a long way to making the code editor more powerful.
    Thanks!

  • Code refactoring

    Hell code refactoring!
    I inhirite a Java application that was written 15 years ago with millions lines of code
    The code has many problems, including some very basic stuff like comparing object using ==. But somehow, it works and the company keeps using it
    The problem we are facing is the code doesn't support debugging. ALL of the methods have very limited number of variables. The coders writting something like this all over places
    if(getA().getB().getC().getD().getE().getM().equals(getA().getB().getC().getD().getE().getN()){
         getA().getB().getC().getD().getE().getM().setZ(getA().getB().getC().getD().getE().getN().getZ());
    int num = getA().getB().getC().getD().getE().getM().getList().size();
    for(int i = 0; i<num; i++){
        getA().getB().getC().getD().getE().getM().getList().get(i).setSomething();;
    It is unbelievable but it is real. Some of them have more than 10 get() on the same line
    I try to refactor it, adding local variables into the methods, so we can resuse the objects instead of using lines of get()
    It also help debugging the code possible because there are many recursive calls plus the above style make it almost impossible now. Whenever something happens, it took me days to figure out what is wrong
    I am going to break the get() chains but since the code base is huge, I don't know if we have some tools availble.
    If someone has solved similar problem, please give me some advice.
    Thank you very much

    2/ The code has many problems, not a single one. but I feel most important is debuggable.
    Well so far you haven't mentioned a single problem with the code. Further, the code sample you posted is 'debuggable'. But, again, you don't need to 'debug' code that works correctly.
    The below is a real function of the code that I renamed all the terms
    What is it about that code that makes you think it is not 'debuggable'?
    You have to pick your battles. You can't try to rewrite/refactor code just because you don't like the way it was written. That is NOT productive.
    Assuming you even have a need to refactor anything the first step is to identify the CRITICAL code sections/elements/classes/methods. Critical either because they are performance issues or critical because they are what keeps breaking.
    There are almost no comments in the code,
    Then, as I already mentioned, the FIRST step is to analyze the code and DOCUMENT IT. You posted a code snippet and said ABSOLUTELY NOTHING about what that method is supposed to be doing. Why not? Why didn't you post a comment? Have you 'analyzed' that code you posted? If not, why not?
    Your analysis should START with the method signature; the parameters and return type. Have you look at that for the sample you posted? If not, why not?
    Do you see anything unusual about it? I do.
    private Double returnCRValue(TsTRatingOperation aetnRatingOperation, String id) throws Exception {  
    Throws Exception? Almost any coded might throw an exception so why does this method just mention a generic exception instead of a specific one.
    The signature declares that the method returns an instance of Double. Does it actually do that?
    BigDecimal dbvalue = null;
    return dbvalue == null ? null : new Double(dbvalue.doubleValue());  
    Why does the method use BigDecimal in the body but then convert the value to a Double for the return? What if that BigDecimal value can't be converted properly to a Double without losing precision? Why isn't the method returning a BigDecimal? Then the caller can perform any conversions that might be necessary.
    The SECOND place to look for issues is the logic flow of the method. Does every IF statement have an ELSE? If not then why not. A common source of bugs is missing ELSE statements that cause code to fall through and work wrong when the IF condition isn't met. Same with CASE/SWITCH statements; big problem with fall through execution if a BREAK statement is missing when it is needed.
    Do you see any logic issues with that code you posted? I do.
            int nPolModTotal = 0;  
            if (aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs() != null) {  
                nPolModTotal = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs().size();  
            //loop CRs  
            for (int n = 0; n < nPolModTotal; n++) {  
                String sid = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs().get(n).getCRTypeReferenceCode().trim();  
                if (sid.equals(id.trim())) {  
                    dbvalue = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs().get(n).getModFactorValue();  
    .. even more, possibly disastrous processing follows
    The value of 'nPolModTotal' is set to zero.
    Then there is an IF statement that MIGHT SET it to a real non-zero value.
    But WHAT IF IT DOESN'T? The rest of the code in the method will still execute. That for loop will escape ok because of its initialization statements but the next FOR loop will still execute. Is that the correct behaviour? I have no way of knowing. But it is certainly suspicious code for the second part to execute and compute a return value when the first part failed to execute.
    I would want to know why the code works that way and if it is correct or a bug waiting to happen.
    Loops of all kinds are also problematic: wrong initialization, wrong termination, unnecessary code within the loop instead of before the loop. Do you see any of the problems in the method you posted? I do.
    //loop CRs    
            for (int n = 0; n < nPolModTotal; n++) {  
                String sid = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs().get(n).getCRTypeReferenceCode().trim();  
                if (sid.equals(id.trim())) {  
                    dbvalue = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs().get(n).getModFactorValue();  
    Why does EVERY iteration potentially set (and overwrite) the value of 'dbvalue'?
    If the code is looking for a single match then it should EXIT the loop when it finds it. Why iterate through hundreds or thousands of entries (depending on the value of 'nPolModTotal') if you found your 'sid' on the very first match?
    What if there are two matches for that IF statement above? The value of 'dbvalue' will be set to the LAST ONE found. Is that the correct behaviour?
    There is nothing inherently wrong with those concatenated 'get' operations.  I'm assuming by your comments that you want to 'refactor' this line of code
    aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs()
    by creating an instance variable and capturing that value and then using that instance variable in the following loop?
    myOperationsCRs = aetnRatingOperation.getTsTRatingPASOperationTerm().get(0).getOperationCRs() ;
    for (int n = 0; n < nPolModTotal; n++) {    
                String sid = myOperationsCRs.get(n).getCRTypeReferenceCode().trim();
      Why? Why do you think you should 'refactor' that code and use an instance variable for the intermediate result?
    As I said before if I were you I would forget refactoring the code and focus on:
    1. analyzing what it does
    2. adding appropriate comments and annotations (e.g. for the parameters and return type
    3. identifying any logic issues (as I did above)
    4. researching those logic issues with a possible plan to fix them

  • Migrating legacy code to 2008 R2 standards...

    Hi , I'm trying to rewrite the below code which uses tmp tables developed in 2000 version of SQL to 2008 R2 .any help in tuning query is appreciated.. -- Load all ip_id and skill combinations from tblSwDM_stg_SYNONYM into #temp_Complete_Skill_List
    INSERT #temp_Complete_Skill_List
    SELECT DISTINCT sm.switch_id, s.value, max(s.item_name), max(s.descr)
    FROM tblSwDM_stg_SYNONYM s (NOLOCK)
    INNER JOIN tblSwDM_SwitchMaster sm (NOLOCK)
    ON s.cms_id = sm.cms_id
    AND s.acd_no = sm.acd_number
    WHERE s.item_type = 'split'
    GROUP BY sm.switch_id, s.value
    -- Append all additional ip_id and skill combinations from tblSwDM_stg_DSPLIT_UNIQUE into #temp_Complete_Skill_List
    INSERT #temp_Complete_Skill_List
    SELECT DISTINCT stg.ip_id, stg.split, NULL, NULL
    FROM tblSwDM_stg_DSPLIT_UNIQUE stg (NOLOCK)
    LEFT OUTER JOIN #temp_Complete_Skill_List tmp
    ON stg.ip_id = tmp.switch_id
    AND stg.split = tmp.skill
    WHERE tmp.switch_id IS NULL
    AND tmp.skill IS NULL
    ---- The above code will be later used to load the table below..
    UPDATE tblSwDM_Dictionary
    SET end_effective_date = @end_effective_date
    FROM tblSwDM_Dictionary
    INNER JOIN #temp_Updated_Skill ON tblSwDM_Dictionary.row_id = #temp_Updated_Skill.row_id
    WHERE tblSwDM_Dictionary.end_effective_date IS NULL
    INSERT INTO tblSwDM_Dictionary ([dictionary_type_id], [switch_id], [value], [name], [description], [start_effective_date])
    SELECT DISTINCT dictionary_type_id, switch_id, skill, NULLIF(skill_name, ''), NULLIF(skill_description, ''), @start_effective_date
    FROM #temp_Updated_Skill
    Thank you ,
    vishal.

    >> I'm trying to rewrite the below code which uses TMP tables developed in 2000 version of SQL to 2008 R2<<
    How much can you do to upgrade the schema? You have a ton of ISO-111798 violations in the data element names. For example, the prefix “tbl-' is absurdly redundant and it is called “tbling” as a design flaw.
    We do not use temp tables in good SQL. This is how an old COBOL programmer fakes using a scratch tape instead of using a derived table, VIEW or CTE. You even do a step-by-step tape merge in SQL! 
    DISTINCT and GROUP BY are seldom used together. But we have no DDL or other specs, so we do not know. The correct form is INSERT INTO; INSERT is dialect.
    The use of NULLIF(skill_name, '') and NULL constant columns is usually a sign of bad design. How can the skill name be an empty string in a valid schema? Where is the explicit “unknown” value? Why create NULLs and then overwrite them in another process step?
    (answer: This is how we did data processing with punch cards in the 1960's!)
    The term “master” is not RDBMS; it is from tape files and network databases. 
    Why do you have multiple names for the same data element? What is the generic, vague “value”? Generic vague “skill” (skill_name, skill_level, skill_code, etc), “split”? Likewise, there is no such thing as a “type_id” in RDBMS. Do you have a “blood_type” or
    a “blood_type_id”? See the redundancy? People actually will say “blood_type_id_value” or worse. 
    Did you know that the 1970's Sybase UPDATE..FROM.. does not work or port? Today we might use a MERGE statement. 
    But my preference would be a 
    CREATE VIEW Complete_Skill_List (switch_id, something_value, item_name, something_description)
    so that it is always correct and current. It will also probably be faster than constantly doing disk seeks and updates. 
    Any help?
    --CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
    in Sets / Trees and Hierarchies in SQL

  • Generate "override" annotations for legacy code?

    Has anyone run across any utilities that will add override annotations to existing class files? I have a very large existing codebase that I would like to convert to use that annotation, but doing it by hand would be an exceptionally tedious task.
    dan

    Has anyone run across any utilities that will add
    override annotations to existing class files? I have
    a very large existing codebase that I would like to
    convert to use that annotation, but doing it by hand
    would be an exceptionally tedious task.This sounds like it should be possible using Jackpot (http://jackpot.netbeans.org/), but this particular transformation isn't one of their samples.

  • For Eric Chan - is Adobe using legacy (or Sigma's) code to do NR for Foveon raw files ?

    Hi Eric,
    is Adobe using legacy (or Sigma's) code to do NR for Foveon raw files ?
    it was stated (I think it was either you or mr Schewe) that Adobe nowadays do not use NR behind the scenes when NR sliders are zeroed - however this is clearly not the case for Foveon raw files... hence the question - is it Adobe's legacy code that for whatever reason was not changed from old days or Adobe is using some SDK provided by Sigma ?
    compare two screenshots - one is ACR, another is SilkyPix v5 Beta... we do not have any demosaicking for Foveon, so it is clear that ACR despite zeroed sliders does NR behind the scenes... can that be fixed and modern Adobe's NR made available for Foveon raw files, like Adobe has it for other cameras ?

    > Is it possible that this file has defaulted to the 2003 process version by accident?
    ACR shows "Process: 2010 (Current)"
    I think that foveon related code was kind of neglected for quite some time... however if Sigma indeed will start selling SD1 that might cause some influx of new customers and it is time to dust off whatever is for foveon inside ACR/LR.

  • Removing deprecated methods from legacy source?

    What does one do about deprecated methods in legacy code?
    As new versions of the compiler seem to keep supporting the deprecated methods (just offering warnings), there is no reason to invest the resources to update the source? I don't mean methods such as:
    java.lang.Thread stop(),
    I am thinking of methods such as:
    java.awt.Window show();
    Will there ever be tangible consequences to not stopping using deprecated methods? Will code with deprecated methods eventually break?
    Edited by: dpxqb on May 7, 2010 9:50 PM

    There's often an "if it ain't broke, don't fix it" mentality around deprecated methods and classes. Whether that's appropriate or not depends on the individual case. Any deprecated method/class may be removed in any future release, but you have to balance the risk of that happening against the cost of replacing it. Some methods/classes will probably never go away--like Vector, for instance. So there's not much benefit to doing a search/replace on a large codebase.
    It depends on your analysis of the various risks and rewards in your particular situation.

  • Generics and warning free code

    Is it possible to cast to a generic class without compiler warnings?
            Object object = null;
            Comparable comparable1 = (Comparable) object;
            comparable1.compareTo(object); // warning: unchecked call
            Comparable<Object> comparable2 = (Comparable<Object>) object; // warning: unchecked cast
            comparable2.compareTo(object);
            String s = (String) object; // ok
            s.compareTo((String) object); // okMy problem is that casts like these are perfectly useful java code and have nothing to do with interacting with legacy code! Yet it seems no longer possible to write such code without warnings!
    Ruud Diterwich
    (ps. sorry for the cross post)

    No, it is not "legacy code", unless you claim that
    any explicit cast is "legacy code". (which would be
    an assumption that I strongly disagreed with...)
    The compiler feels compelled to issue a warning in
    this case solely because Generics are not first-class
    Java types and thus not subject to runtime
    typechecking at the point of the cast.No, I wouldn't claim all casts are legacy code, and my characterization of the whole example as such was hasty.
    I take your point about precisely why the explict cast to (Comparable<Object>) produces a warning. There's no avoiding this without producing a solution that doesn't involve erasure, and I don't think we want to go over that again?
    Comparable has been parameterized in 5.0 and as such using it as a raw type and calling compareTo() is now coding in a legacy style that produces warnings. Casting doesn't even need to come into it:
            Comparable comparable1 =  "";       
            comparable1.compareTo(null);  //warning: [unchecked] unckeched callYou can argue they should have introduced a Comparable2 interface and left the original alone, but that's another tradeoff.

  • Does JDK 7 make code that works on JRE6

    In the FILE I/O documentation trail, it explains that the documentation has been updated to be consistent with the JDK 7 classes. It also has instructions on the quickest ways to update your legacy code to the new tool kit. And it even explains some way to use a method called .toPath that will allow you to "take advantage of the java.nio.file.Path functionality" using (presumably) JDK6 classes.
    So here are my questions.
    1. Does this mean that if I download and install the current snapshot of JDK 7, then the programs I compile with it willl work with anyone using JRE6?
    2. If the answer to this question is "no" then how could anyone run and debug code using the new classes?
    3. Why does JDK6' version of the the java.io.File class have the aforementioned toPath functionality (via the toPath method), if all this Path stuff is new to JDK 7? Or was all this functionality present in JDK but called something else?
    4. I am using NetBeans....do I need special javadocs files for the new file I/O classes (java.nio.file and java.nio.file.attributes)?

    piMeson wrote:
    In the FILE I/O documentation trail, it explains that the documentation has been [updated to be consistent with the JDK 7 classes|http://java.sun.com/docs/books/tutorial/essential/io/fileio.html]. It also has instructions on the quickest ways to [update your legacy code to the new tool kit|http://java.sun.com/docs/books/tutorial/essential/io/legacy.html#interop]. And it even explains some way to use a [method called .toPath|http://openjdk.java.net/projects/nio/javadoc/java/io/File.html#toPath()] that will allow you to "take advantage of the java.nio.file.Path functionality" using (presumably) JDK6 classes. FTFY
    >
    So here are my questions.
    1. Does this mean that if I download and install the current snapshot of JDK 7, then the programs I compile with it willl work with anyone using JRE6? Nope. These programs won't run with JRE6. These programs will run with JDK 7; some of them may also run with OpenJDK (google for "OpenJDK" if you're interested in details)
    2. If the answer to this question is "no" then how could anyone run and debug code using the new classes?One can run and debug with JDK 7; also [some code|http://openjdk.java.net/projects/nio/javadoc/java/io/File.html#toPath()] may run and debug with OpenJDK
    3. Why does JDK6' version of the the java.io.File class have the aforementioned toPath functionality (via the toPath method), if all this Path stuff is new to JDK 7? Or was all this functionality present in JDK but called something else? [JDK6' version of the the java.io.File|http://java.sun.com/javase/6/docs/api/java/io/File.html] does NOT have toPath method.
    >
    4. I am using NetBeans....do I need special javadocs files for the new file I/O classes (java.nio.file and java.nio.file.attributes)?as long as you stick with [JDK 6|http://java.sun.com/javase/6/] - you don't have any JDK7-specific API features at all and in particular you don't need any special javadoc files
    HTH

  • Measure frequency of Z pulse of an accu coder shaft encoder to measure speed using an 6034 E card

    Hi,
    I would like to measure the speed of a engine which has an accu coder encoder hooked onto it. It provides 3 pulses A, B, and Z. I am using a 6034 E PXI card. I wanted to know if there are any examples/ideas that could help me with this (I am new to the digital programming in Labview). I have moved to NI Daqmx 9.8 recently from the older version which supported legacy codes and hence in process of updating the code. I also want to know if an external clock source is required to do this. this. 
    Solved!
    Go to Solution.

    Hello,
    There are several examples in the NI Example finder (you can get here by going to Help >> Find Examples in a LabVIEW window). You can browse to the encoder examples by going to Hardware Input and Output >> DAQmx >> Counter Input. You should be able to find a few examples that will be helpful. 
    Also, this link is a good resources for getting started using DAQmx: http://www.ni.com/white-paper/5438/en
    Thanks!
    Stephanie S.
    Application Engineer
    National Instruments

  • Tools for extracting strings from java code for internationalization

    For legacy code with lots and lots of strings what method is typically used to extract strings for internationalization?
    Am I right in thinking you couldnt simply grep for strings, it could get pretty complitcated, especially with escape characters, escaped quotes etc.,
    -SK

    When dealing with legacy code, it is nice to have an application that queries you as it extracts the strings. You have a choice whether to accept the string as a localizable entity or not.
    There are several tools that do this...including some IDEs like JBuilder. Although it isn't a fully supported or robust tool, Sun has a utility for extracting strings in Java source files:
    http://java.sun.com/products/jilkit/.
    Regards,
    John O'Conner

  • Using 1.4 code without having to modify for generics

    I have some source code that I wrote a few years back with j2sdk1.4.0_01. The program worked great and never gave me any problems until I updated to the current VM. Is there a way to compile and run my legacy code? I get 'errors' now when attempting to compile (from windows xp command line.) I've done some research and have found that my problem lies with my non-use of generics. Although I understand the importance of generics, I would like to compile and run my old code without having to modify it. I have been hunting for weeks now on the subject and have had little luck. Could someone please help me out???
    Thanks so much in advance.

    You are not required to use generics introduced in Java 5.
    You may be getting warnings about using non-typed collections and interface, but the code should compile.
    Can you post a class with a compile error?
    Edited by: josephmmorgan on Sep 6, 2008 2:42 PM

Maybe you are looking for

  • Populating the Values into Dropdownindex using Web services

    Hi Experts, Iam New to the Web dynpro for java.i am doing one assignment. That assignment is like this 1. Create a form with 4 text boxes Plant, material, UOM, altBOM 2. Using webservices 3. Populate plant textbox with list of plants as input help 4.

  • How to install BI-CONT 7.37 in SAP ECC system EHP 5

    Hi SAP Gurus, We recently upgraded BI_CONT in our BW landscape(SAP netweaver 7.3) from 7.36 to 7.37 What is the strategy to upgrade BI _CONT or corresponding changes in SAP ECC system(EHP 5). Currently we don't have BI_CONT installed in our  ECC syst

  • Final Cut Pro Compatibility

    I'm looking to buy FCPX for my 2010 macbook pro. It has a 2.66 GHz core 2 duo processor and 4GB 1067 MHz of memory. Would FCPX work alright on my macbook? I don't remember what the mac OS was when I bought it (lion, snow leapord, flamingo) but I have

  • How to do date validation in Web Dynpro java

    Hi We have one requirement that One input field with date type is there.When we take Date type input field then in web dynpro Date navigater is appearing by default.Our requirement is if user enters the date manually in the input filed instead of cho

  • How to Configure Email for a Specific job when its Fails

    Hi We have So many jobs running in our HR system and BW systems but with no proper Monitoring Configuration. We have Solution manager 7.0 with EHP latest version with CCMS configured. How to setup the email in Solution Manager using CCMS when Job fai