http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/release/CheckReleaseSpecTask.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/CheckReleaseSpecTask.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/release/CheckReleaseSpecTask.groovy deleted file mode 100644 index 72eb41d..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/CheckReleaseSpecTask.groovy +++ /dev/null @@ -1,75 +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.zest.gradle.release - -import groovy.transform.CompileStatic -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException -import org.gradle.api.Project -import org.gradle.api.artifacts.ProjectDependency -import org.gradle.api.tasks.TaskAction - -@CompileStatic -class CheckReleaseSpecTask extends DefaultTask -{ - CheckReleaseSpecTask() - { - description = 'Ensure that no releasable module depend on module(s) that don\'t fit the release criteria.' - doFirst { - def approvedProjects = project.extensions.getByType( ReleaseSpecExtension ).approvedProjects - dependsOn approvedProjects.collect { each -> each.configurations.getByName( 'runtime' ) } - } - } - - @TaskAction - void check() - { - Map<Project, Set<ProjectDependency>> notReleasable = [ : ] - def approvedProjects = project.extensions.getByType( ReleaseSpecExtension ).approvedProjects - approvedProjects.each { approvedProject -> - def projectDependencies = approvedProject.configurations.getByName( 'runtime' ).allDependencies.findAll { - it instanceof ProjectDependency - } as Set<ProjectDependency> - projectDependencies.each { dep -> - def depNotReleaseApproved = approvedProjects.findAll { rp -> - rp.group == dep.dependencyProject.group && rp.name == dep.dependencyProject.name - }.isEmpty() - if( depNotReleaseApproved ) - { - if( !notReleasable[ approvedProject ] ) - { - notReleasable[ approvedProject ] = [ ] as Set - } - notReleasable[ approvedProject ] << dep - } - } - } - if( !notReleasable.isEmpty() ) - { - def errorMessage = new StringBuilder() - errorMessage << "At least one releasable module depends on module(s) that don't fit the release criteria!\n" - errorMessage << "\tOffending module -> Non releasable dependencies\n" - notReleasable.each { k, v -> - def noRlsDeps = v.collect { d -> ':' + d.dependencyProject.group + ':' + d.dependencyProject.name } - errorMessage << "\t$k -> ${ noRlsDeps })\n" - } - errorMessage << "Check the dev-status.xml file content in each modules directory." - throw new GradleException( errorMessage.toString() ) - } - } -}
http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ModuleReleaseSpec.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ModuleReleaseSpec.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ModuleReleaseSpec.groovy deleted file mode 100644 index 0d81bac..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ModuleReleaseSpec.groovy +++ /dev/null @@ -1,44 +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.zest.gradle.release; - -import org.gradle.api.Project - -class ModuleReleaseSpec -{ - def boolean satisfiedBy( Project project ) - { - def devStatusFile = new File( project.projectDir, "dev-status.xml" ) - if( !devStatusFile.exists() ) - { - return false - } - def module = new XmlSlurper().parse( devStatusFile ) - def codebase = module.status.codebase.text() - def docs = module.status.documentation.text() - def tests = module.status.unittests.text() - def satisfied = ( codebase == 'none' && docs == 'complete' && tests != 'complete' ) - satisfied |= ( codebase == 'early' && ( docs == 'complete' || docs == 'good') && (tests == 'complete' || tests == 'good' ) ) - satisfied |= ( codebase == 'beta' && (docs == 'complete' || docs == 'good' || docs == 'brief') && (tests == 'complete' || tests == 'good' || tests == 'some') ) - satisfied |= ( codebase == 'stable' ) - satisfied |= ( codebase == 'mature' ) - // TODO Add a task to report this easily - // println "$project.name($satisfied) -> $codebase, $docs, $tests" - return satisfied - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseApprovedProjectsTask.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseApprovedProjectsTask.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseApprovedProjectsTask.groovy deleted file mode 100644 index 3fe168e..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseApprovedProjectsTask.groovy +++ /dev/null @@ -1,57 +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.zest.gradle.release - -import groovy.json.JsonBuilder -import groovy.transform.CompileStatic -import org.gradle.api.DefaultTask -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.TaskAction - -/** - * Write paths of release approved projects to a JSON file. - * - * This task sole purpose is proper up-do-date behaviour when changing {@literal dev-status.xml} files. - */ -@CompileStatic -class ReleaseApprovedProjectsTask extends DefaultTask -{ - @InputFiles - FileCollection getDevStatusFiles() - { - return project.files( project.allprojects - .collect( { project -> project.file( 'dev-status.xml' ) } ) - .findAll( { it.exists() } ) ) - } - - @OutputFile - File getJsonApprovedProjects() - { - return new File( new File( project.buildDir, 'release' ), 'approved-projects.json' ) - } - - @TaskAction - void approveProjects() - { - def releaseSpec = project.extensions.getByType( ReleaseSpecExtension ) - jsonApprovedProjects.parentFile.mkdirs() - jsonApprovedProjects.text = new JsonBuilder( releaseSpec.approvedProjects.collect( { it.path } ) ).toPrettyString() - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecExtension.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecExtension.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecExtension.groovy deleted file mode 100644 index 4ca5813..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecExtension.groovy +++ /dev/null @@ -1,40 +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.zest.gradle.release - -import groovy.transform.CompileStatic -import org.gradle.api.Project - -/** - * Provide release approved projects. - * - * There's no up-to-date checking on Gradle extensions. - * Depend on {@link ReleaseApprovedProjectsTask} to get a good up-to-date behavior. - */ -@CompileStatic -class ReleaseSpecExtension -{ - static final String NAME = 'releaseSpec' - Set<Project> approvedProjects - - ReleaseSpecExtension( Project rootProject ) - { - def spec = new ModuleReleaseSpec() - approvedProjects = rootProject.allprojects.findAll( { p -> spec.satisfiedBy( p ) } ) - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecPlugin.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecPlugin.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecPlugin.groovy deleted file mode 100644 index 55eac67..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/release/ReleaseSpecPlugin.groovy +++ /dev/null @@ -1,56 +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.zest.gradle.release - -import groovy.transform.CompileStatic -import org.apache.zest.gradle.TaskGroups -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.Task - -@CompileStatic -class ReleaseSpecPlugin implements Plugin<Project> -{ - static class TaskNames - { - static final String RELEASE_APPROVED_PROJECTS = 'releaseSpecApprovedProjects' - static final String CHECK_RELEASE_SPEC = 'checkReleaseSpec' - } - - @Override - void apply( final Project project ) - { - if( project != project.rootProject ) - { - throw new IllegalStateException( "This plugin is only applicable to the root project" ) - } - applyReleaseSpec( project ) - } - - private static void applyReleaseSpec( Project project ) - { - project.extensions.create( ReleaseSpecExtension.NAME, ReleaseSpecExtension, project.rootProject ) - project.tasks.create( TaskNames.RELEASE_APPROVED_PROJECTS, ReleaseApprovedProjectsTask ) { Task task -> - task.group = TaskGroups.RELEASE - task.description = 'Apply release specification to projects in the build' - } - project.tasks.create( TaskNames.CHECK_RELEASE_SPEC, CheckReleaseSpecTask ) { Task task -> - task.group = TaskGroups.RELEASE_VERIFICATION - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/tasks/ExecLogged.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/tasks/ExecLogged.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/tasks/ExecLogged.groovy deleted file mode 100644 index 30075cf..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/tasks/ExecLogged.groovy +++ /dev/null @@ -1,117 +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.zest.gradle.tasks - -import groovy.transform.CompileStatic -import org.gradle.api.Action -import org.gradle.api.GradleException -import org.gradle.api.Project -import org.gradle.api.tasks.AbstractExecTask -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.TaskAction -import org.gradle.internal.logging.ConsoleRenderer -import org.gradle.process.ExecSpec - -@CompileStatic -class ExecLogged extends AbstractExecTask<ExecLogged> -{ - @OutputFile - File stdoutFile = project.file( "$project.buildDir/tmp/${ getName() }/stdout.log" ) - - @OutputFile - File stderrFile = project.file( "$project.buildDir/tmp/${ getName() }/stderr.log" ) - - ExecLogged() - { - super( ExecLogged.class ) - } - - @TaskAction - protected void exec() - { - [ stdoutFile, stderrFile ].each { it.parentFile.mkdirs() } - def outStream = stdoutFile.newOutputStream() - def errStream = stderrFile.newOutputStream() - try - { - super.exec() - } - catch( Exception ex ) - { - throw new GradleException( errorMessage( ex, stdoutFile, stderrFile ), ex ) - } - finally - { - close outStream, errStream - } - } - - static void execLogged( Project project, File stdoutFile, File stderrFile, Action<? super ExecSpec> specAction ) - { - [ stdoutFile, stderrFile ].each { it.parentFile.mkdirs() } - def outStream = stdoutFile.newOutputStream() - def errStream = stderrFile.newOutputStream() - try - { - project.exec { ExecSpec spec -> - specAction.execute( spec ) - spec.standardOutput = outStream - spec.errorOutput = errStream - } - } - catch( Exception ex ) - { - throw new GradleException( errorMessage( ex, stdoutFile, stderrFile ), ex ) - } - finally - { - close outStream, errStream - } - } - - private static void close( Closeable... closeables ) - throws IOException - { - def errors = [ ] as List<IOException> - for( Closeable closeable : closeables ) - { - try - { - closeable.close() - } - catch( IOException ex ) - { - errors.add( ex ) - } - } - if( !errors.empty ) - { - def ex = new IOException( 'Failed to close some' ) - errors.each { ex.addSuppressed it } - throw ex - } - } - - private static String errorMessage( Exception ex, File stdoutFile, File stderrFile ) - { - def consoleRenderer = new ConsoleRenderer() - return "${ ex.message }\n" + - "\tSTDOUT ${ consoleRenderer.asClickableFileUrl( stdoutFile ) }\n" + - "\tSTDERR ${ consoleRenderer.asClickableFileUrl( stderrFile ) }" - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/test/AggregatedJacocoReportTask.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/test/AggregatedJacocoReportTask.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/test/AggregatedJacocoReportTask.groovy deleted file mode 100644 index 40c2278..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/test/AggregatedJacocoReportTask.groovy +++ /dev/null @@ -1,91 +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.zest.gradle.test - -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction - -class AggregatedJacocoReportTask extends DefaultTask -{ - @InputFiles - FileCollection getJacocoExecDataDirectories() - { - return project.files( project.subprojects.collect( { Project p -> "${ p.buildDir.path }/jacoco" } ) ) - } - - @OutputDirectory - File getOutputDirectory() - { - return project.file( "$project.buildDir/reports/coverage" ) - } - - @TaskAction - void report() - { - def coveredProjects = project.subprojects.findAll { p -> new File( "${ p.buildDir.path }/jacoco" ).exists() } - def coreProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.core' ) } - def libProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.lib' ) } - def extProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.ext' ) } - def toolsProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.tool' ) } - def tutoProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.tuto' ) } - def samplesProjects = coveredProjects.findAll { p -> p.name.startsWith( 'org.apache.zest.sample' ) } - def classpath = project.configurations.getByName( 'jacoco' ).asPath - project.ant { - taskdef name: 'jacocoreport', classname: 'org.jacoco.ant.ReportTask', classpath: classpath - mkdir dir: outputDirectory - jacocoreport { - executiondata { - coveredProjects.collect { p -> fileset( dir: "${ p.buildDir.path }/jacoco" ) { include( name: '*.exec' ) } } - } - structure( name: "Apache Polygene⢠(Java Edition) SDK" ) { - group( name: "Core" ) { - classfiles { coreProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { coreProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - group( name: "Libraries" ) { - classfiles { libProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { libProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - group( name: "Extensions" ) { - classfiles { extProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { extProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - group( name: "Tools" ) { - classfiles { toolsProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { toolsProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - group( name: "Tutorials" ) { - classfiles { tutoProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { tutoProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - group( name: "Samples" ) { - classfiles { samplesProjects.collect { p -> fileset dir: "${ p.buildDir.path }/classes/main" } } - sourcefiles { samplesProjects.collect { p -> fileset dir: "${ p.projectDir.path }/src/main/java" } } - } - } - csv destfile: "${ outputDirectory }/jacoco.csv", encoding: "UTF-8" - xml destfile: "${ outputDirectory }/jacoco.xml", encoding: "UTF-8" - html destdir: outputDirectory, encoding: "UTF-8", locale: "en", footer: "Apache Polygene⢠(Java Edition) SDK" - } - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/buildSrc/src/main/groovy/org/apache/zest/gradle/version/VersionClassPlugin.groovy ---------------------------------------------------------------------- diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/version/VersionClassPlugin.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/version/VersionClassPlugin.groovy deleted file mode 100644 index a78f588..0000000 --- a/buildSrc/src/main/groovy/org/apache/zest/gradle/version/VersionClassPlugin.groovy +++ /dev/null @@ -1,98 +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.zest.gradle.version - -import groovy.transform.CompileStatic -import org.gradle.api.Project -import org.gradle.api.Plugin -import org.gradle.api.Task -import org.gradle.api.file.SourceDirectorySet -import org.gradle.api.plugins.JavaPlugin -import org.gradle.api.plugins.JavaPluginConvention -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.bundling.Jar - -// TODO:release:perf Placeholder for date for dev versions -// TODO:release:perf Add git data, placeholders for dev versions -@CompileStatic -class VersionClassPlugin implements Plugin<Project> -{ - def void apply( Project project ) - { - project.getPlugins().apply( JavaPlugin.class ) - def genSrc = 'generated-src/version' - def generatedSrcDir = new File( project.buildDir, genSrc ) - - Task makeVersionClassTask = project.task( 'makeVersionClass' ) - makeVersionClassTask.doLast { - def now = new Date() - def tmpGroup = project.name - if( tmpGroup.startsWith( "org.apache.zest.core" ) ) - { - tmpGroup = tmpGroup - ".core" - } - tmpGroup = tmpGroup.replace( '-', '_' ) - def outFilename = "java/" + tmpGroup.replace( '.', '/' ) + "/BuildVersion.java" - def outFile = new File( generatedSrcDir, outFilename ) - outFile.getParentFile().mkdirs() - def f = new FileWriter( outFile ) - f.write( 'package ' + tmpGroup + ';\n' ) - f.write( """ -/** - * Simple class for storing the version derived from the build system. - * - */ -public interface BuildVersion -{ - /** The version of the project from the gradle build.gradle file. */ - String VERSION = \"""" + project.version + """\"; - - /** The name of the project from the gradle build.gradle file. */ - String NAME = \"""" + project.name + """\"; - - /** The group of the project from the gradle build.gradle file. */ - String GROUP = \"""" + project.group + """\"; - - /** The date this file was generated, usually the last date that the project was modified. */ - String DATE = \"""" + now + """\"; - - /** The full details of the version, including the build date. */ - String DETAILED_VERSION = GROUP + ":" + NAME + ":" + VERSION + " " + DATE; -}\n -""" ) - f.close() - } - def sourceSets = project.convention.getPlugin( JavaPluginConvention ).sourceSets - sourceSets.create( "version" ) { SourceSet sourceSet -> - sourceSet.java { SourceDirectorySet dirSet -> - dirSet.srcDir project.buildDir.name + '/' + genSrc + '/java' - } - } - makeVersionClassTask.getInputs().files( sourceSets.getByName( 'main' ).allSource ) - makeVersionClassTask.getOutputs().file( generatedSrcDir ) - if( project.getBuildFile() != null && project.getBuildFile().exists() ) - { - makeVersionClassTask.getInputs().files( project.getBuildFile() ) - } - project.getTasks().getByName( 'compileJava' ).dependsOn( 'compileVersionJava' ) - project.getTasks().getByName( 'compileVersionJava' ).dependsOn( 'makeVersionClass' ) - project.getTasks().getByName( 'jar' ) { Jar task -> - task.from sourceSets.getByName( 'version' ).output - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/ZestAPI.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/ZestAPI.java b/core/api/src/main/java/org/apache/polygene/api/ZestAPI.java new file mode 100644 index 0000000..ae03999 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/ZestAPI.java @@ -0,0 +1,188 @@ +/* + * 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.polygene.api; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.function.Function; +import org.apache.polygene.api.association.AbstractAssociation; +import org.apache.polygene.api.association.AssociationDescriptor; +import org.apache.polygene.api.composite.Composite; +import org.apache.polygene.api.composite.CompositeDescriptor; +import org.apache.polygene.api.composite.CompositeInstance; +import org.apache.polygene.api.composite.InvalidCompositeException; +import org.apache.polygene.api.composite.ModelDescriptor; +import org.apache.polygene.api.composite.TransientDescriptor; +import org.apache.polygene.api.entity.EntityDescriptor; +import org.apache.polygene.api.property.Property; +import org.apache.polygene.api.property.PropertyDescriptor; +import org.apache.polygene.api.service.ServiceDescriptor; +import org.apache.polygene.api.structure.ModuleDescriptor; +import org.apache.polygene.api.value.ValueDescriptor; + +/** + * Encapsulation of the Polygene API. + */ +public interface PolygeneAPI +{ + /** + * If a Modifier gets a reference to the Composite using @This, + * then that reference must be dereferenced using this method + * before handing it out for others to use. + * + * @param <T> Parameterized type of the Composite + * @param composite instance reference injected in Modified using @This + * + * @return the dereferenced Composite + */ + <T> T dereference( T composite ); + + /** + * Returns the Module or UnitOfWork where the Composite belongs. + * + * @param compositeOrUow The Composite (Service, Value, Entity or Transient) or UnitOfWork to lookup the Module it + * belongs to. + * + * @return The Module instance where the Composite or UnitOfWork belongs to. + */ + ModuleDescriptor moduleOf( Object compositeOrUow ); + + /** + * Returns the ModelDescriptor of the Composite. + * + * @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the + * ModelDescriptor + * + * @return The ModelDescriptor of the Composite + */ + ModelDescriptor modelDescriptorFor( Object compositeOrServiceReference ); + + /** + * Returns the CompositeDescriptor of the Composite. + * + * @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the + * CompositeDescriptor + * + * @return The CompositeDescriptor of the Composite + */ + CompositeDescriptor compositeDescriptorFor( Object compositeOrServiceReference ); + + /** + * Returns the TransientDescriptor of the TransientComposite. + * + * @param transsient The TransientComposite for which to lookup the TransientDescriptor + * + * @return The TransientDescriptor of the TransientComposite + */ + TransientDescriptor transientDescriptorFor( Object transsient ); + + /** + * Returns the EntityDescriptor of the EntityComposite. + * + * @param entity The EntityComposite for which to lookup the EntityDescriptor + * + * @return The EntityDescriptor of the EntityComposite + */ + EntityDescriptor entityDescriptorFor( Object entity ); + + /** + * Returns the ValueDescriptor of the ValueComposite. + * + * @param value The ValueComposite for which to lookup the ValueDescriptor + * + * @return The ValueDescriptor of the ValueComposite + */ + ValueDescriptor valueDescriptorFor( Object value ); + + /** + * Returns the ServiceDescriptor of the ServiceComposite. + * + * @param service The ServiceComposite for which to lookup the ServiceDescriptor + * + * @return The ServiceDescriptor of the ServiceComposite + */ + ServiceDescriptor serviceDescriptorFor( Object service ); + + /** + * Returns the PropertyDescriptor of the Property. + * + * @param property The Property for which to lookup the PropertyDescriptor + * + * @return The PropertyDescriptor of the Property + */ + PropertyDescriptor propertyDescriptorFor( Property<?> property ); + + /** + * Returns the AssociationDescriptor of the Association. + * + * @param association The Association for which to lookup the AssociationDescriptor + * + * @return The AssociationDescriptor of the Association + */ + AssociationDescriptor associationDescriptorFor( AbstractAssociation association ); + + /** + * Function that returns the CompositeDescriptor of a Composite. + */ + Function<Composite, CompositeDescriptor> FUNCTION_DESCRIPTOR_FOR = composite -> { + if( composite instanceof Proxy ) + { + InvocationHandler invocationHandler = Proxy.getInvocationHandler( composite ); + return ( (CompositeInstance) invocationHandler ).descriptor(); + } + try + { + Class<? extends Composite> compositeClass = composite.getClass(); + Field instanceField = compositeClass.getField( "_instance" ); + Object instance = instanceField.get( composite ); + return ( (CompositeInstance) instance ).descriptor(); + } + catch( Exception e ) + { + InvalidCompositeException exception = new InvalidCompositeException( "Could not get _instance field" ); + exception.initCause( e ); + throw exception; + } + }; + + /** + * Function that returns the CompositeInstance of a Composite. + */ + Function<Composite, CompositeInstance> FUNCTION_COMPOSITE_INSTANCE_OF = composite -> { + if( composite instanceof Proxy ) + { + return ( (CompositeInstance) Proxy.getInvocationHandler( composite ) ); + } + try + { + Class<? extends Composite> compositeClass = composite.getClass(); + Field instanceField = compositeClass.getField( "_instance" ); + Object instance = instanceField.get( composite ); + return (CompositeInstance) instance; + } + catch( Exception e ) + { + InvalidCompositeException exception = new InvalidCompositeException( "Could not get _instance field" ); + exception.initCause( e ); + throw exception; + } + }; +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/Activation.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/Activation.java b/core/api/src/main/java/org/apache/polygene/api/activation/Activation.java new file mode 100644 index 0000000..3b03d82 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/Activation.java @@ -0,0 +1,60 @@ +/* + * 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.polygene.api.activation; + +/** + * Interface used by Structure elements and Services that can be activated and passivated. + * <p>Application and Layer expose this interface so you can activate and passivate them.</p> + * <p>Module and ServiceComposite activation/passivation is handled by the Polygene runtime.</p> + */ +@SuppressWarnings("JavaDoc") +public interface Activation +{ + /** + * Activate. + * <p>Fail fast execution order is:</p> + * <ul> + * <li>Fire {@link ActivationEvent.EventType#ACTIVATING}</li> + * <li>Call {@link Activator#beforeActivation(java.lang.Object)} on each Activator</li> + * <li>Call {@link #activate()} children</li> + * <li>Call {@link Activator#afterActivation(java.lang.Object)} on each Activator</li> + * <li>Fire {@link ActivationEvent.EventType#ACTIVATED}</li> + * </ul> + * <p>If an Exception is thrown, already activated nodes are passivated.</p> + * @throws ActivationException with first Exception of activation plus the PassivationException if any + */ + void activate() + throws ActivationException; + + /** + * Passivate. + * <p>Fail safe execution order is:</p> + * <ul> + * <li>Fire {@link ActivationEvent.EventType#PASSIVATING}</li> + * <li>Call {@link Activator#beforePassivation(java.lang.Object)} on each Activator</li> + * <li>Call {@link #passivate()} children</li> + * <li>Call {@link Activator#afterPassivation(java.lang.Object)} on each Activator</li> + * <li>Fire {@link ActivationEvent.EventType#PASSIVATED}</li> + * </ul> + * @throws PassivationException after passivation with all Exceptions of passivation if any + */ + void passivate() + throws PassivationException; +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEvent.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEvent.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEvent.java new file mode 100644 index 0000000..f40488f --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEvent.java @@ -0,0 +1,99 @@ +/* + * 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.polygene.api.activation; + +import java.time.Instant; +import org.apache.polygene.api.time.SystemTime; + +/** + * ActivationEvents are fired during activation and passivation of instances in Polygene. + */ +public final class ActivationEvent +{ + public enum EventType + { + ACTIVATING, ACTIVATED, PASSIVATING, PASSIVATED + } + + private final Instant timestamp; + private final Object source; + private final EventType type; + + public ActivationEvent( Object source, EventType type ) + { + this.timestamp = SystemTime.now(); + this.source = source; + this.type = type; + } + + /** + * @return the source of the Activation event + */ + public Object source() + { + return source; + } + + /** + * @return the type of the Activation event + */ + public EventType type() + { + return type; + } + + + /** + * + * @return The instant that this event was created. + */ + public Instant eventTime() + { + return timestamp; + } + + /** + * @return an informative message describing the event + */ + public String message() + { + switch( type ) + { + case ACTIVATING: + return "Activating " + source; + case ACTIVATED: + return "Activated " + source; + case PASSIVATING: + return "Passivating " + source; + case PASSIVATED: + return "Passivated " + source; + } + return ""; + } + + /** + * @see #message() + */ + @Override + public String toString() + { + return message() + "@" + timestamp; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListener.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListener.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListener.java new file mode 100644 index 0000000..108ebc6 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListener.java @@ -0,0 +1,29 @@ +/* + * 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.polygene.api.activation; + +/** + * Listener for ActivationEvent events + */ +public interface ActivationEventListener +{ + void onEvent( ActivationEvent event ) + throws Exception; +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListenerRegistration.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListenerRegistration.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListenerRegistration.java new file mode 100644 index 0000000..2e7d83a --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationEventListenerRegistration.java @@ -0,0 +1,38 @@ +/* + * 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.polygene.api.activation; + +/** + * Use this to register listeners for ActivationEvents. + * + * This is implemented by Application, Layer, Module, for example. + */ +public interface ActivationEventListenerRegistration +{ + /** + * @param listener will be notified when Activation events occur + */ + void registerActivationEventListener( ActivationEventListener listener ); + + /** + * @param listener will not be notified when Activation events occur anymore + */ + void deregisterActivationEventListener( ActivationEventListener listener ); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java new file mode 100644 index 0000000..cf6d978 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java @@ -0,0 +1,32 @@ +/* + * 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.polygene.api.activation; + +/** + * Thrown when unable to activate. + */ +public class ActivationException extends Exception +{ + private static final long serialVersionUID = 1L; + public ActivationException( String message, Throwable cause ) + { + super( message, cause ); + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/Activator.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/Activator.java b/core/api/src/main/java/org/apache/polygene/api/activation/Activator.java new file mode 100644 index 0000000..90a68b5 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/Activator.java @@ -0,0 +1,72 @@ +/* + * 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.polygene.api.activation; + +/** + * Assemble Activators to hook Services Activation. + * + * @param <ActivateeType> Type of the activatee. + * + * @see ActivatorAdapter + * @see org.apache.polygene.api.service.ServiceActivation + */ +public interface Activator<ActivateeType> +{ + + /** + * Called before activatee activation. + * + * @param activating The instance that is about to be activated. + * + * @throws Exception Allowed to throw Exception which will be wrapped in an ActivationException + */ + void beforeActivation( ActivateeType activating ) + throws Exception; + + /** + * Called after activatee activation. + * + * @param activated The instance that has just been activated. + * + * @throws Exception Allowed to throw Exception which will be wrapped in an ActivationException + */ + void afterActivation( ActivateeType activated ) + throws Exception; + + /** + * Called before activatee passivation. + * + * @param passivating The instance that is about to be passivated. + * + * @throws Exception Allowed to throw Exception which will be wrapped in an PassivationException + */ + void beforePassivation( ActivateeType passivating ) + throws Exception; + + /** + * Called after activatee passivation. + * + * @param passivated The instance that has just been passivated. + * + * @throws Exception Allowed to throw Exception which will be wrapped in an PassivationException + */ + void afterPassivation( ActivateeType passivated ) + throws Exception; +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorAdapter.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorAdapter.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorAdapter.java new file mode 100644 index 0000000..208e492 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorAdapter.java @@ -0,0 +1,70 @@ +/* + * 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.polygene.api.activation; + +/** + * Adapter for Activator. + * <p>If you are thinking about Service activation, see {@link org.apache.polygene.api.service.ServiceActivatorAdapter}.</p> + * + * @param <ActivateeType> Type of the activatee. + */ +public class ActivatorAdapter<ActivateeType> + implements Activator<ActivateeType> +{ + /** + * Called before activatee activation. + * @param activating Activating activatee + */ + @Override + public void beforeActivation( ActivateeType activating ) + throws Exception + { + } + + /** + * Called after activatee activation. + * @param activated Activating activatee + */ + @Override + public void afterActivation( ActivateeType activated ) + throws Exception + { + } + + /** + * Called before activatee passivation. + * @param passivating Passivating activatee + */ + @Override + public void beforePassivation( ActivateeType passivating ) + throws Exception + { + } + + /** + * Called after activatee passivation. + * @param passivated Passivated activatee + */ + @Override + public void afterPassivation( ActivateeType passivated ) + throws Exception + { + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorDescriptor.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorDescriptor.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorDescriptor.java new file mode 100644 index 0000000..75b482f --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivatorDescriptor.java @@ -0,0 +1,27 @@ +/* + * 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.polygene.api.activation; + +/** + * Activator Descriptor. + */ +public interface ActivatorDescriptor +{ +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/Activators.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/Activators.java b/core/api/src/main/java/org/apache/polygene/api/activation/Activators.java new file mode 100644 index 0000000..912760a --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/Activators.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.polygene.api.activation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation is used in ServiceComposites to declare Activator implementation classes. + */ +@Retention( RetentionPolicy.RUNTIME ) +@Target( ElementType.TYPE ) +@Documented +public @interface Activators +{ + + /** + * @return Activator implementation classes. + */ + Class<? extends Activator<?>>[] value(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java b/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java new file mode 100644 index 0000000..7197257 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java @@ -0,0 +1,114 @@ +/* + * 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.polygene.api.activation; + +import java.io.PrintStream; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.polygene.api.structure.Application; + +/** + * Application Passivation Thread to use as a Shutdown Hook. + * <pre>Runtime.getRuntime().addShutdownHook( new ApplicationPassivationThread( application ) );</pre> + */ +public final class ApplicationPassivationThread + extends Thread +{ + /** + * Create a new Application Passivation Thread that output errors to STDERR. + * @param application The Application to passivate + */ + @SuppressWarnings("unused") + public ApplicationPassivationThread(final Application application ) + { + this( application, null, null ); + } + + /** + * Create a new Application Passivation Thread that output errors to a Logger. + * @param application The Application to passivate + * @param logger Logger for errors + */ + @SuppressWarnings("unused") + public ApplicationPassivationThread(Application application, Logger logger ) + { + this( application, null, logger ); + } + + /** + * Create a new Application Passivation Thread that output errors to a PrintStream. + * @param application The Application to passivate + * @param output PrintStream for errors + */ + public ApplicationPassivationThread( Application application, PrintStream output ) + { + this( application, output, null ); + } + + private ApplicationPassivationThread( Application application, PrintStream output, Logger logger ) + { + super( new ApplicationPassivation( application, output, logger ), + application.name() + " Passivation Thread" ); + } + + private static class ApplicationPassivation + implements Runnable + { + + private final Application application; + private final PrintStream output; + private final Logger logger; + + private ApplicationPassivation( Application application, PrintStream output, Logger logger ) + { + this.application = application; + this.output = output; + this.logger = logger; + } + + @Override + public void run() + { + try + { + application.passivate(); + } + catch( PassivationException ex ) + { + String message = application.name() + " " + ex.getMessage(); + if( logger != null ) + { + logger.log( Level.SEVERE, message, ex ); + } + else if( output != null ) + { + output.println( message ); + ex.printStackTrace( output ); + } + else + { + ex.printStackTrace(); + } + } + } + + } + +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java b/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java new file mode 100644 index 0000000..98eaa0f --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java @@ -0,0 +1,57 @@ +/* + * 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.polygene.api.activation; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Thrown when unable to passivate. + * + * Printed StackTrace contains all causes in order as suppressed exceptions. + */ +public final class PassivationException + extends Exception +{ + + private static final long serialVersionUID = 1L; + private final List<Exception> causes; + + /** + * Create new PassivationException. + * @param exceptions All exceptions encountered during passivation, in order + */ + public PassivationException( Collection<Exception> exceptions ) + { + super( "Passivation Exception - [has " + exceptions.size() + " cause(s)]" ); + exceptions.forEach( this::addSuppressed ); + this.causes = new ArrayList<>( exceptions ); + } + + /** + * @return All exceptions encountered during passivation, in order + */ + public List<Exception> causes() + { + return causes; + } + +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/activation/package.html ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/package.html b/core/api/src/main/java/org/apache/polygene/api/activation/package.html new file mode 100644 index 0000000..c11d85f --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/activation/package.html @@ -0,0 +1,29 @@ +<!-- + ~ 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. + ~ + ~ + --> +<html> + <body> + <h2>Activation API.</h2> + <p> + The Activation API package contains types used by client code to integrate with the Polygene⢠Runtime activation + mechanism. In assembly, client code can easily listen to Structure (Application, Layers and Modules) and + Services activation events, or, declare Structure and Service Activators. + </p> + </body> +</html> http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AbstractAssociation.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AbstractAssociation.java b/core/api/src/main/java/org/apache/polygene/api/association/AbstractAssociation.java new file mode 100644 index 0000000..55ec7d8 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AbstractAssociation.java @@ -0,0 +1,28 @@ +/* + * 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.polygene.api.association; + +/** + * Base interface for all associations. + */ +public interface AbstractAssociation +{ +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/Association.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/Association.java b/core/api/src/main/java/org/apache/polygene/api/association/Association.java new file mode 100644 index 0000000..5e458ce --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/Association.java @@ -0,0 +1,52 @@ +/* + * 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.polygene.api.association; + +import org.apache.polygene.api.entity.EntityReference; + +/** + * Association to a single EntityComposite. + */ +public interface Association<T> extends AbstractAssociation +{ + /** + * Get the associated entity. + * + * @return the associated entity + */ + T get(); + + /** + * Set the associated entity. + * + * @param associated the entity + * + * @throws IllegalArgumentException thrown if the entity is not a valid reference for this association + * @throws IllegalStateException thrown if association is immutable + */ + void set( T associated ) + throws IllegalArgumentException, IllegalStateException; + + /** + * @return the the reference of the associated entity. + */ + EntityReference reference(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AssociationDescriptor.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationDescriptor.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationDescriptor.java new file mode 100644 index 0000000..e7a1c01 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationDescriptor.java @@ -0,0 +1,69 @@ +/* + * 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.polygene.api.association; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Type; +import org.apache.polygene.api.common.QualifiedName; +import org.apache.polygene.api.structure.MetaInfoHolder; + +/** + * Association Descriptor. + */ +public interface AssociationDescriptor extends MetaInfoHolder +{ + /** + * Get the qualified name of the association. This is constructed by + * concatenating the name of the declaring interface with the name + * of the method, using ":" as separator. + * <p> + * Example: + * </p> + * <p> + * com.somecompany.MyInterface with association method + * </p> + * <pre><code> + * Association<String> someAssociation(); + * </code></pre> + * will have the qualified name: + * <pre><code> + * com.somecompany.MyInterface:someAssociation + * </code></pre> + * + * @return the qualified name of the association + */ + QualifiedName qualifiedName(); + + /** + * Get the type of the associated Entities + * + * @return the type of the associated Entities + */ + Type type(); + + boolean isImmutable(); + + boolean isAggregated(); + + AccessibleObject accessor(); + + boolean queryable(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AssociationMixin.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationMixin.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationMixin.java new file mode 100644 index 0000000..e26d324 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationMixin.java @@ -0,0 +1,58 @@ +/* + * 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.polygene.api.association; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import org.apache.polygene.api.common.AppliesTo; +import org.apache.polygene.api.common.AppliesToFilter; +import org.apache.polygene.api.injection.scope.State; + +/** + * Generic mixin for associations. + */ +@AppliesTo( { AssociationMixin.AssociationFilter.class } ) +public final class AssociationMixin + implements InvocationHandler +{ + @State + private AssociationStateHolder associations; + + @Override + public Object invoke( Object proxy, Method method, Object[] args ) + throws Throwable + { + return associations.associationFor( method ); + } + + /** + * Associations generic mixin AppliesToFilter. + */ + static class AssociationFilter + implements AppliesToFilter + { + @Override + public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> modifierClass ) + { + return Association.class.isAssignableFrom( method.getReturnType() ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateDescriptor.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateDescriptor.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateDescriptor.java new file mode 100644 index 0000000..dbee470 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateDescriptor.java @@ -0,0 +1,54 @@ +/* + * 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.polygene.api.association; + +import java.util.stream.Stream; +import org.apache.polygene.api.common.QualifiedName; +import org.apache.polygene.api.composite.StateDescriptor; + +/** + * Associations State Descriptor. + */ +public interface AssociationStateDescriptor extends StateDescriptor +{ + AssociationDescriptor getAssociationByName( String name ) + throws IllegalArgumentException; + + AssociationDescriptor getAssociationByQualifiedName( QualifiedName name ) + throws IllegalArgumentException; + + AssociationDescriptor getManyAssociationByName( String name ) + throws IllegalArgumentException; + + AssociationDescriptor getManyAssociationByQualifiedName( QualifiedName name ) + throws IllegalArgumentException; + + AssociationDescriptor getNamedAssociationByName( String name ) + throws IllegalArgumentException; + + AssociationDescriptor getNamedAssociationByQualifiedName( QualifiedName name ) + throws IllegalArgumentException; + + Stream<? extends AssociationDescriptor> associations(); + + Stream<? extends AssociationDescriptor> manyAssociations(); + + Stream<? extends AssociationDescriptor> namedAssociations(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java new file mode 100644 index 0000000..6b1cf42 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java @@ -0,0 +1,79 @@ +/* + * 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.polygene.api.association; + +import java.lang.reflect.AccessibleObject; +import java.util.stream.Stream; +import org.apache.polygene.api.property.StateHolder; + +/** + * This represents the state of a entity (properties+associations). + */ +public interface AssociationStateHolder + extends StateHolder +{ + /** + * Get an association for a specific accessor method. + * + * @param associationMethod for the association + * + * @return the association + */ + <T> Association<T> associationFor( AccessibleObject associationMethod ); + + /** + * Get all associations. + * + * @return stream of associations + */ + Stream<? extends Association<?>> allAssociations(); + + /** + * Get a many-association for a specific accessor method. + * + * @param manyassociationMethod for the many-association + * + * @return the association + */ + <T> ManyAssociation<T> manyAssociationFor( AccessibleObject manyassociationMethod ); + + /** + * Get all ManyAssociations. + * + * @return stream of many-associations + */ + Stream<? extends ManyAssociation<?>> allManyAssociations(); + + /** + * Get a named-association for a specific accessor method. + * + * @param namedassociationMethod for the named-association + * + * @return the association + */ + <T> NamedAssociation<T> namedAssociationFor( AccessibleObject namedassociationMethod ); + + /** + * Get all named-associations. + * + * @return stream of named-associations + */ + Stream<? extends NamedAssociation<?>> allNamedAssociations(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/AssociationWrapper.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationWrapper.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationWrapper.java new file mode 100644 index 0000000..b41b41f --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationWrapper.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.polygene.api.association; + +import org.apache.polygene.api.entity.EntityReference; + +/** + * If you want to catch getting and setting association, then create a GenericConcern + * that wraps the Polygene-supplied Association instance with AssociationWrappers. Override + * get() and/or set() to perform your custom code. + */ +public class AssociationWrapper + implements Association<Object> +{ + protected Association<Object> next; + + public AssociationWrapper( Association<Object> next ) + { + this.next = next; + } + + public Association<Object> next() + { + return next; + } + + @Override + public Object get() + { + return next.get(); + } + + @Override + public void set( Object associated ) + throws IllegalArgumentException + { + next.set( associated ); + } + + @Override + public EntityReference reference() + { + return next.reference(); + } + + @Override + public int hashCode() + { + return next.hashCode(); + } + + @Override + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + public boolean equals( Object obj ) + { + return next.equals( obj ); + } + + @Override + public String toString() + { + return next.toString(); + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/GenericAssociationInfo.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/GenericAssociationInfo.java b/core/api/src/main/java/org/apache/polygene/api/association/GenericAssociationInfo.java new file mode 100644 index 0000000..c42f172 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/GenericAssociationInfo.java @@ -0,0 +1,63 @@ +/* + * 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.polygene.api.association; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import static org.apache.polygene.api.util.Classes.typeOf; + +/** + * Generic Association info. + */ +public final class GenericAssociationInfo +{ + public static Type associationTypeOf( AccessibleObject accessor ) + { + return toAssociationType( typeOf( accessor ) ); + } + + public static Type toAssociationType( Type methodReturnType ) + { + if( methodReturnType instanceof ParameterizedType ) + { + ParameterizedType parameterizedType = (ParameterizedType) methodReturnType; + if( AbstractAssociation.class.isAssignableFrom( (Class<?>) parameterizedType.getRawType() ) ) + { + return parameterizedType.getActualTypeArguments()[ 0 ]; + } + } + if (!(methodReturnType instanceof Class)) + { + throw new IllegalArgumentException( "Unable to make an association with " + methodReturnType ); + } + Type[] interfaces = ((Class<?>) methodReturnType).getGenericInterfaces(); + for (Type anInterface : interfaces) + { + Type associationType = toAssociationType(anInterface); + if (associationType != null) + { + return associationType; + } + } + return null; + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/1c722f44/core/api/src/main/java/org/apache/polygene/api/association/ManyAssociation.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/ManyAssociation.java b/core/api/src/main/java/org/apache/polygene/api/association/ManyAssociation.java new file mode 100644 index 0000000..a2247b9 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/association/ManyAssociation.java @@ -0,0 +1,58 @@ +/* + * 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.polygene.api.association; + +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; +import org.apache.polygene.api.entity.EntityReference; + +/** + * Association to a collection of entities. + */ +public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation +{ + /** + * Returns the number of references in this association. + * @return the number of references in this association. + */ + int count(); + + boolean contains( T entity ); + + boolean add( int i, T entity ); + + boolean add( T entity ); + + boolean remove( T entity ); + + T get( int i ); + + List<T> toList(); + + Set<T> toSet(); + + /** + * Returns a stream of the references to the associated entities. + * @return the references to the associated entities. + */ + Stream<EntityReference> references(); +}
