| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.sqoop.mapreduce.mainframe; |
| |
| import java.text.ParseException; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.conf.Configuration; |
| |
| /** |
| * This class determines resolves FTP folder paths |
| * given the data set type and the data set name |
| */ |
| |
| public class MainframeDatasetPath { |
| |
| private static final Log LOG = |
| LogFactory.getLog(MainframeDatasetPath.class); |
| private String datasetName; |
| private MainframeDatasetType datasetType; |
| private String dsFolderName = null; |
| private String dsFileName = null; |
| |
| // default constructor |
| public MainframeDatasetPath(){} |
| |
| // constructor that takes dataset name job configuration |
| public MainframeDatasetPath(String dsName, Configuration conf) throws Exception { |
| String inputName |
| = conf.get(MainframeConfiguration.MAINFRAME_INPUT_DATASET_NAME); |
| // this should always be true |
| assert(inputName.equals(dsName)); |
| LOG.info("Datasets to transfer from: " + dsName); |
| this.datasetName = dsName; |
| // initialise dataset type |
| String dsType = conf.get(MainframeConfiguration.MAINFRAME_INPUT_DATASET_TYPE); |
| this.setMainframeDatasetType(dsType); |
| initialisePaths(); |
| } |
| |
| public MainframeDatasetPath(String dsName, MainframeDatasetType dsType) { |
| this.setMainframeDatasetName(dsName); |
| this.setMainframeDatasetType(dsType); |
| initialisePaths(); |
| } |
| |
| public MainframeDatasetPath(String dsName, String dsType) throws ParseException { |
| this.setMainframeDatasetName(dsName); |
| this.setMainframeDatasetType(dsType); |
| initialisePaths(); |
| } |
| |
| public void initialisePaths() throws IllegalStateException { |
| if (this.datasetName == null || this.datasetType == null) { |
| throw new IllegalStateException("Please set data set name and type first."); |
| } |
| boolean isSequentialDs = this.datasetType.equals(MainframeDatasetType.SEQUENTIAL); |
| boolean isGDG = this.datasetType.equals(MainframeDatasetType.GDG); |
| LOG.info(String.format("dsName: %s", this.datasetName)); |
| LOG.info(String.format("isSequentialDs: %s isGDG: %s", isSequentialDs, isGDG)); |
| if (isSequentialDs) |
| { |
| // truncate the tailing string until the dot |
| // usually dataset qualifiers are dots. eg blah1.blah2.blah3 |
| // so in this case, we should return blah1.blah2 |
| int lastDotIndex = this.datasetName.lastIndexOf("."); |
| // if not found, it is probably in the root |
| if (lastDotIndex == -1) { this.datasetName = ""; } else { |
| // if found, return the truncated name |
| dsFolderName = this.datasetName.substring(0, lastDotIndex); |
| if (lastDotIndex + 1 < this.datasetName.length()) { |
| dsFileName = this.datasetName.substring(lastDotIndex + 1); |
| } |
| } |
| } else { |
| // GDG or PDS |
| dsFolderName = this.datasetName; |
| dsFileName = null; // handle parentheses parsing later |
| } |
| } |
| |
| // getters and setters |
| public MainframeDatasetType getMainframeDatasetType() { |
| return this.datasetType; |
| } |
| |
| public void setMainframeDatasetType(MainframeDatasetType dsType) { |
| this.datasetType = dsType; |
| } |
| |
| // overloaded setter to parse string |
| public void setMainframeDatasetType(String dsType) throws ParseException { |
| if (dsType.equals("s")) { this.datasetType = MainframeDatasetType.SEQUENTIAL; } |
| else if (dsType.equals("p")) { this.datasetType = MainframeDatasetType.PARTITIONED; } |
| else if (dsType.equals("g")) { this.datasetType = MainframeDatasetType.GDG; } |
| else { throw new ParseException(String.format("Invalid data set type specified: %s",dsType), 0); } |
| } |
| |
| public String getMainframeDatasetName() { |
| return this.datasetName; |
| } |
| |
| public void setMainframeDatasetName(String dsName) { |
| this.datasetName = dsName; |
| } |
| |
| public String getMainframeDatasetFolder() { |
| return this.dsFolderName; |
| } |
| |
| public String getMainframeDatasetFileName() { |
| // returns filename in the folder and null if it is a GDG as this requires a file listing |
| return dsFileName; |
| } |
| } |