http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/client/src/main/resources/process-0.1.xsd ---------------------------------------------------------------------- diff --git a/client/src/main/resources/process-0.1.xsd b/client/src/main/resources/process-0.1.xsd deleted file mode 100644 index 7ed8474..0000000 --- a/client/src/main/resources/process-0.1.xsd +++ /dev/null @@ -1,477 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. - --> -<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" - targetNamespace="uri:falcon:process:0.1" xmlns="uri:falcon:process:0.1" - xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> - <xs:annotation> - <xs:documentation> - 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. - </xs:documentation> - <xs:appinfo> - <jaxb:schemaBindings> - <jaxb:package name="org.apache.falcon.entity.v0.process"/> - </jaxb:schemaBindings> - </xs:appinfo> - </xs:annotation> - - <xs:element name="process" type="process"> - <xs:annotation> - <xs:documentation> - A process defines configuration for the workflow job like - frequency of the workflow, inputs and outputs for the workflow, how to - handle workflow failures, how to handle data that comes late and so on. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:complexType name="process"> - <xs:sequence> - <xs:element type="KEY_VALUE_PAIR" name="tags" minOccurs="0"> - <xs:annotation> - <xs:documentation> - tags: a process specifies an optional list of comma separated tags, - Key Value Pairs, separated by comma, - which is used for classification of processes. - Example: [email protected], [email protected], department=forecasting - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="PIPELINE_LIST" name="pipelines" minOccurs="0" maxOccurs="1"> - <xs:annotation> - <xs:documentation> - pipelines: a process specifies an optional list of comma separated pipelines, - separated by comma, which is used for classification of processes. - Example: dataReplicationPipeline, clickStreamPipeline - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="clusters" name="clusters"> - <xs:annotation> - <xs:documentation>Defines the clusters where the workflow should run - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="parallel"> - <xs:annotation> - <xs:documentation>Defines how many workflow instances can run concurrently - </xs:documentation> - </xs:annotation> - <xs:simpleType> - <xs:restriction base="xs:unsignedShort"> - <xs:minInclusive value="1"/> - <xs:maxInclusive value="12"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - <xs:element type="execution-type" name="order"> - <xs:annotation> - <xs:documentation>Defines the order in which ready workflow instances should run - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="frequency-type" name="timeout" minOccurs="0"> - <xs:annotation> - <xs:documentation>Defines time after which instances will no longer be executed - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="frequency-type" name="frequency"> - <xs:annotation> - <xs:documentation>Defines workflow frequency - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="sla" name="sla" minOccurs="0"> - <xs:annotation> - <xs:documentation> - Defines SLA(Service Level Agreement) for process. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="timezone" minOccurs="0" default="UTC"> - <xs:simpleType> - <xs:annotation> - <xs:appinfo> - <jaxb:javaType name="java.util.TimeZone" parseMethod="java.util.TimeZone.getTimeZone" - printMethod="org.apache.falcon.entity.v0.SchemaHelper.getTimeZoneId"/> - </xs:appinfo> - </xs:annotation> - <xs:restriction base="xs:string"/> - </xs:simpleType> - </xs:element> - <xs:element type="inputs" name="inputs" minOccurs="0"> - <xs:annotation> - <xs:documentation>Defines inputs for the workflow. The workflow will run only when the scheduled - time is up and all the inputs are available - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="outputs" name="outputs" minOccurs="0"> - <xs:annotation> - <xs:documentation>Defines outputs of the workflow - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="properties" name="properties" minOccurs="0"> - </xs:element> - <xs:element type="workflow" name="workflow"> - <xs:annotation> - <xs:documentation>Defines the workflow that should run. The workflow should be defined with respect - to the workflow specification of the workflow engine. - Only - oozie workflow engine is supported as of now. The workflow path is the path on hdfs which - contains the workflow xml - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="spark-attributes" name="spark-attributes" minOccurs="0"> - <xs:annotation> - <xs:documentation>Defines the spark related attributes to run the Spark application. Attributes - must be defined when workflow engine "spark" is selected. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="retry" name="retry" minOccurs="0"> - <xs:annotation> - <xs:documentation>Retry defines how to handle workflow failures. Policy type - periodic, exponential - backoff, final along with the delay define how frequently the workflow should be re-tried. Number of - attempts define how many times to re-try the failures. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="late-process" name="late-process" minOccurs="0"> - <xs:annotation> - <xs:documentation>Late process defines how the late data should be handled. Late policy - backoff, - exponential backoff, final along with delay - define how - frequently Falcon should check for late data. The late data handling can be customized for each - input separatly. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="notification" name="notification" minOccurs="0"> - <xs:annotation> - <xs:documentation>Notification will help to notify the users about the finished status of Falcon - Instance. Currently Email type notification is supported and users must specify the receiver's - email address. - </xs:documentation> - </xs:annotation> - </xs:element> - <xs:element type="ACL" name="ACL" minOccurs="0"/> - </xs:sequence> - <xs:attribute type="IDENTIFIER" name="name" use="required"/> - <xs:attribute type="xs:int" name="version" use="optional" default="0"/> - </xs:complexType> - - <xs:simpleType name="IDENTIFIER"> - <xs:restriction base="xs:string"> - <xs:pattern value="(([a-zA-Z]([\-a-zA-Z0-9])*){1,39})"/> - </xs:restriction> - </xs:simpleType> - - <xs:complexType name="clusters"> - <xs:annotation> - <xs:documentation> - A list of clusters. - </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element type="cluster" name="cluster" maxOccurs="unbounded" minOccurs="1"/> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="cluster"> - <xs:annotation> - <xs:documentation> - Defines the cluster where the workflow should run. In addition, it also defines the validity of the - workflow on this cluster - </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element type="validity" name="validity"/> - <xs:element type="sla" name="sla" minOccurs="0" maxOccurs="1"/> - </xs:sequence> - <xs:attribute type="IDENTIFIER" name="name" use="required"/> - <xs:attribute type="xs:int" name="version" use="optional" default="0"/> - </xs:complexType> - - <xs:complexType name="validity"> - <xs:annotation> - <xs:documentation> - Defines the vailidity of the workflow as start and end time - </xs:documentation> - </xs:annotation> - <xs:attribute type="date-time-type" name="start" use="required"/> - <xs:attribute type="date-time-type" name="end" use="required"/> - </xs:complexType> - - <xs:simpleType name="date-time-type"> - <xs:annotation> - <xs:appinfo> - <jaxb:javaType name="java.util.Date" parseMethod="org.apache.falcon.entity.v0.SchemaHelper.parseDateUTC" - printMethod="org.apache.falcon.entity.v0.SchemaHelper.formatDateUTC"/> - </xs:appinfo> - </xs:annotation> - <xs:restriction base="xs:string"> - <xs:pattern - value="((1|2)\d\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5][0-9]))Z"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="execution-type"> - <xs:restriction base="xs:string"> - <xs:enumeration value="FIFO"/> - <xs:enumeration value="LIFO"/> - <xs:enumeration value="LAST_ONLY"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="frequency-type"> - <xs:annotation> - <xs:appinfo> - <jaxb:javaType name="org.apache.falcon.entity.v0.Frequency" - parseMethod="org.apache.falcon.entity.v0.Frequency.fromString" - printMethod="org.apache.falcon.entity.v0.Frequency.toString"/> - </xs:appinfo> - </xs:annotation> - <xs:restriction base="xs:string"> - <xs:pattern value="(minutes|hours|days|months)\([1-9]\d*\)"/> - </xs:restriction> - </xs:simpleType> - - <xs:complexType name="sla"> - <xs:annotation> - <xs:documentation> - sla has 2 optional attributes - shouldStartIn and shouldEndIn. All the attributes - are written using expressions like frequency. shouldStartIn is the time in which the process should have - started. shouldEndIn is the time in which the process should have finished. - </xs:documentation> - </xs:annotation> - <xs:attribute type="frequency-type" name="shouldStartIn"/> - <xs:attribute type="frequency-type" name="shouldEndIn" /> - </xs:complexType> - - <xs:complexType name="inputs"> - <xs:sequence> - <xs:element type="input" name="input" maxOccurs="unbounded" minOccurs="1"> - <xs:annotation> - <xs:documentation>Defines input for the workflow. Each input maps to a feed. Input path and - frequency are picked from feed definition. - The input specifies the - start and end instance for the workflow. Falcon creates a property with input name which - contains paths of all input - instances between start and end. This - property will be available for the workflow to read inputs. - Input can also optionally specify the specific partition of feed that the workflow needs. - </xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="input"> - <xs:attribute type="IDENTIFIER" name="name" use="required"/> - <xs:attribute type="IDENTIFIER" name="feed" use="required"/> - <xs:attribute type="xs:string" name="start" use="required"/> - <xs:attribute type="xs:string" name="end" use="required"/> - <xs:attribute type="xs:string" name="partition" use="optional"/> - <xs:attribute type="xs:boolean" name="optional" use="optional" default="false"/> - </xs:complexType> - - <xs:complexType name="outputs"> - <xs:sequence> - <xs:element type="output" name="output" maxOccurs="unbounded" minOccurs="1"> - <xs:annotation> - <xs:documentation>Each output maps to a feed. The Output path and frequency are picked from the - corresponding feed definition. - The output also specifies the - instance that is created in terms of EL expression. - For each output, Falcon creates a property with the output name which can be used in workflows - </xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="output"> - <xs:attribute type="IDENTIFIER" name="name" use="required"/> - <xs:attribute type="IDENTIFIER" name="feed" use="required"/> - <xs:attribute type="xs:string" name="instance" use="required"/> - </xs:complexType> - - <xs:complexType name="workflow"> - <xs:attribute type="xs:string" name="name" use="optional"/> - <xs:attribute type="xs:string" name="version" use="optional" default="1.0"/> - <xs:attribute type="engine-type" name="engine" use="optional" default="oozie"/> - <xs:attribute type="xs:string" name="path" use="required"/> - <xs:attribute type="xs:string" name="lib" use="optional"/> - </xs:complexType> - - <xs:simpleType name="engine-type"> - <xs:restriction base="xs:string"> - <xs:enumeration value="oozie"/> - <xs:enumeration value="pig"/> - <xs:enumeration value="hive"/> - <xs:enumeration value="spark"/> - </xs:restriction> - </xs:simpleType> - - <xs:complexType name="spark-attributes"> - <xs:annotation> - <xs:documentation> - List of Spark attributes to run Spark application: - master element is optional and indicates the url of the Spark Master. Ex: yarn-client, yarn-master, or local. This will override the Spark interface, if define in cluster entity. - mode element if present indicates the mode of spark, where to run spark driver program. Ex: client,cluster. - name element indicates the name of the spark application. - class element if present, indicates the spark's application main class. - jar element indicates a comma separated list of jars or python files. Also provide the jar or file directory path to workflow attribute path - spark-opts element if present, contains a list of spark options that can be passed to spark driver. - arg element if present, contains arguments that can be passed to spark application. - </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="master" type="xs:string" minOccurs="0" maxOccurs="1"/> - <xs:element name="mode" type="xs:string" minOccurs="0" maxOccurs="1"/> - <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/> - <xs:element name="class" type="xs:string" minOccurs="0" maxOccurs="1"/> - <xs:element name="jar" type="xs:string" minOccurs="1" maxOccurs="1"/> - <xs:element name="spark-opts" type="xs:string" minOccurs="0" maxOccurs="1"/> - <xs:element name="arg" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="retry"> - <xs:attribute type="policy-type" name="policy" use="required"/> - <xs:attribute type="frequency-type" name="delay" use="required"/> - <xs:attribute name="attempts" use="required"> - <xs:simpleType> - <xs:restriction base="xs:unsignedShort"> - <xs:minInclusive value="1"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute type="xs:boolean" name="onTimeout" use="optional" default="false"/> - </xs:complexType> - - <xs:simpleType name="policy-type"> - <xs:restriction base="xs:string"> - <xs:enumeration value="periodic"/> - <xs:enumeration value="exp-backoff"/> - <xs:enumeration value="final"/> - </xs:restriction> - </xs:simpleType> - - <xs:complexType name="late-process"> - <xs:sequence> - <xs:element type="late-input" name="late-input" maxOccurs="unbounded" minOccurs="1"> - <xs:annotation> - <xs:documentation> - For each input, defines the workflow that should be run when late data is detected - </xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - <xs:attribute type="policy-type" name="policy" use="required"/> - <xs:attribute type="frequency-type" name="delay" use="required"/> - </xs:complexType> - - <xs:complexType name="late-input"> - <xs:attribute type="IDENTIFIER" name="input" use="required"/> - <xs:attribute type="xs:string" name="workflow-path" use="required"/> - </xs:complexType> - - <xs:complexType name="properties"> - <xs:sequence> - <xs:element type="property" name="property" maxOccurs="unbounded" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="property"> - <xs:attribute type="xs:string" name="name" use="required"/> - <xs:attribute type="xs:string" name="value" use="required"/> - </xs:complexType> - - <xs:simpleType name="KEY_VALUE_PAIR"> - <xs:restriction base="xs:string"> - <xs:pattern value="([\w_]+=[^,]+)?([,]?[ ]*[\w_]+=[^,]+)*"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="PIPELINE_LIST"> - <xs:restriction base="xs:string"> - <xs:pattern value="([\w+_]+)([,]?[ ]*([\w+_]+))*"/> - </xs:restriction> - </xs:simpleType> - - <xs:complexType name="ACL"> - <xs:annotation> - <xs:documentation> - Access control list for this process. - owner is the Owner of this entity. - group is the one which has access to read - not used at this time. - permission is not enforced at this time - </xs:documentation> - </xs:annotation> - <xs:attribute type="xs:string" name="owner"/> - <xs:attribute type="xs:string" name="group"/> - <xs:attribute type="xs:string" name="permission" default="*"/> - </xs:complexType> - - <xs:complexType name="notification"> - <xs:annotation> - <xs:documentation> - Notification specifies the "type" of notification to be used to send notification. - Currently email based notification type is supported and user can specify the comma - separated email address with "to" property. - e.g: type="email" to="falcon@localhost,hive@localhost" - "limit" property in notification will help to set the frequency of email notification - in case of Falcon instance failure. - If limit="attempt" is set, for every instance failure email will be sent. - If limit="final" is set, failure email will be sent only when all the attempts has been - tried defined with retry element. - </xs:documentation> - </xs:annotation> - <xs:attribute name="type" use="required"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="email"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="level" use="optional"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="attempt"/> - <xs:enumeration value="instance"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute type="xs:string" name="to" use="required"/> - </xs:complexType> -</xs:schema>
http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/client/src/test/java/org/apache/falcon/entity/v0/DateValidatorTest.java ---------------------------------------------------------------------- diff --git a/client/src/test/java/org/apache/falcon/entity/v0/DateValidatorTest.java b/client/src/test/java/org/apache/falcon/entity/v0/DateValidatorTest.java deleted file mode 100644 index a1adb24..0000000 --- a/client/src/test/java/org/apache/falcon/entity/v0/DateValidatorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * 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.falcon.entity.v0; - -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -/** - * Date format yyyy/mm/dd validator Testing. - */ -public class DateValidatorTest { - - @DataProvider - public Object[][] validDateProvider() { - return new Object[][]{ - new Object[]{"2011-11-01T00:00Z", }, new Object[]{"2020-01-01T00:00Z", }, - new Object[]{"2010-01-31T00:59Z", }, new Object[]{"2020-01-31T00:00Z", }, - new Object[]{"2008-02-29T01:00Z", }, new Object[]{"2008-02-29T00:00Z", }, - new Object[]{"2009-02-28T01:01Z", }, new Object[]{"2009-02-28T00:00Z", }, - new Object[]{"2010-03-31T23:00Z", }, new Object[]{"2010-03-31T00:00Z", }, - new Object[]{"2010-04-30T23:59Z", }, new Object[]{"2010-04-30T00:00Z", }, - new Object[]{"2010-05-31T23:23Z", }, new Object[]{"2010-05-31T00:00Z", }, - new Object[]{"2010-06-30T00:00Z", }, new Object[]{"2010-06-30T00:00Z", }, - new Object[]{"2010-07-31T00:00Z", }, new Object[]{"2010-07-31T00:00Z", }, - new Object[]{"2010-08-31T00:00Z", }, new Object[]{"2010-08-31T00:00Z", }, - new Object[]{"2010-09-30T00:00Z", }, new Object[]{"2010-09-30T00:00Z", }, - new Object[]{"2010-10-31T00:00Z", }, new Object[]{"2010-10-31T00:00Z", }, - new Object[]{"2010-11-30T00:00Z", }, new Object[]{"2010-11-30T00:00Z", }, - new Object[]{"2010-12-31T00:00Z", }, new Object[]{"2010-12-31T00:00Z", }, - new Object[]{"1999-01-30T01:00Z", }, new Object[]{"2999-12-31T00:00Z", }, - }; - } - - @DataProvider - public Object[][] invalidDateProvider() { - return new Object[][]{ - new Object[]{"2010-12-31T00:60Z", }, new Object[]{"2010-12-31T24:00Z", }, - new Object[]{"2010-01-32T00:00Z", }, new Object[]{"2020-01-32T00:00Z", }, - new Object[]{"2010-13-1T00:00Z", }, new Object[]{"1820-01-01T00:00Z", }, - new Object[]{"2007-2-29T00:00Z", }, new Object[]{"2007-02-29T00:00Z", }, - new Object[]{"2008-2-30T00:00Z", }, new Object[]{"2008-02-31T00:00Z", }, - new Object[]{"2008-a-29T00:00Z", }, new Object[]{"2008-02aT00:00Z", }, - new Object[]{"2008-2-333T00:00Z", }, new Object[]{"200a-02-29T00:00Z", }, - new Object[]{"2010-4-31T00:00Z", }, new Object[]{"2010-04-31T00:00Z", }, - new Object[]{"2010-6-31T00:00Z", }, new Object[]{"2010-06-31T00:00Z", }, - new Object[]{"2010-9-31T00:00Z", }, new Object[]{"2010-09-31T00:00Z", }, - new Object[]{"2010-11-31T00:00Z", }, new Object[]{"1999-04-31T01:00Z", }, - new Object[]{null, }, new Object[]{"", }, new Object[]{" ", }, - }; - } - - @Test(dataProvider = "validDateProvider") - public void validDateTest(String date) { - boolean valid = DateValidator.validate(date); - System.out.println("Date is valid : " + date + " , " + valid); - Assert.assertEquals(valid, true); - } - - @Test(dataProvider = "invalidDateProvider", - dependsOnMethods = "validDateTest") - public void invalidDateTest(String date) { - boolean valid = DateValidator.validate(date); - System.out.println("Date is valid : " + date + " , " + valid); - Assert.assertEquals(valid, false); - } -} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/client/src/test/java/org/apache/falcon/entity/v0/TestFrequency.java ---------------------------------------------------------------------- diff --git a/client/src/test/java/org/apache/falcon/entity/v0/TestFrequency.java b/client/src/test/java/org/apache/falcon/entity/v0/TestFrequency.java deleted file mode 100644 index 56e442f..0000000 --- a/client/src/test/java/org/apache/falcon/entity/v0/TestFrequency.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * 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.falcon.entity.v0; - -import org.testng.Assert; -import org.testng.annotations.Test; - -/** - * Test frequency. - */ -@Test -public class TestFrequency { - - public void testValidFrequency() { - String freqStr = "minutes(10)"; - Frequency freq = Frequency.fromString(freqStr); - Assert.assertEquals(freq.getTimeUnit().name(), "minutes"); - Assert.assertEquals(freq.getFrequency(), "10"); - Assert.assertEquals(freq.getFrequencyAsInt(), 10); - } -} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/pom.xml ---------------------------------------------------------------------- diff --git a/common-types/pom.xml b/common-types/pom.xml new file mode 100644 index 0000000..714b166 --- /dev/null +++ b/common-types/pom.xml @@ -0,0 +1,164 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + 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. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.falcon</groupId> + <artifactId>falcon-main</artifactId> + <version>0.11-SNAPSHOT</version> + </parent> + <artifactId>falcon-common-types</artifactId> + <description>Apache Falcon Java common types</description> + <name>Apache Falcon Java common types</name> + <packaging>jar</packaging> + + + <dependencies> + + <dependency> + <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-auth</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-client</artifactId> + </dependency> + + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + </dependency> + + <dependency> + <groupId>commons-net</groupId> + <artifactId>commons-net</artifactId> + </dependency> + + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + + <dependency> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-client</artifactId> + </dependency> + + <dependency> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-json</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + </dependency> + + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> + + <dependency> + <groupId>com.github.stephenc.findbugs</groupId> + <artifactId>findbugs-annotations</artifactId> + </dependency> + + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.hive.hcatalog</groupId> + <artifactId>hive-webhcat-java-client</artifactId> + <version>${hive.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/dependency</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.jvnet.jaxb2.maven2</groupId> + <artifactId>maven-jaxb2-plugin</artifactId> + <version>0.8.0</version> + <executions> + <execution> + <id>1</id> + <phase>generate-sources</phase> + <goals> + <goal>generate</goal> + </goals> + </execution> + </executions> + <configuration> + <args> + <arg>-extension</arg> + <arg>-Xinheritance</arg> + </args> + <plugins> + <plugin> + <groupId>org.jvnet.jaxb2_commons</groupId> + <artifactId>jaxb2-basics</artifactId> + <version>0.6.3</version> + </plugin> + </plugins> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.7</source> + <target>1.7</target> + </configuration> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/LifeCycle.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/LifeCycle.java b/common-types/src/main/java/org/apache/falcon/LifeCycle.java new file mode 100644 index 0000000..0ecddd1 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/LifeCycle.java @@ -0,0 +1,41 @@ +/** + * 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.falcon; + +/** + * Represents life cycle of an entity. + */ + +public enum LifeCycle { + EXECUTION(Tag.DEFAULT), + EVICTION(Tag.RETENTION), + REPLICATION(Tag.REPLICATION), + IMPORT(Tag.IMPORT), + EXPORT(Tag.EXPORT); + + private final Tag tag; + + LifeCycle(Tag tag) { + this.tag = tag; + } + + public Tag getTag() { + return this.tag; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/Pair.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/Pair.java b/common-types/src/main/java/org/apache/falcon/Pair.java new file mode 100644 index 0000000..d4cea90 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/Pair.java @@ -0,0 +1,78 @@ +/** + * 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.falcon; + +import java.io.Serializable; + +/** + * Simple pair class to hold a pair of object of specific class. + * @param <A> - First element in pair. + * @param <B> - Second element in pair + */ +public class Pair<A, B> implements Serializable { + + private static final long serialVersionUID = 1L; + + //SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck + public final A first; + public final B second; + //RESUME CHECKSTYLE CHECK VisibilityModifierCheck + + public Pair(A fst, B snd) { + this.first = fst; + this.second = snd; + } + + public static <A, B> Pair<A, B> of(A a, B b) { + return new Pair<A, B>(a, b); + } + + @Override + public String toString() { + return "(" + first + "," + second + ")"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Pair pair = (Pair) o; + + if (first != null ? !first.equals(pair.first) : pair.first != null) { + return false; + } + if (second != null ? !second.equals(pair.second) : pair.second != null) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = first != null ? first.hashCode() : 0; + result = 31 * result + (second != null ? second.hashCode() : 0); + return result; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/Tag.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/Tag.java b/common-types/src/main/java/org/apache/falcon/Tag.java new file mode 100644 index 0000000..3c2f25e --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/Tag.java @@ -0,0 +1,42 @@ +/** + * 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.falcon; + +import org.apache.falcon.entity.v0.EntityType; + +/** + * Tag to include in the entity type. + */ +public enum Tag { + DEFAULT(EntityType.PROCESS), + RETENTION(EntityType.FEED), + REPLICATION(EntityType.FEED), + IMPORT(EntityType.FEED), + EXPORT(EntityType.FEED); + + private final EntityType entityType; + + Tag(EntityType entityType) { + this.entityType = entityType; + } + + public EntityType getType() { + return entityType; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/AccessControlList.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/AccessControlList.java b/common-types/src/main/java/org/apache/falcon/entity/v0/AccessControlList.java new file mode 100644 index 0000000..89ce6f9 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/AccessControlList.java @@ -0,0 +1,40 @@ +/** + * 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.falcon.entity.v0; + +/** + * Access control list for an Entity. + */ +public abstract class AccessControlList { + + public abstract String getOwner(); + + public abstract String getGroup(); + + public abstract String getPermission(); + + @Override + public String toString() { + return "AccessControlList{" + + "owner='" + getOwner() + '\'' + + ", group='" + getGroup() + '\'' + + ", permission='" + getPermission() + '\'' + + '}'; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/DateValidator.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/DateValidator.java b/common-types/src/main/java/org/apache/falcon/entity/v0/DateValidator.java new file mode 100644 index 0000000..e211f57 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/DateValidator.java @@ -0,0 +1,81 @@ +/** + * 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.falcon.entity.v0; + +import org.apache.commons.lang3.StringUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Date utility class. + */ +public final class DateValidator { + + private static final String DATE_PATTERN = + "(2\\d\\d\\d|19\\d\\d)-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5][0-9])Z"; + private static final Pattern PATTERN = Pattern.compile(DATE_PATTERN); + + private DateValidator() { + } + + /** + * Validate date format with regular expression. + * + * @param date date address for validation + * @return true valid date fromat, false invalid date format + */ + public static boolean validate(final String date) { + if (StringUtils.isBlank(date)) { + return false; + } + Matcher matcher = PATTERN.matcher(date); + + if (matcher.matches()) { + + matcher.reset(); + + if (matcher.find()) { + + int year = Integer.parseInt(matcher.group(1)); + String month = matcher.group(2); + String day = matcher.group(3); + + if (day.equals("31") + && (month.equals("4") || month.equals("6") + || month.equals("9") || month.equals("11") + || month.equals("04") || month.equals("06") || month.equals("09"))) { + return false; // only 1,3,5,7,8,10,12 has 31 days + } else if (month.equals("2") || month.equals("02")) { + // leap year + if (year % 4 == 0) { + return !(day.equals("30") || day.equals("31")); + } else { + return !(day.equals("29") || day.equals("30") || day.equals("31")); + } + } else { + return true; + } + } else { + return false; + } + } else { + return false; + } + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/Entity.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/Entity.java b/common-types/src/main/java/org/apache/falcon/entity/v0/Entity.java new file mode 100644 index 0000000..ba6f2e5 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/Entity.java @@ -0,0 +1,98 @@ +/** + * 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.falcon.entity.v0; + +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import java.io.StringReader; +import java.io.StringWriter; + +/** + * Base class that all entity jaxb object will extend. + */ +public abstract class Entity { + public abstract String getName(); + + public abstract String getTags(); + + public abstract AccessControlList getACL(); + + public EntityType getEntityType() { + for (EntityType type : EntityType.values()) { + if (type.getEntityClass().equals(getClass())) { + return type; + } + } + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || !o.getClass().equals(this.getClass())) { + return false; + } + + Entity entity = (Entity) o; + + String name = getName(); + return !(name != null ? !name.equals(entity.getName()) : entity.getName() != null); + } + + @Override + public int hashCode() { + String clazz = this.getClass().getName(); + + String name = getName(); + int result = name != null ? name.hashCode() : 0; + result = 31 * result + clazz.hashCode(); + return result; + } + + @Override + public String toString() { + try { + StringWriter stringWriter = new StringWriter(); + Marshaller marshaller = getEntityType().getMarshaller(); + marshaller.marshal(this, stringWriter); + return stringWriter.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static Entity fromString(EntityType type, String str) { + try { + Unmarshaller unmarshaler = type.getUnmarshaller(); + return (Entity) unmarshaler.unmarshal(new StringReader(str)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public String toShortString() { + return "(" + getEntityType().name().toLowerCase() + ") " + getName(); + } + + public Entity copy() { + return fromString(getEntityType(), toString()); + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java b/common-types/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java new file mode 100644 index 0000000..bab70d4 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java @@ -0,0 +1,35 @@ +/** + * 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.falcon.entity.v0; + +/** + * EntityNotification class to be extended by Feed/Process notification class. + */ +public abstract class EntityNotification { + public abstract String getType(); + public abstract String getLevel(); + public abstract String getTo(); + + public String toString() { + return "Notification{" + + "type=" + getType() + + ", to=" + getTo() + + "}"; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/EntityType.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/EntityType.java b/common-types/src/main/java/org/apache/falcon/entity/v0/EntityType.java new file mode 100644 index 0000000..29dbc7a --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/EntityType.java @@ -0,0 +1,127 @@ +/** + * 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.falcon.entity.v0; + +import org.apache.falcon.entity.v0.cluster.Cluster; +import org.apache.falcon.entity.v0.feed.Feed; +import org.apache.falcon.entity.v0.process.Process; +import org.apache.falcon.entity.v0.datasource.Datasource; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.ValidationEventHandler; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import java.util.Arrays; + +/** + * Enum for types of entities in Falcon Process, Feed and Cluster. + */ +public enum EntityType { + FEED(Feed.class, "/feed-0.1.xsd", "name"), + PROCESS(Process.class, "/process-0.1.xsd", "name"), + CLUSTER(Cluster.class, "/cluster-0.1.xsd", "name"), + DATASOURCE(Datasource.class, "/datasource-0.1.xsd", "name"); + + //Fail unmarshalling of whole xml if unmarshalling of any element fails + private static class EventHandler implements ValidationEventHandler { + @Override + public boolean handleEvent(ValidationEvent event) { + return false; + } + } + + private static final String NS = "http://www.w3.org/2001/XMLSchema"; + + private final Class<? extends Entity> clazz; + private JAXBContext jaxbContext; + private Schema schema; + private String[] immutableProperties; + + private String schemaFile; + + private EntityType(Class<? extends Entity> typeClass, String schemaFile, String... immutableProperties) { + clazz = typeClass; + this.immutableProperties = immutableProperties; + this.schemaFile = schemaFile; + try { + jaxbContext = JAXBContext.newInstance(typeClass); + synchronized (this) { + SchemaFactory schemaFactory = SchemaFactory.newInstance(NS); + schema = schemaFactory.newSchema(getClass().getResource(schemaFile)); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public Class<? extends Entity> getEntityClass() { + return clazz; + } + + public String getSchemaFile() { + return schemaFile; + } + + public Marshaller getMarshaller() throws JAXBException { + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + return marshaller; + } + + public Unmarshaller getUnmarshaller() throws JAXBException { + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + unmarshaller.setSchema(schema); + unmarshaller.setEventHandler(new EventHandler()); + return unmarshaller; + } + + + public boolean isSchedulable() { + // Cluster and Datasource are not schedulable like Feed and Process + return ((this != EntityType.CLUSTER) && (this != EntityType.DATASOURCE)); + } + + public static void assertSchedulable(String entityType){ + EntityType type = EntityType.getEnum(entityType); + if (type.isSchedulable()){ + return; + } else { + throw new IllegalArgumentException("EntityType "+ entityType + + " is not valid,Feed and Process are the valid input type."); + } + } + + @edu.umd.cs.findbugs.annotations.SuppressWarnings({"EI_EXPOSE_REP"}) + public String[] getImmutableProperties() { + return immutableProperties; + } + + public static EntityType getEnum(String type) { + try { + return EntityType.valueOf(type.toUpperCase().trim()); + } catch (IllegalArgumentException iae) { + throw new IllegalArgumentException("Invalid entity type: " + type + ". Expected " + + Arrays.toString(values()).toLowerCase() + "."); + } + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/Frequency.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/Frequency.java b/common-types/src/main/java/org/apache/falcon/entity/v0/Frequency.java new file mode 100644 index 0000000..f423df6 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/Frequency.java @@ -0,0 +1,113 @@ +/** + * 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.falcon.entity.v0; + +import java.util.Calendar; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Frequency as supported in the xsd definitions. + */ +public class Frequency { + private static final Pattern PATTERN = Pattern.compile("(minutes|hours|days|months)\\((\\d+)\\)"); + + /** + * TimeUnit corresponding to the frequency. + */ + public static enum TimeUnit { + minutes(Calendar.MINUTE), hours(Calendar.HOUR), days(Calendar.DATE), months(Calendar.MONTH); + + private int calendarUnit; + + private TimeUnit(int calendarUnit) { + this.calendarUnit = calendarUnit; + } + + public int getCalendarUnit() { + return calendarUnit; + } + } + + private TimeUnit timeUnit; + private String frequency; + + public Frequency(String freq, TimeUnit timeUnit) { + this.frequency = freq; + this.timeUnit = timeUnit; + } + + public Frequency(String strValue) { + Matcher matcher = PATTERN.matcher(strValue); + if (!matcher.matches()) { + throw new IllegalArgumentException("Invalid frequency: " + strValue); + } + + timeUnit = TimeUnit.valueOf(matcher.group(1)); + frequency = matcher.group(2); + } + + public static Frequency fromString(String strValue) { + return new Frequency(strValue); + } + + public static String toString(Frequency freq) { + return freq==null? null:freq.toString(); + } + + @Override + public String toString() { + return timeUnit.name() + "(" + frequency + ")"; + } + + public TimeUnit getTimeUnit() { + return timeUnit; + } + + public String getFrequency() { + return frequency; + } + + public int getFrequencyAsInt() { + return Integer.parseInt(frequency); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!(obj instanceof Frequency)) { + return false; + } + + Frequency freq = (Frequency) obj; + return this == freq || this.getFrequency().equals(freq.getFrequency()) + && this.getTimeUnit() == freq.getTimeUnit(); + + } + + @Override + public int hashCode() { + int result = timeUnit.hashCode(); + result = 31 * result + frequency.hashCode(); + return result; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/entity/v0/SchemaHelper.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/entity/v0/SchemaHelper.java b/common-types/src/main/java/org/apache/falcon/entity/v0/SchemaHelper.java new file mode 100644 index 0000000..1c02f37 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/entity/v0/SchemaHelper.java @@ -0,0 +1,71 @@ +/** + * 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.falcon.entity.v0; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * Support function to parse and format date in xsd string. + */ +public final class SchemaHelper { + + public static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm'Z'"; + + private SchemaHelper() {} + + public static String getTimeZoneId(TimeZone tz) { + return tz.getID(); + } + + public static DateFormat getDateFormat() { + DateFormat dateFormat = new SimpleDateFormat(ISO8601_FORMAT); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + return dateFormat; + } + + public static String formatDateUTC(Date date) { + return (date != null) ? getDateFormat().format(date) : null; + } + + public static Date parseDateUTC(String dateStr) { + if (!DateValidator.validate(dateStr)) { + throw new IllegalArgumentException(dateStr + " is not a valid UTC string"); + } + try { + return getDateFormat().parse(dateStr); + } catch (ParseException e) { + throw new RuntimeException("Unable to parse date: " + dateStr, e); + } + } + + public static String formatDateUTCToISO8601(final String dateString, final String dateStringFormat) { + + try { + DateFormat dateFormat = new SimpleDateFormat(dateStringFormat.substring(0, dateString.length())); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + return SchemaHelper.formatDateUTC(dateFormat.parse(dateString)); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/extensions/ExtensionType.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/extensions/ExtensionType.java b/common-types/src/main/java/org/apache/falcon/extensions/ExtensionType.java new file mode 100644 index 0000000..c4621cc --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/extensions/ExtensionType.java @@ -0,0 +1,37 @@ +/** + * 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.falcon.extensions; + +/** + * Enum to store ExtensionType. + */ +public enum ExtensionType { + TRUSTED("Trusted extension") , + CUSTOM("Custom extension"); + + private final String text; + + private ExtensionType(final String text) { + this.text = text; + } + @Override + public String toString(){ + return text; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/metadata/RelationshipType.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/metadata/RelationshipType.java b/common-types/src/main/java/org/apache/falcon/metadata/RelationshipType.java new file mode 100644 index 0000000..47bc377 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/metadata/RelationshipType.java @@ -0,0 +1,81 @@ +/** + * 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.falcon.metadata; + +import org.apache.falcon.entity.v0.EntityType; + +/** + * Enumerates Relationship types. + */ +public enum RelationshipType { + + // entity vertex types + CLUSTER_ENTITY("cluster-entity"), + FEED_ENTITY("feed-entity"), + PROCESS_ENTITY("process-entity"), + DATASOURCE_ENTITY("datasource-entity"), + + // instance vertex types + FEED_INSTANCE("feed-instance"), + PROCESS_INSTANCE("process-instance"), + IMPORT_INSTANCE("import-instance"), + + // Misc vertex types + USER("user"), + COLO("data-center"), + TAGS("classification"), + GROUPS("group"), + PIPELINES("pipelines"), + REPLICATION_METRICS("replication-metrics"); + + + private final String name; + + RelationshipType(java.lang.String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static RelationshipType fromString(String value) { + if (value != null) { + for (RelationshipType type : RelationshipType.values()) { + if (value.equals(type.getName())) { + return type; + } + } + } + + throw new IllegalArgumentException("No constant with value " + value + " found"); + } + + public static RelationshipType fromSchedulableEntityType(String type) { + EntityType entityType = EntityType.getEnum(type); + switch (entityType) { + case FEED: + return RelationshipType.FEED_ENTITY; + case PROCESS: + return RelationshipType.PROCESS_ENTITY; + default: + throw new IllegalArgumentException("Invalid schedulable entity type: " + entityType.name()); + } + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/APIResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/APIResult.java b/common-types/src/main/java/org/apache/falcon/resource/APIResult.java new file mode 100644 index 0000000..e67eb3a --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/APIResult.java @@ -0,0 +1,106 @@ +/** + * 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.falcon.resource; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.StringWriter; + +/** + * APIResult is the output returned by all the APIs; status-SUCCEEDED or FAILED + * message- detailed message. + */ +@XmlRootElement(name = "result") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class APIResult { + + private Status status; + + private String message; + + private String requestId; + + private static final JAXBContext JAXB_CONTEXT; + + static { + try { + JAXB_CONTEXT = JAXBContext.newInstance(APIResult.class); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } + + /** + * API Result status. + */ + public static enum Status { + SUCCEEDED, PARTIAL, FAILED + } + + public APIResult(Status status, String message) { + super(); + this.status = status; + this.message = message; + requestId = Thread.currentThread().getName(); + } + + protected APIResult() { + // private default constructor for JAXB + } + + public Status getStatus() { + return status; + } + + public String getMessage() { + return message; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String reqId) { + this.requestId = reqId; + } + + @Override + public String toString() { + try { + StringWriter stringWriter = new StringWriter(); + Marshaller marshaller = JAXB_CONTEXT.createMarshaller(); + marshaller.marshal(this, stringWriter); + return stringWriter.toString(); + } catch (JAXBException e) { + return e.getMessage(); + } + } + + public Object[] getCollection() { + return null; + } + + public void setCollection(Object[] items) { + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/EntityList.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/EntityList.java b/common-types/src/main/java/org/apache/falcon/resource/EntityList.java new file mode 100644 index 0000000..1a208fa --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/EntityList.java @@ -0,0 +1,213 @@ +/** + * 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.falcon.resource; + +import org.apache.commons.lang3.StringUtils; +import org.apache.falcon.entity.v0.Entity; +import org.apache.falcon.entity.v0.EntityType; +import org.apache.falcon.entity.v0.process.Input; +import org.apache.falcon.entity.v0.process.Output; +import org.apache.falcon.entity.v0.process.Process; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.ArrayList; +import java.util.List; + +/** + * Entity list used for marshalling / unmarshalling with REST calls. + */ +@XmlRootElement(name = "entities") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class EntityList { + public static final String INPUT_TAG = "Input"; + public static final String OUTPUT_TAG = "Output"; + + public int getTotalResults() { + return totalResults; + } + + @XmlElement + private int totalResults; + + @XmlElement(name = "entity") + private final EntityElement[] elements; + + /** + * List of fields returned by RestAPI. + */ + public enum EntityFieldList { + TYPE, NAME, STATUS, TAGS, PIPELINES, CLUSTERS + } + + /** + * Filter by these Fields is supported by RestAPI. + */ + public enum EntityFilterByFields { + TYPE, NAME, STATUS, PIPELINES, CLUSTER, TAGS + } + + /** + * Element within an entity. + */ + public static class EntityElement { + //SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck + @XmlElement + public String type; + @XmlElement + public String name; + @XmlElement + public String status; + @XmlElementWrapper(name = "tags") + public List<String> tag; + @XmlElementWrapper(name = "pipelines") + public List<String> pipeline; + @XmlElementWrapper(name = "clusters") + public List<String> cluster; + + //RESUME CHECKSTYLE CHECK VisibilityModifierCheck + + @Override + public String toString() { + String outString = "(" + type + ") " + name; + if (StringUtils.isNotEmpty(status)) { + outString += "(" + status + ")"; + } + + if (tag != null && !tag.isEmpty()) { + outString += " - " + tag.toString(); + } + + if (pipeline != null && !pipeline.isEmpty()) { + outString += " - " + pipeline.toString(); + } + + if (cluster != null && !cluster.isEmpty()) { + outString += " - " + cluster.toString(); + } + + outString += "\n"; + return outString; + } + } + + //For JAXB + public EntityList() { + this.elements = null; + this.totalResults = 0; + } + + public EntityList(EntityElement[] elements, int totalResults) { + this.totalResults = totalResults; + this.elements = elements; + } + + public EntityList(Entity[] elements, int totalResults) { + this.totalResults = totalResults; + int len = elements.length; + EntityElement[] items = new EntityElement[len]; + for (int i = 0; i < len; i++) { + items[i] = createEntityElement(elements[i]); + } + this.elements = items; + } + + private EntityElement createEntityElement(Entity e) { + EntityElement element = new EntityElement(); + element.type = e.getEntityType().name().toLowerCase(); + element.name = e.getName(); + element.status = null; + element.tag = new ArrayList<String>(); + element.pipeline = new ArrayList<String>(); + element.cluster = new ArrayList<String>(); + return element; + } + + public EntityList(Entity[] dependentEntities, Entity entity) { + int len = dependentEntities.length; + this.totalResults = len; + EntityElement[] items = new EntityElement[len]; + for (int i = 0; i < len; i++) { + Entity e = dependentEntities[i]; + EntityElement o = new EntityElement(); + o.type = e.getEntityType().name().toLowerCase(); + o.name = e.getName(); + o.status = null; + o.tag = getEntityTag(e, entity); + items[i] = o; + } + this.elements = items; + } + + public EntityElement[] getElements() { + return elements; + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append(totalResults + "\n"); + for (EntityElement element : elements) { + buffer.append(element.toString()); + } + return buffer.toString(); + } + + private List<String> getEntityTag(Entity dependentEntity, Entity entity) { + List<String> tagList = new ArrayList<String>(); + + if (entity.getEntityType().equals(EntityType.CLUSTER)) { + return tagList; + } + + Process process = null; + String entityNameToMatch = null; + if (dependentEntity.getEntityType().equals(EntityType.PROCESS)) { + process = (Process) dependentEntity; + entityNameToMatch = entity.getName(); + } else if (dependentEntity.getEntityType().equals(EntityType.FEED) + && entity.getEntityType().equals(EntityType.PROCESS)) { + process = (Process) entity; + entityNameToMatch = dependentEntity.getName(); + } + + if (process != null) { + if (process.getInputs() != null) { + for (Input i : process.getInputs().getInputs()) { + if (i.getFeed().equals(entityNameToMatch)) { + tagList.add(INPUT_TAG); + } + } + } + if (process.getOutputs() != null) { + for (Output o : process.getOutputs().getOutputs()) { + if (o.getFeed().equals(entityNameToMatch)) { + tagList.add(OUTPUT_TAG); + } + } + } + } + + return tagList; + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/EntitySummaryResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/EntitySummaryResult.java b/common-types/src/main/java/org/apache/falcon/resource/EntitySummaryResult.java new file mode 100644 index 0000000..4d42b42 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/EntitySummaryResult.java @@ -0,0 +1,235 @@ +/** + * 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.falcon.resource; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Arrays; +import java.util.Date; + +/** + * Pojo for JAXB marshalling / unmarshalling. + */ +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class EntitySummaryResult extends APIResult { + + /** + * Workflow status as being set in result object. + */ + public static enum WorkflowStatus { + WAITING, RUNNING, SUSPENDED, KILLED, FAILED, SUCCEEDED, ERROR, READY + } + + @XmlElement + private EntitySummary[] entitySummaries; + + //For JAXB + public EntitySummaryResult() { + super(); + } + + public EntitySummaryResult(String message, EntitySummary[] entitySummaries) { + this(Status.SUCCEEDED, message, entitySummaries); + } + + public EntitySummaryResult(Status status, String message, EntitySummary[] entitySummaries) { + super(status, message); + this.entitySummaries = entitySummaries; + } + + public EntitySummaryResult(Status status, String message) { + super(status, message); + } + + public EntitySummary[] getEntitySummaries() { + return this.entitySummaries; + } + + public void setEntitySummaries(EntitySummary[] entitySummaries) { + this.entitySummaries = entitySummaries; + } + + @Override + public Object[] getCollection() { + return entitySummaries; + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setEntitySummaries(new EntitySummary[0]); + } else { + EntitySummary[] summaries = Arrays.copyOf(items, items.length, EntitySummary[].class); + setEntitySummaries(summaries); + } + } + + /** + * A single entity object inside entity summary result. + */ + @XmlRootElement(name = "entitySummary") + public static class EntitySummary { + + @XmlElement + public String type; + @XmlElement + public String name; + @XmlElement + public String status; + @XmlElement + public String[] tags; + @XmlElement + public String[] pipelines; + @XmlElement + public Instance[] instances; + + public EntitySummary() { + } + + public EntitySummary(String entityName, String entityType) { + this.name = entityName; + this.type = entityType; + } + + public EntitySummary(String name, String type, String status, + String[] tags, String[] pipelines, + Instance[] instances) { + this.name = name; + this.type = type; + this.status = status; + this.pipelines = pipelines; + this.tags = tags; + this.instances = instances; + } + + public String getName() { + return this.name; + } + + public String getType() { + return this.type; + } + + public String getStatus() { + return this.status; + } + + public String[] getTags() { + return this.tags; + } + + public String[] getPipelines() { + return this.pipelines; + } + + public Instance[] getInstances() { + return this.instances; + } + + @Override + public String toString() { + return "{Entity: " + (this.name == null ? "" : this.name) + + ", Type: " + (this.type == null ? "" : this.type) + + ", Status: " + (this.status == null ? "" : this.status) + + ", Tags: " + (this.tags == null ? "[]" : Arrays.toString(this.tags)) + + ", Pipelines: " + (this.pipelines == null ? "[]" : Arrays.toString(this.pipelines)) + + ", InstanceSummary: " + (this.instances == null ? "[]" : Arrays.toString(this.instances)) + +"}"; + } + } + + /** + * A single instance object inside instance result. + */ + @XmlRootElement(name = "instances") + public static class Instance { + @XmlElement + public String instance; + + @XmlElement + public WorkflowStatus status; + + @XmlElement + public String logFile; + + @XmlElement + public String cluster; + + @XmlElement + public String sourceCluster; + + @XmlElement + public Date startTime; + + @XmlElement + public Date endTime; + + public Instance() { + } + + public Instance(String cluster, String instance, WorkflowStatus status) { + this.cluster = cluster; + this.instance = instance; + this.status = status; + } + + public String getInstance() { + return instance; + } + + public WorkflowStatus getStatus() { + return status; + } + + public String getLogFile() { + return logFile; + } + + public String getCluster() { + return cluster; + } + + public String getSourceCluster() { + return sourceCluster; + } + + public Date getStartTime() { + return startTime; + } + + public Date getEndTime() { + return endTime; + } + + @Override + public String toString() { + return "{instance: " + (this.instance == null ? "" : this.instance) + + ", status: " + (this.status == null ? "" : this.status) + + (this.logFile == null ? "" : ", log: " + this.logFile) + + (this.sourceCluster == null ? "" : ", source-cluster: " + this.sourceCluster) + + (this.cluster == null ? "" : ", cluster: " + this.cluster) + + (this.startTime == null ? "" : ", startTime: " + this.startTime) + + (this.endTime == null ? "" : ", endTime: " + this.endTime) + + "}"; + } + } +} +//RESUME CHECKSTYLE CHECK VisibilityModifierCheck
