All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.jbatch.container.jsl.impl.StepModelResolverImpl Maven / Gradle / Ivy

There is a newer version: 1.0
Show newest version
/*
 * Copyright 2012 International Business Machines Corp.
 * 
 * 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 com.ibm.jbatch.container.jsl.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;
import java.util.Properties;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;


import com.ibm.jbatch.container.jsl.ModelResolver;
import com.ibm.jbatch.jsl.model.Step;
import com.ibm.jbatch.jsl.util.ValidatorHelper;
import com.ibm.jbatch.jsl.util.JSLMerger;
import com.ibm.jbatch.jsl.util.JSLValidationEventHandler;

//FIXME: basically identical to JobModelResolverImpl
public class StepModelResolverImpl implements ModelResolver {

	@Override
	public Step resolveModel(String stepXML) {
        Step theStep = null;
        Step stepModel = unmarshalStepXML(stepXML);
        
        if(stepModel.getParent() != null) {
            //Resolve parent refs for inheritance --CT
        	Step parent = null;
        	try {
				parent = getStepInheritance(stepModel.getParent());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	if (parent != null) {
        		JSLMerger merger = new JSLMerger();
        		theStep = merger.mergeStep(parent, stepModel);
        	}
        }
        if (theStep == null) {
        	theStep = stepModel;
        }
        return theStep;
    }
	
	private Step getStepInheritance(String parentId) throws IOException {
		Step step = null;
		InputStream indexFileUrl = JobModelResolverImpl.class.getResourceAsStream("/META-INF/jobinheritance");
		
		if (indexFileUrl != null) {
			Properties index = new Properties();
			index.load(indexFileUrl);
			
			if (index.getProperty(parentId) != null) {
				URL parentUrl = StepModelResolverImpl.class.getResource(index.getProperty(parentId));
				String parentXml = readJobXML(parentUrl.getFile());
				
				step = resolveModel(parentXml);	
			}
		}
		
		return step;
	}
	
    private String readJobXML(String fileWithPath) throws FileNotFoundException, IOException {

        StringBuffer jobXMLBuffer = ( fileWithPath==null ? null : new StringBuffer() );
        if ( !(fileWithPath==null) ) {
            BufferedReader zin = new BufferedReader( new FileReader( new File(fileWithPath)));
            String input = zin.readLine();
            do {
                if (input != null) {
                    //jobXMLBuffer.append( input.trim() );
                	jobXMLBuffer.append(input);
                    input = zin.readLine();
                }
            } while (input!=null);
        }
        return ( jobXMLBuffer==null ? null : jobXMLBuffer.toString() );

    }

	@Override
	public Step resolveModel(Step t) {
		Step theStep = null;
        if(t.getParent() != null) {
            //Resolve parent refs for inheritance --CT
        	Step parent = null;
        	try {
				parent = getStepInheritance(t.getParent());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	if (parent != null) {
        		JSLMerger merger = new JSLMerger();
        		theStep = merger.mergeStep(parent, t);
        	}
        }
        if (theStep == null) {
        	theStep = t;
        }
		return theStep;
	}

    private Step unmarshalStepXML(String stepXML) {
        Object result = null;
        Step step = null;
        JSLValidationEventHandler handler = new JSLValidationEventHandler();
        try {
            JAXBContext ctx = JAXBContext.newInstance("com.ibm.jbatch.jsl.model");
            Unmarshaller u = ctx.createUnmarshaller();
            u.setSchema(ValidatorHelper.getXJCLSchema());

            u.setEventHandler(handler);

            // Use this for anonymous type
            //job = (Job)u.unmarshal(new StreamSource(new StringReader(jobXML)));

            // Use this for named complex type
            result = u.unmarshal(new StreamSource(new StringReader(stepXML)));

        } catch (JAXBException e) {
            throw new IllegalArgumentException("Exception unmarshalling jobXML", e);
        }

        if (handler.eventOccurred()) {
            throw new IllegalArgumentException("xJCL invalid per schema, see SysOut for now for details");
        }

        step = ((JAXBElement)result).getValue();
        
        return step;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy